From 0a0e475f8316eff05e5176a7fae0563e1e594dc8 Mon Sep 17 00:00:00 2001 From: Bukkit/Spigot Date: Mon, 28 Feb 2011 00:30:59 +0000 Subject: [PATCH] Tweaks to command system to allow setting executors via plugins (no more ambiguous onCommand in plugins) By: Dinnerbone --- .../main/java/org/bukkit/command/Command.java | 2 -- .../org/bukkit/command/CommandExecutor.java | 18 +++++++++++ .../java/org/bukkit/command/CommandMap.java | 8 +++++ .../org/bukkit/command/PluginCommand.java | 30 +++++++++---------- .../org/bukkit/command/SimpleCommandMap.java | 6 +++- .../main/java/org/bukkit/plugin/Plugin.java | 12 ++------ .../org/bukkit/plugin/java/JavaPlugin.java | 11 +------ 7 files changed, 48 insertions(+), 39 deletions(-) create mode 100644 paper-api/src/main/java/org/bukkit/command/CommandExecutor.java diff --git a/paper-api/src/main/java/org/bukkit/command/Command.java b/paper-api/src/main/java/org/bukkit/command/Command.java index 6f4aca6099..8629b01276 100644 --- a/paper-api/src/main/java/org/bukkit/command/Command.java +++ b/paper-api/src/main/java/org/bukkit/command/Command.java @@ -3,8 +3,6 @@ package org.bukkit.command; import java.util.ArrayList; import java.util.List; -import org.bukkit.command.CommandSender; - public abstract class Command { private final String name; private List aliases; diff --git a/paper-api/src/main/java/org/bukkit/command/CommandExecutor.java b/paper-api/src/main/java/org/bukkit/command/CommandExecutor.java new file mode 100644 index 0000000000..32847bfa67 --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/command/CommandExecutor.java @@ -0,0 +1,18 @@ + +package org.bukkit.command; + +/** + * Represents a class which contains a single method for executing commands + */ +public interface CommandExecutor { + /** + * Executes the given command, returning its success + * + * @param sender Source of the command + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args Passed command arguments + * @return true if a valid command, otherwise false + */ + public boolean onCommand(CommandSender sender, Command command, String label, String[] args); +} diff --git a/paper-api/src/main/java/org/bukkit/command/CommandMap.java b/paper-api/src/main/java/org/bukkit/command/CommandMap.java index 6acc4acf91..3e0bfd1785 100644 --- a/paper-api/src/main/java/org/bukkit/command/CommandMap.java +++ b/paper-api/src/main/java/org/bukkit/command/CommandMap.java @@ -31,4 +31,12 @@ public interface CommandMap { * Clears all registered commands. */ public void clearCommands(); + + /** + * Gets the command registered to the specified name + * + * @param name Name of the command to retrieve + * @return Command with the specified name + */ + public Command getCommand(String name); } diff --git a/paper-api/src/main/java/org/bukkit/command/PluginCommand.java b/paper-api/src/main/java/org/bukkit/command/PluginCommand.java index 972488bfa2..33e1a9b67a 100644 --- a/paper-api/src/main/java/org/bukkit/command/PluginCommand.java +++ b/paper-api/src/main/java/org/bukkit/command/PluginCommand.java @@ -1,37 +1,35 @@ package org.bukkit.command; -import org.bukkit.ChatColor; import org.bukkit.plugin.Plugin; public final class PluginCommand extends Command { private final Plugin owningPlugin; + private CommandExecutor executor; - public PluginCommand(String name, Plugin owner) { + protected PluginCommand(String name, Plugin owner) { super(name); + this.executor = owner; this.owningPlugin = owner; this.usageMessage = ""; } public boolean execute(CommandSender sender, String commandLabel, String[] args) { - boolean cmdSuccess = false; - + boolean success = false; + try { - cmdSuccess = owningPlugin.onCommand(sender, this, commandLabel, args); + success = executor.onCommand(sender, this, commandLabel, args); } catch (Throwable ex) { throw new CommandException("Unhandled exception executing command '" + commandLabel + "' in plugin " + owningPlugin.getDescription().getFullName(), ex); } - if (!cmdSuccess && !usageMessage.isEmpty()) { - String tmpMsg = usageMessage.replace("", commandLabel); - String[] usageLines = tmpMsg.split("\\n"); - for(String line: usageLines) { - while (line.length() > 0) { - int stripChars = (line.length() > 53 ? 53:line.length()); - sender.sendMessage(ChatColor.RED + line.substring(0, stripChars)); - line = line.substring(stripChars); - } - } + if (!success && !usageMessage.isEmpty()) { + sender.sendMessage(usageMessage.replace("", commandLabel)); } - return cmdSuccess; + + return success; + } + + public void setExecutor(CommandExecutor executor) { + this.executor = executor; } } \ No newline at end of file diff --git a/paper-api/src/main/java/org/bukkit/command/SimpleCommandMap.java b/paper-api/src/main/java/org/bukkit/command/SimpleCommandMap.java index c63fd34e25..a24bc06164 100644 --- a/paper-api/src/main/java/org/bukkit/command/SimpleCommandMap.java +++ b/paper-api/src/main/java/org/bukkit/command/SimpleCommandMap.java @@ -23,7 +23,7 @@ public final class SimpleCommandMap implements CommandMap { private void setDefaultCommands(final Server server) { register("bukkit", new VersionCommand("version", server)); register("bukkit", new ReloadCommand("reload", server)); - register("bukkit", new PluginsCommand("plugins",server)); + register("bukkit", new PluginsCommand("plugins", server)); } /** @@ -91,6 +91,10 @@ public final class SimpleCommandMap implements CommandMap { } } + public Command getCommand(String name) { + return knownCommands.get(name); + } + private static class VersionCommand extends Command { private final Server server; diff --git a/paper-api/src/main/java/org/bukkit/plugin/Plugin.java b/paper-api/src/main/java/org/bukkit/plugin/Plugin.java index ce00bd52e6..380404da71 100644 --- a/paper-api/src/main/java/org/bukkit/plugin/Plugin.java +++ b/paper-api/src/main/java/org/bukkit/plugin/Plugin.java @@ -3,14 +3,13 @@ package org.bukkit.plugin; import java.io.File; import org.bukkit.Server; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; +import org.bukkit.command.CommandExecutor; import org.bukkit.util.config.Configuration; /** * Represents a Plugin */ -public interface Plugin { +public interface Plugin extends CommandExecutor { /** * Returns the folder that the plugin data's files are located in. The * folder may not yet exist. @@ -63,11 +62,4 @@ public interface Plugin { * Called when this plugin is enabled */ public void onEnable(); - - /** - * Called when a command registered by this plugin is received. - * @param commandLabel - * @return TODO - */ - public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args); } diff --git a/paper-api/src/main/java/org/bukkit/plugin/java/JavaPlugin.java b/paper-api/src/main/java/org/bukkit/plugin/java/JavaPlugin.java index ac1d188b44..50de9b31e8 100644 --- a/paper-api/src/main/java/org/bukkit/plugin/java/JavaPlugin.java +++ b/paper-api/src/main/java/org/bukkit/plugin/java/JavaPlugin.java @@ -2,10 +2,8 @@ package org.bukkit.plugin.java; import java.io.File; -import java.util.ArrayList; import org.bukkit.Server; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; +import org.bukkit.command.CommandExecutor; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginLoader; @@ -121,13 +119,6 @@ public abstract class JavaPlugin implements Plugin { } } - /** - * Called when a command registered by this plugin is received. - */ - public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { - return false; // default implementation: do nothing! - } - /** * Initializes this plugin with the given variables. *