diff --git a/src/main/java/ru/simsonic/rscPermissions/API/Settings.java b/src/main/java/ru/simsonic/rscPermissions/API/Settings.java index 73fe3b0..52c3084 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/Settings.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/Settings.java @@ -17,6 +17,7 @@ public interface Settings public static final String INSTANCE_SEP = "."; public static final String INSTANCE_PHOLDER = "?"; public static final String REGEXP_INSTANCE = Pattern.quote(INSTANCE_SEP); + public static final String REGEXP_GROUP_LVL = Pattern.quote(new String(new char[] { SHOW_GROUP_LEVEL })); public static final String REGEXP_ROW_SPLIT = "\\s*[;,\\r\\n\\s]+\\s*"; public static final String REGEXP_NICKNAME = "^[\\*a-zA-Z0-9_-]{3,16}$"; public static final String REGEXP_UUID_DASH = "^(?:[a-f\\d]{8}(?:-[a-f\\d]{4}){3}-[a-f\\d]{12})$"; diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java index 8626512..703166f 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java @@ -1,9 +1,11 @@ package ru.simsonic.rscPermissions.Bukkit.Commands; +import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; @@ -16,6 +18,7 @@ import ru.simsonic.rscPermissions.API.RowPermission; import ru.simsonic.rscPermissions.Bukkit.BukkitUtilities; import ru.simsonic.rscPermissions.Bukkit.Commands.ArgumentUtilities.OptionalParams; import ru.simsonic.rscPermissions.BukkitPluginMain; +import ru.simsonic.rscPermissions.Engine.Matchers; import ru.simsonic.rscPermissions.Engine.Phrases; import ru.simsonic.rscPermissions.Engine.ResolutionResult; @@ -120,14 +123,15 @@ public class CommandEntity extends CommandEntityHelper // Remove this optional argument from the battlefront args = Arrays.copyOfRange(args, 1, args.length); // Find what is the target for operation - ResolutionResult result = null; - RowEntity entity = null; + ResolutionResult result = null; + OfflinePlayer offline = null; + RowEntity entity = null; if(type.equals(TargetType.PLAYER)) { // Search for online or offline player object String target = args[0]; - final Player online = BukkitUtilities.findOnlinePlayer(target); - final OfflinePlayer offline = online != null + final Player online = BukkitUtilities.findOnlinePlayer(target); + offline = online != null ? online : BukkitUtilities.findOfflinePlayer(target); // Does command sender require convertion of game Player into database User? @@ -217,7 +221,7 @@ public class CommandEntity extends CommandEntityHelper "{_LR}Do you want to force it's creation with special keyword {_YL}new{_LR} before name?", }); if(result != null) - onPlayerCommand(result, args); + onPlayerCommand(result, args, offline); else onEntityCommand(entity, type, args); throw new CommandAnswerException(getHelpForType(type)); @@ -298,7 +302,7 @@ public class CommandEntity extends CommandEntityHelper break; } } - private void onPlayerCommand(ResolutionResult result, String[] args) throws CommandAnswerException + private void onPlayerCommand(ResolutionResult result, String[] args, OfflinePlayer offline) throws CommandAnswerException { final String targetName = args[0]; final String subcommand = args.length > 1 && args[1] != null @@ -325,9 +329,112 @@ public class CommandEntity extends CommandEntityHelper showPlayerParents(result, targetName); break; case "info": - // Should I show some INFO for this result? not now ... + showPlayerDetails(result, offline); case "help": throw new CommandAnswerException(getHelpForType(TargetType.PLAYER)); } } + private void showPlayerDetails(ResolutionResult result, OfflinePlayer offline) throws CommandAnswerException + { + final List answer = new ArrayList<>(8); + if(offline != null) + { + // Show name, uuid + try + { + answer.add("Last seen name: {_YL}" + offline.getName()); + } catch(RuntimeException | NoSuchMethodError ex) { + } + try + { + answer.add("Unique ID (uuid): {_YL}" + offline.getUniqueId().toString().toLowerCase()); + } catch(RuntimeException | NoSuchMethodError ex) { + } + // Show IP-address + try + { + + final Player online = offline.getPlayer(); + if(online != null) + { + final InetSocketAddress socketAddress = online.getAddress(); + if(socketAddress != null) + answer.add("Connection IP: {_YL}" + socketAddress.getAddress().getHostAddress()); + } + } catch(RuntimeException | NoSuchMethodError ex) { + } + // Show isBanned, isOpped, isWhitelisted + if(offline.isOp() || offline.isBanned()|| offline.isWhitelisted()) + { + final StringBuilder sb = new StringBuilder("Options:"); + if(offline.isOp()) + sb.append("{_LG} server operator{_LS}"); + if(offline.isBanned()) + sb.append("{_LR} banned{_LS}"); + if(offline.isWhitelisted()) + sb.append("{_WH} whitelisted"); + sb.append("{_LS}."); + answer.add(sb.toString()); + } + } + // Show prefix and suffix, number of parent groups and permissions + final StringBuilder sb = new StringBuilder("Details:"); + final String prefix = result.getPrefix(); + final String suffix = result.getSuffix(); + final boolean hasPrefix = prefix != null && !"".equals(prefix); + final boolean hasSuffix = suffix != null && !"".equals(suffix); + if(hasPrefix || hasSuffix) + sb + .append("{_R} {_LS}[\'") + .append(hasPrefix ? prefix : "") + .append("{_LS}\', \'") + .append(hasSuffix ? suffix : "") + .append("{_LS}\']"); + final Map permissions = result.getPermissions(); + if(permissions != null && !permissions.isEmpty()) + sb.append(String.format("{_R} {_LC}%d{_DC}p", permissions.size())); + final Set uniqueGroups = result.getUniqueGroups(); + if(!uniqueGroups.isEmpty()) + sb.append(String.format("{_R} {_LC}%d{_DC}i", uniqueGroups.size())); + answer.add(sb.toString()); + throw new CommandAnswerException(answer); + } + private void showPlayerPrefix(ResolutionResult result, String user) throws CommandAnswerException + { + if(Matchers.isCorrectDashlessUUID(user)) + user = Matchers.uuidAddDashes(user); + final ArrayList answer = new ArrayList<>(); + answer.add("Calculated prefix for user {_YL}" + user + "{_LS} is:"); + answer.add("{_R}\"" + result.getPrefix() + "{_R}\""); + throw new CommandAnswerException(answer); + } + private void showPlayerSuffix(ResolutionResult result, String user) throws CommandAnswerException + { + if(Matchers.isCorrectDashlessUUID(user)) + user = Matchers.uuidAddDashes(user); + final ArrayList answer = new ArrayList<>(); + answer.add("Calculated suffix for user {_YL}" + user + "{_LS} is:"); + answer.add("{_R}\"" + result.getSuffix() + "{_R}\""); + throw new CommandAnswerException(answer); + } + private void showPlayerPermissions(ResolutionResult result, String user) throws CommandAnswerException + { + if(Matchers.isCorrectDashlessUUID(user)) + user = Matchers.uuidAddDashes(user); + final ArrayList answer = new ArrayList<>(); + answer.add("Permission list for user {_YL}" + user + "{_LS}:"); + for(Map.Entry entry : result.getPermissions().entrySet()) + answer.add((entry.getValue() ? "{_LG}" : "{_LR}") + entry.getKey()); + throw new CommandAnswerException(answer); + } + private void showPlayerParents(ResolutionResult result, String player) throws CommandAnswerException + { + if(Matchers.isCorrectDashlessUUID(player)) + player = Matchers.uuidAddDashes(player); + final ArrayList answer = new ArrayList<>(); + answer.add("List of parent groups for player {_YL}" + player + "{_LS}:"); + for(String group : result.getOrderedGroups()) + answer.add("{_LG}" + group); + throw new CommandAnswerException(answer); + } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntityHelper.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntityHelper.java index 59766cf..6808808 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntityHelper.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntityHelper.java @@ -3,15 +3,12 @@ package ru.simsonic.rscPermissions.Bukkit.Commands; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.LinkedList; -import java.util.Map; import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException; import ru.simsonic.rscPermissions.API.EntityType; import ru.simsonic.rscPermissions.API.RowEntity; import ru.simsonic.rscPermissions.API.RowInheritance; import ru.simsonic.rscPermissions.API.RowPermission; import ru.simsonic.rscPermissions.BukkitPluginMain; -import ru.simsonic.rscPermissions.Engine.Matchers; -import ru.simsonic.rscPermissions.Engine.ResolutionResult; public class CommandEntityHelper { @@ -20,6 +17,57 @@ public class CommandEntityHelper { this.rscp = plugin; } + protected void showEntityPrefix(RowEntity entity) throws CommandAnswerException + { + if(entity.prefix != null) + throw new CommandAnswerException(String.format( + "Own prefix for %s {_YL}%s{_LS} is {_R}\"%s{_R}\"", + entity.entityType.equals(EntityType.GROUP) ? "group" : "user", + entity.entity, + entity.prefix)); + throw new CommandAnswerException(String.format( + "Own prefix for %s {_YL}%s{_LS} is not set (null).", + entity.entityType.equals(EntityType.GROUP) ? "group" : "user", + entity.entity)); + } + protected void showEntitySuffix(RowEntity entity) throws CommandAnswerException + { + if(entity.suffix != null) + throw new CommandAnswerException(String.format( + "Own suffix for %s {_YL}%s{_LS} is {_R}\"%s{_R}\"", + entity.entityType.equals(EntityType.GROUP) ? "group" : "user", + entity.entity, + entity.suffix)); + throw new CommandAnswerException(String.format( + "Own suffix for %s {_YL}%s{_LS} is not set (null).", + entity.entityType.equals(EntityType.GROUP) ? "group" : "user", + entity.entity)); + } + protected void showEntityPermissions(RowEntity entity) throws CommandAnswerException + { + final ArrayList answer = new ArrayList<>(); + final String typeName = entity.entityType.name().toLowerCase(); + answer.add("Explicit permissions for " + typeName + " {_YL}" + entity.entity + "{_LS}:"); + for(RowPermission permission : entity.permissions) + { + final String details = showPermissionDetails(permission); + if(details != null) + answer.add(details); + } + throw new CommandAnswerException(answer); + } + protected void showEntityParents(RowEntity entity) throws CommandAnswerException + { + final ArrayList answer = new ArrayList<>(); + answer.add("Explicit parent groups for " + entity.entityType.name().toLowerCase() + " {_YL}" + entity.entity + "{_LS}:"); + for(RowInheritance parent : entity.inheritance) + { + final String details = showInheritanceDetails(parent); + if(details != null) + answer.add(details); + } + throw new CommandAnswerException(answer); + } protected String showEntityDetails(RowEntity entity) { final String name = entity.entity; @@ -52,19 +100,6 @@ public class CommandEntityHelper sb.append(String.format("{_R} {_LC}%d{_DC}i", entity.inheritance.length)); return sb.toString(); } - protected void showEntityPermissions(RowEntity entity) throws CommandAnswerException - { - final ArrayList answer = new ArrayList<>(); - final String typeName = entity.entityType.name().toLowerCase(); - answer.add("Explicit permissions for " + typeName + " {_YL}" + entity.entity + "{_LS}:"); - for(RowPermission permission : entity.permissions) - { - final String details = showPermissionDetails(permission); - if(details != null) - answer.add(details); - } - throw new CommandAnswerException(answer); - } protected String showPermissionDetails(RowPermission row) { final StringBuilder sb = new StringBuilder(); @@ -85,18 +120,6 @@ public class CommandEntityHelper } return sb.toString(); } - protected void showEntityParents(RowEntity entity) throws CommandAnswerException - { - final ArrayList answer = new ArrayList<>(); - answer.add("Explicit parent groups for " + entity.entityType.name().toLowerCase() + " {_YL}" + entity.entity + "{_LS}:"); - for(RowInheritance parent : entity.inheritance) - { - final String details = showInheritanceDetails(parent); - if(details != null) - answer.add(details); - } - throw new CommandAnswerException(answer); - } protected String showInheritanceDetails(RowInheritance row) { final StringBuilder sb = new StringBuilder(); @@ -117,70 +140,6 @@ public class CommandEntityHelper } return sb.toString(); } - protected void showPlayerPermissions(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Permission list for user {_YL}" + user + "{_LS}:"); - for(Map.Entry entry : result.getPermissions().entrySet()) - answer.add((entry.getValue() ? "{_LG}" : "{_LR}") + entry.getKey()); - throw new CommandAnswerException(answer); - } - protected void showPlayerParents(ResolutionResult result, String player) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(player)) - player = Matchers.uuidAddDashes(player); - final ArrayList answer = new ArrayList<>(); - answer.add("List of parent groups for player {_YL}" + player + "{_LS}:"); - for(String group : result.getOrderedGroups()) - answer.add("{_LG}" + group); - throw new CommandAnswerException(answer); - } - protected void showEntityPrefix(RowEntity entity) throws CommandAnswerException - { - if(entity.prefix != null) - throw new CommandAnswerException(String.format( - "Own prefix for %s {_YL}%s{_LS} is {_R}\"%s{_R}\"", - entity.entityType.equals(EntityType.GROUP) ? "group" : "user", - entity.entity, - entity.prefix)); - throw new CommandAnswerException(String.format( - "Own prefix for %s {_YL}%s{_LS} is not set (null).", - entity.entityType.equals(EntityType.GROUP) ? "group" : "user", - entity.entity)); - } - protected void showEntitySuffix(RowEntity entity) throws CommandAnswerException - { - if(entity.suffix != null) - throw new CommandAnswerException(String.format( - "Own suffix for %s {_YL}%s{_LS} is {_R}\"%s{_R}\"", - entity.entityType.equals(EntityType.GROUP) ? "group" : "user", - entity.entity, - entity.suffix)); - throw new CommandAnswerException(String.format( - "Own suffix for %s {_YL}%s{_LS} is not set (null).", - entity.entityType.equals(EntityType.GROUP) ? "group" : "user", - entity.entity)); - } - protected void showPlayerPrefix(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Calculated prefix for user {_YL}" + user + "{_LS} is:"); - answer.add("{_R}\"" + result.getPrefix() + "{_R}\""); - throw new CommandAnswerException(answer); - } - protected void showPlayerSuffix(ResolutionResult result, String user) throws CommandAnswerException - { - if(Matchers.isCorrectDashlessUUID(user)) - user = Matchers.uuidAddDashes(user); - final ArrayList answer = new ArrayList<>(); - answer.add("Calculated suffix for user {_YL}" + user + "{_LS} is:"); - answer.add("{_R}\"" + result.getSuffix() + "{_R}\""); - throw new CommandAnswerException(answer); - } protected void addGroup(RowEntity entity, String parent, ArgumentUtilities.OptionalParams optional) throws CommandAnswerException { final String[] splitted = RowInheritance.splitIntoNameAndInstance(parent); diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java index 13969d7..0cc369b 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java @@ -4,9 +4,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.regex.Pattern; +import java.util.Set; +import java.util.TreeSet; import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes; -import ru.simsonic.rscPermissions.API.RowEntity; import ru.simsonic.rscPermissions.API.Settings; public class ResolutionResult extends IntermediateResult @@ -49,16 +49,21 @@ public class ResolutionResult extends IntermediateResult public String[] getDeorderedGroups() { final ArrayList list = new ArrayList(groups.size()); - final String separator = Pattern.quote(new String(new char[] { Settings.SHOW_GROUP_LEVEL })); for(String group : groups) { - final String[] splitted = group.split(separator); + final String[] splitted = group.split(Settings.REGEXP_GROUP_LVL); list.add(splitted[splitted.length - 1]); } return list.toArray(new String[list.size()]); } - public RowEntity[] getApplicableRows() + public Set getUniqueGroups() { - return null; + final Set result = new TreeSet<>(); + for(String group : groups) + { + final String[] splitted = group.split(Settings.REGEXP_GROUP_LVL); + result.add(splitted[splitted.length - 1]); + } + return result; } }