From 8a42eecc111c19c1ee8f97435337438816232c15 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Thu, 24 Mar 2016 20:57:59 +1100 Subject: [PATCH] Command changes Legacy commands still need to be cleaned up (after which economy / confirmation can be centralized) All command names / usage / description is configurable Simplifies creating commands Deeper tab completion / command help --- .../plot/api/PlotAPI.java | 22 +- .../com/plotsquared/bukkit/BukkitMain.java | 17 +- .../bukkit/commands/DebugUUID.java | 2 +- .../bukkit/util/BukkitCommand.java | 60 +- .../com/intellectualcrafters/plot/PS.java | 77 +-- .../plot/commands/Add.java | 2 +- .../plot/commands/CommandCategory.java | 8 +- .../plot/commands/DebugExec.java | 17 +- .../plot/commands/DebugFixFlags.java | 2 +- .../plot/commands/Deny.java | 2 +- .../plot/commands/GenerateDocs.java | 21 +- .../plot/commands/Help.java | 90 ++- .../plot/commands/Home.java | 38 -- .../plot/commands/{list.java => ListCmd.java} | 2 +- .../plot/commands/MainCommand.java | 546 ++++++------------ .../commands/{plugin.java => PluginCmd.java} | 2 +- .../plot/commands/Rate.java | 4 +- .../plot/commands/Remove.java | 2 +- .../plot/commands/Set.java | 9 +- .../plot/commands/SetCommand.java | 8 +- .../plot/commands/SubCommand.java | 91 +-- .../plot/commands/Toggle.java | 136 ++--- .../plot/commands/Trust.java | 2 +- .../plot/commands/Undeny.java | 2 +- .../plot/commands/Untrust.java | 2 +- .../plot/commands/Visit.java | 4 +- .../intellectualcrafters/plot/config/C.java | 22 +- .../plot/config/Settings.java | 4 - .../plot/database/SQLManager.java | 8 +- .../plot/generator/AugmentedUtils.java | 2 +- .../plot/object/Plot.java | 68 ++- .../plot/object/PlotArea.java | 13 +- .../plot/util/PlotChunk.java | 39 ++ .../plot/util/helpmenu/HelpMenu.java | 4 +- .../plot/util/helpmenu/HelpPage.java | 9 +- .../plotsquared/general/commands/Command.java | 532 +++++++++++++---- .../general/commands/CommandDeclaration.java | 6 +- .../general/commands/CommandManager.java | 149 ----- 38 files changed, 947 insertions(+), 1077 deletions(-) delete mode 100644 Core/src/main/java/com/intellectualcrafters/plot/commands/Home.java rename Core/src/main/java/com/intellectualcrafters/plot/commands/{list.java => ListCmd.java} (99%) rename Core/src/main/java/com/intellectualcrafters/plot/commands/{plugin.java => PluginCmd.java} (98%) delete mode 100644 Core/src/main/java/com/plotsquared/general/commands/CommandManager.java diff --git a/Bukkit/src/main/java/com/intellectualcrafters/plot/api/PlotAPI.java b/Bukkit/src/main/java/com/intellectualcrafters/plot/api/PlotAPI.java index cf3884149..d6c6b3b91 100644 --- a/Bukkit/src/main/java/com/intellectualcrafters/plot/api/PlotAPI.java +++ b/Bukkit/src/main/java/com/intellectualcrafters/plot/api/PlotAPI.java @@ -23,7 +23,6 @@ package com.intellectualcrafters.plot.api; import com.intellectualcrafters.configuration.file.YamlConfiguration; import com.intellectualcrafters.plot.PS; -import com.intellectualcrafters.plot.commands.MainCommand; import com.intellectualcrafters.plot.commands.SubCommand; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.flag.AbstractFlag; @@ -40,17 +39,16 @@ import com.intellectualcrafters.plot.util.SetQueue; import com.intellectualcrafters.plot.util.UUIDHandler; import com.intellectualcrafters.plot.uuid.UUIDWrapper; import com.plotsquared.bukkit.util.BukkitUtil; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; - import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.UUID; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; /** * PlotSquared API
@@ -641,17 +639,13 @@ public class PlotAPI { /** * Register a subcommand - * + * @deprecated Command registration is done on object creation * @param c SubCommand, that we want to register - * * @see com.intellectualcrafters.plot.commands.SubCommand */ + @Deprecated public void registerCommand(SubCommand c) { - if (c.getCommand() != null) { - MainCommand.getInstance().addCommand(c); - } else { - MainCommand.getInstance().createCommand(c); - } + PS.debug("SubCommands are now registered on creation"); } /** diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java index ee2fbec7d..28af29e0c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java @@ -3,7 +3,6 @@ package com.plotsquared.bukkit; import com.intellectualcrafters.configuration.ConfigurationSection; import com.intellectualcrafters.plot.IPlotMain; import com.intellectualcrafters.plot.PS; -import com.intellectualcrafters.plot.commands.MainCommand; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.ConfigurationNode; import com.intellectualcrafters.plot.config.Settings; @@ -74,6 +73,12 @@ import com.plotsquared.bukkit.uuid.LowerOfflineUUIDWrapper; import com.plotsquared.bukkit.uuid.OfflineUUIDWrapper; import com.plotsquared.bukkit.uuid.SQLUUIDHandler; import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -88,13 +93,6 @@ import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - public class BukkitMain extends JavaPlugin implements Listener, IPlotMain { public static BukkitMain THIS; @@ -173,7 +171,7 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain { plotCommand.setExecutor(bcmd); plotCommand.setAliases(Arrays.asList("p", "ps", "plotme", "plot")); plotCommand.setTabCompleter(bcmd); - MainCommand.getInstance().addCommand(new DebugUUID()); + new DebugUUID(); } @Override @@ -215,7 +213,6 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain { case COMPLEX_PART: case FISHING_HOOK: case ENDER_SIGNAL: - case LINGERING_POTION: case AREA_EFFECT_CLOUD: case EXPERIENCE_ORB: case LEASH_HITCH: diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/commands/DebugUUID.java b/Bukkit/src/main/java/com/plotsquared/bukkit/commands/DebugUUID.java index 446a60aab..5e2c5d696 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/commands/DebugUUID.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/commands/DebugUUID.java @@ -65,7 +65,7 @@ import java.util.UUID; public class DebugUUID extends SubCommand { public DebugUUID() { - this.requiredArguments = new Argument[]{Argument.String}; + super(Argument.String); } @Override diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitCommand.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitCommand.java index 9d7f52d2b..d7a81d57c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitCommand.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitCommand.java @@ -3,36 +3,31 @@ package com.plotsquared.bukkit.util; import com.intellectualcrafters.plot.commands.MainCommand; import com.intellectualcrafters.plot.object.ConsolePlayer; import com.intellectualcrafters.plot.object.PlotPlayer; -import com.intellectualcrafters.plot.util.Permissions; -import com.intellectualcrafters.plot.util.StringComparison; import com.plotsquared.bukkit.commands.DebugUUID; -import com.plotsquared.general.commands.Command; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - public class BukkitCommand implements CommandExecutor, TabCompleter { public BukkitCommand() { - MainCommand.getInstance().addCommand(new DebugUUID()); + new DebugUUID(); } @Override public boolean onCommand(final CommandSender commandSender, org.bukkit.command.Command command, final String commandLabel, String[] args) { if (commandSender instanceof Player) { - return MainCommand.onCommand(BukkitUtil.getPlayer((Player) commandSender), commandLabel, args); + return MainCommand.onCommand(BukkitUtil.getPlayer((Player) commandSender), args); } if (commandSender == null || commandSender.getClass() == Bukkit.getConsoleSender().getClass()) { - return MainCommand.onCommand(ConsolePlayer.getConsole(), commandLabel, args); + return MainCommand.onCommand(ConsolePlayer.getConsole(), args); } @SuppressWarnings("deprecation") ConsolePlayer sender = new ConsolePlayer() { @@ -55,49 +50,28 @@ public class BukkitCommand implements CommandExecutor, TabCompleter { } }; sender.teleport(ConsolePlayer.getConsole().getLocationFull()); - boolean result = MainCommand.onCommand(sender, commandLabel, args); + boolean result = MainCommand.onCommand(sender, args); ConsolePlayer.getConsole().teleport(sender.getLocationFull()); return result; } @Override - public List onTabComplete(CommandSender commandSender, org.bukkit.command.Command command, String s, - String[] strings) { + public List onTabComplete(CommandSender commandSender, org.bukkit.command.Command command, String s, String[] args) { if (!(commandSender instanceof Player)) { return null; } PlotPlayer player = BukkitUtil.getPlayer((Player) commandSender); - if (strings.length < 1) { - if (strings.length == 0 || "plots".startsWith(s)) { - return Collections.singletonList("plots"); - } + if (args.length == 0) { + return Collections.singletonList("plots"); } - if (strings.length > 1) { + Collection objects = MainCommand.getInstance().tab(player, args, s.endsWith(" ")); + if (objects == null) { return null; } - Set tabOptions = new HashSet<>(); - String arg = strings[0].toLowerCase(); - ArrayList labels = new ArrayList<>(); - for (Command cmd : MainCommand.getInstance().getCommands()) { - String label = cmd.getCommand(); - HashSet aliases = new HashSet<>(cmd.getAliases()); - aliases.add(label); - for (String alias : aliases) { - labels.add(alias); - if (alias.startsWith(arg)) { - if (Permissions.hasPermission(player, cmd.getPermission())) { - tabOptions.add(label); - } else { - break; - } - } - } + List result = new ArrayList<>(); + for (Object o : objects) { + result.add(o.toString()); } - String best = new StringComparison<>(arg, labels).getBestMatch(); - tabOptions.add(best); - if (!tabOptions.isEmpty()) { - return new ArrayList<>(tabOptions); - } - return null; + return result; } } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/PS.java b/Core/src/main/java/com/intellectualcrafters/plot/PS.java index 2055ffbbd..89b3bbe24 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/PS.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/PS.java @@ -3,7 +3,6 @@ package com.intellectualcrafters.plot; import com.intellectualcrafters.configuration.ConfigurationSection; import com.intellectualcrafters.configuration.MemorySection; import com.intellectualcrafters.configuration.file.YamlConfiguration; -import com.intellectualcrafters.plot.commands.MainCommand; import com.intellectualcrafters.plot.commands.WE_Anywhere; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.Configuration; @@ -54,7 +53,6 @@ import com.intellectualcrafters.plot.util.WorldUtil; import com.intellectualcrafters.plot.util.area.QuadMap; import com.plotsquared.listener.WESubscriber; import com.sk89q.worldedit.WorldEdit; - import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -106,10 +104,12 @@ public class PS { // public: public File styleFile; public File configFile; + public File commandsFile; public File translationFile; public YamlConfiguration style; public YamlConfiguration config; public YamlConfiguration storage; + public YamlConfiguration commands; public IPlotMain IMP = null; public TaskManager TASK; public WorldEdit worldedit; @@ -176,7 +176,7 @@ public class PS { if (this.IMP.initWorldEdit()) { this.worldedit = WorldEdit.getInstance(); WorldEdit.getInstance().getEventBus().register(new WESubscriber()); - MainCommand.getInstance().createCommand(new WE_Anywhere()); + new WE_Anywhere(); } // Events @@ -649,26 +649,24 @@ public class PS { plot.setArea(plotarea); } } - if (Settings.ENABLE_CLUSTERS) { - Set clusters = this.clusters_tmp.remove(plotarea.toString()); - if (clusters == null) { - if (plotarea.TYPE == 2) { - clusters = this.clusters_tmp.get(plotarea.worldname); - if (clusters != null) { - Iterator iter = clusters.iterator(); - while (iter.hasNext()) { - PlotCluster next = iter.next(); - if (next.intersects(plotarea.getMin(), plotarea.getMax())) { - next.setArea(plotarea); - iter.remove(); - } + Set clusters = this.clusters_tmp.remove(plotarea.toString()); + if (clusters == null) { + if (plotarea.TYPE == 2) { + clusters = this.clusters_tmp.get(plotarea.worldname); + if (clusters != null) { + Iterator iter = clusters.iterator(); + while (iter.hasNext()) { + PlotCluster next = iter.next(); + if (next.intersects(plotarea.getMin(), plotarea.getMax())) { + next.setArea(plotarea); + iter.remove(); } } } - } else { - for (PlotCluster cluster : clusters) { - cluster.setArea(plotarea); - } + } + } else { + for (PlotCluster cluster : clusters) { + cluster.setArea(plotarea); } } Set localAreas = getPlotAreas(plotarea.worldname); @@ -736,10 +734,8 @@ public class PS { public Set getClusters(String world) { HashSet set = new HashSet<>(); - if (Settings.ENABLE_CLUSTERS) { - for (PlotArea area : getPlotAreas(world)) { - set.addAll(area.getClusters()); - } + for (PlotArea area : getPlotAreas(world)) { + set.addAll(area.getClusters()); } return set; @@ -991,7 +987,7 @@ public class PS { Collections.sort(list, new Comparator() { @Override public int compare(Plot a, Plot b) { - return (int) Math.signum(ExpireManager.IMP.getTimestamp(a.owner) - ExpireManager.IMP.getTimestamp(b.owner)); + return Long.compare(ExpireManager.IMP.getTimestamp(a.owner), ExpireManager.IMP.getTimestamp(b.owner)); } }); return list; @@ -1785,9 +1781,7 @@ public class PS { } DBFunc.dbManager = new SQLManager(this.database, Settings.DB.PREFIX, false); this.plots_tmp = DBFunc.getPlots(); - if (Settings.ENABLE_CLUSTERS) { - this.clusters_tmp = DBFunc.getClusters(); - } + this.clusters_tmp = DBFunc.getClusters(); } catch (ClassNotFoundException | SQLException e) { log(C.PREFIX + "&cFailed to open DATABASE connection. The plugin will disable itself."); if (Settings.DB.USE_MONGO) { @@ -1967,9 +1961,6 @@ public class PS { options.put("protection.redstone.disable-offline", Settings.REDSTONE_DISABLER); options.put("protection.redstone.disable-unoccupied", Settings.REDSTONE_DISABLER_UNOCCUPIED); - // Clusters - options.put("clusters.enabled", Settings.ENABLE_CLUSTERS); - // PlotMe options.put("plotme-alias", Settings.USE_PLOTME_ALIAS); options.put("plotme-convert.enabled", Settings.CONVERT_PLOTME); @@ -2100,9 +2091,6 @@ public class PS { Settings.REDSTONE_DISABLER = this.config.getBoolean("protection.redstone.disable-offline"); Settings.REDSTONE_DISABLER_UNOCCUPIED = this.config.getBoolean("protection.redstone.disable-unoccupied"); - // Clusters - Settings.ENABLE_CLUSTERS = this.config.getBoolean("clusters.enabled"); - // PlotMe Settings.USE_PLOTME_ALIAS = this.config.getBoolean("plotme-alias"); Settings.CONVERT_PLOTME = this.config.getBoolean("plotme-convert.enabled"); @@ -2265,10 +2253,23 @@ public class PS { log("Failed to save storage.yml"); } try { - this.style.save(this.styleFile); - this.config.save(this.configFile); - this.storage.save(this.storageFile); - } catch (IOException e) { + commandsFile = new File(IMP.getDirectory() + File.separator + "config" + File.separator + "commands.yml"); + if (!commandsFile.exists()) { + if (!commandsFile.createNewFile()) { + log("Could not the storage settings file, please create \"commands.yml\" manually."); + } + } + commands = YamlConfiguration.loadConfiguration(commandsFile); + setupStorage(); + } catch (IOException err_trans) { + log("Failed to save commands.yml"); + } + try { + style.save(styleFile); + config.save(configFile); + storage.save(storageFile); + commands.save(commandsFile); + } catch (final IOException e) { log("Configuration file saving failed"); e.printStackTrace(); } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Add.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Add.java index ca959394b..fd7e2baef 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Add.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Add.java @@ -45,7 +45,7 @@ import java.util.UUID; public class Add extends SubCommand { public Add() { - this.requiredArguments = new Argument[]{Argument.PlayerName}; + super(Argument.PlayerName); } @Override diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/CommandCategory.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/CommandCategory.java index cdaa6aa55..6c958c42e 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/CommandCategory.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/CommandCategory.java @@ -8,13 +8,13 @@ package com.intellectualcrafters.plot.commands; */ public enum CommandCategory { /** - * Claiming Commands + * Claiming CommandConfig * * Such as: /plot claim */ CLAIMING("Claiming"), /** - * Teleportation Commands + * Teleportation CommandConfig * * Such as: /plot visit */ @@ -36,13 +36,13 @@ public enum CommandCategory { */ APPEARANCE("Cosmetic"), /** - * Information Commands + * Information CommandConfig * * Such as: /plot info */ INFO("Info"), /** - * Debug Commands + * Debug CommandConfig * * Such as: /plot debug */ diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java index 3674dd8a6..7ba064d51 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java @@ -37,6 +37,8 @@ import com.intellectualcrafters.plot.object.PlotBlock; import com.intellectualcrafters.plot.object.PlotId; import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.RunnableVal; +import com.intellectualcrafters.plot.object.RunnableVal2; +import com.intellectualcrafters.plot.object.RunnableVal3; import com.intellectualcrafters.plot.util.AbstractTitle; import com.intellectualcrafters.plot.util.ChunkManager; import com.intellectualcrafters.plot.util.EconHandler; @@ -74,7 +76,7 @@ import javax.script.SimpleScriptContext; @CommandDeclaration(command = "debugexec", permission = "plots.admin", description = "Mutli-purpose debug command", - aliases = "exec", + aliases = {"exec", "$"}, category = CommandCategory.DEBUG) public class DebugExec extends SubCommand { @@ -310,22 +312,19 @@ public class DebugExec extends SubCommand { .readLines(MainUtil.getFile(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), args[1]), StandardCharsets.UTF_8), System.getProperty("line.separator")); - Command subcommand = new Command(args[1].split("\\.")[0]) { + new Command(MainCommand.getInstance(), true, args[1].split("\\.")[0], null, RequiredType.NONE, CommandCategory.DEBUG) { @Override - public boolean onCommand(PlotPlayer plr, String[] args) { + public void execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { try { - DebugExec.this.scope.put("PlotPlayer", plr); + DebugExec.this.scope.put("PlotPlayer", player); DebugExec.this.scope.put("args", args); DebugExec.this.engine.eval(cmd, DebugExec.this.scope); - return true; } catch (ScriptException e) { e.printStackTrace(); MainUtil.sendMessage(player, C.COMMAND_WENT_WRONG); - return false; } } }; - MainCommand.getInstance().addCommand(subcommand); return true; } catch (IOException e) { e.printStackTrace(); @@ -358,7 +357,7 @@ public class DebugExec extends SubCommand { return false; } long start = System.currentTimeMillis(); - Command cmd = MainCommand.getInstance().getCommand(args[3]); + Command cmd = MainCommand.getInstance().getCommand(args[3]); String[] params = Arrays.copyOfRange(args, 4, args.length); if ("true".equals(args[1])) { Location loc = player.getMeta("location"); @@ -366,7 +365,7 @@ public class DebugExec extends SubCommand { for (Plot current : PS.get().getBasePlots()) { player.setMeta("location", current.getBottomAbs()); player.setMeta("lastplot", current); - cmd.onCommand(player, params); + cmd.execute(player, params, null, null); } if (loc == null) { player.deleteMeta("location"); diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/DebugFixFlags.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/DebugFixFlags.java index 117860494..8407127be 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/DebugFixFlags.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/DebugFixFlags.java @@ -47,7 +47,7 @@ import java.util.Map.Entry; public class DebugFixFlags extends SubCommand { public DebugFixFlags() { - this.requiredArguments = new Argument[]{Argument.String}; + super(Argument.String); } @Override diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Deny.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Deny.java index 99c242416..1fa1426cc 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Deny.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Deny.java @@ -45,7 +45,7 @@ import java.util.UUID; public class Deny extends SubCommand { public Deny() { - this.requiredArguments = new Argument[]{Argument.PlayerName}; + super(Argument.PlayerName); } @Override diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/GenerateDocs.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/GenerateDocs.java index 8cbbfd291..47342f66d 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/GenerateDocs.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/GenerateDocs.java @@ -1,10 +1,8 @@ package com.intellectualcrafters.plot.commands; import com.intellectualcrafters.plot.config.C; -import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.util.StringMan; import com.plotsquared.general.commands.Command; - import java.io.File; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -12,16 +10,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class GenerateDocs { public static void main(String[] args) { - MainCommand.getInstance().addCommand(new WE_Anywhere()); - MainCommand.getInstance().addCommand(new Cluster()); - ArrayList> commands = MainCommand.getInstance().getCommands(); + new WE_Anywhere(); + List commands = MainCommand.getInstance().getCommands(); log("### Want to document some commands?"); log(" - This page is automatically generated"); log(" - Fork the project and add a javadoc comment to one of the command classes"); @@ -30,22 +26,21 @@ public class GenerateDocs { log("# Contents"); for (CommandCategory category : CommandCategory.values()) { log("###### " + category.name()); - for (Command command : MainCommand.getCommands(category, null)) { - log(" - [/plot " + command.getCommand() + "](https://github.com/IntellectualSites/PlotSquared/wiki/Commands#" + command.getCommand() - + ") "); + for (Command command : MainCommand.getInstance().getCommands(category, null)) { + log(" - [/plot " + command.getId() + "](https://github.com/IntellectualSites/PlotSquared/wiki/Commands#" + command.getId() + ") "); } log(""); } log("# Commands"); - for (Command command : commands) { + for (Command command : commands) { printCommand(command); } } - public static void printCommand(Command command) { + public static void printCommand(Command command) { try { String clazz = command.getClass().getSimpleName(); - String name = command.getCommand(); + String name = command.getId(); // Header String source = @@ -88,7 +83,7 @@ public class GenerateDocs { log("`" + command.getRequiredType().name() + "`"); } - Set aliases = command.getAliases(); + List aliases = command.getAliases(); if (!aliases.isEmpty()) { log("#### Aliases"); log("`" + StringMan.getString(command.getAliases()) + "`"); diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Help.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Help.java index 5406712f2..16b1c2fa7 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Help.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Help.java @@ -1,16 +1,98 @@ package com.intellectualcrafters.plot.commands; +import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.object.PlotPlayer; +import com.intellectualcrafters.plot.object.RunnableVal2; +import com.intellectualcrafters.plot.object.RunnableVal3; +import com.intellectualcrafters.plot.util.MainUtil; +import com.intellectualcrafters.plot.util.MathMan; +import com.intellectualcrafters.plot.util.StringMan; +import com.intellectualcrafters.plot.util.helpmenu.HelpMenu; +import com.plotsquared.general.commands.Command; import com.plotsquared.general.commands.CommandDeclaration; @CommandDeclaration(command = "help", description = "Get this help menu", - aliases = {"he"}, - category = CommandCategory.INFO) -public class Help extends SubCommand { + aliases = {"he", "h", "?"}, + category = CommandCategory.INFO, + usage="help [category|#]", + permission="plots.use") +public class Help extends Command { + public Help(Command parent) { + super(parent, true); + } @Override - public boolean onCommand(PlotPlayer plr, String[] args) { + public boolean canExecute(PlotPlayer player) { return true; } + + @Override + public void execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { + switch (args.length) { + case 0: { + displayHelp(player, null, 0); + return; + } + case 1: { + if (MathMan.isInteger(args[0])) { + try { + displayHelp(player, null, Integer.parseInt(args[0])); + } catch (NumberFormatException e) { + displayHelp(player, null, 1); + } + } else { + displayHelp(player, args[0], 1); + } + return; + } + case 2: { + if (MathMan.isInteger(args[1])) { + try { + displayHelp(player, args[1], Integer.parseInt(args[1])); + } catch (NumberFormatException e) { + displayHelp(player, args[1], 1); + } + } + return; + } + default: { + C.COMMAND_SYNTAX.send(player, getUsage()); + } + } + } + + public void displayHelp(PlotPlayer player, String cat, int page) { + CommandCategory catEnum = null; + if (cat != null) { + if (StringMan.isEqualIgnoreCase(cat, "all")) { + catEnum = null; + } else { + for (CommandCategory c : CommandCategory.values()) { + if (StringMan.isEqualIgnoreCaseToAny(cat, c.name(), c.toString())) { + catEnum = c; + cat = c.name(); + break; + } + } + if (catEnum == null) { + cat = null; + } + } + } + if (cat == null && page == 0) { + StringBuilder builder = new StringBuilder(); + builder.append(C.HELP_HEADER.s()); + for (CommandCategory c : CommandCategory.values()) { + builder.append( + "\n" + StringMan.replaceAll(C.HELP_INFO_ITEM.s(), "%category%", c.toString().toLowerCase(), "%category_desc%", c.toString())); + } + builder.append("\n").append(C.HELP_INFO_ITEM.s().replaceAll("%category%", "all").replaceAll("%category_desc%", "Display all commands")); + builder.append("\n" + C.HELP_FOOTER.s()); + MainUtil.sendMessage(player, builder.toString(), false); + return; + } + page--; + new HelpMenu(player).setCategory(catEnum).getCommands().generateMaxPages().generatePage(page, getParent().toString()).render(); + } } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Home.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Home.java deleted file mode 100644 index d9a5197c0..000000000 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Home.java +++ /dev/null @@ -1,38 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////// -// PlotSquared - A plot manager and world generator for the Bukkit API / -// Copyright (c) 2014 IntellectualSites/IntellectualCrafters / -// / -// This program is free software; you can redistribute it and/or modify / -// it under the terms of the GNU General Public License as published by / -// the Free Software Foundation; either version 3 of the License, or / -// (at your option) any later version. / -// / -// This program is distributed in the hope that it will be useful, / -// but WITHOUT ANY WARRANTY; without even the implied warranty of / -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the / -// GNU General Public License for more details. / -// / -// You should have received a copy of the GNU General Public License / -// along with this program; if not, write to the Free Software Foundation, / -// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA / -// / -// You can contact us via: support@intellectualsites.com / -//////////////////////////////////////////////////////////////////////////////////////////////////// -package com.intellectualcrafters.plot.commands; - -import com.intellectualcrafters.plot.object.PlotPlayer; -import com.plotsquared.general.commands.CommandDeclaration; - -@CommandDeclaration(command = "home", - aliases = {"h"}, - description = "Go to your plot", - usage = "/plot home [id|alias]", - category = CommandCategory.TELEPORT, - requiredType = RequiredType.NONE) -public class Home extends SubCommand { - - @Override - public boolean onCommand(PlotPlayer plr, String[] args) { - return MainCommand.getInstance().getCommand("visit").onCommand(plr, args); - } -} diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/list.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/ListCmd.java similarity index 99% rename from Core/src/main/java/com/intellectualcrafters/plot/commands/list.java rename to Core/src/main/java/com/intellectualcrafters/plot/commands/ListCmd.java index 006bc560b..8b6643e11 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/list.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/ListCmd.java @@ -56,7 +56,7 @@ import java.util.UUID; permission = "plots.list", category = CommandCategory.INFO, usage = "/plot list > [#]") -public class List extends SubCommand { +public class ListCmd extends SubCommand { private String[] getArgumentList(PlotPlayer player) { java.util.List args = new ArrayList<>(); diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/MainCommand.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/MainCommand.java index 29ff2e7df..01369af4f 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/MainCommand.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/MainCommand.java @@ -20,287 +20,221 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// package com.intellectualcrafters.plot.commands; +import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.config.C; -import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.object.ConsolePlayer; import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.PlotArea; import com.intellectualcrafters.plot.object.PlotPlayer; -import com.intellectualcrafters.plot.util.MainUtil; +import com.intellectualcrafters.plot.object.RunnableVal2; +import com.intellectualcrafters.plot.object.RunnableVal3; +import com.intellectualcrafters.plot.util.CmdConfirm; +import com.intellectualcrafters.plot.util.EconHandler; import com.intellectualcrafters.plot.util.MathMan; import com.intellectualcrafters.plot.util.Permissions; -import com.intellectualcrafters.plot.util.StringComparison; -import com.intellectualcrafters.plot.util.StringMan; -import com.intellectualcrafters.plot.util.helpmenu.HelpMenu; -import com.plotsquared.general.commands.Argument; import com.plotsquared.general.commands.Command; -import com.plotsquared.general.commands.CommandHandlingOutput; -import com.plotsquared.general.commands.CommandManager; - -import java.util.ArrayList; +import com.plotsquared.general.commands.CommandDeclaration; import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; /** * PlotSquared command class. */ -public class MainCommand extends CommandManager { - +@CommandDeclaration( + command = "plot", + aliases = {"plots", "p", "plotsquared", "plot2", "p2", "ps", "2", "plotme", "plotz", "ap"}) +public class MainCommand extends Command { + private static MainCommand instance; + private Help help; private MainCommand() { - super(null, new ArrayList>()); + super(null, true); instance = this; - createCommand(new Buy()); - createCommand(new Save()); - createCommand(new Load()); - createCommand(new Confirm()); - createCommand(new Template()); - createCommand(new Download()); - createCommand(new Update()); - createCommand(new Template()); - createCommand(new Setup()); - createCommand(new Area()); - createCommand(new DebugSaveTest()); - createCommand(new DebugLoadTest()); - createCommand(new CreateRoadSchematic()); - createCommand(new DebugAllowUnsafe()); - createCommand(new RegenAllRoads()); - createCommand(new Claim()); - createCommand(new Auto()); - createCommand(new Visit()); - createCommand(new Home()); - createCommand(new Set()); - createCommand(new Toggle()); - createCommand(new Clear()); - createCommand(new Delete()); - createCommand(new Trust()); - createCommand(new Add()); - createCommand(new Deny()); - createCommand(new Untrust()); - createCommand(new Remove()); - createCommand(new Undeny()); - createCommand(new Info()); - createCommand(new com.intellectualcrafters.plot.commands.List()); - createCommand(new Help()); - createCommand(new Debug()); - createCommand(new SchematicCmd()); - createCommand(new Plugin()); - createCommand(new Purge()); - createCommand(new Reload()); - createCommand(new Merge()); - createCommand(new DebugPaste()); - createCommand(new Unlink()); - createCommand(new Kick()); - createCommand(new Rate()); - createCommand(new DebugClaimTest()); - createCommand(new Inbox()); - createCommand(new Comment()); - createCommand(new Database()); - createCommand(new Swap()); - createCommand(new Music()); - createCommand(new DebugRoadRegen()); - createCommand(new Trust()); - createCommand(new DebugExec()); - createCommand(new FlagCmd()); - createCommand(new Target()); - createCommand(new DebugFixFlags()); - createCommand(new Move()); - createCommand(new Condense()); - createCommand(new Condense()); - createCommand(new Copy()); - createCommand(new Chat()); - createCommand(new Trim()); - createCommand(new Done()); - createCommand(new Continue()); - createCommand(new BO3()); - createCommand(new Middle()); - createCommand(new Grant()); - // set commands - createCommand(new Owner()); - createCommand(new Desc()); - createCommand(new Biome()); - createCommand(new Alias()); - createCommand(new SetHome()); - if (Settings.ENABLE_CLUSTERS) { - MainCommand.getInstance().addCommand(new Cluster()); - } } public static MainCommand getInstance() { if (instance == null) { instance = new MainCommand(); + new Buy(); + new Save(); + new Load(); + new Confirm(); + new Template(); + new Download(); + new Update(); + new Template(); + new Setup(); + new Area(); + new DebugSaveTest(); + new DebugLoadTest(); + new CreateRoadSchematic(); + new DebugAllowUnsafe(); + new RegenAllRoads(); + new Claim(); + new Auto(); + new Visit(); + new Set(); + new Toggle(); + new Clear(); + new Delete(); + new Trust(); + new Add(); + new Deny(); + new Untrust(); + new Remove(); + new Undeny(); + new Info(); + new ListCmd(); + instance.help = new Help(instance); + new Debug(); + new SchematicCmd(); + new PluginCmd(); + new Purge(); + new Reload(); + new Merge(); + new DebugPaste(); + new Unlink(); + new Kick(); + new Rate(); + new DebugClaimTest(); + new Inbox(); + new Comment(); + new Database(); + new Swap(); + new Music(); + new DebugRoadRegen(); + new Trust(); + new DebugExec(); + new FlagCmd(); + new Target(); + new DebugFixFlags(); + new Move(); + new Condense(); + new Condense(); + new Copy(); + new Chat(); + new Trim(); + new Done(); + new Continue(); + new BO3(); + new Middle(); + new Grant(); + // set commands + new Owner(); + new Desc(); + new Biome(); + new Alias(); + new SetHome(); + new Cluster(); } return instance; } - public static boolean no_permission(PlotPlayer player, String permission) { - MainUtil.sendMessage(player, C.NO_PERMISSION, permission); - return false; + @Deprecated + /** + * @Deprecated legacy + */ + public void addCommand(Command command) { + PS.debug("Command registration is now done during instantiation"); } - public static List> getCommandAndAliases(CommandCategory category, PlotPlayer player) { - List> commands = new ArrayList<>(); - for (Command command : getInstance().getCommands()) { - if ((category != null) && !command.getCategory().equals(category)) { - continue; + public static boolean onCommand(final PlotPlayer player, String... args) { + if (args.length >= 1 && args[0].contains(":")) { + String[] split2 = args[0].split(":"); + if (split2.length == 2) { + // Ref: c:v, this will push value to the last spot in the array + // ex. /p h:2 SomeUsername + // > /p h SomeUsername 2 + String[] tmp = new String[args.length + 1]; + tmp[0] = split2[0]; + tmp[args.length] = split2[1]; + if (args.length > 2) { + System.arraycopy(args, 1, tmp, 1, args.length - 1); + } + args = tmp; } - if ((player != null) && !Permissions.hasPermission(player, command.getPermission())) { - continue; - } - commands.add(command); } - return commands; - } - - public static List> getCommands(CommandCategory category, PlotPlayer player) { - List> commands = new ArrayList<>(); - for (Command command : new HashSet<>(getInstance().getCommands())) { - if ((category != null) && !command.getCategory().equals(category)) { - continue; - } - if ((player != null) && !Permissions.hasPermission(player, command.getPermission())) { - continue; - } - commands.add(command); + { + try { + if (args.length == 0 || MathMan.isInteger(args[0]) || CommandCategory.valueOf(args[0].toUpperCase()) != null) { + // This will default certain syntax to the help command + // e.g. /plot, /plot 1, /plot claiming + getInstance().help.execute(player, args, null, null); + return true; + } + } catch (IllegalArgumentException e) {} } - return commands; - } - - public static void displayHelp(PlotPlayer player, String cat, int page, String label) { - CommandCategory catEnum = null; - if (cat != null) { - if (StringMan.isEqualIgnoreCase(cat, "all")) { - catEnum = null; - } else { - for (CommandCategory c : CommandCategory.values()) { - if (StringMan.isEqualIgnoreCaseToAny(cat, c.name(), c.toString())) { - catEnum = c; - cat = c.name(); - break; + getInstance().execute(player, args, new RunnableVal3() { + @Override + public void run(final Command cmd, final Runnable success, final Runnable failure) { + if (cmd.hasConfirmation(player) ) { + CmdConfirm.addPending(player, "/plot area create pos2 (Creates world)", new Runnable() { + @Override + public void run() { + if (EconHandler.manager != null) { + PlotArea area = player.getApplicablePlotArea(); + if (area != null) { + Double price = area.PRICES.get(cmd.getId()); + if (price != null && EconHandler.manager.getMoney(player) < price) { + failure.run(); + return; + } + } + } + success.run(); + } + }); + return; + } + if (EconHandler.manager != null) { + PlotArea area = player.getApplicablePlotArea(); + if (area != null) { + Double price = area.PRICES.get(cmd.getId()); + if (price != null && EconHandler.manager.getMoney(player) < price) { + failure.run(); + return; + } } } - if (catEnum == null) { - cat = null; - } + success.run(); } - } - if (cat == null && page == 0) { - StringBuilder builder = new StringBuilder(); - builder.append(C.HELP_HEADER.s()); - for (CommandCategory c : CommandCategory.values()) { - builder.append( - "\n" + StringMan.replaceAll(C.HELP_INFO_ITEM.s(), "%category%", c.toString().toLowerCase(), "%category_desc%", c.toString())); + }, new RunnableVal2() { + @Override + public void run(Command cmd, CommandResult result) { + // Post command stuff!? } - builder.append("\n").append(C.HELP_INFO_ITEM.s().replaceAll("%category%", "all").replaceAll("%category_desc%", "Display all commands")); - builder.append("\n" + C.HELP_FOOTER.s()); - MainUtil.sendMessage(player, builder.toString(), false); - return; - } - page--; - new HelpMenu(player).setCategory(catEnum).getCommands().generateMaxPages().generatePage(page, label).render(); + }); + // Always true + return true; } - public static boolean onCommand(PlotPlayer player, String cmd, String... args) { + @Override + public void execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { // Clear perm caching // player.deleteMeta("perm"); - //////////////////////// - int help_index = -1; + // Optional command scope // String category = null; Location loc = null; Plot plot = null; boolean tp = false; - switch (args.length) { - case 0: { - help_index = 0; - break; - } - case 1: { - if (MathMan.isInteger(args[0])) { - try { - help_index = Integer.parseInt(args[args.length - 1]); - } catch (NumberFormatException e) { - } - break; - } - } - default: { - switch (args[0].toLowerCase()) { - case "he": - case "help": - case "?": { - switch (args.length) { - case 1: { - help_index = 0; - break; - } - case 2: { - if (MathMan.isInteger(args[1])) { - category = null; - try { - help_index = Integer.parseInt(args[1]); - } catch (NumberFormatException e) { - help_index = 1; - } - } else { - help_index = 1; - category = args[1]; - } - break; - } - case 3: { - category = args[1]; - if (MathMan.isInteger(args[2])) { - try { - help_index = Integer.parseInt(args[2]); - } catch (NumberFormatException e) { - help_index = 1; - } - } - break; - } - default: { - C.COMMAND_SYNTAX.send(player, "/" + cmd + "? [#||category [#]]"); - return true; - } - } - break; - } - default: { - if (args.length >= 2) { - PlotArea area = player.getApplicablePlotArea(); - Plot newPlot = Plot.fromString(area, args[0]); - if (newPlot == null) { - break; - } - if (!ConsolePlayer.isConsole(player) && (!newPlot.getArea().equals(area) || newPlot.isDenied(player.getUUID())) - && !Permissions.hasPermission(player, C.PERMISSION_ADMIN)) { - break; - } - // Save meta - loc = player.getMeta("location"); - plot = player.getMeta("lastplot"); - tp = true; - // Set loc - player.setMeta("location", newPlot.getBottomAbs()); - player.setMeta("lastplot", newPlot); - // Trim command - args = Arrays.copyOfRange(args, 1, args.length); - } - } - } + if (args.length >= 2) { + PlotArea area = player.getApplicablePlotArea(); + Plot newPlot = Plot.fromString(area, args[0]); + if (newPlot != null && (ConsolePlayer.isConsole(player) || newPlot.getArea().equals(area) || Permissions.hasPermission(player, C.PERMISSION_ADMIN)) && !newPlot.isDenied(player.getUUID())) { + // Save meta + loc = player.getMeta("location"); + plot = player.getMeta("lastplot"); + tp = true; + // Set loc + player.setMeta("location", newPlot.getBottomAbs()); + player.setMeta("lastplot", newPlot); + // Trim command + args = Arrays.copyOfRange(args, 1, args.length); } } - if (help_index != -1) { - displayHelp(player, category, help_index, cmd); - return true; - } - String fullCmd = StringMan.join(args, " "); - getInstance().handle(player, cmd + " " + fullCmd); - // Restore location + super.execute(player, args, confirm, whenDone); + // Reset command scope // if (tp) { if (loc == null) { player.deleteMeta("location"); @@ -313,148 +247,10 @@ public class MainCommand extends CommandManager { player.setMeta("lastplot", plot); } } - return true; - } - - public int getMatch(String[] args, Command cmd) { - int count = 0; - String perm = cmd.getPermission(); - HashSet desc = new HashSet<>(); - for (String alias : cmd.getAliases()) { - if (alias.startsWith(args[0])) { - count += 5; - } - } - Collections.addAll(desc, cmd.getDescription().split(" ")); - for (String arg : args) { - if (perm.startsWith(arg)) { - count++; - } - if (desc.contains(arg)) { - count++; - } - } - String[] usage = cmd.getUsage().split(" "); - for (int i = 0; i < Math.min(4, usage.length); i++) { - int require; - if (usage[i].startsWith("<")) { - require = 1; - } else { - require = 0; - } - String[] split = usage[i].split("\\|| |\\>|\\<|\\[|\\]|\\{|\\}|\\_|\\/"); - for (String aSplit : split) { - for (String arg : args) { - if (StringMan.isEqualIgnoreCase(arg, aSplit)) { - count += 5 - i + require; - } - } - } - } - count += StringMan.intersection(desc, args); - return count; } @Override - public int handle(PlotPlayer plr, String input) { - String[] parts = input.split(" "); - String[] args; - String label; - if (parts.length == 1) { - label = null; - args = new String[0]; - } else { - label = parts[1]; - args = new String[parts.length - 2]; - System.arraycopy(parts, 2, args, 0, args.length); - } - Command cmd; - if (label != null) { - if (label.contains(":")) { - // Ref: c:v, this will push value to the last spot in the array - // ex. /p h:2 SomeUsername - // > /p h SomeUsername 2 - String[] temp = label.split(":"); - if (temp.length == 2) { - label = temp[0]; - String[] tempArgs = new String[args.length + 1]; - System.arraycopy(args, 0, tempArgs, 0, args.length); - tempArgs[tempArgs.length - 1] = temp[1]; - args = tempArgs; - } - } - cmd = getInstance().commands.get(label.toLowerCase()); - } else { - cmd = null; - } - if (cmd == null) { - MainUtil.sendMessage(plr, C.NOT_VALID_SUBCOMMAND); - { - List> cmds = getCommands(null, plr); - if ((label == null) || cmds.isEmpty()) { - MainUtil.sendMessage(plr, C.DID_YOU_MEAN, "/plot help"); - } else { - HashSet setargs = new HashSet<>(args.length + 1); - for (String arg : args) { - setargs.add(arg.toLowerCase()); - } - setargs.add(label); - String[] allargs = setargs.toArray(new String[setargs.size()]); - int best = 0; - for (Command current : cmds) { - int match = getMatch(allargs, current); - if (match > best) { - cmd = current; - } - } - if (cmd == null) { - cmd = new StringComparison<>(label, getCommandAndAliases(null, plr)).getMatchObject(); - } - MainUtil.sendMessage(plr, C.DID_YOU_MEAN, cmd.getUsage().replaceAll("\\{label\\}", parts[0])); - } - } - return CommandHandlingOutput.NOT_FOUND; - } - if (!cmd.getRequiredType().allows(plr)) { - if (ConsolePlayer.isConsole(plr)) { - MainUtil.sendMessage(plr, C.IS_CONSOLE); - } else { - MainUtil.sendMessage(plr, C.NOT_CONSOLE); - } - return CommandHandlingOutput.CALLER_OF_WRONG_TYPE; - } - if (!Permissions.hasPermission(plr, cmd.getPermission())) { - MainUtil.sendMessage(plr, C.NO_PERMISSION, cmd.getPermission()); - return CommandHandlingOutput.NOT_PERMITTED; - } - Argument[] requiredArguments = cmd.getRequiredArguments(); - if ((requiredArguments != null) && (requiredArguments.length > 0)) { - boolean success = true; - if (args.length < requiredArguments.length) { - success = false; - } else { - for (int i = 0; i < requiredArguments.length; i++) { - if (requiredArguments[i].parse(args[i]) == null) { - success = false; - break; - } - } - } - if (!success) { - C.COMMAND_SYNTAX.send(plr, cmd.getUsage()); - return CommandHandlingOutput.WRONG_USAGE; - } - } - try { - boolean result = cmd.onCommand(plr, args); - if (!result) { - cmd.getUsage(); - return CommandHandlingOutput.WRONG_USAGE; - } - } catch (Throwable t) { - t.printStackTrace(); - return CommandHandlingOutput.ERROR; - } - return CommandHandlingOutput.SUCCESS; + public boolean canExecute(PlotPlayer player) { + return true; } } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/plugin.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/PluginCmd.java similarity index 98% rename from Core/src/main/java/com/intellectualcrafters/plot/commands/plugin.java rename to Core/src/main/java/com/intellectualcrafters/plot/commands/PluginCmd.java index 2ac8bc7e4..ad840ce38 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/plugin.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/PluginCmd.java @@ -30,7 +30,7 @@ import com.plotsquared.general.commands.CommandDeclaration; description = "Show plugin information", aliases = "version", category = CommandCategory.INFO) -public class Plugin extends SubCommand { +public class PluginCmd extends SubCommand { @Override public boolean onCommand(PlotPlayer plr, String[] args) { diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Rate.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Rate.java index 35758cd84..eb1c78ad0 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Rate.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Rate.java @@ -134,9 +134,9 @@ public class Rate extends SubCommand { } setTitle(Settings.RATING_CATEGORIES.get(index.getValue())); if (Permissions.hasPermission(this.player, "plots.comment")) { - Command command = MainCommand.getInstance().getCommand("comment"); + Command command = MainCommand.getInstance().getCommand("comment"); if (command != null) { - MainUtil.sendMessage(this.player, C.COMMENT_THIS, command.getUsage().replaceAll("{label}", "plot")); + MainUtil.sendMessage(this.player, C.COMMENT_THIS, command.getUsage()); } } return false; diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Remove.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Remove.java index 8f1d09003..dfb39a87c 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Remove.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Remove.java @@ -45,7 +45,7 @@ import java.util.UUID; public class Remove extends SubCommand { public Remove() { - this.requiredArguments = new Argument[]{Argument.PlayerName}; + super(Argument.PlayerName); } @Override diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Set.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Set.java index 63c2d57e4..ce7611968 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Set.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Set.java @@ -61,7 +61,7 @@ public class Set extends SubCommand { this.component = new SetCommand() { @Override - public String getCommand() { + public String getId() { return "set.component"; } @@ -163,9 +163,10 @@ public class Set extends SubCommand { if (args.length == 0) { return noArgs(plr); } - Command cmd = MainCommand.getInstance().getCommand("set" + args[0]); + Command cmd = MainCommand.getInstance().getCommand("set" + args[0]); if (cmd != null) { - return cmd.onCommand(plr, Arrays.copyOfRange(args, 1, args.length)); + cmd.execute(plr, Arrays.copyOfRange(args, 1, args.length), null, null); + return true; } // Additional checks Plot plot = plr.getCurrentPlot(); @@ -193,7 +194,7 @@ public class Set extends SubCommand { a.append(" ").append(args[x]); } } - MainCommand.onCommand(plr, "plot", ("flag set " + args[0] + a.toString()).split(" ")); + MainCommand.onCommand(plr, ("flag set " + args[0] + a.toString()).split(" ")); return true; } } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/SetCommand.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/SetCommand.java index 0734ccdb2..ffdb93f6d 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/SetCommand.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/SetCommand.java @@ -18,15 +18,15 @@ public abstract class SetCommand extends SubCommand { return !sendMessage(plr, C.NOT_IN_PLOT); } if (!plot.hasOwner()) { - if (!Permissions.hasPermission(plr, "plots.admin.command." + getCommand())) { - MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.admin.command." + getCommand()); + if (!Permissions.hasPermission(plr, "plots.admin.command." + getId())) { + MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.admin.command." + getId()); MainUtil.sendMessage(plr, C.PLOT_NOT_CLAIMED); return false; } } if (!plot.isOwner(plr.getUUID())) { - if (!Permissions.hasPermission(plr, "plots.admin.command." + getCommand())) { - MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.admin.command." + getCommand()); + if (!Permissions.hasPermission(plr, "plots.admin.command." + getId())) { + MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.admin.command." + getId()); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); return false; } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/SubCommand.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/SubCommand.java index 811451b54..69fc41a0d 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/SubCommand.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/SubCommand.java @@ -21,80 +21,37 @@ package com.intellectualcrafters.plot.commands; import com.intellectualcrafters.plot.config.C; -import com.intellectualcrafters.plot.object.PlotMessage; import com.intellectualcrafters.plot.object.PlotPlayer; +import com.intellectualcrafters.plot.object.RunnableVal2; import com.intellectualcrafters.plot.object.RunnableVal3; -import com.intellectualcrafters.plot.util.MainUtil; - -import java.util.List; +import com.plotsquared.general.commands.Argument; +import com.plotsquared.general.commands.Command; /** - * SubCommand class. + * SubCommand class + * @see com.plotsquared.general.commands.Command(com.plotsquared.general.commands.Command, boolean) + * @Deprecated In favor of normal Command class */ -public abstract class SubCommand extends com.plotsquared.general.commands.Command { +public abstract class SubCommand extends Command { + public SubCommand() { + super(MainCommand.getInstance(), true); + } - /** - * The category. - */ - public CommandCategory category; + public SubCommand(Argument... arguments) { + this(); + setRequiredArguments(arguments); + } - /** - * Send a message. - * - * @param plr Player who will receive the message - * @param c Caption - * @param args Arguments (%s's) - * - * @see MainUtil#sendMessage(PlotPlayer, C, String...) - */ - public boolean sendMessage(PlotPlayer plr, C c, String... args) { - c.send(plr, args); + @Override + public void execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { + onCommand(player, args); + } + + + public abstract boolean onCommand(PlotPlayer plr, String[] args); + + public boolean sendMessage(PlotPlayer player, C message, Object... args) { + message.send(player, args); return true; } - - public void paginate(PlotPlayer player, List c, int size, int page, RunnableVal3 add, String baseCommand, - String header) { - // Calculate pages & index - if (page < 0) { - page = 0; - } - int totalPages = (int) Math.ceil(c.size() / size); - if (page > totalPages) { - page = totalPages; - } - int max = page * size + size; - if (max > c.size()) { - max = c.size(); - } - // Send the header - header = header.replaceAll("%cur", page + 1 + "").replaceAll("%max", totalPages + 1 + "").replaceAll("%amount%", c.size() + "") - .replaceAll("%word%", "all"); - MainUtil.sendMessage(player, header); - // Send the page content - List subList = c.subList(page * size, max); - int i = page * size; - for (T obj : subList) { - i++; - PlotMessage msg = new PlotMessage(); - add.run(i, obj, msg); - msg.send(player); - } - // Send the footer - if (page < totalPages && page > 0) { // Back | Next - new PlotMessage().text("<-").color("$1").command(baseCommand + " " + page).text(" | ").color("$3").text("->").color("$1") - .command(baseCommand + " " + (page + 2)) - .text(C.CLICKABLE.s()).color("$2").send(player); - return; - } - if (page == 0 && totalPages != 0) { // Next - new PlotMessage().text("<-").color("$3").text(" | ").color("$3").text("->").color("$1").command(baseCommand + " " + (page + 2)) - .text(C.CLICKABLE.s()).color("$2").send(player); - return; - } - if (page == totalPages && totalPages != 0) { // Back - new PlotMessage().text("<-").color("$1").command(baseCommand + " " + page).text(" | ").color("$3").text("->").color("$3") - .text(C.CLICKABLE.s()).color("$2").send(player); - - } - } } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Toggle.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Toggle.java index 3725bd8ae..a8cca8817 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Toggle.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Toggle.java @@ -20,20 +20,14 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// package com.intellectualcrafters.plot.commands; -import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.object.PlotPlayer; +import com.intellectualcrafters.plot.object.RunnableVal2; +import com.intellectualcrafters.plot.object.RunnableVal3; import com.intellectualcrafters.plot.util.MainUtil; -import com.intellectualcrafters.plot.util.Permissions; -import com.intellectualcrafters.plot.util.StringMan; import com.plotsquared.general.commands.Command; import com.plotsquared.general.commands.CommandDeclaration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map.Entry; - @CommandDeclaration( command = "toggle", aliases = {"attribute"}, @@ -42,97 +36,59 @@ import java.util.Map.Entry; usage = "/plot toggle ", requiredType = RequiredType.NONE, category = CommandCategory.SETTINGS) -public class Toggle extends SubCommand { - - private final HashMap> toggles; - +public class Toggle extends Command { public Toggle() { - this.toggles = new HashMap<>(); - this.toggles.put("titles", - new Command("titles", "/plot toggle titles", "Toggle titles for yourself", C.PERMISSION_PLOT_TOGGLE_TITLES.s()) { - - @Override - public boolean onCommand(PlotPlayer player, String[] args) { - if (toggle(player, "disabletitles")) { - MainUtil.sendMessage(player, C.TOGGLE_ENABLED, getCommand()); - } else { - MainUtil.sendMessage(player, C.TOGGLE_DISABLED, getCommand()); - } - return true; - } - }); - this.toggles.put("chatspy", new Command("chatspy", "/plot toggle chatspy", "Toggle chat spying", C.PERMISSION_COMMANDS_CHAT.s()) { - - @Override - public boolean onCommand(PlotPlayer player, String[] args) { - if (toggle(player, "chatspy")) { - MainUtil.sendMessage(player, C.TOGGLE_DISABLED, getCommand()); - } else { - MainUtil.sendMessage(player, C.TOGGLE_ENABLED, getCommand()); - } - return true; - } - }); - this.toggles.put("chat", - new Command("chat", "/plot toggle chat", "Toggle plot chat for yourself", C.PERMISSION_PLOT_TOGGLE_CHAT.s()) { - - @Override - public boolean onCommand(PlotPlayer player, String[] args) { - if (toggle(player, "chat")) { - MainUtil.sendMessage(player, C.PLOT_CHAT_OFF); - } else { - MainUtil.sendMessage(player, C.PLOT_CHAT_ON); - } - return true; - } - }); - if (PS.get() != null && PS.get().worldedit != null) { - this.toggles.put("worldedit", - new Command("worldedit", "/plot toggle worldedit", "Toggle worldedit bypass", C.PERMISSION_WORLDEDIT_BYPASS.s()) { - - @Override - public boolean onCommand(PlotPlayer player, String[] args) { - if (toggle(player, "worldedit")) { - MainUtil.sendMessage(player, C.WORLDEDIT_RESTRICTED); - } else { - MainUtil.sendMessage(player, C.WORLDEDIT_UNMASKED); - } - return true; - } - }); - } - + super(MainCommand.getInstance(), true); } - public void noArgs(PlotPlayer plr) { - MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot toggle "); - ArrayList options = new ArrayList<>(); - for (Entry> entry : this.toggles.entrySet()) { - if (Permissions.hasPermission(plr, entry.getValue().getPermission())) { - options.add(entry.getKey()); - } - } - if (!options.isEmpty()) { - MainUtil.sendMessage(plr, C.SUBCOMMAND_SET_OPTIONS_HEADER.s() + StringMan.join(options, ",")); + @CommandDeclaration( + command = "chatspy", + aliases = {"spy"}, + permission = "plots.admin.command.chat", + description = "Toggle admin chat spying") + public void chatspy(Command command, final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { + if (toggle(player, "chatspy")) { + MainUtil.sendMessage(player, C.TOGGLE_DISABLED, command.toString()); + } else { + MainUtil.sendMessage(player, C.TOGGLE_ENABLED, command.toString()); } } - @Override - public boolean onCommand(PlotPlayer player, String[] args) { - if (args.length == 0) { - noArgs(player); - return false; + @CommandDeclaration( + command = "worldedit", + aliases = {"we", "wea"}, + permission = "plots.worldedit.bypass", + description = "Toggle worldedit area restrictions") + public void worldedit(Command command, final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { + if (toggle(player, "worldedit")) { + MainUtil.sendMessage(player, C.TOGGLE_DISABLED, command.toString()); + } else { + MainUtil.sendMessage(player, C.TOGGLE_ENABLED, command.toString()); } - Command cmd = this.toggles.get(args[0].toLowerCase()); - if (cmd == null) { - noArgs(player); - return false; + } + + @CommandDeclaration( + command = "chat", + permission = "plots.toggle.chat", + description = "Toggle plot chat") + public void chat(Command command, final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { + if (toggle(player, "chat")) { + MainUtil.sendMessage(player, C.TOGGLE_DISABLED, command.toString()); + } else { + MainUtil.sendMessage(player, C.TOGGLE_ENABLED, command.toString()); } - if (!Permissions.hasPermission(player, cmd.getPermission())) { - C.NO_PERMISSION.send(player, cmd.getPermission()); - return false; + } + + @CommandDeclaration( + command = "titles", + permission = "plots.toggle.titles", + description = "Toggle plot title messages") + public void titles(Command command, final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { + if (toggle(player, "titles")) { + MainUtil.sendMessage(player, C.TOGGLE_DISABLED, command.toString()); + } else { + MainUtil.sendMessage(player, C.TOGGLE_ENABLED, command.toString()); } - return cmd.onCommand(player, Arrays.copyOfRange(args, 1, args.length)); } public boolean toggle(PlotPlayer player, String key) { diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Trust.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Trust.java index c3e5b2e1f..f16ff0223 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Trust.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Trust.java @@ -44,7 +44,7 @@ import java.util.UUID; public class Trust extends SubCommand { public Trust() { - this.requiredArguments = new Argument[]{Argument.PlayerName}; + super(Argument.PlayerName); } @Override diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Undeny.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Undeny.java index c50cc729c..f781ebd91 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Undeny.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Undeny.java @@ -43,7 +43,7 @@ import java.util.UUID; public class Undeny extends SubCommand { public Undeny() { - this.requiredArguments = new Argument[]{Argument.PlayerName}; + super(Argument.PlayerName); } @Override diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Untrust.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Untrust.java index 33a9e98d9..4add20bb9 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Untrust.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Untrust.java @@ -46,7 +46,7 @@ import java.util.UUID; public class Untrust extends SubCommand { public Untrust() { - this.requiredArguments = new Argument[]{Argument.PlayerName}; + super(Argument.PlayerName); } @Override diff --git a/Core/src/main/java/com/intellectualcrafters/plot/commands/Visit.java b/Core/src/main/java/com/intellectualcrafters/plot/commands/Visit.java index 19e9b6cf0..d3f344ae5 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/commands/Visit.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/commands/Visit.java @@ -43,13 +43,13 @@ import java.util.UUID; permission = "plots.visit", description = "Visit someones plot", usage = "/plot visit [player|alias|world|id] [#]", - aliases = {"v", "tp", "teleport", "goto"}, + aliases = {"v", "tp", "teleport", "goto", "home"}, requiredType = RequiredType.NONE, category = CommandCategory.TELEPORT) public class Visit extends SubCommand { public Visit() { - this.requiredArguments = new Argument[]{Argument.String}; + super(Argument.String); } public List getPlots(UUID uuid) { diff --git a/Core/src/main/java/com/intellectualcrafters/plot/config/C.java b/Core/src/main/java/com/intellectualcrafters/plot/config/C.java index f395ee591..16e2ffc23 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/config/C.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/config/C.java @@ -369,14 +369,14 @@ public enum C { UNLINK_IMPOSSIBLE("$2You can only unlink a mega-plot", "Merge"), UNLINK_SUCCESS("$2Successfully unlinked plots.", "Merge"), /* - * Commands + * CommandConfig */ - NOT_VALID_SUBCOMMAND("$2That is not a valid subcommand", "Commands"), - DID_YOU_MEAN("$2Did you mean: $1%s", "Commands"), - NAME_LITTLE("$2%s0 name is too short, $1%s1$2<$1%s3", "Commands"), - NO_COMMANDS("$2I'm sorry, but you're not permitted to use any subcommands.", "Commands"), - SUBCOMMAND_SET_OPTIONS_HEADER("$2Possible Values: ", "Commands"), - COMMAND_SYNTAX("$1Usage: $2%s", "Commands"), + NOT_VALID_SUBCOMMAND("$2That is not a valid subcommand", "CommandConfig"), + DID_YOU_MEAN("$2Did you mean: $1%s", "CommandConfig"), + NAME_LITTLE("$2%s0 name is too short, $1%s1$2<$1%s3", "CommandConfig"), + NO_COMMANDS("$2I'm sorry, but you're not permitted to use any subcommands.", "CommandConfig"), + SUBCOMMAND_SET_OPTIONS_HEADER("$2Possible Values: ", "CommandConfig"), + COMMAND_SYNTAX("$1Usage: $2%s", "CommandConfig"), /* * Player not found */ @@ -573,7 +573,7 @@ public enum C { FLAG_NOT_ADDED("$2The flag could not be added", "Flag"), FLAG_REMOVED("$4Successfully removed flag", "Flag"), FLAG_ADDED("$4Successfully added flag", "Flag"), - FLAG_TUTORIAL_USAGE("$1Have an admin set the flag: $2%s", "Commands"), + FLAG_TUTORIAL_USAGE("$1Have an admin set the flag: $2%s", "CommandConfig"), /* * Trusted */ @@ -633,16 +633,14 @@ public enum C { */ private final String def; /** - * Should the string be prefixed. - */ - private final boolean prefix; /** * What locale category should this translation fall under. */ private final String category; /** * Translated. */ - private String s; /** + private String s; + /** * Should the string be prefixed. */ private final boolean prefix; diff --git a/Core/src/main/java/com/intellectualcrafters/plot/config/Settings.java b/Core/src/main/java/com/intellectualcrafters/plot/config/Settings.java index e9ba60fd2..57dac19c9 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/config/Settings.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/config/Settings.java @@ -60,10 +60,6 @@ public class Settings { public static boolean REQUIRE_DONE = false; public static boolean DONE_COUNTS_TOWARDS_LIMIT = false; public static boolean DONE_RESTRICTS_BUILDING = false; - /** - * Clusters - */ - public static boolean ENABLE_CLUSTERS = false; /** * PlotMe settings */ diff --git a/Core/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java b/Core/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java index f348a18cb..8a9f2ba56 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java @@ -1044,13 +1044,7 @@ public class SQLManager implements AbstractDB { */ @Override public void createTables() throws SQLException { - String[] tables; - if (Settings.ENABLE_CLUSTERS) { - tables = new String[] { "plot", "plot_denied", "plot_helpers", "plot_comments", "plot_trusted", "plot_rating", "plot_settings", "cluster", "player_meta" }; - } else { - tables = new String[]{"plot", "plot_denied", "plot_helpers", "plot_comments", "plot_trusted", "plot_rating", "plot_settings", - "player_meta"}; - } + String[] tables = new String[] { "plot", "plot_denied", "plot_helpers", "plot_comments", "plot_trusted", "plot_rating", "plot_settings", "cluster", "player_meta" }; DatabaseMetaData meta = this.connection.getMetaData(); int create = 0; for (String s : tables) { diff --git a/Core/src/main/java/com/intellectualcrafters/plot/generator/AugmentedUtils.java b/Core/src/main/java/com/intellectualcrafters/plot/generator/AugmentedUtils.java index dd24f23e7..a29296e32 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/generator/AugmentedUtils.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/generator/AugmentedUtils.java @@ -115,7 +115,7 @@ public class AugmentedUtils { for (int z = bzz; z <= tzz; z++) { int rx = x + bx; int rz = z + bz; - boolean can = manager.getPlotIdAbs(area, rx, 0, rz) == null; + boolean can = manager.getPlotId(area, rx, 0, rz) == null; if (can) { for (int y = 1; y < 128; y++) { result.setBlock(x, y, z, air); diff --git a/Core/src/main/java/com/intellectualcrafters/plot/object/Plot.java b/Core/src/main/java/com/intellectualcrafters/plot/object/Plot.java index 00f80372b..a52003ac0 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/object/Plot.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/object/Plot.java @@ -20,6 +20,25 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// package com.intellectualcrafters.plot.object; +import java.awt.Rectangle; +import java.awt.geom.Area; +import java.awt.geom.PathIterator; +import java.io.File; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + import com.google.common.collect.BiMap; import com.intellectualcrafters.jnbt.CompoundTag; import com.intellectualcrafters.plot.PS; @@ -41,25 +60,6 @@ import com.intellectualcrafters.plot.util.UUIDHandler; import com.intellectualcrafters.plot.util.WorldUtil; import com.plotsquared.listener.PlotListener; -import java.awt.Rectangle; -import java.awt.geom.Area; -import java.awt.geom.PathIterator; -import java.io.File; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map.Entry; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; - /** * The plot class
* [IMPORTANT] @@ -1960,12 +1960,10 @@ public class Plot { * @return */ public boolean canClaim(PlotPlayer player) { - if (Settings.ENABLE_CLUSTERS) { - PlotCluster cluster = this.getCluster(); - if (cluster != null) { - if (!cluster.isAdded(player.getUUID()) && !Permissions.hasPermission(player, "plots.admin.command.claim")) { - return false; - } + PlotCluster cluster = this.getCluster(); + if (cluster != null) { + if (!cluster.isAdded(player.getUUID()) && !Permissions.hasPermission(player, "plots.admin.command.claim")) { + return false; } } return this.guessOwner() == null && !isMerged(); @@ -2650,14 +2648,14 @@ public class Plot { greaterPlot.setMerged(0, true); lesserPlot.mergeData(greaterPlot); if (removeRoads) { - if (lesserPlot.getMerged(5)) { - lesserPlot.removeRoadSouthEast(); - } lesserPlot.removeRoadSouth(); Plot other = this.getRelative(3); if (other.getMerged(2) && other.getMerged(1)) { - other.removeRoadEast(); greaterPlot.mergePlot(other, removeRoads); + other.removeRoadEast(); + } + if (lesserPlot.getMerged(5)) { + lesserPlot.removeRoadSouthEast(); } } } @@ -2674,15 +2672,15 @@ public class Plot { greaterPlot.setMerged(3, true); lesserPlot.mergeData(greaterPlot); if (removeRoads) { - lesserPlot.removeRoadEast(); + final Plot other = lesserPlot.getRelative(0); + if (other.getMerged(2) && other.getMerged(1)) { + greaterPlot.mergePlot(other, removeRoads); + other.removeRoadSouthEast(); + } if (lesserPlot.getMerged(5)) { lesserPlot.removeRoadSouthEast(); } - Plot other = lesserPlot.getRelative(0); - if (other.getMerged(2) && other.getMerged(1)) { - other.removeRoadSouthEast(); - greaterPlot.mergePlot(other, removeRoads); - } + lesserPlot.removeRoadEast(); } } } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/object/PlotArea.java b/Core/src/main/java/com/intellectualcrafters/plot/object/PlotArea.java index 88a1be682..b1fab38e8 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/object/PlotArea.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/object/PlotArea.java @@ -554,9 +554,6 @@ public abstract class PlotArea { } public PlotCluster getCluster(Location location) { - if (!Settings.ENABLE_CLUSTERS) { - return null; - } Plot plot = getPlot(location); if (plot == null) { return null; @@ -565,7 +562,7 @@ public abstract class PlotArea { } public PlotCluster getFirstIntersectingCluster(PlotId pos1, PlotId pos2) { - if (!Settings.ENABLE_CLUSTERS || this.clusters == null) { + if (this.clusters == null) { return null; } for (PlotCluster cluster : this.clusters.getAll()) { @@ -577,9 +574,6 @@ public abstract class PlotArea { } public PlotCluster getCluster(PlotId id) { - if (!Settings.ENABLE_CLUSTERS) { - return null; - } return this.clusters != null ? this.clusters.get(id.x, id.y) : null; } @@ -862,16 +856,13 @@ public abstract class PlotArea { } public void removeCluster(PlotCluster plotCluster) { - if (!Settings.ENABLE_CLUSTERS || this.clusters == null) { + if (this.clusters == null) { throw new IllegalAccessError("Clusters not enabled!"); } this.clusters.remove(plotCluster); } public void addCluster(PlotCluster plotCluster) { - if (!Settings.ENABLE_CLUSTERS) { - throw new IllegalAccessError("Clusters not enabled!"); - } if (this.clusters == null) { this.clusters = new QuadMap(Integer.MAX_VALUE, 0, 0, 64) { @Override diff --git a/Core/src/main/java/com/intellectualcrafters/plot/util/PlotChunk.java b/Core/src/main/java/com/intellectualcrafters/plot/util/PlotChunk.java index 5663ad2e0..a8497a5ce 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/util/PlotChunk.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/util/PlotChunk.java @@ -1,7 +1,13 @@ package com.intellectualcrafters.plot.util; +import com.intellectualcrafters.plot.PS; +import com.intellectualcrafters.plot.object.Location; +import com.intellectualcrafters.plot.object.Plot; +import com.intellectualcrafters.plot.object.PlotArea; import com.intellectualcrafters.plot.object.PlotBlock; +import com.intellectualcrafters.plot.object.PlotManager; import com.intellectualcrafters.plot.object.PseudoRandom; +import com.intellectualcrafters.plot.object.RunnableVal3; import com.intellectualcrafters.plot.util.SetQueue.ChunkWrapper; /** @@ -129,6 +135,39 @@ public abstract class PlotChunk implements Cloneable { } } + /** + * Run a task for each x,z value corresponding to the plot at that location
+ * - Plot: The plot at the x,z (may be null)
+ * - Location: The location in the chunk (y = 0)
+ * - PlotChunk: Reference to this chunk object
+ * @param task + */ + public void mapByType2D(RunnableVal3 task) { + int bx = getX() << 4; + int bz = getZ() << 4; + String world = getChunkWrapper().world; + PlotArea area = PS.get().getPlotArea(world, null); + Location loc = new Location(world, bx, 0, bz); + if (area != null) { + PlotManager manager = area.getPlotManager(); + for (int x = 0; x < 16; x++) { + loc.setX(bx + x); + for (int z = 0; z < 16; z++) { + loc.setZ(bz + z); + task.run(area.getPlotAbs(loc), x, z); + } + } + } else { + for (int x = 0; x < 16; x++) { + loc.setX(bx + x); + for (int z = 0; z < 16; z++) { + loc.setZ(bz + z); + task.run(loc.getPlotAbs(), x, z); + } + } + } + } + /** * Fill a cuboid in this chunk with a block * @param x1 diff --git a/Core/src/main/java/com/intellectualcrafters/plot/util/helpmenu/HelpMenu.java b/Core/src/main/java/com/intellectualcrafters/plot/util/helpmenu/HelpMenu.java index 7bb68eb0c..c894f5c9d 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/util/helpmenu/HelpMenu.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/util/helpmenu/HelpMenu.java @@ -15,7 +15,7 @@ public class HelpMenu { private HelpPage _page = new HelpPage(CommandCategory.INFO, 0, 0); private int _maxPage; private CommandCategory _commandCategory; - private List> _commands; + private List _commands; public HelpMenu(final PlotPlayer player) { _player = player; @@ -27,7 +27,7 @@ public class HelpMenu { } public HelpMenu getCommands() { - _commands = MainCommand.getCommands(_commandCategory, _player); + _commands = MainCommand.getInstance().getCommands(_commandCategory, _player); return this; } diff --git a/Core/src/main/java/com/intellectualcrafters/plot/util/helpmenu/HelpPage.java b/Core/src/main/java/com/intellectualcrafters/plot/util/helpmenu/HelpPage.java index 677347461..d6875c8d4 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/util/helpmenu/HelpPage.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/util/helpmenu/HelpPage.java @@ -4,6 +4,7 @@ import com.intellectualcrafters.plot.commands.CommandCategory; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.util.MainUtil; +import com.intellectualcrafters.plot.util.StringMan; import java.util.ArrayList; import java.util.List; @@ -21,12 +22,8 @@ public class HelpPage { if (helpObjects.size() < 1) { MainUtil.sendMessage(player, C.NOT_VALID_NUMBER, "(0)"); } else { - MainUtil.sendMessage(player, C.HELP_HEADER, false); - MainUtil.sendMessage(player, _header, false); - for (final HelpObject object : helpObjects) { - MainUtil.sendMessage(player, object.toString(), false); - } - MainUtil.sendMessage(player, C.HELP_FOOTER, false); + String message = C.HELP_HEADER.s() + "\n" + _header + "\n" + StringMan.join(helpObjects, "\n") + "\n" + C.HELP_FOOTER.s(); + MainUtil.sendMessage(player, message, false); } } diff --git a/Core/src/main/java/com/plotsquared/general/commands/Command.java b/Core/src/main/java/com/plotsquared/general/commands/Command.java index cbea66327..17614675d 100644 --- a/Core/src/main/java/com/plotsquared/general/commands/Command.java +++ b/Core/src/main/java/com/plotsquared/general/commands/Command.java @@ -1,156 +1,449 @@ package com.plotsquared.general.commands; +import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.commands.CommandCategory; import com.intellectualcrafters.plot.commands.RequiredType; - +import com.intellectualcrafters.plot.config.C; +import com.intellectualcrafters.plot.object.PlotMessage; +import com.intellectualcrafters.plot.object.PlotPlayer; +import com.intellectualcrafters.plot.object.RunnableVal2; +import com.intellectualcrafters.plot.object.RunnableVal3; +import com.intellectualcrafters.plot.util.MainUtil; +import com.intellectualcrafters.plot.util.Permissions; +import com.intellectualcrafters.plot.util.StringComparison; +import com.intellectualcrafters.plot.util.StringMan; +import java.io.IOException; import java.lang.annotation.Annotation; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.Set; -public abstract class Command extends CommandManager { +public abstract class Command { - protected Argument[] requiredArguments; - private RequiredType requiredType = RequiredType.NONE; - private String command; - private String usage = ""; - private String description = ""; - private String permission = ""; - private Set aliases = new HashSet<>(); + // May be none + private ArrayList allCommands = new ArrayList<>(); + private ArrayList dynamicCommands = new ArrayList<>(); + private HashMap staticCommands = new HashMap<>(); + + // Parent command (may be null) + private Command parent; + + // The command ID + private String id; + private List aliases; + private RequiredType required; + private String usage; + private String description; + private boolean isStatic; + private String perm; + private boolean confirmation; private CommandCategory category; - private int hash; + private Argument[] arguments; - public Command() { - super(null, new ArrayList()); + public Command getParent() { + return parent; } - public Command(String command) { - super(null, new ArrayList()); - this.command = command; + public String getId() { + return id; } - public Command(String command, String usage) { - super(null, new ArrayList()); - this.command = command; - this.usage = usage; + public List getCommands(PlotPlayer player) { + List commands = new ArrayList<>(); + for (Command cmd : allCommands) { + if (cmd.canExecute(player)) { + commands.add(cmd); + } + } + return commands; } - public Command(String command, String usage, String description) { - super(null, new ArrayList()); - this.command = command; - this.usage = usage; - this.description = description; + public List getCommands(CommandCategory cat, PlotPlayer player) { + List cmds = getCommands(player); + if (cat != null) { + Iterator iter = cmds.iterator(); + while (iter.hasNext()) { + if (iter.next().category != cat) { + iter.remove(); + } + } + } + return cmds; } - public Command(String command, String usage, String description, String permission) { - super(null, new ArrayList()); - this.command = command; - this.usage = usage; - this.description = description; - this.permission = permission; + public List getCommands() { + return allCommands; } - public Command(String command, String[] aliases, String usage) { - super(null, new ArrayList()); - this.command = command; - this.aliases = new HashSet<>(Arrays.asList(aliases)); - this.usage = usage; + public boolean hasConfirmation(PlotPlayer player) { + return confirmation && !player.hasPermission(getPermission() + ".confirm.bypass"); } - public Command(String command, String[] aliases) { - super(null, new ArrayList()); - this.command = command; - this.aliases = new HashSet<>(Arrays.asList(aliases)); + public List getAliases() { + return aliases; } - public Command(String command, String usage, String description, String permission, String[] aliases, RequiredType requiredType) { - super(null, new ArrayList()); - this.command = command; - this.usage = usage; - this.description = description; - this.permission = permission; - this.aliases = new HashSet<>(Arrays.asList(aliases)); - this.requiredType = requiredType; + public String getDescription() { + return description; } public RequiredType getRequiredType() { - return this.requiredType; + return required; } - public void create() { - Annotation annotation = getClass().getAnnotation(CommandDeclaration.class); - if (annotation == null) { - throw new RuntimeException("Command does not have a CommandDeclaration"); + public Argument[] getRequiredArguments() { + return arguments; + } + + public void setRequiredArguments(Argument[] arguments) { + this.arguments = arguments; + } + + public Command(Command parent, boolean isStatic, String id, String perm, RequiredType required, CommandCategory cat) { + this.parent = parent; + this.isStatic = isStatic; + this.id = id; + this.perm = perm; + this.required = required; + this.category = cat; + this.aliases = Arrays.asList(id); + } + + public Command(Command parent, boolean isStatic) { + this.parent = parent; + this.isStatic = isStatic; + final Annotation cdAnnotation = getClass().getAnnotation(CommandDeclaration.class); + if (cdAnnotation != null) { + final CommandDeclaration declaration = (CommandDeclaration) cdAnnotation; + init(declaration); } - CommandDeclaration declaration = (CommandDeclaration) annotation; - this.command = declaration.command(); - this.usage = declaration.usage(); - this.description = declaration.description(); - this.usage = declaration.usage(); - this.permission = declaration.permission(); - this.aliases = new HashSet<>(Arrays.asList(declaration.aliases())); - this.requiredType = declaration.requiredType(); + for (final Method method : getClass().getDeclaredMethods()) { + if (method.isAnnotationPresent(CommandDeclaration.class)) { + Class[] types = method.getParameterTypes(); + // final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone + if (types.length == 5 && types[0] == Command.class && types[1] == PlotPlayer.class && types[2] == String[].class && types[3] == RunnableVal3.class && types[4] == RunnableVal2.class) { + Command tmp = new Command(this, true) { + @Override + public void execute(PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { + try { + method.invoke(Command.this, this, player, args, confirm, whenDone); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + }; + tmp.init(method.getAnnotation(CommandDeclaration.class)); + } + } + } + } + + public void init(CommandDeclaration declaration) { + this.id = declaration.command(); + this.perm = declaration.permission(); + this.required = declaration.requiredType(); this.category = declaration.category(); + HashMap options = new HashMap<>(); + List aliasOptions = new ArrayList<>(); + aliasOptions.add(id); + aliasOptions.addAll(Arrays.asList(declaration.aliases())); + options.put("aliases", aliasOptions); + options.put("description", declaration.description()); + options.put("usage", declaration.usage()); + options.put("confirmation", declaration.confirmation()); + boolean set = false; + for (Map.Entry entry : options.entrySet()) { + String key = id + "." + entry.getKey(); + if (!PS.get().commands.contains(key)) { + PS.get().commands.set(key, entry.getValue()); + set = true; + } + } + if (set) { + try { + PS.get().commands.save(PS.get().commandsFile); + } catch (IOException e) { + e.printStackTrace(); + + } + } + aliases = PS.get().commands.getStringList(id + ".aliases"); + description = PS.get().commands.getString(id + ".description"); + usage = PS.get().commands.getString(id + ".usage"); + confirmation = PS.get().commands.getBoolean(id + ".confirmation"); + if (parent != null) { + parent.register(this); + } + } + + public void register(Command command) { + if (command.isStatic) { + for (String alias : command.aliases) { + staticCommands.put(alias.toLowerCase(), command); + } + } else { + dynamicCommands.add(command); + } + allCommands.add(command); + } + + public enum CommandResult { + FAILURE, + SUCCESS + } + + public String getPermission() { + if (perm != null && perm.length() != 0) { + return perm; + } + if (parent == null) { + return "plots.use"; + } + if (parent.parent == null) { + return "plots." + id; + } + return parent.getPermission() + "." + id; + } + + public void paginate(PlotPlayer player, List c, int size, int page, RunnableVal3 add, String baseCommand, String header) { + // Calculate pages & index + if (page < 0) { + page = 0; + } + final int totalPages = (int) Math.ceil(c.size() / size); + if (page > totalPages) { + page = totalPages; + } + int max = page * size + size; + if (max > c.size()) { + max = c.size(); + } + // Send the header + header = header.replaceAll("%cur", page + 1 + "").replaceAll("%max", totalPages + 1 + "").replaceAll("%amount%", c.size() + "").replaceAll("%word%", "all"); + MainUtil.sendMessage(player, header); + // Send the page content + final List subList = c.subList(page * size, max); + int i = page * size; + for (final T obj : subList) { + i++; + PlotMessage msg = new PlotMessage(); + add.run(i, obj, msg); + msg.send(player); + } + // Send the footer + if (page < totalPages && page > 0) { // Back | Next + new PlotMessage().text("<-").color("$1").command(baseCommand + " " + page).text(" | ").color("$3").text("->").color("$1") + .command(baseCommand + " " + (page + 2)) + .text(C.CLICKABLE.s()).color("$2").send(player); + return; + } + if (page == 0 && totalPages != 0) { // Next + new PlotMessage().text("<-").color("$3").text(" | ").color("$3").text("->").color("$1").command(baseCommand + " " + (page + 2)).text(C.CLICKABLE.s()).color("$2").send(player); + return; + } + if (page == totalPages && totalPages != 0) { // Back + new PlotMessage().text("<-").color("$1").command(baseCommand + " " + page).text(" | ").color("$3").text("->").color("$3") + .text(C.CLICKABLE.s()).color("$2").send(player); + } + } + + /** + * + * @param player Caller + * @param args Arguments + * @param confirm Instance, Success, Failure + * @return + */ + public void execute(final PlotPlayer player, String[] args, RunnableVal3 confirm, RunnableVal2 whenDone) { + if (args.length == 0 || args[0] == null) { + C.COMMAND_SYNTAX.send(player, getUsage()); + return; + } + if (allCommands == null || allCommands.size() == 0) { + player.sendMessage("Not Implemented: https://github.com/IntellectualSites/PlotSquared/issues/new"); + return; + } + Command cmd = getCommand(args[0]); + if (cmd == null) { + if (parent != null) { + C.COMMAND_SYNTAX.send(player, getUsage()); + return; + } + // Command recommendation + MainUtil.sendMessage(player, C.NOT_VALID_SUBCOMMAND); + { + List cmds = getCommands(player); + if (cmds.isEmpty()) { + MainUtil.sendMessage(player, C.DID_YOU_MEAN, "/plot help"); + return; + } + HashSet setargs = new HashSet<>(args.length); + for (String arg : args) { + setargs.add(arg.toLowerCase()); + } + String[] allargs = setargs.toArray(new String[setargs.size()]); + int best = 0; + for (Command current : cmds) { + int match = getMatch(allargs, current); + if (match > best) { + cmd = current; + } + } + if (cmd == null) { + cmd = new StringComparison<>(args[0], allCommands).getMatchObject(); + } + MainUtil.sendMessage(player, C.DID_YOU_MEAN, cmd.getUsage()); + } + return; + } + if (!cmd.canExecute(player)) { + Argument[] reqArgs = cmd.getRequiredArguments(); + if ((reqArgs != null) && (reqArgs.length > 0)) { + boolean failed = args.length > reqArgs.length; + String[] baseSplit = getCommandString().split(" "); + String[] fullSplit = getUsage().split(" "); + String base = getCommandString(); + for (int i = 0; i < reqArgs.length; i++) { + fullSplit[i + baseSplit.length] = reqArgs[i].getExample().toString(); + failed = failed || reqArgs[i].parse(args[i]) == null; + } + if (failed) { + C.COMMAND_SYNTAX.send(player, StringMan.join(fullSplit, " ")); + return; + } + } + C.NO_PERMISSION.send(player, cmd.getPermission()); + return; + } + cmd.execute(player, Arrays.copyOfRange(args, 1, args.length), confirm, whenDone); + } + + public int getMatch(String[] args, Command cmd) { + int count = 0; + String perm = cmd.getPermission(); + HashSet desc = new HashSet<>(); + for (String alias : cmd.getAliases()) { + if (alias.startsWith(args[0])) { + count += 5; + } + } + Collections.addAll(desc, cmd.getDescription().split(" ")); + for (String arg : args) { + if (perm.startsWith(arg)) { + count++; + } + if (desc.contains(arg)) { + count++; + } + } + String[] usage = cmd.getUsage().split(" "); + for (int i = 0; i < Math.min(4, usage.length); i++) { + int require; + if (usage[i].startsWith("<")) { + require = 1; + } else { + require = 0; + } + String[] split = usage[i].split("\\|| |\\>|\\<|\\[|\\]|\\{|\\}|\\_|\\/"); + for (String aSplit : split) { + for (String arg : args) { + if (StringMan.isEqualIgnoreCase(arg, aSplit)) { + count += 5 - i + require; + } + } + } + } + count += StringMan.intersection(desc, args); + return count; + } + + public Command getCommand(String arg) { + Command cmd = staticCommands.get(arg.toLowerCase()); + if (cmd == null) { + for (Command command : dynamicCommands) { + if (command.matches(arg)) { + return command; + } + } + } + return cmd; + } + + public boolean canExecute(PlotPlayer player) { + return required.allows(player) && Permissions.hasPermission(player, getPermission()); + } + + public boolean matches(String arg) { + arg = arg.toLowerCase(); + return StringMan.isEqual(arg, id) || aliases.contains(arg); + } + + public String getCommandString() { + String base; + if (parent == null) { + return "/" + toString(); + } else { + return parent.getCommandString() + " " + toString(); + } + } + + public String getUsage() { + if (usage != null && usage.length() != 0) { + if (usage.startsWith("/")) { + return usage; + } + return getCommandString() + " " + usage; + } + if (allCommands.size() == 0) { + return getCommandString(); + } + StringBuilder args = new StringBuilder("["); + String prefix = ""; + for (Command cmd : allCommands) { + args.append(prefix).append(cmd.isStatic ? cmd.toString() : "<" + cmd + ">"); + prefix = "|"; + } + return getCommandString() + " " + args + "]"; + } + + public Collection tab(PlotPlayer player, String[] args, boolean space) { + switch (args.length) { + case 0: + return allCommands; + case 1: + String arg = args[0].toLowerCase(); + if (space) { + Command cmd = getCommand(arg); + return (cmd != null && cmd.canExecute(player)) ? (cmd.tab(player, Arrays.copyOfRange(args, 1, args.length), space)) : null; + } else { + Set commands = new HashSet(); + for (Map.Entry entry : staticCommands.entrySet()) { + if (entry.getKey().startsWith(arg) && entry.getValue().canExecute(player)) { + commands.add(entry.getValue()); + } + } + return commands; + } + default: + Command cmd = getCommand(args[0]); + return cmd != null ? cmd.tab(player, Arrays.copyOfRange(args, 1, args.length), space) : null; + } } @Override public String toString() { - return this.command; - } - - public abstract boolean onCommand(E plr, String[] arguments); - - public int handle(E plr, String[] args) { - if (args.length == 0) { - return super.handle(plr, ""); - } - StringBuilder builder = new StringBuilder(); - for (String s : args) { - builder.append(s).append(" "); - } - String s = builder.substring(0, builder.length() - 1); - return super.handle(plr, s); - } - - public String getCommand() { - return this.command; - } - - public String getUsage() { - if (this.usage.isEmpty()) { - return "/{label} " + this.command; - } - return this.usage; - } - - public String getPermission() { - if (this.permission == null || this.permission.isEmpty()) { - this.permission = "plots." + this.command.toLowerCase(); - } - return this.permission; - } - - public String getDescription() { - return this.description; - } - - public Set getAliases() { - return this.aliases; - } - - public Argument[] getRequiredArguments() { - if (this.requiredArguments == null) { - return new Argument[0]; - } - return this.requiredArguments; - } - - public CommandCategory getCategory() { - if (this.category == null) { - return CommandCategory.DEBUG; - } - return this.category; + return aliases.size() > 0 ? aliases.get(0) : id; } @Override @@ -161,18 +454,15 @@ public abstract class Command extends CommandManager { if (getClass() != obj.getClass()) { return false; } - Command other = (Command) obj; + final Command other = (Command) obj; if (this.hashCode() != other.hashCode()) { return false; } - return this.command.equals(other.command); + return this.id.equals(other.id); } @Override public int hashCode() { - if (this.hash == 0) { - this.hash = getCommand().hashCode(); - } - return this.hash; + return id.hashCode(); } } diff --git a/Core/src/main/java/com/plotsquared/general/commands/CommandDeclaration.java b/Core/src/main/java/com/plotsquared/general/commands/CommandDeclaration.java index 120b574b0..d8d427e67 100644 --- a/Core/src/main/java/com/plotsquared/general/commands/CommandDeclaration.java +++ b/Core/src/main/java/com/plotsquared/general/commands/CommandDeclaration.java @@ -8,7 +8,7 @@ import java.lang.annotation.Target; import com.intellectualcrafters.plot.commands.CommandCategory; import com.intellectualcrafters.plot.commands.RequiredType; -@Target(ElementType.TYPE) +@Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface CommandDeclaration { @@ -24,5 +24,7 @@ public @interface CommandDeclaration { RequiredType requiredType() default RequiredType.NONE; - CommandCategory category(); + CommandCategory category() default CommandCategory.INFO; + + boolean confirmation() default false; } diff --git a/Core/src/main/java/com/plotsquared/general/commands/CommandManager.java b/Core/src/main/java/com/plotsquared/general/commands/CommandManager.java deleted file mode 100644 index e6bbc323d..000000000 --- a/Core/src/main/java/com/plotsquared/general/commands/CommandManager.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.plotsquared.general.commands; - -import com.intellectualcrafters.plot.config.C; -import com.intellectualcrafters.plot.util.Permissions; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -public class CommandManager { - - public final ConcurrentHashMap> commands; - private final Character initialCharacter; - - public CommandManager(Character initialCharacter, List> commands) { - this.commands = new ConcurrentHashMap<>(); - for (Command command : commands) { - addCommand(command); - } - this.initialCharacter = initialCharacter; - } - - public final void addCommand(Command command) { - if (command.getCommand() == null) { - command.create(); - } - this.commands.put(command.getCommand().toLowerCase(), command); - for (String alias : command.getAliases()) { - this.commands.put(alias.toLowerCase(), command); - } - } - - public final Command getCommand(String command) { - return this.commands.get(command.toLowerCase()); - } - - public final boolean createCommand(Command command) { - try { - command.create(); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - if (command.getCommand() != null) { - addCommand(command); - return true; - } - return false; - } - - public final ArrayList> getCommands() { - HashSet> set = new HashSet<>(this.commands.values()); - ArrayList> result = new ArrayList<>(set); - Collections.sort(result, new Comparator>() { - @Override - public int compare(Command a, Command b) { - if (a == b) { - return 0; - } - if (a == null) { - return -1; - } - if (b == null) { - return 1; - } - return a.getCommand().compareTo(b.getCommand()); - } - }); - return result; - } - - public final ArrayList getCommandLabels(ArrayList> cmds) { - ArrayList labels = new ArrayList<>(cmds.size()); - for (Command cmd : cmds) { - labels.add(cmd.getCommand()); - } - return labels; - } - - public int handle(T plr, String input) { - if (this.initialCharacter != null && !input.startsWith(this.initialCharacter + "")) { - return CommandHandlingOutput.NOT_COMMAND; - } - if (this.initialCharacter == null) { - input = input; - } else { - input = input.substring(1); - } - String[] parts = input.split(" "); - String[] args; - String command = parts[0].toLowerCase(); - if (parts.length == 1) { - args = new String[0]; - } else { - args = new String[parts.length - 1]; - System.arraycopy(parts, 1, args, 0, args.length); - } - Command cmd = this.commands.get(command); - if (cmd == null) { - return CommandHandlingOutput.NOT_FOUND; - } - if (!cmd.getRequiredType().allows(plr)) { - return CommandHandlingOutput.CALLER_OF_WRONG_TYPE; - } - if (!Permissions.hasPermission(plr, cmd.getPermission())) { - return CommandHandlingOutput.NOT_PERMITTED; - } - Argument[] requiredArguments = cmd.getRequiredArguments(); - if ((requiredArguments != null) && (requiredArguments.length > 0)) { - boolean success = true; - if (args.length < requiredArguments.length) { - success = false; - } else { - for (int i = 0; i < requiredArguments.length; i++) { - if (requiredArguments[i].parse(args[i]) == null) { - success = false; - break; - } - } - } - if (!success) { - cmd.getUsage().replaceAll("\\{label\\}", parts[0]); - C.COMMAND_SYNTAX.send(plr, cmd.getUsage()); - return CommandHandlingOutput.WRONG_USAGE; - } - } - try { - boolean a = cmd.onCommand(plr, args); - if (!a) { - String usage = cmd.getUsage(); - if ((usage != null) && !usage.isEmpty()) { - plr.sendMessage(usage); - } - return CommandHandlingOutput.WRONG_USAGE; - } - } catch (Throwable t) { - t.printStackTrace(); - return CommandHandlingOutput.ERROR; - } - return CommandHandlingOutput.SUCCESS; - } - - public final char getInitialCharacter() { - return this.initialCharacter; - } -}