From 57a41c75400fa007bb4d53d80c144fb73f08a4f5 Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 8 Aug 2017 20:30:40 -0400 Subject: [PATCH] Current progress on updating the help PR --- .../co/aikar/commands/BukkitCommandHelp.java | 41 ------------ .../aikar/commands/BukkitCommandManager.java | 8 +-- .../co/aikar/commands/BukkitRootCommand.java | 13 ++-- .../java/co/aikar/commands/BaseCommand.java | 4 +- .../java/co/aikar/commands/CommandHelp.java | 67 ++++++++++++------- .../co/aikar/commands/CommandManager.java | 4 +- .../java/co/aikar/commands/HelpEntry.java | 6 +- .../main/java/co/aikar/commands/Locales.java | 10 +-- .../java/co/aikar/commands/MessageKeys.java | 3 +- .../java/co/aikar/commands/MessageType.java | 8 +-- .../java/co/aikar/commands/RootCommand.java | 30 +++++---- languages/core/acf-core_en.properties | 1 + 12 files changed, 89 insertions(+), 106 deletions(-) delete mode 100644 bukkit/src/main/java/co/aikar/commands/BukkitCommandHelp.java diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitCommandHelp.java b/bukkit/src/main/java/co/aikar/commands/BukkitCommandHelp.java deleted file mode 100644 index 7a636e2e..00000000 --- a/bukkit/src/main/java/co/aikar/commands/BukkitCommandHelp.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2016-2017 Daniel Ennis (Aikar) - MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -package co.aikar.commands; - -import java.util.ArrayList; -import java.util.List; - -public class BukkitCommandHelp extends CommandHelp { - - protected BukkitCommandHelp(CommandManager manager, BaseCommand cmd) { - super(manager, cmd); - } - - @Override - void renderHelp(CommandIssuer issuer) { - List rendered = new ArrayList<>(); - getCommandHelp().forEach(h -> rendered.add("/" + h.getCommand() + " " + h.getSyntax() + ((h.getHelpText() != null && !h.getHelpText().isEmpty() ? " - " + h.getHelpText() : "")))); - rendered.forEach(issuer::sendMessage); - } -} diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java b/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java index 0bb26b7c..4aed8844 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java @@ -267,11 +267,7 @@ public class BukkitCommandManager extends CommandManager subCommands = new HashMap<>(); + private SetMultimap subCommands = HashMultimap.create(); private List children = new ArrayList<>(); boolean isRegistered = false; @@ -73,9 +74,9 @@ public class BukkitRootCommand extends Command implements RootCommand { private boolean execute(CommandIssuer sender, String commandLabel, String[] args) { for (int i = args.length; i >= 0; i--) { String checkSub = StringUtils.join(args, " ", 0, i).toLowerCase(); - BaseCommand subHandler = this.subCommands.get(checkSub); - if (subHandler != null) { - subHandler.execute(sender, commandLabel, args); + Set registeredCommands = this.subCommands.get(checkSub); + if (!registeredCommands.isEmpty()) { + registeredCommands.iterator().next().scope.execute(sender, commandLabel, args); return true; } } @@ -100,7 +101,7 @@ public class BukkitRootCommand extends Command implements RootCommand { } @Override - public Map getSubCommands() { + public SetMultimap getSubCommands() { return this.subCommands; } diff --git a/core/src/main/java/co/aikar/commands/BaseCommand.java b/core/src/main/java/co/aikar/commands/BaseCommand.java index eab59b7c..9efeeeb7 100644 --- a/core/src/main/java/co/aikar/commands/BaseCommand.java +++ b/core/src/main/java/co/aikar/commands/BaseCommand.java @@ -512,8 +512,8 @@ public abstract class BaseCommand { return false; } - CommandHelp getCommandHelp(){ - return manager.getHelp(this.getExecCommandLabel()); + public CommandHelp getCommandHelp(){ + return manager.generateCommandHelp(this); } public void help(Object issuer, String[] args) { diff --git a/core/src/main/java/co/aikar/commands/CommandHelp.java b/core/src/main/java/co/aikar/commands/CommandHelp.java index 003cff3e..5aa74f20 100644 --- a/core/src/main/java/co/aikar/commands/CommandHelp.java +++ b/core/src/main/java/co/aikar/commands/CommandHelp.java @@ -27,37 +27,58 @@ import com.google.common.collect.SetMultimap; import java.util.*; -public abstract class CommandHelp { - private BaseCommand command; +public class CommandHelp { + private final CommandManager manager; + private final List helpEntries; + private final CommandOperationContext currentContext; - protected CommandHelp(CommandManager manager, BaseCommand command) { - this.command = command; + protected CommandHelp(CommandManager manager, BaseCommand command, CommandOperationContext currentContext) { + this.manager = manager; + this.currentContext = currentContext; + + List entries = new ArrayList<>(); + for (RootCommand root : command.registeredCommands.values()) { + SetMultimap subCommands = root.getSubCommands(); + subCommands.entries().forEach(e -> { + if (e.getKey().equals("__default") || e.getKey().equals("__unknown")){ + return; + } + RegisteredCommand regCommand = e.getValue(); + entries.add(new HelpEntry(regCommand)); + + }); + } + + this.helpEntries = entries; } - abstract void renderHelp(CommandIssuer issuer); + public CommandManager getManager() { + return manager; + } + public void showHelp() { + showHelp(currentContext.getCommandIssuer()); + } - Collection getCommandHelp() { - SetMultimap subCommands = command.subCommands; - Set help = new HashSet<>(); - List used = new ArrayList<>(); - subCommands.entries().forEach(e -> { - if(e.getKey().equals("__default") || e.getKey().equals("__unknown")){ - return; - } - RegisteredCommand regCommand = e.getValue(); - if(!used.contains(regCommand.getCommand())) { - help.add(new HelpEntry(regCommand)); - used.add(regCommand.getCommand()); - - } + public void showHelp(CommandIssuer issuer) { + getHelpEntries().forEach(h -> { + issuer.sendMessage(MessageType.HELP, MessageKeys.HELP_FORMAT, + //{command} {parameters} {seperator} {helptext} + "{command}", h.getCommand(), + "{parameters}", h.getParameterSyntax(), + "{seperator}", h.getHelpText().isEmpty() ? "" : " - ", + "{helptext}", h.getHelpText() + ); }); - return help; - } - public BaseCommand getCommand() { - return command; } + public List getHelpEntries() { + return helpEntries; + } + + public CommandOperationContext getCurrentContext() { + return currentContext; + } } diff --git a/core/src/main/java/co/aikar/commands/CommandManager.java b/core/src/main/java/co/aikar/commands/CommandManager.java index 52e6835b..34510448 100644 --- a/core/src/main/java/co/aikar/commands/CommandManager.java +++ b/core/src/main/java/co/aikar/commands/CommandManager.java @@ -106,9 +106,7 @@ public abstract class CommandManager > { */ public abstract CommandCompletions getCommandCompletions(); - CommandHelp getHelp(String command){ - throw new IllegalStateException("Not implemented yet."); - } + public abstract CommandHelp generateCommandHelp(BaseCommand command); /** * Registers a command with ACF diff --git a/core/src/main/java/co/aikar/commands/HelpEntry.java b/core/src/main/java/co/aikar/commands/HelpEntry.java index 844ecff2..cac893ee 100644 --- a/core/src/main/java/co/aikar/commands/HelpEntry.java +++ b/core/src/main/java/co/aikar/commands/HelpEntry.java @@ -33,11 +33,11 @@ public class HelpEntry { public String getCommand(){ - return this.command.getCommand(); + return "/" + this.command.command; } - public String getSyntax(){ - return this.command.getSyntaxText(); + public String getParameterSyntax(){ + return this.command.syntaxText; } public String getHelpText(){ diff --git a/core/src/main/java/co/aikar/commands/Locales.java b/core/src/main/java/co/aikar/commands/Locales.java index f5aa17c4..86d9dcbd 100644 --- a/core/src/main/java/co/aikar/commands/Locales.java +++ b/core/src/main/java/co/aikar/commands/Locales.java @@ -25,6 +25,7 @@ package co.aikar.commands; import co.aikar.locales.LocaleManager; import co.aikar.locales.MessageKey; +import co.aikar.locales.MessageKeyProvider; import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; import org.jetbrains.annotations.NotNull; @@ -130,11 +131,12 @@ public class Locales { return this.localeManager.addMessage(locale, key, message); } - public String getMessage(CommandIssuer issuer, MessageKey key) { - String message = this.localeManager.getMessage(issuer, key); + public String getMessage(CommandIssuer issuer, MessageKeyProvider key) { + final MessageKey msgKey = key.getMessageKey(); + String message = this.localeManager.getMessage(issuer, msgKey); if (message == null) { - manager.log(LogLevel.ERROR, "Missing Language Key: " + key.getKey()); - message = ""; + manager.log(LogLevel.ERROR, "Missing Language Key: " + msgKey.getKey()); + message = ""; } return message; } diff --git a/core/src/main/java/co/aikar/commands/MessageKeys.java b/core/src/main/java/co/aikar/commands/MessageKeys.java index 7ea7673b..e79b3804 100644 --- a/core/src/main/java/co/aikar/commands/MessageKeys.java +++ b/core/src/main/java/co/aikar/commands/MessageKeys.java @@ -43,7 +43,8 @@ public enum MessageKeys implements MessageKeyProvider { MUST_BE_MIN_LENGTH, MUST_BE_MAX_LENGTH, NOT_ALLOWED_ON_CONSOLE, - COULD_NOT_FIND_PLAYER; + COULD_NOT_FIND_PLAYER, + HELP_FORMAT; private final MessageKey key = MessageKey.of("acf-core." + this.name().toLowerCase()); public MessageKey getMessageKey() { diff --git a/core/src/main/java/co/aikar/commands/MessageType.java b/core/src/main/java/co/aikar/commands/MessageType.java index 0550b6e3..874edf9c 100644 --- a/core/src/main/java/co/aikar/commands/MessageType.java +++ b/core/src/main/java/co/aikar/commands/MessageType.java @@ -29,10 +29,10 @@ import java.util.concurrent.atomic.AtomicInteger; public class MessageType { private static final AtomicInteger counter = new AtomicInteger(1); - public static MessageType INFO = new MessageType(); - public static MessageType SYNTAX = new MessageType(); - public static MessageType ERROR = new MessageType(); - + public static final MessageType INFO = new MessageType(); + public static final MessageType SYNTAX = new MessageType(); + public static final MessageType ERROR = new MessageType(); + public static final MessageType HELP = new MessageType(); private final int id = counter.getAndIncrement(); diff --git a/core/src/main/java/co/aikar/commands/RootCommand.java b/core/src/main/java/co/aikar/commands/RootCommand.java index 651aab60..20d3218f 100644 --- a/core/src/main/java/co/aikar/commands/RootCommand.java +++ b/core/src/main/java/co/aikar/commands/RootCommand.java @@ -23,31 +23,35 @@ package co.aikar.commands; -import java.util.HashMap; +import com.google.common.collect.SetMultimap; + import java.util.List; -import java.util.Map; +import java.util.Set; interface RootCommand { void addChild(BaseCommand command); CommandManager getManager(); - default Map getSubCommands(){ - return new HashMap<>(0); - } + SetMultimap getSubCommands(); String getCommandName(); - default void addChildShared(List children, Map subCommands, BaseCommand command) { - command.subCommands.keySet().forEach(key -> { + default void addChildShared(List children, SetMultimap subCommands, BaseCommand command) { + command.subCommands.entries().forEach(e -> { + String key = e.getKey(); + RegisteredCommand registeredCommand = e.getValue(); if (key.equals(BaseCommand.DEFAULT) || key.equals(BaseCommand.UNKNOWN)) { return; } - BaseCommand regged = subCommands.get(key); - if (regged != null) { - this.getManager().log(LogLevel.ERROR, "ACF Error: " + command.getName() + " registered subcommand " + key + " for root command " + getCommandName() + " - but it is already defined in " + regged.getName()); - this.getManager().log(LogLevel.ERROR, "2 subcommands of the same prefix may not be spread over 2 different classes. Ignoring this."); - return; + Set registered = subCommands.get(key); + if (!registered.isEmpty()) { + BaseCommand prevBase = registered.iterator().next().scope; + if (prevBase != registeredCommand.scope) { + this.getManager().log(LogLevel.ERROR, "ACF Error: " + command.getName() + " registered subcommand " + key + " for root command " + getCommandName() + " - but it is already defined in " + prevBase.getName()); + this.getManager().log(LogLevel.ERROR, "2 subcommands of the same prefix may not be spread over 2 different classes. Ignoring this."); + return; + } } - subCommands.put(key, command); + subCommands.put(key, registeredCommand); }); children.add(command); diff --git a/languages/core/acf-core_en.properties b/languages/core/acf-core_en.properties index eea3f958..cf6621f4 100644 --- a/languages/core/acf-core_en.properties +++ b/languages/core/acf-core_en.properties @@ -33,3 +33,4 @@ acf-core.must_be_min_length = Error: Must be at least {min} characters long. acf-core.must_be_max_length = Error: Must be less than {max} characters long. acf-core.not_allowed_on_console = Error: Console may not execute this command. acf-core.could_not_find_player = Error: Could not find a player by the name: {search} +acf-core.help_format = {command} {parameters} {seperator} {helptext}