From baa090b39a6d195d5d4858a4eb1e09bdc8346d12 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Thu, 16 Jun 2016 19:28:15 +0200 Subject: [PATCH] Permission System Improvements. TypeEnchantment Aliases. TypeMap settings. --- .../massivecore/MassiveCorePerm.java | 7 +- .../requirement/RequirementHasPerm.java | 13 +-- .../command/type/TypeEnchantment.java | 89 ++++++++++----- .../command/type/container/TypeContainer.java | 39 +++++-- .../engine/EngineMassiveCoreMain.java | 2 +- ...ventMassiveCorePermissionDeniedFormat.java | 8 +- .../massivecore/store/Entity.java | 8 +- .../massivecore/store/SenderEntity.java | 42 ++++++- .../massivecore/util/PermissionUtil.java | 107 +++++++++--------- 9 files changed, 198 insertions(+), 117 deletions(-) diff --git a/src/com/massivecraft/massivecore/MassiveCorePerm.java b/src/com/massivecraft/massivecore/MassiveCorePerm.java index fed8a6c8..3d028628 100644 --- a/src/com/massivecraft/massivecore/MassiveCorePerm.java +++ b/src/com/massivecraft/massivecore/MassiveCorePerm.java @@ -72,13 +72,14 @@ public enum MassiveCorePerm implements Identified // HAS // -------------------------------------------- // - public boolean has(Permissible permissible, boolean informSenderIfNot) + public boolean has(Permissible permissible, boolean verboose) { - return PermissionUtil.hasPermission(permissible, this.id, informSenderIfNot); + return PermissionUtil.hasPermission(permissible, this, verboose); } public boolean has(Permissible permissible) { - return has(permissible, false); + return PermissionUtil.hasPermission(permissible, this); } + } diff --git a/src/com/massivecraft/massivecore/command/requirement/RequirementHasPerm.java b/src/com/massivecraft/massivecore/command/requirement/RequirementHasPerm.java index 0caaf2d3..c9868640 100644 --- a/src/com/massivecraft/massivecore/command/requirement/RequirementHasPerm.java +++ b/src/com/massivecraft/massivecore/command/requirement/RequirementHasPerm.java @@ -2,7 +2,6 @@ package com.massivecraft.massivecore.command.requirement; import org.bukkit.command.CommandSender; -import com.massivecraft.massivecore.Identified; import com.massivecraft.massivecore.command.MassiveCommand; import com.massivecraft.massivecore.util.PermissionUtil; @@ -14,21 +13,15 @@ public class RequirementHasPerm extends RequirementAbstract // INSTANCE & CONSTRUCT // -------------------------------------------- // - public static RequirementHasPerm get(String permissionId) { return new RequirementHasPerm(permissionId); } - public static RequirementHasPerm get(Identified identified) { return new RequirementHasPerm(identified); } + public static RequirementHasPerm get(Object permission) { return new RequirementHasPerm(permission); } // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // - public RequirementHasPerm(String permissionId) + public RequirementHasPerm(Object permission) { - this.permissionId = permissionId; - } - - public RequirementHasPerm(Identified identified) - { - this(identified.getId()); + this.permissionId = PermissionUtil.asPermissionId(permission); } // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/command/type/TypeEnchantment.java b/src/com/massivecraft/massivecore/command/type/TypeEnchantment.java index f4dcc1d0..814031b4 100644 --- a/src/com/massivecraft/massivecore/command/type/TypeEnchantment.java +++ b/src/com/massivecraft/massivecore/command/type/TypeEnchantment.java @@ -1,16 +1,57 @@ package com.massivecraft.massivecore.command.type; -import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.Set; import org.bukkit.ChatColor; import org.bukkit.enchantments.Enchantment; +import com.massivecraft.massivecore.collections.MassiveList; +import com.massivecraft.massivecore.collections.MassiveMap; import com.massivecraft.massivecore.collections.MassiveSet; import com.massivecraft.massivecore.util.Txt; public class TypeEnchantment extends TypeAbstractChoice { + // -------------------------------------------- // + // DATA + // -------------------------------------------- // + // http://minecraft.gamepedia.com/Enchanting#Enchantments + + // The first name is taken from the wiki. Those names are those people think of. + // The second name is the Bukkit enum name. + // Thereafter comes assorted extras + public static Map> ID_TO_RAWNAMES = new MassiveMap>( + 0, new MassiveList<>("Protection", "PROTECTION_ENVIRONMENTAL"), + 1, new MassiveList<>("Fire Protection", "PROTECTION_FIRE"), + 2, new MassiveList<>("Feather Falling", "PROTECTION_FALL", "FallProtection"), + 3, new MassiveList<>("Blast Protection", "PROTECTION_EXPLOSIONS", "ExplosionProtection"), + 4, new MassiveList<>("Projectile Protection", "PROTECTION_PROJECTILE", "ProjectileProtection"), + 5, new MassiveList<>("Respiration", "OXYGEN", "Breathing"), + 6, new MassiveList<>("Aqua Affinity", "WATER_WORKER"), + 7, new MassiveList<>("Thorns", "THORNS"), + 8, new MassiveList<>("Depth Strider", "DEPTH_STRIDER"), + 9, new MassiveList<>("Frost Walker", "FROST_WALKER"), + 16, new MassiveList<>("Sharpness", "DAMAGE_ALL"), + 17, new MassiveList<>("Smite", "DAMAGE_UNDEAD"), + 18, new MassiveList<>("Bane of Arthropods", "DAMAGE_ARTHROPODS", "BaneArthropods", "Arthropods"), + 19, new MassiveList<>("Knockback", "KNOCKBACK"), + 20, new MassiveList<>("Fire Aspect", "FIRE_ASPECT"), + 21, new MassiveList<>("Looting", "LOOT_BONUS_MOBS"), + 32, new MassiveList<>("Efficiency", "DIG_SPEED"), + 33, new MassiveList<>("Silk Touch", "SILK_TOUCH"), + 34, new MassiveList<>("Unbreaking", "DURABILITY"), + 35, new MassiveList<>("Fortune", "LOOT_BONUS_BLOCKS"), + 48, new MassiveList<>("Power", "ARROW_DAMAGE"), + 49, new MassiveList<>("Punch", "ARROW_KNOCKBACK"), + 50, new MassiveList<>("Flame", "ARROW_FIRE"), + 51, new MassiveList<>("Infinity", "ARROW_INFINITE", "ArrowInfinity"), + 61, new MassiveList<>("Luck of the Sea", "LUCK", "LuckOfSea", "LuckTheSea", "LuckSea"), + 62, new MassiveList<>("Lure", "LURE"), + 70, new MassiveList<>("Mending", "MENDING") + ); + // -------------------------------------------- // // INSTANCE & CONSTRUCT // -------------------------------------------- // @@ -28,50 +69,42 @@ public class TypeEnchantment extends TypeAbstractChoice // OVERRIDE // -------------------------------------------- // + @SuppressWarnings("deprecation") @Override public String getNameInner(Enchantment enchantment) { - return Txt.getNicedEnumString(enchantment.getName()); + String rawname = enchantment.getName(); + List rawnames = ID_TO_RAWNAMES.get(enchantment.getId()); + if (rawnames != null) rawname = rawnames.get(0); + return Txt.getNicedEnumString(rawname); } + @SuppressWarnings("deprecation") @Override public Set getNamesInner(Enchantment enchantment) { + // Create Set ret = new MassiveSet<>(); - ret.add(this.getName(enchantment)); - if (Enchantment.DAMAGE_ALL.equals(enchantment)) Collections.addAll(ret, "Sharpness"); - if (Enchantment.DAMAGE_ARTHROPODS.equals(enchantment)) Collections.addAll(ret, "BaneOfArthropdos"); - if (Enchantment.DAMAGE_UNDEAD.equals(enchantment)) Collections.addAll(ret, "Smite"); - if (Enchantment.DIG_SPEED.equals(enchantment)) Collections.addAll(ret, "Efficiency"); - if (Enchantment.DURABILITY.equals(enchantment)) Collections.addAll(ret, "Unbreaking"); - if (Enchantment.THORNS.equals(enchantment)) Collections.addAll(ret); - if (Enchantment.FIRE_ASPECT.equals(enchantment)) Collections.addAll(ret); - if (Enchantment.KNOCKBACK.equals(enchantment)) Collections.addAll(ret); - if (Enchantment.LOOT_BONUS_BLOCKS.equals(enchantment)) Collections.addAll(ret, "Fortune"); - if (Enchantment.LOOT_BONUS_MOBS.equals(enchantment)) Collections.addAll(ret, "Looting"); - if (Enchantment.OXYGEN.equals(enchantment)) Collections.addAll(ret, "Respiration", "Breathing"); - if (Enchantment.PROTECTION_ENVIRONMENTAL.equals(enchantment)) Collections.addAll(ret, "Protection"); - if (Enchantment.PROTECTION_EXPLOSIONS.equals(enchantment)) Collections.addAll(ret, "BlastProtection", "ExplosionProtection"); - if (Enchantment.PROTECTION_FALL.equals(enchantment)) Collections.addAll(ret, "FeatherFalling", "FallProtection"); - if (Enchantment.PROTECTION_FIRE.equals(enchantment)) Collections.addAll(ret, "FireProtection"); - if (Enchantment.PROTECTION_PROJECTILE.equals(enchantment)) Collections.addAll(ret, "ProectileProtection"); - if (Enchantment.SILK_TOUCH.equals(enchantment)) Collections.addAll(ret); - if (Enchantment.WATER_WORKER.equals(enchantment)) Collections.addAll(ret, "AquaAffinity"); - if (Enchantment.ARROW_FIRE.equals(enchantment)) Collections.addAll(ret, "Flame"); - if (Enchantment.ARROW_DAMAGE.equals(enchantment)) Collections.addAll(ret, "Power"); - if (Enchantment.ARROW_KNOCKBACK.equals(enchantment)) Collections.addAll(ret, "Punch"); - if (Enchantment.ARROW_INFINITE.equals(enchantment)) Collections.addAll(ret, "Infinity"); - if (Enchantment.LUCK.equals(enchantment)) Collections.addAll(ret, "LuckOfSea", "LuckOfTheSea"); - if (Enchantment.LURE.equals(enchantment)) Collections.addAll(ret); + // Fill + List raws = new MassiveList<>(); + List rawnames = ID_TO_RAWNAMES.get(enchantment.getId()); + if (rawnames != null) raws.addAll(rawnames); + raws.add(enchantment.getName()); + for (String raw : raws) + { + ret.add(Txt.getNicedEnumString(raw)); + } + // Return return ret; } + @SuppressWarnings("deprecation") @Override public String getIdInner(Enchantment enchantment) { - return enchantment.getName(); + return String.valueOf(enchantment.getId()); } } diff --git a/src/com/massivecraft/massivecore/command/type/container/TypeContainer.java b/src/com/massivecraft/massivecore/command/type/container/TypeContainer.java index 671c9ee1..e9ce3dc9 100644 --- a/src/com/massivecraft/massivecore/command/type/container/TypeContainer.java +++ b/src/com/massivecraft/massivecore/command/type/container/TypeContainer.java @@ -46,6 +46,20 @@ public abstract class TypeContainer extends TypeAbstract return super.getName(); } + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private int indexStart = 0; + public int getIndexStart() { return this.indexStart; } + @SuppressWarnings("unchecked") + public X setIndexStart(int indexStart) { this.indexStart = indexStart; return (X)this; } + + private boolean indexVisible = true; + public boolean isIndexVisible() { return this.indexVisible; } + @SuppressWarnings("unchecked") + public X setIndexVisible(boolean indexVisible) { this.indexVisible = indexVisible; return (X)this; } + // -------------------------------------------- // // WRITE VISUAL // -------------------------------------------- // @@ -62,16 +76,20 @@ public abstract class TypeContainer extends TypeAbstract // Fill List elements = this.getContainerElementsOrdered(container); Type innerType = this.getInnerType(); - int index = -1; + int index = this.getIndexStart(); for (E element : elements) { - index++; - Mson part = Mson.mson( - Mson.mson(String.valueOf(index)).color(ChatColor.WHITE), - Mson.SPACE, - innerType.getVisualMson(element, sender) - ); + Mson part = innerType.getVisualMson(element, sender); + if (this.isIndexVisible()) + { + part = Mson.mson( + Mson.mson(String.valueOf(index)).color(ChatColor.WHITE), + Mson.SPACE, + part + ); + } parts.add(part); + index++; } // Return @@ -94,12 +112,13 @@ public abstract class TypeContainer extends TypeAbstract // Fill List elements = this.getContainerElementsOrdered(container); Type innerType = this.getInnerType(); - int index = -1; + int index = this.getIndexStart(); for (E element : elements) { - index++; - String part = Txt.parse("%d %s", index, innerType.getVisual(element, sender)); + String part = innerType.getVisual(element, sender); + if (this.isIndexVisible()) part = Txt.parse("%d %s", index, part); parts.add(part); + index++; } // Return diff --git a/src/com/massivecraft/massivecore/engine/EngineMassiveCoreMain.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreMain.java index 19e537ae..436d91d0 100644 --- a/src/com/massivecraft/massivecore/engine/EngineMassiveCoreMain.java +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreMain.java @@ -98,7 +98,7 @@ public class EngineMassiveCoreMain extends Engine if (event.hasFormat()) return; // ... and we have a custom format in the config ... - String customFormat = MassiveCoreMConf.get().getPermissionDeniedFormat(event.getPermissionName()); + String customFormat = MassiveCoreMConf.get().getPermissionDeniedFormat(event.getPermissionId()); if (customFormat == null) return; // ... then make use of that format. diff --git a/src/com/massivecraft/massivecore/event/EventMassiveCorePermissionDeniedFormat.java b/src/com/massivecraft/massivecore/event/EventMassiveCorePermissionDeniedFormat.java index 5870a26a..623f1f3b 100644 --- a/src/com/massivecraft/massivecore/event/EventMassiveCorePermissionDeniedFormat.java +++ b/src/com/massivecraft/massivecore/event/EventMassiveCorePermissionDeniedFormat.java @@ -16,8 +16,8 @@ public class EventMassiveCorePermissionDeniedFormat extends EventMassiveCore // FIELD // -------------------------------------------- // - private final String permissionName; - public String getPermissionName() { return this.permissionName; } + private final String permissionId; + public String getPermissionId() { return this.permissionId; } private String format; public String getFormat() { return this.format; } @@ -28,9 +28,9 @@ public class EventMassiveCorePermissionDeniedFormat extends EventMassiveCore // CONSTRUCT // -------------------------------------------- // - public EventMassiveCorePermissionDeniedFormat(String permissionName) + public EventMassiveCorePermissionDeniedFormat(String permissionId) { - this.permissionName = permissionName; + this.permissionId = permissionId; this.format = null; } diff --git a/src/com/massivecraft/massivecore/store/Entity.java b/src/com/massivecraft/massivecore/store/Entity.java index 857cb372..133f02ec 100644 --- a/src/com/massivecraft/massivecore/store/Entity.java +++ b/src/com/massivecraft/massivecore/store/Entity.java @@ -176,15 +176,15 @@ public class Entity> implements Identified // -------------------------------------------- // // GENERIC - public T convertGet(T value, T defaultValue) + public T convertGet(T value, T standard) { - return value != null ? value : defaultValue; + return value != null ? value : standard; } - public T convertSet(T value, T defaultValue) + public T convertSet(T value, T standard) { this.changed(); - return Objects.equals(value, defaultValue) ? null : value; + return Objects.equals(value, standard) ? null : value; } // BOOLEAN diff --git a/src/com/massivecraft/massivecore/store/SenderEntity.java b/src/com/massivecraft/massivecore/store/SenderEntity.java index ed36a656..82adfd2a 100644 --- a/src/com/massivecraft/massivecore/store/SenderEntity.java +++ b/src/com/massivecraft/massivecore/store/SenderEntity.java @@ -10,6 +10,7 @@ import org.bukkit.entity.Player; import com.google.common.base.Objects; import com.massivecraft.massivecore.Named; +import com.massivecraft.massivecore.PlayerState; import com.massivecraft.massivecore.event.EventMassiveCoreAknowledge; import com.massivecraft.massivecore.mixin.MixinDisplayName; import com.massivecraft.massivecore.mixin.MixinMessage; @@ -70,22 +71,53 @@ public abstract class SenderEntity> extends Entity // -------------------------------------------- // // GENERIC - public T convertGet(T value, T defaultValue, String permissionId) + public T convertGet(T value, T standard, Object permission) { // Create - T ret = super.convertGet(value, defaultValue); + T ret = this.convertGet(value, standard); // Permission Requirement - if ( ! Objects.equal(value, defaultValue) && ! PermissionUtil.hasPermission(this.getSender(), permissionId)) return defaultValue; + if ( ! Objects.equal(value, standard) && !this.hasPermission(permission, true)) return standard; // Return return ret; } // BOOLEAN - public boolean convertGet(Boolean value, String permissionId) + public boolean convertGet(Boolean value, Object permission) { - return this.convertGet(value, false, permissionId); + return this.convertGet(value, false, permission); + } + + // -------------------------------------------- // + // CONVENIENCE: PERMISSON + // -------------------------------------------- // + + public Boolean hasPermission(Object permission, Boolean standard, boolean verboose) + { + // Null + if (permission == null) throw new NullPointerException("permission"); + + // Sender + CommandSender sender = this.getSender(); + if (sender == null) return standard; + + // Players must be fully joined. + // The permission manager may not have updated permissions during the early login/connect stages. + if (sender instanceof Player) + { + Player player = (Player)sender; + PlayerState state = PlayerState.get(player); + if (state != PlayerState.JOINED) return standard; + } + + // Check + return PermissionUtil.hasPermission(sender, permission, verboose); + } + + public Boolean hasPermission(Object permission, Boolean standard) + { + return this.hasPermission(permission, standard, false); } // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/util/PermissionUtil.java b/src/com/massivecraft/massivecore/util/PermissionUtil.java index 12287480..4dd42278 100644 --- a/src/com/massivecraft/massivecore/util/PermissionUtil.java +++ b/src/com/massivecraft/massivecore/util/PermissionUtil.java @@ -13,6 +13,7 @@ import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.Plugin; +import com.massivecraft.massivecore.Identified; import com.massivecraft.massivecore.Lang; import com.massivecraft.massivecore.MassiveCore; import com.massivecraft.massivecore.event.EventMassiveCorePermissionDeniedFormat; @@ -70,6 +71,32 @@ public class PermissionUtil ensureHas(permissible, permission.getName()); } + // -------------------------------------------- // + // AS + // -------------------------------------------- // + + public static String asPermissionId(Object object) + { + if (object == null) return null; + + if (object instanceof String) return (String)object; + if (object instanceof Identified) return ((Identified)object).getId(); + if (object instanceof Permission) return getPermissionId((Permission)object); + + throw new IllegalArgumentException(object.toString()); + } + + public static Permission asPermission(Object object) + { + if (object == null) return null; + + if (object instanceof Permission) return (Permission)object; + + String permissionId = asPermissionId(object); + Permission permission = getPermission(false, permissionId); + return permission; + } + // -------------------------------------------- // // PERMISSION > CONSTRUCT // -------------------------------------------- // @@ -311,17 +338,11 @@ public class PermissionUtil // The action should fit into the format for a denied message such as: // You don't have permission to FLY TO THE MOON. - public static String getPermissionAction(String permissionId) + public static String getPermissionAction(Object permission) { - if (permissionId == null) return Lang.PERM_DEFAULT_DESCRIPTION; - Permission permission = Bukkit.getPluginManager().getPermission(permissionId); - return getPermissionAction(permission); - } - - public static String getPermissionAction(Permission permission) - { - if (permission == null) return Lang.PERM_DEFAULT_DESCRIPTION; - String ret = getPermissionDescription(permission); + Permission permissionBukkit = asPermission(permission); + if (permissionBukkit == null) return Lang.PERM_DEFAULT_DESCRIPTION; + String ret = getPermissionDescription(permissionBukkit); if (ret == null || ret.isEmpty()) ret = Lang.PERM_DEFAULT_DESCRIPTION; return ret; } @@ -330,8 +351,9 @@ public class PermissionUtil // PERMISSION > DENIED FORMAT // -------------------------------------------- // - public static String getPermissionDeniedFormat(String permissionId) + public static String getPermissionDeniedFormat(Object permission) { + String permissionId = asPermissionId(permission); EventMassiveCorePermissionDeniedFormat event = new EventMassiveCorePermissionDeniedFormat(permissionId); event.run(); String ret = event.getFormat(); @@ -339,23 +361,11 @@ public class PermissionUtil return ret; } - public static String getPermissionDeniedFormat(Permission permission) - { - return getPermissionDeniedFormat(permission == null ? null : permission.getName()); - } - // -------------------------------------------- // // PERMISSION > DENIED MESSAGE // -------------------------------------------- // - public static String getPermissionDeniedMessage(String permissionId) - { - String deniedFormat = getPermissionDeniedFormat(permissionId); - String action = getPermissionAction(permissionId); - return Txt.parse(deniedFormat, action); - } - - public static String getPermissionDeniedMessage(Permission permission) + public static String getPermissionDeniedMessage(Object permission) { String deniedFormat = getPermissionDeniedFormat(permission); String action = getPermissionAction(permission); @@ -364,41 +374,34 @@ public class PermissionUtil // -------------------------------------------- // // PERMISSION > HAS - // -------------------------------------------- // + // -------------------------------------------- // - public static boolean hasPermission(Permissible permissable, Permission permission) + public static boolean hasPermission(Permissible permissible, Object permission, boolean verbose) { - return hasPermission(permissable, permission.getName()); - } - - public static boolean hasPermission(Permissible permissable, String permissionId) - { - if (permissable == null) return false; - return permissable.hasPermission(permissionId); - } - - public static boolean hasPermission(Permissible permissable, Permission permission, boolean verbose) - { - return hasPermission(permissable, permission.getName(), verbose); - } - - public static boolean hasPermission(Permissible permissible, String permissionId, boolean verbose) - { - if (hasPermission(permissible, permissionId)) + // Fail Fast + if (permissible == null) throw new NullPointerException("permissible"); + if (permission == null) throw new NullPointerException("permission"); + + String permissionId = asPermissionId(permission); + if (permissionId == null) throw new NullPointerException("permissionId"); + + if (permissible.hasPermission(permissionId)) return true; + + if (verbose && permissible instanceof CommandSender) { - return true; - } - else if (verbose && permissible != null) - { - if (permissible instanceof CommandSender) - { - CommandSender sender = (CommandSender)permissible; - sender.sendMessage(getPermissionDeniedMessage(permissionId)); - } + CommandSender sender = (CommandSender)permissible; + String message = getPermissionDeniedMessage(permission); + sender.sendMessage(message); } + return false; } + public static boolean hasPermission(Permissible permissible, Object permission) + { + return hasPermission(permissible, permission, false); + } + // -------------------------------------------- // // PERMISSIBLE > BASE // -------------------------------------------- //