diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java b/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java index 08472a98..272c8627 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java @@ -102,6 +102,11 @@ public class BukkitCommandManager extends CommandManager { return completions; } + @Override + public boolean hasRegisteredCommands() { + return !registeredCommands.isEmpty(); + } + @Override public void registerCommand(BaseCommand command) { final String plugin = this.plugin.getName().toLowerCase(); diff --git a/core/src/main/java/co/aikar/commands/BaseCommand.java b/core/src/main/java/co/aikar/commands/BaseCommand.java index fac7d2b3..8b314bde 100644 --- a/core/src/main/java/co/aikar/commands/BaseCommand.java +++ b/core/src/main/java/co/aikar/commands/BaseCommand.java @@ -103,12 +103,13 @@ public abstract class BaseCommand { void onRegister(CommandManager manager, String cmd) { this.manager = manager; final Class self = this.getClass(); - CommandAlias rootCmdAlias = self.getAnnotation(CommandAlias.class); + CommandAlias rootCmdAliasAnno = self.getAnnotation(CommandAlias.class); + String rootCmdAlias = rootCmdAliasAnno != null ? manager.getCommandReplacements().replace(rootCmdAliasAnno.value()).toLowerCase() : null; if (cmd == null) { if (rootCmdAlias == null) { cmd = "__" + self.getSimpleName(); } else { - cmd = ACFPatterns.PIPE.split(manager.getCommandReplacements().replace(rootCmdAlias.value()))[0]; + cmd = ACFPatterns.PIPE.split(rootCmdAlias)[0]; } cmd = cmd.toLowerCase(); } @@ -164,7 +165,7 @@ public abstract class BaseCommand { if (rootCmdAlias != null) { Set cmdList = new HashSet<>(); - Collections.addAll(cmdList, ACFPatterns.PIPE.split(rootCmdAlias.value().toLowerCase())); + Collections.addAll(cmdList, ACFPatterns.PIPE.split(rootCmdAlias)); cmdList.remove(cmd); for (String cmdAlias : cmdList) { register(cmdAlias, this); diff --git a/core/src/main/java/co/aikar/commands/CommandManager.java b/core/src/main/java/co/aikar/commands/CommandManager.java index 64b524e8..028cb8f5 100644 --- a/core/src/main/java/co/aikar/commands/CommandManager.java +++ b/core/src/main/java/co/aikar/commands/CommandManager.java @@ -34,7 +34,7 @@ import java.util.Map; public abstract class CommandManager { protected Map rootCommands = new HashMap<>(); - protected CommandReplacements replacements = new CommandReplacements(); + protected CommandReplacements replacements = new CommandReplacements(this); /** * Gets the command contexts manager @@ -68,6 +68,7 @@ public abstract class CommandManager { * @return boolean */ public abstract void registerCommand(BaseCommand command); + public abstract boolean hasRegisteredCommands(); public abstract TimingManager getTimings(); diff --git a/core/src/main/java/co/aikar/commands/CommandReplacements.java b/core/src/main/java/co/aikar/commands/CommandReplacements.java index aceceb04..cf8e5b79 100644 --- a/core/src/main/java/co/aikar/commands/CommandReplacements.java +++ b/core/src/main/java/co/aikar/commands/CommandReplacements.java @@ -32,6 +32,12 @@ import java.util.regex.Pattern; * Manages replacement template strings */ public class CommandReplacements { + + private final CommandManager manager; + + CommandReplacements(CommandManager manager) { + this.manager = manager; + } private final Map> replacements = new LinkedHashMap<>(); public void addReplacements(String... replacements) { @@ -44,6 +50,11 @@ public class CommandReplacements { } public String addReplacement(String key, String val) { + if (this.manager.hasRegisteredCommands()) { + ACFLog.severe("You are registering replacements after you have registered your commands!"); + ACFLog.severe("This is not allowed, and this replacement (" + key + ") will not work for any previously registered command."); + } + key = ACFPatterns.PERCENTAGE.matcher(key.toLowerCase()).replaceAll(""); Pattern pattern = Pattern.compile("%" + Pattern.quote(key) + "\\b", Pattern.CASE_INSENSITIVE); diff --git a/example/src/main/java/co/aikar/acfexample/ACFExample.java b/example/src/main/java/co/aikar/acfexample/ACFExample.java index 12988bf7..66d7f027 100644 --- a/example/src/main/java/co/aikar/acfexample/ACFExample.java +++ b/example/src/main/java/co/aikar/acfexample/ACFExample.java @@ -41,6 +41,7 @@ public final class ACFExample extends JavaPlugin { private void registerCommands() { commandManager = new BukkitCommandManager(this); commandManager.getCommandReplacements().addReplacements("test", "foobar", "%foo", "barbaz"); + commandManager.getCommandReplacements().addReplacement("testcmd", "test4|foobar|barbaz"); commandManager.getCommandContexts().registerContext(SomeObject.class, SomeObject.getContextResolver()); commandManager.getCommandCompletions().registerCompletion("test", (sender, config, input, c) -> ( Lists.newArrayList("foo", "bar", "baz") diff --git a/example/src/main/java/co/aikar/acfexample/SomeCommand.java b/example/src/main/java/co/aikar/acfexample/SomeCommand.java index cbc10a37..4d211d28 100644 --- a/example/src/main/java/co/aikar/acfexample/SomeCommand.java +++ b/example/src/main/java/co/aikar/acfexample/SomeCommand.java @@ -40,8 +40,7 @@ import org.bukkit.entity.Player; @CommandAlias("acf|somecommand|sc|somcom") public class SomeCommand extends BaseCommand { - @Subcommand("test4") - @CommandAlias("acftest|acft") + @CommandAlias("%testcmd") public void onCommand(CommandSender sender, SomeObject someObject) { sender.sendMessage("You got an object of type: " + someObject.getClass().getName() + " with a value of: " + someObject.getValue()); }