From 3936556e1b9d0f22ae26801dbbbbf3c29bbcc234 Mon Sep 17 00:00:00 2001 From: Aikar Date: Mon, 1 May 2017 21:54:14 -0400 Subject: [PATCH] Fix unregistering commands to not depend on paper and other cleanup --- .../aikar/commands/BukkitCommandManager.java | 81 +++++++++---------- .../co/aikar/commands/CommandManager.java | 29 ------- 2 files changed, 38 insertions(+), 72 deletions(-) diff --git a/src/main/java/co/aikar/commands/BukkitCommandManager.java b/src/main/java/co/aikar/commands/BukkitCommandManager.java index d5d3fe78..22c27e40 100644 --- a/src/main/java/co/aikar/commands/BukkitCommandManager.java +++ b/src/main/java/co/aikar/commands/BukkitCommandManager.java @@ -32,6 +32,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.plugin.Plugin; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.*; @@ -41,7 +42,8 @@ public class BukkitCommandManager implements CommandManager { @SuppressWarnings("WeakerAccess") protected final Plugin plugin; private final CommandMap commandMap; - protected Map knownCommands; + protected Map knownCommands = new HashMap<>(); + protected Map registeredCommands = new HashMap<>(); protected CommandContexts contexts; protected CommandCompletions completions; @@ -53,24 +55,16 @@ public class BukkitCommandManager implements CommandManager { Method getCommandMap = server.getClass().getDeclaredMethod("getCommandMap"); getCommandMap.setAccessible(true); commandMap = (CommandMap) getCommandMap.invoke(server); + Field knownCommands = commandMap.getClass().getDeclaredField("knownCommands"); + knownCommands.setAccessible(true); + //noinspection unchecked + this.knownCommands = (Map) knownCommands.get(commandMap); } catch (Exception e) { ACFLog.severe("Failed to get Command Map. ACF will not function."); ACFUtil.sneaky(e); } this.commandMap = commandMap; - this.knownCommands = new HashMap<>(); - Bukkit.getPluginManager().registerEvents( - new Listener() { - @EventHandler - public void onPluginDisable(PluginDisableEvent event) { - if (!(plugin.getName().equalsIgnoreCase(event.getPlugin().getName()))) { - return; - } - unregisterCommands(); - } - }, - plugin - ); + Bukkit.getPluginManager().registerEvents(new ACFBukkitListener(plugin), plugin); } @Override @@ -82,11 +76,6 @@ public class BukkitCommandManager implements CommandManager { return commandMap; } - @Override - public Map getKnownCommands() { - return knownCommands; - } - @Override public CommandContexts getCommandContexts() { if (this.contexts == null) { @@ -109,44 +98,50 @@ public class BukkitCommandManager implements CommandManager { command.onRegister(this); boolean allSuccess = true; for (Map.Entry entry : command.registeredCommands.entrySet()) { - if (!(commandMap.register(entry.getKey().toLowerCase(), plugin, entry.getValue()))) { + String key = entry.getKey().toLowerCase(); + if (!(commandMap.register(key, plugin, entry.getValue()))) { allSuccess = false; - } else { - knownCommands.put(entry.getKey(), command); } + registeredCommands.put(key, command); } return allSuccess; } - @Override - public boolean unregisterCommand(BaseCommand command) { - boolean[] allSuccess = {true}; + public void unregisterCommand(BaseCommand command) { + final String plugin = this.plugin.getName().toLowerCase(); command.registeredCommands.entrySet().removeIf(entry -> { - boolean removed = entry.getValue().unregister(commandMap); - if (removed) { - commandMap.getKnownCommands().remove(entry.getKey()); - } else { - allSuccess[0] = false; + Command cmd = entry.getValue(); + cmd.unregister(commandMap); + String key = entry.getKey(); + Command registered = knownCommands.get(key); + if (registered == command) { + knownCommands.remove(key); } - return removed; + knownCommands.remove(plugin + ":" + key); + return true; }); - return allSuccess[0]; } - @Override - public boolean unregisterCommands() { - boolean allSuccess = true; - for (Map.Entry entry : knownCommands.entrySet()) { - if (!(unregisterCommand(entry.getValue()))) { - allSuccess = false; - } + public void unregisterCommands() { + for (Map.Entry entry : registeredCommands.entrySet()) { + unregisterCommand(entry.getValue()); } - return allSuccess; } - @Override - public BaseCommand getCommandByAlias(String alias) { - return knownCommands.get(alias); + private class ACFBukkitListener implements Listener { + private final Plugin plugin; + + public ACFBukkitListener(Plugin plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onPluginDisable(PluginDisableEvent event) { + if (!(plugin.getName().equalsIgnoreCase(event.getPlugin().getName()))) { + return; + } + unregisterCommands(); + } } } diff --git a/src/main/java/co/aikar/commands/CommandManager.java b/src/main/java/co/aikar/commands/CommandManager.java index 6422cd88..5b9efb85 100644 --- a/src/main/java/co/aikar/commands/CommandManager.java +++ b/src/main/java/co/aikar/commands/CommandManager.java @@ -31,12 +31,6 @@ public interface CommandManager { Plugin getPlugin(); - /** - * Gets the commands this CommandManager knows about - * @return the commands - */ - Map getKnownCommands(); - /** * Gets the command contexts manager * @return Command Contexts @@ -56,27 +50,4 @@ public interface CommandManager { * @return boolean */ boolean registerCommand(BaseCommand command); - - /** - * Unregisters a command from ACF - * - * @param command The command to unregister - * @return boolean - */ - boolean unregisterCommand(BaseCommand command); - - /** - * Unregisters all commands registered via this manager from ACF - * - * @return boolean - */ - boolean unregisterCommands(); - - /** - * Matches an alias to its BaseCommand instance - * - * @param alias The command alias - * @return The command - */ - BaseCommand getCommandByAlias(String alias); }