From 27c7fd16cce30386db926a330babfc102e2d8564 Mon Sep 17 00:00:00 2001 From: adrian Date: Mon, 22 Dec 2025 23:42:17 -0300 Subject: [PATCH] Started implementing new structure. --- src/b1_7_3/resources/settings.yml | 3 +- .../github/adrianvic/nemesiseye/Config.java | 4 +- .../adrianvic/nemesiseye/DataShifter.java | 11 ++++ .../github/adrianvic/nemesiseye/Events.java | 7 ++- .../github/adrianvic/nemesiseye/Nemesis.java | 2 +- .../adrianvic/nemesiseye/Validator.java | 19 +++--- .../nemesiseye/commands/sub/PolicyInfo.java | 2 +- .../adrianvic/nemesiseye/policy/Action.java | 3 +- .../adrianvic/nemesiseye/policy/Effect.java | 7 +++ .../nemesiseye/policy/NodeHandler.java | 8 ++- .../nemesiseye/policy/NodeHandlers.java | 10 ++-- .../adrianvic/nemesiseye/policy/Policy.java | 9 ++- .../nemesiseye/policy/PolicyNode.java | 60 +++++++++++++------ .../nemesiseye/policy/PolicyParser.java | 29 ++++++++- .../nemesiseye/policy/PolicyParsers.java | 4 ++ .../policy/handlers/attackWith.java | 4 +- .../policy/handlers/useEnchantment.java | 4 +- .../nemesiseye/policy/handlers/useItem.java | 6 +- .../policy/parser/GlobalPolicyParser.java | 23 +------ .../policy/parser/LocationPolicyParser.java | 23 ++----- .../policy/parser/PermissionPolicyParser.java | 29 +++++++++ .../policy/parser/PlayerNamePolicyParser.java | 28 +++++++++ .../nemesiseye/policy/policies/Core.java | 15 +++++ .../policy/policies/GlobalPolicy.java | 3 +- .../policy/policies/LocationPolicy.java | 7 ++- .../policy/policies/PermissionPolicy.java | 13 +++- .../policy/policies/PlayerNamePolicy.java | 17 +++++- .../adrianvic/nemesiseye/impl/r1_21.java | 1 + src/r1_21/resources/settings.yml | 27 ++++++--- 29 files changed, 274 insertions(+), 104 deletions(-) create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/Effect.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/parser/PermissionPolicyParser.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/parser/PlayerNamePolicyParser.java create mode 100644 src/main/java/io/github/adrianvic/nemesiseye/policy/policies/Core.java diff --git a/src/b1_7_3/resources/settings.yml b/src/b1_7_3/resources/settings.yml index 09921c7..c71ab81 100644 --- a/src/b1_7_3/resources/settings.yml +++ b/src/b1_7_3/resources/settings.yml @@ -2,7 +2,8 @@ Policies: # NO SPACES - name: "Block-illegal-items" type: global # global / location / permission / list of types - allowList: false # Will deny anything that's not allowed by the nodes if set to true + nodesAllowList: false # Will deny anything that's not allowed by the nodes if set to true + policyAllowList: false # Inverts the policy validation logic, for example a location policy will affect all players NOT inside it's location nodes: - useItem: value: diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Config.java b/src/main/java/io/github/adrianvic/nemesiseye/Config.java index 52bc4dc..7628fde 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Config.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Config.java @@ -1,6 +1,8 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import io.github.adrianvic.nemesiseye.policy.policies.GlobalPolicy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; import java.io.File; @@ -11,7 +13,6 @@ public class Config { private static Config instance = new Config(); private final Glimmer glim = Nemesis.getInstance().getGlimmer(); private File file; - private List policies = new ArrayList<>(); private Config() {} @@ -19,6 +20,7 @@ public class Config { public void load() { policies = glim.loadPoliciesFromFile(glim.loadConfigFile()); } + // TODO: Implement config saving // // public void save() { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java index 39331d6..afc5fed 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/DataShifter.java @@ -78,4 +78,15 @@ public class DataShifter { return boxes; } + + public static > T enumOrDefault(Class type, String string, T def) { + try { + return Enum.valueOf(type, string); + } catch (IllegalArgumentException e) { + return def; + } catch (Exception e) { + e.printStackTrace(); + return def; + } + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Events.java b/src/main/java/io/github/adrianvic/nemesiseye/Events.java index 07f0ed2..bc6c926 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Events.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Events.java @@ -1,5 +1,6 @@ package io.github.adrianvic.nemesiseye; +import io.github.adrianvic.nemesiseye.policy.Action; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; @@ -8,18 +9,18 @@ import org.bukkit.event.player.PlayerInteractEvent; public class Events { public static void onBlockBreak(BlockBreakEvent event) { - event.setCancelled(!Validator.canBreak(event.getPlayer())); + event.setCancelled(!Validator.can(event.getPlayer(), Action.BREAK)); } public static void onInteractionEvent(PlayerInteractEvent event) { if (event.getItem() != null) { - event.setCancelled(!Validator.canInteract(event.getPlayer())); + event.setCancelled(!Validator.can(event.getPlayer(), Action.INTERACT)); } } public static void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { if (event.getDamager() instanceof Player) { - event.setCancelled(!Validator.canHit((HumanEntity) event.getDamager())); + event.setCancelled(!Validator.can((HumanEntity) event.getDamager(), Action.HIT)); } } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java index d232213..8f6f819 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Nemesis.java @@ -61,4 +61,4 @@ public final class Nemesis extends JavaPlugin { public static Nemesis getInstance() { return instance; } public Glimmer getGlimmer() { return glim; } public PluginManager getPluginManager() { return this.getServer().getPluginManager(); } -} \ No newline at end of file +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java index ade192d..3c852fb 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/Validator.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/Validator.java @@ -1,6 +1,7 @@ package io.github.adrianvic.nemesiseye; import io.github.adrianvic.nemesiseye.policy.Action; +import io.github.adrianvic.nemesiseye.policy.NodeHandler; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import io.github.adrianvic.nemesiseye.reflection.Glimmer; @@ -12,15 +13,8 @@ import java.util.List; public class Validator { private final static Glimmer glim = Nemesis.getInstance().getGlimmer(); - public static boolean canInteract(HumanEntity entity) { - return checkAgainstEntity(entity, Action.INTERACT); - } - public static boolean canBreak(HumanEntity entity) { - return checkAgainstEntity(entity, Action.BREAK); - } - - public static boolean canHit(HumanEntity entity) { - return checkAgainstEntity(entity, Action.HIT); + public static boolean can(HumanEntity entity, Action action) { + return checkAgainstEntity(entity, action); } public static boolean checkAgainstEntity(HumanEntity entity, Action action) { @@ -35,7 +29,12 @@ public class Validator { } public static boolean checkAgainstNode(HumanEntity entity, PolicyNode node, Action action) { - return node.getHandler().allows(entity, node, action); + for (NodeHandler handler : node.getHandler()) { + if (!handler.allows(entity, node, action)) { + return false; + } + } + return true; } public static List getNodesForPolicies(List policies) { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java index ad48e02..de08e0f 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/commands/sub/PolicyInfo.java @@ -23,7 +23,7 @@ public class PolicyInfo implements Subcommand { Type: %s Nodes: %s %s - """, ChatColor.GREEN, policy.name(), ChatColor.WHITE, "location", policy.nodes().size(), policy.allowlist() ? "Is allowlist" : "Is blacklist")); + """, ChatColor.GREEN, policy.name(), ChatColor.WHITE, policy.getClass().getTypeName(), policy.nodes().size(), policy.nodeAllowlist() ? "Is allowlist" : "Is blacklist")); } } return true; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/Action.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/Action.java index 2bcd83e..b779578 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/Action.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/Action.java @@ -5,5 +5,6 @@ public enum Action { BREAK, HIT, CRAFT, - EQUIP + EQUIP, + USE_ENCHANTMENT } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/Effect.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/Effect.java new file mode 100644 index 0000000..36a342f --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/Effect.java @@ -0,0 +1,7 @@ +package io.github.adrianvic.nemesiseye.policy; + +public enum Effect { + DENY, + ALLOW, + ALLOWONLY +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandler.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandler.java index 6e7edf3..c60827e 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandler.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandler.java @@ -3,5 +3,11 @@ package io.github.adrianvic.nemesiseye.policy; import org.bukkit.entity.HumanEntity; public interface NodeHandler { - boolean allows(HumanEntity entity, PolicyNode node, Action action); + boolean check(HumanEntity entity, PolicyNode node, Action action); + + default boolean allows(HumanEntity entity, PolicyNode node, Action action) { + boolean isWhitelist = (node.effect() == Effect.ALLOWONLY); + return check(entity, node, action) ? !isWhitelist : isWhitelist; + } + } \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandlers.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandlers.java index 5746e1c..4502951 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandlers.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/NodeHandlers.java @@ -8,15 +8,15 @@ import java.util.HashMap; import java.util.Map; public class NodeHandlers { - private static final Map handlers = new HashMap<>(); + private static final Map handlers = new HashMap<>(); static { - handlers.put("attackWithItemInHand", new attackWith()); - handlers.put("useItem", new useItem()); - handlers.put("useEnchantment", new useEnchantment()); + handlers.put(Action.HIT, new attackWith()); + handlers.put(Action.INTERACT, new useItem()); + handlers.put(Action.USE_ENCHANTMENT, new useEnchantment()); } - public static NodeHandler get(String type) { + public static NodeHandler get(Action type) { return handlers.get(type); } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java index 42b3382..90cf7b9 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/Policy.java @@ -7,7 +7,12 @@ import java.util.List; public interface Policy { String name(); List nodes(); - boolean allowlist(); + boolean nodeAllowlist(); + boolean policyAllowList(); boolean applies(HumanEntity entity); - + Effect effect(); + int weight(); + default void addNode(PolicyNode node) { + nodes().add(node); + } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java index 2192821..a500088 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyNode.java @@ -1,36 +1,62 @@ package io.github.adrianvic.nemesiseye.policy; +import io.github.adrianvic.nemesiseye.Config; +import io.github.adrianvic.nemesiseye.DataShifter; +import org.apache.logging.log4j.status.StatusLogger; + import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; -public record PolicyNode(String type, List values, boolean isWhitelist) { - public static List parseNodes(List> raw, boolean isWhitelist) { +public record PolicyNode(List actions, List values, Effect effect) { + public static List parseNodes(List> raw, Effect effect) { List nodes = new ArrayList<>(); - for (Map m : raw) { - for (Map.Entry entry : m.entrySet()) { - String type = entry.getKey(); - List values = new ArrayList<>(); - Object val = entry.getValue(); + for (Map m : raw) { + for (Map.Entry rawNode : m.entrySet()) { + List nodeActions = new ArrayList<>(); + List nodeValues = new ArrayList<>(); + Effect nodeEffect = effect; - if (val instanceof Map valMap) { - if (valMap.get("values") instanceof String s) { - values.add(s); - } else if (valMap.get("values") instanceof List l) { - values.addAll(l); - } else if (valMap.get("values") instanceof Map map) { - values.add(map); + if (rawNode.getKey() instanceof List rawTypes && rawNode.getValue() instanceof Map rawNodeValues) { + for (Object rawType : rawTypes) { + if (rawType instanceof String rts && !rts.isEmpty() && !(rts == null) && DataShifter.enumOrDefault(Action.class, rts, null) != null) { + nodeActions.add(DataShifter.enumOrDefault(Action.class, rts, null)); + } + } + Map semiParsedNodeValue = new HashMap<>(); + for (Map.Entry rawNodeValueEntries : rawNodeValues.entrySet()) { + if (rawNodeValueEntries.getKey() instanceof String stringKey) { + semiParsedNodeValue.put(stringKey, rawNodeValueEntries.getValue()); + } } - nodes.add(new PolicyNode(type, values, isWhitelist)); + if (semiParsedNodeValue.get("values") instanceof List l) { + for (Object v : l) { + nodeValues.add(v); + } + } + + if (semiParsedNodeValue.get("effect") instanceof String efc) { + Effect type = DataShifter.enumOrDefault(Effect.class, efc, null); + if (type != null) { + nodeEffect = type; + } + } } + + nodes.add(new PolicyNode(nodeActions, nodeValues, nodeEffect)); } } return nodes; } - public NodeHandler getHandler() { - return NodeHandlers.get(type); + public List getHandler() { + List handlers = new ArrayList<>(); + for (Action a : actions) { + handlers.add(NodeHandlers.get(a)); + } + return handlers; } } \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java index ecddd33..bde513d 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParser.java @@ -1,7 +1,34 @@ package io.github.adrianvic.nemesiseye.policy; +import io.github.adrianvic.nemesiseye.DataShifter; +import io.github.adrianvic.nemesiseye.policy.policies.Core; + +import java.util.ArrayList; +import java.util.List; import java.util.Map; public interface PolicyParser { - Policy parse(Map raw); + default Policy parse(Map raw) { + boolean policyAllowList = Boolean.TRUE.equals(raw.get("policyAllowList")); + boolean nodesAllowList = Boolean.TRUE.equals(raw.get("nodesAllowList")); + Effect effect = DataShifter.enumOrDefault(Effect.class, (String) raw.get("effect"), Effect.DENY); + String name = (String) raw.get("name"); + int weight = (int) raw.get("weight"); + + // Nodes + Object rawNodes = raw.get("nodes"); + List> nodeList = new ArrayList<>(); + + if (rawNodes instanceof List list) { + for (Object o : list) { + if (o instanceof Map map) + nodeList.add((Map) map); + } + } + + List nodes = PolicyNode.parseNodes(nodeList, effect); + return parse(new Core(name, nodes, nodesAllowList, policyAllowList, effect, weight), raw); + } + + Policy parse(Core corePolicy, Map raw); } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java index 9f256af..6a7c3b4 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/PolicyParsers.java @@ -2,6 +2,8 @@ package io.github.adrianvic.nemesiseye.policy; import io.github.adrianvic.nemesiseye.policy.parser.GlobalPolicyParser; import io.github.adrianvic.nemesiseye.policy.parser.LocationPolicyParser; +import io.github.adrianvic.nemesiseye.policy.parser.PermissionPolicyParser; +import io.github.adrianvic.nemesiseye.policy.parser.PlayerNamePolicyParser; import java.util.HashMap; import java.util.Map; @@ -12,6 +14,8 @@ public class PolicyParsers { static { handlers.put("location", new LocationPolicyParser()); handlers.put("global", new GlobalPolicyParser()); + handlers.put("playerName", new PlayerNamePolicyParser()); + handlers.put("permission", new PermissionPolicyParser()); } public static PolicyParser get(String type) { diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java index db54c09..ed5c4fa 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/attackWith.java @@ -13,11 +13,11 @@ public class attackWith implements NodeHandler { private final static Glimmer glim = Nemesis.getInstance().getGlimmer(); @Override - public boolean allows(HumanEntity entity, PolicyNode node, Action action) { + public boolean check(HumanEntity entity, PolicyNode node, Action action) { if (action == Action.HIT) { for (String s : DataShifter.parseValueToStringList(node.values())) { boolean matches = DataShifter.safeMatches(s, glim.getItemInMainHandHumanEntity(entity).getType().toString()); - if (matches) return node.isWhitelist(); + if (matches) return false; } } return true; diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java index e34c28f..4d3ef49 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useEnchantment.java @@ -13,7 +13,7 @@ public class useEnchantment implements NodeHandler { private final Glimmer glim = Nemesis.getInstance().getGlimmer(); @Override - public boolean allows(HumanEntity entity, PolicyNode node, Action action) { + public boolean check(HumanEntity entity, PolicyNode node, Action action) { ItemStack item = glim.getItemInMainHandHumanEntity(entity); if (!glim.hasItemMeta(item)) return true; @@ -22,6 +22,6 @@ public class useEnchantment implements NodeHandler { boolean matches = glim.hasEnchantment(item, DataShifter.parseValueToStringMap(node.values())); - return matches ? node.isWhitelist() : !node.isWhitelist(); + return matches; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java index a28a700..bcbccf4 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/handlers/useItem.java @@ -13,13 +13,13 @@ public class useItem implements NodeHandler { private final Glimmer glim = Nemesis.getInstance().getGlimmer(); @Override - public boolean allows(HumanEntity entity, PolicyNode node, Action action) { + public boolean check(HumanEntity entity, PolicyNode node, Action action) { String type = glim.getItemInMainHandHumanEntity(entity).getType().toString(); for (String s : DataShifter.parseValueToStringList(node.values())) { boolean matches = DataShifter.safeMatches(s, type); - if (matches) return node.isWhitelist(); + if (matches) return false; } - return !node.isWhitelist(); + return true; } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/GlobalPolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/GlobalPolicyParser.java index 8716f02..d77f510 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/GlobalPolicyParser.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/GlobalPolicyParser.java @@ -1,32 +1,15 @@ package io.github.adrianvic.nemesiseye.policy.parser; import io.github.adrianvic.nemesiseye.policy.Policy; -import io.github.adrianvic.nemesiseye.policy.PolicyNode; import io.github.adrianvic.nemesiseye.policy.PolicyParser; +import io.github.adrianvic.nemesiseye.policy.policies.Core; import io.github.adrianvic.nemesiseye.policy.policies.GlobalPolicy; -import java.util.ArrayList; -import java.util.List; import java.util.Map; public class GlobalPolicyParser implements PolicyParser { @Override - public Policy parse(Map raw) { - boolean allowlist = (boolean) raw.get("allowList"); - String name = (String) raw.get("name"); - - // Nodes - Object rawNodes = raw.get("nodes"); - List> nodeList = new ArrayList<>(); - if (rawNodes instanceof List list) { - for (Object o : list) { - if (o instanceof Map map) - nodeList.add((Map) map); - } - } - - List nodes = PolicyNode.parseNodes(nodeList, allowlist); - - return new GlobalPolicy(name, nodes, allowlist); + public Policy parse(Core corePolicy, Map raw) { + return new GlobalPolicy(corePolicy.name(), corePolicy.nodes(), corePolicy.nodeAllowlist(), corePolicy.policyAllowList(), corePolicy.effect(), corePolicy.weight()); } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java index cacf4e9..ff7ecd7 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/LocationPolicyParser.java @@ -3,6 +3,7 @@ package io.github.adrianvic.nemesiseye.policy.parser; import io.github.adrianvic.nemesiseye.DataShifter; import io.github.adrianvic.nemesiseye.Nemesis; import io.github.adrianvic.nemesiseye.policy.*; +import io.github.adrianvic.nemesiseye.policy.policies.Core; import io.github.adrianvic.nemesiseye.policy.policies.LocationPolicy; import io.github.adrianvic.nemesiseye.reflection.Glimmer; @@ -13,24 +14,8 @@ import java.util.Map; public class LocationPolicyParser implements PolicyParser { private Glimmer glim = Nemesis.getInstance().getGlimmer(); - public Policy parse(Map raw) { - String name = (String) raw.get("name"); - boolean allowlist = Boolean.TRUE.equals(raw.get("allowList")); - - // Nodes - Object rawNodes = raw.get("nodes"); - List> nodeList = new ArrayList<>(); - if (rawNodes instanceof List list) { - for (Object o : list) { - if (o instanceof Map map) - nodeList.add((Map) map); - } - } - - List nodes = PolicyNode.parseNodes(nodeList, allowlist); - - List locations = DataShifter.configLocationParser(raw.get("locations")); - - return new LocationPolicy(name, locations, nodes, allowlist); + public Policy parse(Core corePolicy, Map raw) { + List locations = DataShifter.configLocationParser(raw.get("locations")); + return new LocationPolicy(corePolicy.name(), locations, corePolicy.nodes(), corePolicy.nodeAllowlist(), corePolicy.policyAllowList(), corePolicy.effect(), corePolicy.weight()); } } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/PermissionPolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/PermissionPolicyParser.java new file mode 100644 index 0000000..56d4dbc --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/PermissionPolicyParser.java @@ -0,0 +1,29 @@ +package io.github.adrianvic.nemesiseye.policy.parser; + +import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import io.github.adrianvic.nemesiseye.policy.PolicyParser; +import io.github.adrianvic.nemesiseye.policy.policies.Core; +import io.github.adrianvic.nemesiseye.policy.policies.PermissionPolicy; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PermissionPolicyParser implements PolicyParser { + @Override + public Policy parse(Core corePolicy, Map raw) { + Object rawPerms = raw.get("permissions"); + List permissions = new ArrayList<>(); + + if (rawPerms instanceof List list) { + for (Object o : list) { + if (o instanceof String s) { + permissions.add(s); + } + } + } + + return new PermissionPolicy(corePolicy.name(), permissions, corePolicy.nodes(), corePolicy.nodeAllowlist(), corePolicy.policyAllowList(), corePolicy.effect(), corePolicy.weight()); + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/PlayerNamePolicyParser.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/PlayerNamePolicyParser.java new file mode 100644 index 0000000..88f42c0 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/parser/PlayerNamePolicyParser.java @@ -0,0 +1,28 @@ +package io.github.adrianvic.nemesiseye.policy.parser; + +import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyParser; +import io.github.adrianvic.nemesiseye.policy.policies.Core; +import io.github.adrianvic.nemesiseye.policy.policies.PlayerNamePolicy; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PlayerNamePolicyParser implements PolicyParser { + @Override + public Policy parse(Core corePolicy, Map raw) { + Object rawNames = raw.get("names"); + List names = new ArrayList<>(); + + if (rawNames instanceof List list) { + for (Object o : list) { + if (o instanceof String s) { + names.add(s); + } + } + } + + return new PlayerNamePolicy(corePolicy.name(), names, corePolicy.nodes(), corePolicy.nodeAllowlist(), corePolicy.effect(), corePolicy.policyAllowList(), corePolicy.weight()); + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/Core.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/Core.java new file mode 100644 index 0000000..1fe2c94 --- /dev/null +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/Core.java @@ -0,0 +1,15 @@ +package io.github.adrianvic.nemesiseye.policy.policies; + +import io.github.adrianvic.nemesiseye.policy.Effect; +import io.github.adrianvic.nemesiseye.policy.Policy; +import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import org.bukkit.entity.HumanEntity; + +import java.util.List; + +public record Core(String name, List nodes, boolean nodeAllowlist, boolean policyAllowList, Effect effect, int weight) implements Policy { + @Override + public boolean applies(HumanEntity entity) { + return false; + } +} \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java index c9797a0..4ca2125 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/GlobalPolicy.java @@ -1,12 +1,13 @@ package io.github.adrianvic.nemesiseye.policy.policies; +import io.github.adrianvic.nemesiseye.policy.Effect; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import org.bukkit.entity.HumanEntity; import java.util.List; -public record GlobalPolicy(String name, List nodes, boolean allowlist) implements Policy { +public record GlobalPolicy(String name, List nodes, boolean nodeAllowlist, boolean policyAllowList, Effect effect, int weight) implements Policy { public boolean applies(HumanEntity entity) { return true; } diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java index 8e63cf6..5b068cf 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/LocationPolicy.java @@ -1,5 +1,6 @@ package io.github.adrianvic.nemesiseye.policy.policies; +import io.github.adrianvic.nemesiseye.policy.Effect; import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; import io.github.adrianvic.nemesiseye.reflection.Glimmer; @@ -7,12 +8,12 @@ import org.bukkit.entity.HumanEntity; import java.util.List; -public record LocationPolicy(String name, List locations, List nodes, boolean allowlist) implements Policy { +public record LocationPolicy(String name, List locations, List nodes, boolean nodeAllowlist, boolean policyAllowList, Effect effect, int weight) implements Policy { @Override public boolean applies(HumanEntity entity) { for (Glimmer.Box box : locations) { - if (box.contains(entity.getLocation().toVector())) return true; + if (box.contains(entity.getLocation().toVector())) return !policyAllowList; } - return false; + return policyAllowList; } } \ No newline at end of file diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java index b1c63dc..b647a5a 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PermissionPolicy.java @@ -1,8 +1,19 @@ package io.github.adrianvic.nemesiseye.policy.policies; +import io.github.adrianvic.nemesiseye.policy.Effect; +import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; import org.bukkit.permissions.Permission; import java.util.ArrayList; +import java.util.List; -public record PermissionPolicy(String name, ArrayList permissions, PolicyNode nodes, boolean allowlist) {} +public record PermissionPolicy(String name, List permissions, List nodes, boolean nodeAllowlist, boolean policyAllowList, Effect effect, int weight) implements Policy { + + @Override + public boolean applies(HumanEntity entity) { + return true; + } +} diff --git a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java index 2a1a821..29fda34 100644 --- a/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java +++ b/src/main/java/io/github/adrianvic/nemesiseye/policy/policies/PlayerNamePolicy.java @@ -1,7 +1,20 @@ package io.github.adrianvic.nemesiseye.policy.policies; +import io.github.adrianvic.nemesiseye.policy.Effect; +import io.github.adrianvic.nemesiseye.policy.Policy; import io.github.adrianvic.nemesiseye.policy.PolicyNode; +import org.bukkit.entity.HumanEntity; -import java.util.ArrayList; +import java.util.List; -public record PlayerNamePolicy(String name, ArrayList playerName, PolicyNode nodes, boolean allowlist) {} \ No newline at end of file +public record PlayerNamePolicy(String name, List playerName, List nodes, boolean nodeAllowlist, Effect effect, boolean policyAllowList, int weight) implements Policy { + + @Override + public boolean applies(HumanEntity entity) { + if (playerName.contains(entity.getName())) { + return !policyAllowList(); + } else { + return policyAllowList(); + } + } +} \ No newline at end of file diff --git a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java index 3cdd6fd..239ab38 100644 --- a/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java +++ b/src/r1_21/java/io/github/adrianvic/nemesiseye/impl/r1_21.java @@ -47,6 +47,7 @@ public class r1_21 implements Glimmer { for (Map policyMap : rawPolicies) { if (policyMap.get("type") != null && policyMap.get("type") instanceof String type) { + System.out.println(type); allPolicies.add(PolicyParsers.get(type).parse(policyMap)); } } diff --git a/src/r1_21/resources/settings.yml b/src/r1_21/resources/settings.yml index 0336fb6..34ad038 100644 --- a/src/r1_21/resources/settings.yml +++ b/src/r1_21/resources/settings.yml @@ -1,13 +1,26 @@ Policies: - # NO SPACES - - name: "Beta-1.7.3-items-only" - type: "location" - allowList: true # Will deny anything that's not allowed by the nodes if set to true + - name: "Bedrock-only-admins" + type: "permission" + effect: ALLOW + weight: 1 + policyAllowList: true + permissions: + - "server.usebedrock" + nodes: + - [INTERACT]: + values: + - BEDROCK + + - name: "Beta-1.7.3-items-only" # No spaces here or else commands which need the name as argument will not work + type: "location" # global | location | permission | playerName + effect: ALLOWONLY # DENY | ALLOW (overrides deny) | ALLOWONLY (allow only if met) + weight: 0 # Greater weight overrides lower + policyAllowList: false # Inverts the policy validation logic, for example a location policy will affect all players NOT inside it's location locations: - corner1: { x: 2100, y: 256, z: 1400 } corner2: { x: 1000, y: -64, z: 2200 } nodes: - - useItem: + - [INTERACT]: values: - AIR - STONE @@ -106,7 +119,7 @@ Policies: - FISHING_ROD - CLOCK - GLOWSTONE_DUST - - INK_SACw + - INK_SAC - BONE_MEAL - SUGAR - COOKIE @@ -117,5 +130,5 @@ Policies: - MUSIC_DISK_13 - DIRT - BREAD - - useEnchantment: + - [USE_ENCHANTMENT]: "flying bananas": "0" \ No newline at end of file