diff --git a/src/main/java/ru/simsonic/rscPermissions/API/Destination.java b/src/main/java/ru/simsonic/rscPermissions/API/Destination.java index 375b553..ce1b176 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/Destination.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/Destination.java @@ -31,7 +31,7 @@ public class Destination if(this.world == null || this.world.isEmpty() || "*".equals(this.world)) return true; final String instantiated = (instantiator != null && !instantiator.isEmpty()) - ? this.world.replace(Settings.INSTANTIATOR, instantiator) + ? this.world.replace(Settings.INSTANCE_PHOLDER, instantiator) : this.world; return wildcardTest(world, instantiated); } @@ -40,7 +40,7 @@ public class Destination if(this.region == null || "".equals(this.region) || "*".equals(this.region)) return true; final String instantiated = (instantiator != null && !"".equals(instantiator)) - ? this.region.replace(Settings.INSTANTIATOR, instantiator) + ? this.region.replace(Settings.INSTANCE_PHOLDER, instantiator) : this.region; for(String regionId : regions) if(wildcardTest(regionId, instantiated)) @@ -52,7 +52,7 @@ public class Destination if(this.region == null || "".equals(this.region) || "*".equals(this.region)) return true; final String instantiated = (instantiator != null && !"".equals(instantiator)) - ? this.region.replace(Settings.INSTANTIATOR, instantiator) + ? this.region.replace(Settings.INSTANCE_PHOLDER, instantiator) : this.region; for(String regionId : regions) if(wildcardTest(regionId, instantiated)) diff --git a/src/main/java/ru/simsonic/rscPermissions/API/EntityType.java b/src/main/java/ru/simsonic/rscPermissions/API/EntityType.java index bc0bb08..c06a449 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/EntityType.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/EntityType.java @@ -11,6 +11,10 @@ public enum EntityType { this.value = value; } + public int getValue() + { + return value; + } public static EntityType byValue(int value) { for(EntityType constant : EntityType.values()) diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java b/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java index f7c9332..395d3ba 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowEntity.java @@ -14,6 +14,14 @@ public class RowEntity implements Cloneable, Comparable public transient PlayerType playerType; public transient RowPermission[] permissions; public transient RowInheritance[] inheritance; + public boolean isMappedInDB() + { + return splittedId != null && !"".equals(splittedId); + } + public boolean hasClonesInRow() + { + return splittedId != null && splittedId.contains(Settings.SPLITTED_ID_SEP); + } @Override public RowEntity clone() throws CloneNotSupportedException { diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java b/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java index 381ccd5..a1bd81d 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java @@ -24,7 +24,7 @@ public class RowInheritance implements Cloneable, Comparable { if(parent != null) { - final String[] splitted = parent.split(Settings.REGEXP_SEPARATOR); + final String[] splitted = parent.split(Settings.REGEXP_INSTANCE); if(splitted.length > 1) { parent = GenericChatCodes.glue(Arrays.copyOf(splitted, splitted.length - 1), Settings.INSTANCE_SEP); @@ -38,6 +38,14 @@ public class RowInheritance implements Cloneable, Comparable { return this.parent + (instance.isEmpty() ? "" : "." + instance); } + public boolean isMappedInDB() + { + return splittedId != null && !"".equals(splittedId); + } + public boolean hasClonesInRow() + { + return splittedId != null && splittedId.contains(Settings.SPLITTED_ID_SEP); + } @Override public RowInheritance clone() throws CloneNotSupportedException { diff --git a/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java b/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java index 5fd32b5..11f0e2c 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java @@ -16,6 +16,14 @@ public class RowPermission implements Cloneable, Comparable public transient PlayerType playerType; public transient String destinationSource; public transient RowEntity entityObject; + public boolean isMappedInDB() + { + return splittedId != null && !"".equals(splittedId); + } + public boolean hasClonesInRow() + { + return splittedId != null && splittedId.contains(Settings.SPLITTED_ID_SEP); + } @Override public RowPermission clone() throws CloneNotSupportedException { diff --git a/src/main/java/ru/simsonic/rscPermissions/API/Settings.java b/src/main/java/ru/simsonic/rscPermissions/API/Settings.java index e46a5d9..5746ad3 100644 --- a/src/main/java/ru/simsonic/rscPermissions/API/Settings.java +++ b/src/main/java/ru/simsonic/rscPermissions/API/Settings.java @@ -1,6 +1,7 @@ package ru.simsonic.rscPermissions.API; import java.util.Map; +import java.util.regex.Pattern; import ru.simsonic.rscCommonsLibrary.ConnectionMySQL.ConnectionParams; public interface Settings @@ -9,11 +10,12 @@ public interface Settings public static final String CHAT_PREFIX = "{GOLD}[rscp] {_LS}"; public static final String UPDATE_CMD = "/rscp update do"; - public static final String TEXT_INHERITER = "%"; + public static final String PREFIX_PHOLDER = "%"; public static final char SHOW_GROUP_LEVEL = '┏'; - public static final String INSTANTIATOR = "?"; + public static final String SPLITTED_ID_SEP = ":"; public static final String INSTANCE_SEP = "."; - public static final String REGEXP_SEPARATOR = "\\."; + public static final String INSTANCE_PHOLDER = "?"; + public static final String REGEXP_INSTANCE = Pattern.quote(INSTANCE_SEP); 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 f41548a..7f5ab9a 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java @@ -15,6 +15,7 @@ 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.Bukkit.Commands.ArgumentUtilities.CommandParams; import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.Engine.Matchers; import ru.simsonic.rscPermissions.Engine.ResolutionResult; @@ -107,16 +108,16 @@ public class CommandEntity case "prefix": case "p": if(result != null) - viewPlayerPrefix(result, targetName); + showPlayerPrefix(result, targetName); else - viewEntityPrefix(entity); + showEntityPrefix(entity); break; case "suffix": case "s": if(result != null) - viewPlayerSuffix(result, targetName); + showPlayerSuffix(result, targetName); else - viewEntitySuffix(entity); + showEntitySuffix(entity); break; case "listpermissions": case "permissions": @@ -134,33 +135,49 @@ public class CommandEntity else showEntityParents(entity); break; + case "info": + if(entity != null) + throw new CommandAnswerException(showEntityDetails(entity)); + case "help": + throw new CommandAnswerException(getHelpForType(type)); + } + if(args.length < 3) + throw new CommandAnswerException("FEW ARGUMENTS"); + final String target = args[2]; + args = Arrays.copyOfRange(args, 3, args.length); + CommandParams optional = ArgumentUtilities.parseCommandParams(args); + switch(subcommand) + { case "addgroup": case "ag": // TO DO HERE - addGroup(entity, "group", null, null); + addGroup(entity, target, optional); break; case "addpermission": case "ap": // TO DO HERE - addPermission(entity, "permission", null, null); + addPermission(entity, target, optional); break; case "removegroup": case "rg": // TO DO HERE - removeGroup(entity, "group"); + removeGroup(entity, target); break; case "removepermission": case "rp": // TO DO HERE - this.removePermission(entity, "permission"); + removePermission(entity, target); + break; + case "setprefix": + case "sp": + // TO DO HERE + break; + case "setsuffix": + case "ss": + // TO DO HERE break; - case "info": - if(entity != null) - throw new CommandAnswerException(showEntityDetails(entity)); - case "help": - default: - throw new CommandAnswerException(getHelpForType(type)); } + throw new CommandAnswerException(getHelpForType(type)); } public void listGroups(CommandSender sender) throws CommandAnswerException { @@ -309,23 +326,33 @@ public class CommandEntity answer.add("{_LG}" + group); throw new CommandAnswerException(answer); } - private void viewEntityPrefix(RowEntity entity) throws CommandAnswerException + private void showEntityPrefix(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); + 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)); } - private void viewEntitySuffix(RowEntity entity) throws CommandAnswerException + private void showEntitySuffix(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); + 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)); } - private void viewPlayerPrefix(ResolutionResult result, String user) throws CommandAnswerException + private void showPlayerPrefix(ResolutionResult result, String user) throws CommandAnswerException { if(Matchers.isCorrectDashlessUUID(user)) user = Matchers.uuidAddDashes(user); @@ -334,7 +361,7 @@ public class CommandEntity answer.add("{_R}\"" + result.getPrefix() + "{_R}\""); throw new CommandAnswerException(answer); } - private void viewPlayerSuffix(ResolutionResult result, String user) throws CommandAnswerException + private void showPlayerSuffix(ResolutionResult result, String user) throws CommandAnswerException { if(Matchers.isCorrectDashlessUUID(user)) user = Matchers.uuidAddDashes(user); @@ -343,12 +370,12 @@ public class CommandEntity answer.add("{_R}\"" + result.getSuffix() + "{_R}\""); throw new CommandAnswerException(answer); } - private void addGroup(RowEntity entity, String parent, String destination, Integer seconds) throws CommandAnswerException + private void addGroup(RowEntity entity, String parent, CommandParams optional) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); throw new CommandAnswerException(answer); } - private void addPermission(RowEntity entity, String parent, String destination, Integer seconds) throws CommandAnswerException + private void addPermission(RowEntity entity, String parent, CommandParams optional) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); throw new CommandAnswerException(answer); @@ -356,11 +383,15 @@ public class CommandEntity private void removeGroup(RowEntity entity, String whatToRemove) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); + // Find out what does entered identifier mean? + rscp.connection.removeInheritanceById(1200); throw new CommandAnswerException(answer); } private void removePermission(RowEntity entity, String whatToRemove) throws CommandAnswerException { final ArrayList answer = new ArrayList<>(); + // Find out what does entered identifier mean? + rscp.connection.removePermissionsById(1200); throw new CommandAnswerException(answer); } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java index f0df55e..7275a48 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/BackendDatabase.java @@ -111,18 +111,6 @@ public class BackendDatabase extends ConnectionMySQL } return result.toArray(new RowInheritance[result.size()]); } - public synchronized void updateEntityText(String entity, boolean entity_type, String text, boolean isPrefix) - { - if("".equals(entity)) - return; - if("".equals(text) || "\"\"".equals(text)) - text = null; - setupQueryTemplate("{ENTITY}", entity); - setupQueryTemplate("{ENTITY_TYPE}", entity_type ? "1" : "0"); - setupQueryTemplate("{TEXT_TYPE}", isPrefix ? "prefix" : "suffix"); - setupQueryTemplate("{TEXT}", (text != null) ? "'" + text + "'" : "NULL"); - executeUpdateT("Update_entity_text"); - } public synchronized void lockTableEntities() { executeUpdate("LOCK TABLES `{DATABASE}`.`{PREFIX}entities`;"); @@ -151,10 +139,34 @@ public class BackendDatabase extends ConnectionMySQL { executeUpdate("ROLLBACK;"); } + public synchronized void updateEntityPrefix(String entity, EntityType type, String prefix) + { + if("".equals(entity)) + return; + if("".equals(prefix) || "\"\"".equals(prefix)) + prefix = null; + setupQueryTemplate("{ENTITY}", entity); + setupQueryTemplate("{ENTITY_TYPE}", String.valueOf(type.getValue())); + setupQueryTemplate("{TEXT_TYPE}", "prefix"); + setupQueryTemplate("{TEXT}", (prefix != null) ? "'" + prefix + "'" : "NULL"); + executeUpdateT("UpdateEntity"); + } + public synchronized void updateEntitySuffix(String entity, EntityType type, String suffix) + { + if("".equals(entity)) + return; + if("".equals(suffix) || "\"\"".equals(suffix)) + suffix = null; + setupQueryTemplate("{ENTITY}", entity); + setupQueryTemplate("{ENTITY_TYPE}", String.valueOf(type.getValue())); + setupQueryTemplate("{TEXT_TYPE}", "suffix"); + setupQueryTemplate("{TEXT}", (suffix != null) ? "'" + suffix + "'" : "NULL"); + executeUpdateT("UpdateEntity"); + } public synchronized void removeEntityById(long id) { setupQueryTemplate("{ID}", Long.toString(id)); - executeUpdateT("DELETE FROM `{DATABASE}`.`{PREFIX}entities` WHERE `id` = '{ID}';"); + executeUpdateT("DELETE FROM `{DATABASE}`.`{PREFIX}entities` WHERE `id` = '{ID}';"); } public synchronized void removePermissionsById(long id) { diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java index 195beea..22a605e 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/Backends/DatabaseContents.java @@ -38,8 +38,8 @@ public class DatabaseContents for(String oneEntity : splittedByE) { final RowEntity clone = row.clone(); - clone.splittedId = String.format(isAlone ? "e%d" : "e%d:%d", - row.id, subRowEntry); + clone.splittedId = String.format(isAlone ? "e%d" : "e%d%s%d", + row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(oneEntity); le.add(clone); subRowEntry += 1; @@ -61,8 +61,8 @@ public class DatabaseContents for(String entity : splittedByE) { final RowPermission clone = row.clone(); - clone.splittedId = String.format(isAlone ? "p%d" : "p%d:%d", - row.id, subRowEntry); + clone.splittedId = String.format(isAlone ? "p%d" : "p%d%s%d", + row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(entity); clone.permission = permission; clone.destination = destination; @@ -87,8 +87,8 @@ public class DatabaseContents for(String entity : splittedByE) { final RowInheritance clone = row.clone(); - clone.splittedId = String.format(isAlone ? "i%d" : "i%d:%d", - row.id, subRowEntry); + clone.splittedId = String.format(isAlone ? "i%d" : "i%d%s%d", + row.id, Settings.SPLITTED_ID_SEP, subRowEntry); clone.entity = PlayerType.normalize(entity); clone.parent = parent; clone.deriveInstance(); diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java index aa1030a..d9af603 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java @@ -168,9 +168,9 @@ public class InternalCache extends InternalStorage result.prefix = params.parentEntity.prefix; result.suffix = params.parentEntity.suffix; if(result.prefix == null || "".equals(result.prefix)) - result.prefix = (gipp ? Settings.TEXT_INHERITER : ""); + result.prefix = (gipp ? Settings.PREFIX_PHOLDER : ""); if(result.suffix == null || "".equals(result.suffix)) - result.suffix = (gipp ? Settings.TEXT_INHERITER : ""); + result.suffix = (gipp ? Settings.PREFIX_PHOLDER : ""); final StringBuilder sbp = new StringBuilder(); final StringBuilder sbs = new StringBuilder(); for(ResolutionResult inherited : intermediate) @@ -180,10 +180,10 @@ public class InternalCache extends InternalStorage if(inherited.suffix != null) sbs.append(inherited.suffix); } - result.prefix = result.prefix.replace(Settings.TEXT_INHERITER, sbp.toString()); - result.suffix = result.suffix.replace(Settings.TEXT_INHERITER, sbs.toString()); - result.prefix = result.prefix.replace(Settings.INSTANTIATOR, params.instantiator); - result.suffix = result.suffix.replace(Settings.INSTANTIATOR, params.instantiator); + result.prefix = result.prefix.replace(Settings.PREFIX_PHOLDER, sbp.toString()); + result.suffix = result.suffix.replace(Settings.PREFIX_PHOLDER, sbs.toString()); + result.prefix = result.prefix.replace(Settings.INSTANCE_PHOLDER, params.instantiator); + result.suffix = result.suffix.replace(Settings.INSTANCE_PHOLDER, params.instantiator); return result; } private void processPermissions(ResolutionParams params, List permissions) @@ -191,7 +191,7 @@ public class InternalCache extends InternalStorage for(RowPermission row : permissions) if(isPermissionApplicable(params, row)) params.finalPerms.put( - row.permission.replace(Settings.INSTANTIATOR, params.instantiator), + row.permission.replace(Settings.INSTANCE_PHOLDER, params.instantiator), row.value); } private boolean isPermissionApplicable(ResolutionParams params, RowPermission row) diff --git a/src/main/resources/sqlt/Update_entity_text.sqlt b/src/main/resources/sqlt/UpdateEntity.sqlt similarity index 100% rename from src/main/resources/sqlt/Update_entity_text.sqlt rename to src/main/resources/sqlt/UpdateEntity.sqlt