package ru.simsonic.rscPermissions.Bukkit.Commands; import java.time.format.DateTimeFormatter; 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.command.CommandSender; import org.bukkit.entity.Player; 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.Bukkit.BukkitUtilities; import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.Engine.Matchers; import ru.simsonic.rscPermissions.Engine.ResolutionResult; public class CommandEntity { private final BukkitPluginMain rscp; CommandEntity(BukkitPluginMain plugin) { this.rscp = plugin; } public static enum TargetType { GROUP, USER, PLAYER, } public void onEntityCommandHub(CommandSender sender, TargetType type, String[] args) throws CommandAnswerException { if(sender.hasPermission("rscp.admin") == false) throw new CommandAnswerException("Not enough permissions."); args = Arrays.copyOfRange(args, 1, args.length); if(args.length <= 1) throw new CommandAnswerException("Read help."); ResolutionResult result = null; RowEntity entity = null; switch(type) { case PLAYER: final Player online = BukkitUtilities.findOnlinePlayer(args[0]); if(online != null) { args[0] = online.getName(); result = rscp.permissionManager.getResult(online); break; } result = rscp.permissionManager.getResult(args[0]); break; case USER: entity = rscp.internalCache.findUserEntity(args[0]); break; case GROUP: entity = rscp.internalCache.findGroupEntity(args[0]); break; } if(entity == null && result == null) throw new CommandAnswerException("{_LR}I don't know such name!"); if(args[1] == null) args[1] = "help"; final String targetName = args[0]; switch(args[1].toLowerCase()) { case "help": throw new CommandAnswerException(getHelpForType(type)); case "prefix": case "p": if(result != null) viewCalculatedPrefix(result, targetName); else viewEntityPrefix(entity); break; case "suffix": case "s": if(result != null) viewCalculatedSuffix(result, targetName); else viewEntitySuffix(entity); break; case "listpermissions": case "permissions": case "lp": if(result != null) listFinalPlayerPermissions(result, targetName); else showEntityPermissions(entity); break; case "listparents": case "listgroups": case "parents": case "groups": case "lg": if(result != null) listUserGroupsTree(result, targetName); else showEntityParents(entity); break; case "addparent": case "addgroup": case "ap": case "ag": // TO DO HERE addGroup(result, targetName, null, null, null); break; case "removeparent": case "removegroup": case "rp": case "rg": // TO DO HERE removeGroup(result, targetName, null); break; default: break; } } public List getHelpForType(TargetType type) { final List answer = new ArrayList<>(16); final String typeName = type.name().toLowerCase(); answer.add(String.format("{_YL}/rscp %s prefix {_LS}-- show entity's prefix", typeName)); answer.add(String.format("{_YL}/rscp %s suffix {_LS}-- show entity's suffix", typeName)); answer.add(String.format("{_YL}/rscp %s listgroups {_LS}-- show list of parent groups", typeName)); answer.add(String.format("{_YL}/rscp %s listpermissions {_LS}-- show list of explicit permissions", typeName)); switch(type) { case GROUP: case USER: break; case PLAYER: break; } return answer; } public void listGroups(CommandSender sender) throws CommandAnswerException { final List answer = new ArrayList<>(16); final Set groups = rscp.internalCache.getKnownGroupObjects(); answer.add("There are following known groups in database:"); for(RowEntity group : groups) { final String details = detailsAboutEntity(group); if(details != null) answer.add(details); } throw new CommandAnswerException(answer); } public void listUsers(CommandSender sender) throws CommandAnswerException { final List answer = new LinkedList<>(); final Set users = rscp.internalCache.getKnownUserObjects(); answer.add("There are following known users in database:"); for(RowEntity user : users) { final String details = detailsAboutEntity(user); if(details != null) answer.add(details); } throw new CommandAnswerException(answer); } private String detailsAboutEntity(RowEntity entity) { String name = entity.entity; if("".equals(name)) // return null; name = ""; final StringBuilder sb = new StringBuilder(); if(entity.splittedId != null) sb.append("{_WH}").append(entity.splittedId).append(" "); sb.append("{_YL}").append(name); if(entity.prefix != null && !"".equals(entity.prefix)) sb.append("{_LS}, prefix \"").append(entity.prefix).append("{_LS}\""); if(entity.suffix != null && !"".equals(entity.suffix)) sb.append("{_LS}, suffix \"").append(entity.suffix).append("{_LS}\""); if(entity.lifetime != null) { final String lifetime = entity.lifetime.toLocalDateTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T", " "); sb.append("{_R} {_YL}").append(lifetime); } return sb.toString(); } private void viewEntityPrefix(RowEntity entity) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); answer.add("Own prefix for " + (entity.entityType == EntityType.GROUP ? "group" : "user") + " {_YL}" + entity.entity + "{_LS} is:"); answer.add("{_R}\"" + (entity.prefix != null ? entity.prefix : "") + "{_R}\""); throw new CommandAnswerException(answer); } private void viewEntitySuffix(RowEntity entity) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); answer.add("Own suffix for " + (entity.entityType == EntityType.GROUP ? "group" : "user") + " {_YL}" + entity.entity + "{_LS} is:"); answer.add("{_R}\"" + (entity.suffix != null ? entity.suffix : "") + "{_R}\""); throw new CommandAnswerException(answer); } private void viewCalculatedPrefix(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 viewCalculatedSuffix(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 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 StringBuilder sb = new StringBuilder(); sb.append("{_WH}").append(permission.splittedId); sb.append(permission.value ? " {_LG}" : " {_LR}").append(permission.permission); if(permission.destination != null) { final String destination = permission.destination.toString(); if(!"".equals(destination)) sb.append("{_R} {_LC}{_U}").append(destination); } if(permission.expirience > 0) sb.append("{_R} {_LB}").append(permission.expirience).append(" LVLs"); if(permission.lifetime != null) { final String lifetime = permission.lifetime.toLocalDateTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T", " "); sb.append("{_R} {_YL}").append(lifetime); } answer.add(sb.toString()); } throw new CommandAnswerException(answer); } private void showEntityParents(RowEntity entity) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); answer.add("Parent groups for " + entity.entityType.name().toLowerCase() + " {_YL}" + entity.entity + "{_LS}:"); for(RowInheritance parent : entity.inheritance) answer.add("{_WH}" + parent.splittedId + " {_LG}" + parent.getParentWithInstance()); throw new CommandAnswerException(answer); } private void listFinalPlayerPermissions(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 listUserGroupsTree(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); } private void addGroup(ResolutionResult result, String user, String parent, String destination, Integer seconds) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); throw new CommandAnswerException(answer); } private void removeGroup(ResolutionResult result, String user, String parent) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); throw new CommandAnswerException(answer); } }