From 89ac1291b761e8a4df638cb73563ba9865d6da52 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 9 Aug 2024 22:29:04 +0200 Subject: [PATCH 01/10] Refactor indentation in CommandSuggestionProvider Adjusted the indentation for the getSuggestions method to improve readability. This change does not alter the functionality but ensures consistent code formatting. --- .../paper/command/CommandSuggestionProvider.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/command/CommandSuggestionProvider.java b/paper/src/main/java/net/thenextlvl/commander/paper/command/CommandSuggestionProvider.java index bcc1359..92a7264 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/command/CommandSuggestionProvider.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/command/CommandSuggestionProvider.java @@ -20,12 +20,12 @@ class CommandSuggestionProvider implements SuggestionProvider getSuggestions(CommandContext context, SuggestionsBuilder builder) { - Bukkit.getCommandMap().getKnownCommands().values().stream() - .map(Command::getLabel) - .filter(s -> !plugin.commandRegistry().isUnregistered(s)) - .map(StringArgumentType::escapeIfRequired) - .filter(s -> s.contains(builder.getRemaining())) - .forEach(builder::suggest); + Bukkit.getCommandMap().getKnownCommands().values().stream() + .map(Command::getLabel) + .filter(s -> !plugin.commandRegistry().isUnregistered(s)) + .map(StringArgumentType::escapeIfRequired) + .filter(s -> s.contains(builder.getRemaining())) + .forEach(builder::suggest); return builder.buildFuture(); } } From df855252d192ea1e03da4523120d58ba14a97145 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 9 Aug 2024 22:29:28 +0200 Subject: [PATCH 02/10] Refactor command handling logic to improve matching Utilize `findCommands` method to streamline command lookup and matching. This enhances maintainability and ensure consistent command filtering across multiple operations like hide, register, reveal, and unregister. Introduces regex pattern matching to support more flexible command searches. --- .../implementation/PaperCommandRegistry.java | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java index 5bab6c8..a2116bd 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java @@ -5,8 +5,8 @@ import core.file.format.GsonFile; import core.io.IO; import lombok.Getter; -import net.thenextlvl.commander.paper.CommanderPlugin; import net.thenextlvl.commander.CommandRegistry; +import net.thenextlvl.commander.paper.CommanderPlugin; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -14,6 +14,9 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; @Getter public class PaperCommandRegistry implements CommandRegistry { @@ -44,8 +47,9 @@ public Set unregisteredCommands() { @Override public boolean hide(String command) { - return Bukkit.getCommandMap().getKnownCommands().containsKey(command) - && hiddenFile.getRoot().add(command); + return !findCommands(command).stream() + .filter(hiddenFile.getRoot()::add) + .toList().isEmpty(); } @Override @@ -60,22 +64,33 @@ public boolean isUnregistered(String command) { @Override public boolean register(String command) { - return unregisteredFile.getRoot().remove(command) && internalRegister(command); + return !findCommands(Set.copyOf(commands.keySet()).stream(), command).stream() + .filter(unregisteredFile.getRoot()::remove) + .filter(this::internalRegister) + .toList().isEmpty(); } @Override public boolean reveal(String command) { - return hiddenFile.getRoot().remove(command); + return !findCommands(command).stream() + .filter(hiddenFile.getRoot()::remove) + .toList().isEmpty(); } @Override public boolean unregister(String command) { - return unregisteredFile.getRoot().add(command) && internalUnregister(command); + return !findCommands(command).stream() + .filter(s -> !s.equals("commander:command")) + .filter(unregisteredFile.getRoot()::add) + .filter(this::internalUnregister) + .toList().isEmpty(); } @Override public void unregisterCommands() { - unregisteredCommands().forEach(this::internalUnregister); + unregisteredCommands().stream() + .filter(command -> !command.equals("commander:command")) + .forEach(this::internalUnregister); } private boolean internalRegister(String command) { @@ -91,4 +106,19 @@ private boolean internalUnregister(String command) { commands.put(command, registered); return true; } + + private Set findCommands(String input) { + return findCommands(Bukkit.getCommandMap().getKnownCommands().entrySet() + .stream().mapMulti((entry, consumer) -> { + consumer.accept(entry.getKey()); + entry.getValue().getAliases().forEach(consumer); + }), input); + } + + private Set findCommands(Stream commands, String input) { + var pattern = Pattern.compile(input.replace("*", ".*")); + return commands.filter(command -> + pattern.matcher(command).matches() + ).collect(Collectors.toSet()); + } } From effa89a094a4e187d1ff839015fc0fef409c0c49 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 9 Aug 2024 22:58:25 +0200 Subject: [PATCH 03/10] Make `findCommands` methods static Refactored `findCommands` methods to be static for better accessibility and potential use without needing an instance of `PaperCommandRegistry`. This change will also help in simplifying unit tests related to command finding functionality. --- .../commander/paper/implementation/PaperCommandRegistry.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java index a2116bd..2fb4d24 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java @@ -107,7 +107,7 @@ private boolean internalUnregister(String command) { return true; } - private Set findCommands(String input) { + static Set findCommands(String input) { return findCommands(Bukkit.getCommandMap().getKnownCommands().entrySet() .stream().mapMulti((entry, consumer) -> { consumer.accept(entry.getKey()); @@ -115,7 +115,7 @@ private Set findCommands(String input) { }), input); } - private Set findCommands(Stream commands, String input) { + static Set findCommands(Stream commands, String input) { var pattern = Pattern.compile(input.replace("*", ".*")); return commands.filter(command -> pattern.matcher(command).matches() From 1d7c36b7c675b09206eee13413a6b26281b36665 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 9 Aug 2024 22:58:46 +0200 Subject: [PATCH 04/10] Refactor permission override mechanism Replace direct permission and reset operations with bulk command handling using 'findCommands'. This enhancement ensures that all relevant commands are consistently updated or reset, streamlining the internal logic and improving maintainability. --- .../implementation/PaperPermissionOverride.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java index 929b4bc..b150596 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java @@ -13,6 +13,8 @@ import java.util.*; +import static net.thenextlvl.commander.paper.implementation.PaperCommandRegistry.findCommands; + @Getter @RequiredArgsConstructor public class PaperPermissionOverride implements PermissionOverride { @@ -53,15 +55,20 @@ public boolean isOverridden(String command) { @Override public boolean override(String command, @Nullable String permission) { - overridesFile.getRoot().put(command, permission); - return internalOverride(command, permission); + var commands = findCommands(command).stream() + .filter(s -> internalOverride(s, permission)) + .toList(); + commands.forEach(s -> overridesFile.getRoot().put(s, permission)); + return !commands.isEmpty(); } @Override public boolean reset(String command) { - if (!isOverridden(command)) return false; - overridesFile.getRoot().remove(command); - return internalReset(command); + var commands = findCommands(Set.copyOf(overridesFile.getRoot().keySet()).stream(), command); + commands.forEach(overridesFile.getRoot()::remove); + return !commands.stream() + .filter(this::internalReset) + .toList().isEmpty(); } @Override From def1af3b6f73f47796a25422a0ebb5b302ed865a Mon Sep 17 00:00:00 2001 From: david Date: Fri, 9 Aug 2024 23:12:52 +0200 Subject: [PATCH 05/10] Make immutable maps and sets null value safe --- .../paper/implementation/PaperCommandRegistry.java | 6 +++--- .../paper/implementation/PaperPermissionOverride.java | 11 +++++++---- .../velocity/implementation/ProxyCommandRegistry.java | 4 ++-- .../implementation/ProxyPermissionOverride.java | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java index 2fb4d24..602fdba 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java @@ -37,12 +37,12 @@ public PaperCommandRegistry(CommanderPlugin plugin) { @Override public Set hiddenCommands() { - return Set.copyOf(hiddenFile.getRoot()); + return new HashSet<>(hiddenFile.getRoot()); } @Override public Set unregisteredCommands() { - return Set.copyOf(unregisteredFile.getRoot()); + return new HashSet<>(unregisteredFile.getRoot()); } @Override @@ -64,7 +64,7 @@ public boolean isUnregistered(String command) { @Override public boolean register(String command) { - return !findCommands(Set.copyOf(commands.keySet()).stream(), command).stream() + return !findCommands(new HashSet<>(commands.keySet()).stream(), command).stream() .filter(unregisteredFile.getRoot()::remove) .filter(this::internalRegister) .toList().isEmpty(); diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java index b150596..0e963c5 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java @@ -11,7 +11,10 @@ import org.bukkit.Bukkit; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; import static net.thenextlvl.commander.paper.implementation.PaperCommandRegistry.findCommands; @@ -30,12 +33,12 @@ public PaperPermissionOverride(CommanderPlugin plugin) { @Override public Map overrides() { - return Map.copyOf(overridesFile.getRoot()); + return new HashMap<>(overridesFile.getRoot()); } @Override public Map originalPermissions() { - return Map.copyOf(originalPermissions); + return new HashMap<>(originalPermissions); } @Override @@ -64,7 +67,7 @@ public boolean override(String command, @Nullable String permission) { @Override public boolean reset(String command) { - var commands = findCommands(Set.copyOf(overridesFile.getRoot().keySet()).stream(), command); + var commands = findCommands(new HashSet<>(overridesFile.getRoot().keySet()).stream(), command); commands.forEach(overridesFile.getRoot()::remove); return !commands.stream() .filter(this::internalReset) diff --git a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandRegistry.java b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandRegistry.java index 0b1ed14..df94e6c 100644 --- a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandRegistry.java +++ b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandRegistry.java @@ -31,12 +31,12 @@ public ProxyCommandRegistry(CommanderPlugin plugin) { @Override public Set hiddenCommands() { - return Set.copyOf(hiddenFile.getRoot()); + return new HashSet<>(hiddenFile.getRoot()); } @Override public Set unregisteredCommands() { - return Set.copyOf(unregisteredFile.getRoot()); + return new HashSet<>(unregisteredFile.getRoot()); } @Override diff --git a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyPermissionOverride.java b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyPermissionOverride.java index e80aa19..762213c 100644 --- a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyPermissionOverride.java +++ b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyPermissionOverride.java @@ -28,7 +28,7 @@ public ProxyPermissionOverride(CommanderPlugin plugin) { @Override public Map overrides() { - return Map.copyOf(overridesFile.getRoot()); + return new HashMap<>(overridesFile.getRoot()); } @Override From f5469a5ebd93426c57ab4f72b9ce2847cf3a4b2b Mon Sep 17 00:00:00 2001 From: david Date: Sat, 10 Aug 2024 17:06:07 +0200 Subject: [PATCH 06/10] Add CommandFinder interface and implementations Introduce the CommandFinder interface to streamline command search functionality. Added implementations for both Paper and Velocity platforms. Also updated Commander and related plugins to integrate the CommandFinder feature. --- .../thenextlvl/commander/CommandFinder.java | 26 ++++++++++++++++ .../net/thenextlvl/commander/Commander.java | 6 ++++ .../commander/paper/CommanderPlugin.java | 2 ++ .../implementation/PaperCommandFinder.java | 30 +++++++++++++++++++ .../commander/velocity/CommanderPlugin.java | 3 ++ .../implementation/ProxyCommandFinder.java | 28 +++++++++++++++++ 6 files changed, 95 insertions(+) create mode 100644 api/src/main/java/net/thenextlvl/commander/CommandFinder.java create mode 100644 paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandFinder.java create mode 100644 velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandFinder.java diff --git a/api/src/main/java/net/thenextlvl/commander/CommandFinder.java b/api/src/main/java/net/thenextlvl/commander/CommandFinder.java new file mode 100644 index 0000000..c37382d --- /dev/null +++ b/api/src/main/java/net/thenextlvl/commander/CommandFinder.java @@ -0,0 +1,26 @@ +package net.thenextlvl.commander; + +import java.util.Set; +import java.util.stream.Stream; + +/** + * The CommandFinder interface defines methods for finding commands based on a given input. + */ +public interface CommandFinder { + /** + * Finds commands based on the given input. + * + * @param input The input used to search for commands. + * @return A set of strings representing the found commands. + */ + Set findCommands(String input); + + /** + * This method finds commands based on a given input. + * + * @param commands The stream of commands to search for. + * @param input The input used to search for commands. + * @return A set of strings representing the found commands. + */ + Set findCommands(Stream commands, String input); +} diff --git a/api/src/main/java/net/thenextlvl/commander/Commander.java b/api/src/main/java/net/thenextlvl/commander/Commander.java index 2fd42bb..a13edcd 100644 --- a/api/src/main/java/net/thenextlvl/commander/Commander.java +++ b/api/src/main/java/net/thenextlvl/commander/Commander.java @@ -5,6 +5,12 @@ @MethodsReturnNotNullByDefault public interface Commander { + /** + * Retrieves the CommandFinder instance associated with the Commander. + * + * @return the CommandFinder instance + */ + CommandFinder commandFinder(); /** * Retrieves the ComponentBundle associated with the Commander. diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/CommanderPlugin.java b/paper/src/main/java/net/thenextlvl/commander/paper/CommanderPlugin.java index 25b9eb7..e3f3a56 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/CommanderPlugin.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/CommanderPlugin.java @@ -8,6 +8,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.thenextlvl.commander.Commander; import net.thenextlvl.commander.paper.command.CommanderCommand; +import net.thenextlvl.commander.paper.implementation.PaperCommandFinder; import net.thenextlvl.commander.paper.implementation.PaperCommandRegistry; import net.thenextlvl.commander.paper.implementation.PaperPermissionOverride; import net.thenextlvl.commander.paper.listener.CommandListener; @@ -38,6 +39,7 @@ public class CommanderPlugin extends JavaPlugin implements Commander { Placeholder.component("prefix", bundle.component(Locale.US, "prefix")) )).build()); + private final PaperCommandFinder commandFinder = new PaperCommandFinder(this); private final PaperCommandRegistry commandRegistry = new PaperCommandRegistry(this); private final PaperPermissionOverride permissionOverride = new PaperPermissionOverride(this); diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandFinder.java b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandFinder.java new file mode 100644 index 0000000..7f6990a --- /dev/null +++ b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandFinder.java @@ -0,0 +1,30 @@ +package net.thenextlvl.commander.paper.implementation; + +import lombok.RequiredArgsConstructor; +import net.thenextlvl.commander.CommandFinder; +import net.thenextlvl.commander.paper.CommanderPlugin; + +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@RequiredArgsConstructor +public class PaperCommandFinder implements CommandFinder { + private final CommanderPlugin plugin; + + public Set findCommands(String input) { + return findCommands(plugin.getServer().getCommandMap().getKnownCommands().entrySet() + .stream().mapMulti((entry, consumer) -> { + consumer.accept(entry.getKey()); + entry.getValue().getAliases().forEach(consumer); + }), input); + } + + public Set findCommands(Stream commands, String input) { + var pattern = Pattern.compile(input.replace("*", ".*")); + return commands.filter(command -> + pattern.matcher(command).matches() + ).collect(Collectors.toSet()); + } +} diff --git a/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java b/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java index c891782..dcc4681 100644 --- a/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java +++ b/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java @@ -17,6 +17,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.thenextlvl.commander.Commander; import net.thenextlvl.commander.velocity.command.CommanderCommand; +import net.thenextlvl.commander.velocity.implementation.ProxyCommandFinder; import net.thenextlvl.commander.velocity.implementation.ProxyCommandRegistry; import net.thenextlvl.commander.velocity.implementation.ProxyPermissionOverride; import net.thenextlvl.commander.velocity.listener.CommandListener; @@ -39,6 +40,7 @@ public class CommanderPlugin implements Commander { private final CommanderVersionChecker versionChecker = new CommanderVersionChecker(this); private final ComponentBundle bundle; + private final ProxyCommandFinder commandFinder; private final ProxyCommandRegistry commandRegistry; private final ProxyPermissionOverride permissionOverride; private final Metrics.Factory metricsFactory; @@ -60,6 +62,7 @@ public CommanderPlugin(ProxyServer server, Logger logger, @DataDirectory Path da TagResolver.standard(), Placeholder.component("prefix", bundle.component(Locale.US, "prefix")) )).build()); + this.commandFinder = new ProxyCommandFinder(this); this.commandRegistry = new ProxyCommandRegistry(this); this.permissionOverride = new ProxyPermissionOverride(this); checkVersionUpdate(); diff --git a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandFinder.java b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandFinder.java new file mode 100644 index 0000000..a7c492d --- /dev/null +++ b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandFinder.java @@ -0,0 +1,28 @@ +package net.thenextlvl.commander.velocity.implementation; + +import lombok.RequiredArgsConstructor; +import net.thenextlvl.commander.CommandFinder; +import net.thenextlvl.commander.velocity.CommanderPlugin; + +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@RequiredArgsConstructor +public class ProxyCommandFinder implements CommandFinder { + private final CommanderPlugin plugin; + + @Override + public Set findCommands(String input) { + return findCommands(plugin.server().getCommandManager().getAliases().stream(), input); + } + + @Override + public Set findCommands(Stream commands, String input) { + var pattern = Pattern.compile(input.replace("*", ".*")); + return commands.filter(command -> + pattern.matcher(command).matches() + ).collect(Collectors.toSet()); + } +} From 64b5fb16b81024d584f6c32d531ebc0a7f45bd08 Mon Sep 17 00:00:00 2001 From: david Date: Sat, 10 Aug 2024 17:06:53 +0200 Subject: [PATCH 07/10] Integrate commandFinder utility in Paper components Refactor PaperCommandRegistry and PaperPermissionOverride to use the plugin's commandFinder utility for command searching. This enhances code maintainability by centralizing command lookup logic and removes redundant static methods. --- .../implementation/PaperCommandRegistry.java | 32 +++++-------------- .../PaperPermissionOverride.java | 10 +++--- 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java index 602fdba..e593113 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperCommandRegistry.java @@ -14,25 +14,24 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.Stream; @Getter public class PaperCommandRegistry implements CommandRegistry { private final Map commands = new HashMap<>(); private final FileIO> hiddenFile; private final FileIO> unregisteredFile; + private final CommanderPlugin plugin; public PaperCommandRegistry(CommanderPlugin plugin) { this.hiddenFile = new GsonFile>( IO.of(plugin.getDataFolder(), "hidden-commands.json"), new HashSet<>(), new TypeToken<>() { - }).saveIfAbsent(); + }).reload().saveIfAbsent(); this.unregisteredFile = new GsonFile>( IO.of(plugin.getDataFolder(), "removed-commands.json"), new HashSet<>(), new TypeToken<>() { - }).saveIfAbsent(); + }).reload().saveIfAbsent(); + this.plugin = plugin; } @Override @@ -47,7 +46,7 @@ public Set unregisteredCommands() { @Override public boolean hide(String command) { - return !findCommands(command).stream() + return !plugin.commandFinder().findCommands(command).stream() .filter(hiddenFile.getRoot()::add) .toList().isEmpty(); } @@ -64,7 +63,7 @@ public boolean isUnregistered(String command) { @Override public boolean register(String command) { - return !findCommands(new HashSet<>(commands.keySet()).stream(), command).stream() + return !plugin.commandFinder().findCommands(new HashSet<>(commands.keySet()).stream(), command).stream() .filter(unregisteredFile.getRoot()::remove) .filter(this::internalRegister) .toList().isEmpty(); @@ -72,14 +71,14 @@ public boolean register(String command) { @Override public boolean reveal(String command) { - return !findCommands(command).stream() + return !plugin.commandFinder().findCommands(new HashSet<>(hiddenFile.getRoot()).stream(), command).stream() .filter(hiddenFile.getRoot()::remove) .toList().isEmpty(); } @Override public boolean unregister(String command) { - return !findCommands(command).stream() + return !plugin.commandFinder().findCommands(command).stream() .filter(s -> !s.equals("commander:command")) .filter(unregisteredFile.getRoot()::add) .filter(this::internalUnregister) @@ -106,19 +105,4 @@ private boolean internalUnregister(String command) { commands.put(command, registered); return true; } - - static Set findCommands(String input) { - return findCommands(Bukkit.getCommandMap().getKnownCommands().entrySet() - .stream().mapMulti((entry, consumer) -> { - consumer.accept(entry.getKey()); - entry.getValue().getAliases().forEach(consumer); - }), input); - } - - static Set findCommands(Stream commands, String input) { - var pattern = Pattern.compile(input.replace("*", ".*")); - return commands.filter(command -> - pattern.matcher(command).matches() - ).collect(Collectors.toSet()); - } } diff --git a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java index 0e963c5..49f3671 100644 --- a/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java +++ b/paper/src/main/java/net/thenextlvl/commander/paper/implementation/PaperPermissionOverride.java @@ -16,19 +16,19 @@ import java.util.Map; import java.util.Objects; -import static net.thenextlvl.commander.paper.implementation.PaperCommandRegistry.findCommands; - @Getter @RequiredArgsConstructor public class PaperPermissionOverride implements PermissionOverride { private final Map originalPermissions = new HashMap<>(); private final FileIO> overridesFile; + private final CommanderPlugin plugin; public PaperPermissionOverride(CommanderPlugin plugin) { this.overridesFile = new GsonFile>( IO.of(plugin.getDataFolder(), "permission-overrides.json"), new HashMap<>(), new TypeToken<>() { - }).saveIfAbsent(); + }).reload().saveIfAbsent(); + this.plugin = plugin; } @Override @@ -58,7 +58,7 @@ public boolean isOverridden(String command) { @Override public boolean override(String command, @Nullable String permission) { - var commands = findCommands(command).stream() + var commands = plugin.commandFinder().findCommands(command).stream() .filter(s -> internalOverride(s, permission)) .toList(); commands.forEach(s -> overridesFile.getRoot().put(s, permission)); @@ -67,7 +67,7 @@ public boolean override(String command, @Nullable String permission) { @Override public boolean reset(String command) { - var commands = findCommands(new HashSet<>(overridesFile.getRoot().keySet()).stream(), command); + var commands = plugin.commandFinder().findCommands(new HashSet<>(overridesFile.getRoot().keySet()).stream(), command); commands.forEach(overridesFile.getRoot()::remove); return !commands.stream() .filter(this::internalReset) From 6ecdd633f90656b6d47ff27e8a5ef65666e5c830 Mon Sep 17 00:00:00 2001 From: david Date: Sat, 10 Aug 2024 17:07:16 +0200 Subject: [PATCH 08/10] Enhance command handling in Proxy classes Update `ProxyCommandRegistry` and `ProxyPermissionOverride` to improve command lookup and manipulation. Ensure hidden, unregistered, and overridden commands are accurately processed by integrating enhanced command finding logic. --- .../implementation/ProxyCommandRegistry.java | 24 +++++++++++++------ .../ProxyPermissionOverride.java | 18 ++++++++++---- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandRegistry.java b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandRegistry.java index df94e6c..3969157 100644 --- a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandRegistry.java +++ b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyCommandRegistry.java @@ -21,11 +21,11 @@ public ProxyCommandRegistry(CommanderPlugin plugin) { this.hiddenFile = new GsonFile>( IO.of(plugin.dataFolder().toFile(), "hidden-commands.json"), new HashSet<>(), new TypeToken<>() { - }).saveIfAbsent(); + }).reload().saveIfAbsent(); this.unregisteredFile = new GsonFile>( IO.of(plugin.dataFolder().toFile(), "removed-commands.json"), new HashSet<>(), new TypeToken<>() { - }).saveIfAbsent(); + }).reload().saveIfAbsent(); this.plugin = plugin; } @@ -41,7 +41,9 @@ public Set unregisteredCommands() { @Override public boolean hide(String command) { - return hiddenFile.getRoot().add(command); + return !plugin.commandFinder().findCommands(command).stream() + .filter(hiddenFile.getRoot()::add) + .toList().isEmpty(); } @Override @@ -56,18 +58,26 @@ public boolean isUnregistered(String command) { @Override public boolean register(String command) { - return unregisteredFile.getRoot().remove(command); + return !plugin.commandFinder().findCommands(new HashSet<>(unregisteredFile.getRoot()).stream(), command).stream() + .filter(unregisteredFile.getRoot()::remove) + .toList().isEmpty(); } @Override public boolean reveal(String command) { - return hiddenFile.getRoot().remove(command); + return !plugin.commandFinder().findCommands(new HashSet<>(hiddenFile.getRoot()).stream(), command).stream() + .filter(hiddenFile.getRoot()::remove) + .toList().isEmpty(); } @Override public boolean unregister(String command) { - if (!plugin.server().getCommandManager().hasCommand(command)) return false; - return unregisteredFile.getRoot().add(command) && internalUnregister(command); + return !plugin.commandFinder().findCommands(command).stream() + .filter(s -> !s.equals("commandv")) + .filter(plugin.server().getCommandManager()::hasCommand) + .filter(unregisteredFile.getRoot()::add) + .filter(this::internalUnregister) + .toList().isEmpty(); } @Override diff --git a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyPermissionOverride.java b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyPermissionOverride.java index 762213c..f371a35 100644 --- a/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyPermissionOverride.java +++ b/velocity/src/main/java/net/thenextlvl/commander/velocity/implementation/ProxyPermissionOverride.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Objects; @@ -18,12 +19,14 @@ @RequiredArgsConstructor public class ProxyPermissionOverride implements PermissionOverride { private final FileIO> overridesFile; + private final CommanderPlugin plugin; public ProxyPermissionOverride(CommanderPlugin plugin) { this.overridesFile = new GsonFile>( IO.of(plugin.dataFolder().toFile(), "permission-overrides.json"), new HashMap<>(), new TypeToken<>() { - }).saveIfAbsent(); + }).reload().saveIfAbsent(); + this.plugin = plugin; } @Override @@ -55,14 +58,19 @@ public boolean isOverridden(String command) { @Override public boolean override(String command, @Nullable String permission) { - return !Objects.equals(overridesFile.getRoot().put(command, permission), permission); + return !plugin.commandFinder().findCommands(command).stream() + .filter(s -> !Objects.equals(overridesFile.getRoot().put(s, permission), permission)) + .toList().isEmpty(); } @Override public boolean reset(String command) { - if (!isOverridden(command)) return false; - overridesFile.getRoot().remove(command); - return true; + var overridden = new HashSet<>(overridesFile.getRoot().keySet()).stream(); + var commands = plugin.commandFinder().findCommands(overridden, command); + return !commands.stream() + .filter(this::isOverridden) + .map(overridesFile.getRoot()::remove) + .toList().isEmpty(); } @Override From 64e44cd26981766cec105005b63b38c1f4312463 Mon Sep 17 00:00:00 2001 From: david Date: Sat, 10 Aug 2024 17:10:30 +0200 Subject: [PATCH 09/10] Update version to 4.1.0 Bump version from 4.0.0 to 4.1.0 in CommanderPlugin.java and build.gradle.kts. This reflects the latest changes and improvements in the project. --- api/build.gradle.kts | 2 +- .../java/net/thenextlvl/commander/velocity/CommanderPlugin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 8ac5786..9390510 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "net.thenextlvl.commander" -version = "4.0.0" +version = "4.1.0" repositories { mavenCentral() diff --git a/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java b/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java index dcc4681..f0aa4bd 100644 --- a/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java +++ b/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java @@ -36,7 +36,7 @@ name = "Commander", authors = "NonSwag", url = "https://thenextlvl.net", - version = "4.0.0") + version = "4.1.0") public class CommanderPlugin implements Commander { private final CommanderVersionChecker versionChecker = new CommanderVersionChecker(this); private final ComponentBundle bundle; From 7e6c87ae86ace95120a661d66bb5500d46a40f3a Mon Sep 17 00:00:00 2001 From: david Date: Sat, 10 Aug 2024 17:13:41 +0200 Subject: [PATCH 10/10] Revert "Update version to 4.1.0" This reverts commit 64e44cd26981766cec105005b63b38c1f4312463. --- api/build.gradle.kts | 2 +- .../java/net/thenextlvl/commander/velocity/CommanderPlugin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 9390510..8ac5786 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "net.thenextlvl.commander" -version = "4.1.0" +version = "4.0.0" repositories { mavenCentral() diff --git a/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java b/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java index f0aa4bd..dcc4681 100644 --- a/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java +++ b/velocity/src/main/java/net/thenextlvl/commander/velocity/CommanderPlugin.java @@ -36,7 +36,7 @@ name = "Commander", authors = "NonSwag", url = "https://thenextlvl.net", - version = "4.1.0") + version = "4.0.0") public class CommanderPlugin implements Commander { private final CommanderVersionChecker versionChecker = new CommanderVersionChecker(this); private final ComponentBundle bundle;