From 75579fe6491c8b359340753c8cb4d7449d99527f Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 8 Aug 2017 22:08:05 -0400 Subject: [PATCH] more fixes, formatting, expand control over format, fix dupe --- .../aikar/commands/BukkitCommandManager.java | 2 +- .../aikar/commands/BungeeCommandManager.java | 2 +- .../java/co/aikar/commands/ACFPatterns.java | 2 +- .../main/java/co/aikar/commands/ACFUtil.java | 16 +++++++++ .../java/co/aikar/commands/BaseCommand.java | 4 +++ .../java/co/aikar/commands/CommandHelp.java | 35 +++++++++++++++---- .../co/aikar/commands/CommandManager.java | 13 ++++--- languages/core/acf-core_en.properties | 2 +- .../aikar/commands/SpongeCommandManager.java | 2 +- 9 files changed, 63 insertions(+), 15 deletions(-) diff --git a/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java b/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java index 5357bdc1..aab3dfab 100644 --- a/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java +++ b/bukkit/src/main/java/co/aikar/commands/BukkitCommandManager.java @@ -71,7 +71,7 @@ public class BukkitCommandManager extends CommandManager\\d+)>(?.+?)", Pattern.CASE_INSENSITIVE); + public static final Pattern FORMATTER = Pattern.compile("\\d+)>(?.*?)", Pattern.CASE_INSENSITIVE); public static final Pattern I18N_STRING = Pattern.compile("\\{@@(?.+?)}", Pattern.CASE_INSENSITIVE); diff --git a/core/src/main/java/co/aikar/commands/ACFUtil.java b/core/src/main/java/co/aikar/commands/ACFUtil.java index a12f12c8..81462a38 100644 --- a/core/src/main/java/co/aikar/commands/ACFUtil.java +++ b/core/src/main/java/co/aikar/commands/ACFUtil.java @@ -365,6 +365,22 @@ public final class ACFUtil { return total.toString().trim(); } + public static String ltrim(String s) { + int i = 0; + while (i < s.length() && Character.isWhitespace(s.charAt(i))) { + i++; + } + return s.substring(i); + } + + public static String rtrim(String s) { + int i = s.length()-1; + while (i >= 0 && Character.isWhitespace(s.charAt(i))) { + i--; + } + return s.substring(0,i+1); + } + public static List enumNames(Enum[] values) { return Stream.of(values).map(Enum::name).collect(Collectors.toList()); } diff --git a/core/src/main/java/co/aikar/commands/BaseCommand.java b/core/src/main/java/co/aikar/commands/BaseCommand.java index 8593c8cc..237d7ea8 100644 --- a/core/src/main/java/co/aikar/commands/BaseCommand.java +++ b/core/src/main/java/co/aikar/commands/BaseCommand.java @@ -516,6 +516,10 @@ public abstract class BaseCommand { return manager.generateCommandHelp(); } + public void showCommandHelp() { + getCommandHelp().showHelp(); + } + public void help(Object issuer, String[] args) { help(manager.getCommandIssuer(issuer), args); } diff --git a/core/src/main/java/co/aikar/commands/CommandHelp.java b/core/src/main/java/co/aikar/commands/CommandHelp.java index 81a9b725..d709c66d 100644 --- a/core/src/main/java/co/aikar/commands/CommandHelp.java +++ b/core/src/main/java/co/aikar/commands/CommandHelp.java @@ -23,7 +23,9 @@ package co.aikar.commands; +import co.aikar.locales.MessageKeyProvider; import com.google.common.collect.SetMultimap; +import org.jetbrains.annotations.NotNull; import java.util.*; @@ -38,14 +40,16 @@ public class CommandHelp { this.issuer = issuer; SetMultimap subCommands = rootCommand.getSubCommands(); + Set seen = new HashSet<>(); subCommands.entries().forEach(e -> { String key = e.getKey(); if (key.equals("__default") || key.equals("__unknown")){ return; } RegisteredCommand regCommand = e.getValue(); - if (regCommand.hasPermission(issuer)) { + if (regCommand.hasPermission(issuer) && !seen.contains(regCommand)) { this.helpEntries.add(new HelpEntry(regCommand)); + seen.add(regCommand); } }); } @@ -55,17 +59,36 @@ public class CommandHelp { } public void showHelp() { - showHelp(issuer); + showHelp(issuer, MessageKeys.HELP_FORMAT); } public void showHelp(CommandIssuer issuer) { - getHelpEntries().forEach(e -> issuer.sendMessage(MessageType.HELP, MessageKeys.HELP_FORMAT, - //{command} {parameters} {seperator} {description} + showHelp(issuer, MessageKeys.HELP_FORMAT); + } + + public void showHelp(CommandIssuer issuer, MessageKeyProvider format) { + getHelpEntries().forEach(e -> { + String formatted = this.manager.formatMessage(issuer, MessageType.HELP, format, getFormatReplacements(e)); + for (String msg : ACFPatterns.NEWLINE.split(formatted)) { + issuer.sendMessageInternal(ACFUtil.rtrim(msg)); + } + }); + } + + /** + * Override this to control replacements + * @param e + * @return + */ + @NotNull + public String[] getFormatReplacements(HelpEntry e) { + //{command} {parameters} {seperator} {description} + return new String[] { "{command}", e.getCommand(), "{parameters}", e.getParameterSyntax(), - "{seperator}", e.getDescription().isEmpty() ? "" : " - ", + "{seperator}", e.getDescription().isEmpty() ? "" : "-", "{description}", e.getDescription() - )); + }; } public List getHelpEntries() { diff --git a/core/src/main/java/co/aikar/commands/CommandManager.java b/core/src/main/java/co/aikar/commands/CommandManager.java index 314621d0..2a14794b 100644 --- a/core/src/main/java/co/aikar/commands/CommandManager.java +++ b/core/src/main/java/co/aikar/commands/CommandManager.java @@ -220,6 +220,14 @@ public abstract class CommandManager > { } public void sendMessage(CommandIssuer issuer, MessageType type, MessageKeyProvider key, String... replacements) { + String message = formatMessage(issuer, type, key, replacements); + + for (String msg : ACFPatterns.NEWLINE.split(message)) { + issuer.sendMessageInternal(ACFUtil.rtrim(msg)); + } + } + + public String formatMessage(CommandIssuer issuer, MessageType type, MessageKeyProvider key, String... replacements) { String message = getLocales().getMessage(issuer, key.getMessageKey()); if (replacements.length > 0) { message = ACFUtil.replaceStrings(message, replacements); @@ -231,10 +239,7 @@ public abstract class CommandManager > { if (formatter != null) { message = formatter.format(message); } - - for (String msg : ACFPatterns.NEWLINE.split(message)) { - issuer.sendMessageInternal(msg); - } + return message; } public Locale getIssuerLocale(CommandIssuer issuer) { diff --git a/languages/core/acf-core_en.properties b/languages/core/acf-core_en.properties index c1f804fd..6cba2612 100644 --- a/languages/core/acf-core_en.properties +++ b/languages/core/acf-core_en.properties @@ -33,4 +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} {description} +acf-core.help_format = {command} {parameters} {seperator} {description} diff --git a/sponge/src/main/java/co/aikar/commands/SpongeCommandManager.java b/sponge/src/main/java/co/aikar/commands/SpongeCommandManager.java index 067eddae..5fcf7a42 100644 --- a/sponge/src/main/java/co/aikar/commands/SpongeCommandManager.java +++ b/sponge/src/main/java/co/aikar/commands/SpongeCommandManager.java @@ -58,7 +58,7 @@ public class SpongeCommandManager extends CommandManager