From 5aeef212dced2581a8f4352dacce741efe915ddc Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Sat, 24 Jul 2021 17:23:42 +0200 Subject: [PATCH] Refactor help menu --- .../commands/BukkitCommandServerUtils.java | 6 +- .../common/commands/CommandServerUtils.java | 82 +++++++++++----- .../common/commands/ServerUtilsCommand.java | 93 ++++++++++++++++--- .../common/utils/FormatBuilder.java | 12 ++- Common/src/main/resources/commands.json | 1 + Common/src/main/resources/messages.json | 2 +- 6 files changed, 154 insertions(+), 42 deletions(-) diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/commands/BukkitCommandServerUtils.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/commands/BukkitCommandServerUtils.java index eeeb3d2..bd7cd9c 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/commands/BukkitCommandServerUtils.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/commands/BukkitCommandServerUtils.java @@ -71,13 +71,13 @@ public class BukkitCommandServerUtils extends CommandServerUtils supportedConfigNames) .build()); - manager.command(parseSubcommand(builder, "enableplugin") + manager.command(buildSubcommand(builder, "enableplugin") .argument(getArgument("plugin")) .handler(this::handleEnablePlugin)); - manager.command(parseSubcommand(builder, "disableplugin") + manager.command(buildSubcommand(builder, "disableplugin") .argument(getArgument("plugin")) .handler(this::handleDisablePlugin)); - manager.command(parseSubcommand(builder, "reloadconfig") + manager.command(buildSubcommand(builder, "reloadconfig") .argument(getArgument("config")) .handler(this::handleReloadConfig)); } diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/commands/CommandServerUtils.java b/Common/src/main/java/net/frankheijden/serverutils/common/commands/CommandServerUtils.java index e425c94..55a7c34 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/commands/CommandServerUtils.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/commands/CommandServerUtils.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; +import net.frankheijden.serverutils.common.config.ServerUtilsConfig; import net.frankheijden.serverutils.common.entities.AbstractResult; import net.frankheijden.serverutils.common.entities.CloseableResult; import net.frankheijden.serverutils.common.entities.LoadResult; @@ -48,29 +49,29 @@ public abstract class CommandServerUtils manager.command(builder .handler(this::handleHelpCommand)); - manager.command(parseSubcommand(builder, "help") + manager.command(buildSubcommand(builder, "help") .handler(this::handleHelpCommand)); - manager.command(parseSubcommand(builder, "reload") + manager.command(buildSubcommand(builder, "reload") .handler(this::handleReload)); - manager.command(parseSubcommand(builder, "loadplugin") + manager.command(buildSubcommand(builder, "loadplugin") .argument(getArgument("jarFile")) .handler(this::handleLoadPlugin)); - manager.command(parseSubcommand(builder, "unloadplugin") + manager.command(buildSubcommand(builder, "unloadplugin") .argument(getArgument("plugin")) .handler(this::handleUnloadPlugin)); - manager.command(parseSubcommand(builder, "reloadplugin") + manager.command(buildSubcommand(builder, "reloadplugin") .argument(getArgument("plugin")) .handler(this::handleReloadPlugin)); - manager.command(parseSubcommand(builder, "watchplugin") + manager.command(buildSubcommand(builder, "watchplugin") .argument(getArgument("plugin")) .handler(this::handleWatchPlugin)); - manager.command(parseSubcommand(builder, "unwatchplugin") + manager.command(buildSubcommand(builder, "unwatchplugin") .argument(getArgument("plugin")) .handler(this::handleUnwatchPlugin)); - manager.command(parseSubcommand(builder, "plugininfo") + manager.command(buildSubcommand(builder, "plugininfo") .argument(getArgument("plugin")) .handler(this::handlePluginInfo)); - manager.command(parseSubcommand(builder, "commandinfo") + manager.command(buildSubcommand(builder, "commandinfo") .argument(getArgument("command")) .handler(this::handleCommandInfo)); } @@ -80,28 +81,67 @@ public abstract class CommandServerUtils plugin.getMessagesResource().sendMessage(sender, "serverutils.help.header"); FormatBuilder builder = FormatBuilder.create(plugin.getMessagesResource().getMessage("serverutils.help.format")) - .orderedKeys("%command%", "%subcommand%", "%help%"); + .orderedKeys("%command%", "%help%"); - for (Command command : plugin.getCommands()) { - List> arguments = command.getArguments(); - if (arguments.size() < 2) continue; + ServerUtilsConfig config = plugin.getCommandsResource().getConfig(); + for (String commandName : config.getKeys()) { + ServerUtilsConfig commandConfig = (ServerUtilsConfig) config.get(commandName); + CommandElement commandElement = parseElement(commandConfig); + String shortestCommandAlias = determineShortestAlias(commandElement); - String commandName = arguments.get(0).getName(); - StringBuilder sb = new StringBuilder(); - for (int i = 1; i < arguments.size(); i++) { - CommandArgument argument = arguments.get(i); - sb.append(" ").append(argument.getName()); + if (commandElement.shouldDisplayInHelp()) { + builder.add(shortestCommandAlias, commandElement.getDescription().getDescription()); } - String subcommand = sb.toString(); - String description = command.getComponents().get(1).getArgumentDescription().getDescription(); + Object subcommandsObject = commandConfig.get("subcommands"); + if (subcommandsObject instanceof ServerUtilsConfig) { + ServerUtilsConfig subcommandsConfig = (ServerUtilsConfig) subcommandsObject; - builder.add(commandName, subcommand, description); + for (String subcommandName : subcommandsConfig.getKeys()) { + ServerUtilsConfig subcommandConfig = (ServerUtilsConfig) subcommandsConfig.get(subcommandName); + CommandElement subcommandElement = parseElement(subcommandConfig); + if (subcommandElement.shouldDisplayInHelp()) { + String shortestSubcommandAlias = determineShortestAlias(subcommandElement); + builder.add( + shortestCommandAlias + ' ' + shortestSubcommandAlias, + subcommandElement.getDescription().getDescription() + ); + } + } + } + + Object flagsObject = commandConfig.get("flags"); + if (flagsObject instanceof ServerUtilsConfig) { + ServerUtilsConfig flagsConfig = (ServerUtilsConfig) flagsObject; + + for (String flagName : flagsConfig.getKeys()) { + ServerUtilsConfig flagConfig = (ServerUtilsConfig) flagsConfig.get(flagName); + CommandElement flagElement = parseElement(flagConfig); + if (flagElement.shouldDisplayInHelp()) { + String shortestFlagAlias = determineShortestAlias(flagElement); + String flagPrefix = "-" + (flagElement.getMain().equals(shortestFlagAlias) ? "_" : ""); + builder.add( + shortestCommandAlias + ' ' + flagPrefix + shortestFlagAlias, + flagElement.getDescription().getDescription() + ); + } + } + } } builder.build().forEach(msg -> plugin.getMessagesResource().sendRawMessage(sender, msg)); plugin.getMessagesResource().sendMessage(sender, "serverutils.help.footer"); } + private String determineShortestAlias(CommandElement element) { + String shortestAlias = element.getMain(); + for (String alias : element.getAliases()) { + if (alias.length() < shortestAlias.length()) { + shortestAlias = alias; + } + } + return shortestAlias; + } + private void handleReload(CommandContext context) { C sender = context.getSender(); plugin.reload(); diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/commands/ServerUtilsCommand.java b/Common/src/main/java/net/frankheijden/serverutils/common/commands/ServerUtilsCommand.java index f1e18be..2664bf5 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/commands/ServerUtilsCommand.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/commands/ServerUtilsCommand.java @@ -5,6 +5,7 @@ import cloud.commandframework.Command; import cloud.commandframework.CommandManager; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.arguments.flags.CommandFlag; +import cloud.commandframework.permission.CommandPermission; import cloud.commandframework.permission.Permission; import java.util.HashMap; import java.util.Map; @@ -51,29 +52,48 @@ public abstract class ServerUtilsCommand return this.arguments.get(name).copy(); } + /** + * Builds a subcommand from the config. + */ + public Command.Builder buildSubcommand(Command.Builder builder, String subcommandName) { + CommandElement subcommand = parseSubcommand(subcommandName); + return builder + .literal(subcommand.getMain(), subcommand.getDescription(), subcommand.getAliases()) + .permission(subcommand.getPermission()); + } + + /** + * Parses a command from the config. + */ + public CommandElement parseElement(ServerUtilsConfig elementConfig) { + String main = applyPrefix(elementConfig.getString("main")); + String descriptionString = elementConfig.getString("description"); + ArgumentDescription description = descriptionString == null ? null : ArgumentDescription.of(descriptionString); + CommandPermission permission = Permission.of(elementConfig.getString("permission")); + boolean displayInHelp = elementConfig.getBoolean("display-in-help"); + String[] aliases = elementConfig.getStringList("aliases").stream() + .map(this::applyPrefix) + .toArray(String[]::new); + + return new CommandElement(main, description, permission, displayInHelp, aliases); + } + /** * Parses a subcommand from the config. */ - public Command.Builder parseSubcommand(Command.Builder builder, String subcommand) { - ServerUtilsConfig subcommandConfig = (ServerUtilsConfig) commandConfig.get("subcommands." + subcommand); - return builder - .literal( - subcommandConfig.getString("main"), - ArgumentDescription.of(subcommandConfig.getString("description")), - subcommandConfig.getStringList("aliases").toArray(new String[0]) - ) - .permission(subcommandConfig.getString("permission")); + public CommandElement parseSubcommand(String subcommandName) { + return parseElement((ServerUtilsConfig) commandConfig.get("subcommands." + subcommandName)); } /** * Parses a flag from the config. */ - public CommandFlag parseFlag(String flag) { - ServerUtilsConfig flagConfig = (ServerUtilsConfig) commandConfig.get("flags." + flag); - return CommandFlag.newBuilder(flagConfig.getString("main")) - .withAliases(flagConfig.getStringList("aliases").toArray(new String[0])) - .withPermission(Permission.of(flagConfig.getString("permission"))) - .withDescription(ArgumentDescription.of(flagConfig.getString("description"))) + public CommandFlag parseFlag(String flagName) { + CommandElement flag = parseElement((ServerUtilsConfig) commandConfig.get("flags." + flagName)); + return CommandFlag.newBuilder(flag.getMain()) + .withAliases(flag.getAliases()) + .withPermission(flag.getPermission()) + .withDescription(flag.getDescription()) .build(); } @@ -95,4 +115,47 @@ public abstract class ServerUtilsCommand return str.replace("%prefix%", prefixChar); } + + protected static class CommandElement { + + private final String main; + private final ArgumentDescription description; + private final CommandPermission permission; + private final boolean displayInHelp; + private final String[] aliases; + + public CommandElement( + String main, + ArgumentDescription description, + CommandPermission permission, + boolean displayInHelp, + String... aliases + ) { + this.main = main; + this.description = description; + this.permission = permission; + this.displayInHelp = displayInHelp; + this.aliases = aliases; + } + + public String getMain() { + return main; + } + + public ArgumentDescription getDescription() { + return description; + } + + public CommandPermission getPermission() { + return permission; + } + + public boolean shouldDisplayInHelp() { + return displayInHelp; + } + + public String[] getAliases() { + return aliases; + } + } } diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/utils/FormatBuilder.java b/Common/src/main/java/net/frankheijden/serverutils/common/utils/FormatBuilder.java index 00e7e6d..ddfe8ed 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/utils/FormatBuilder.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/utils/FormatBuilder.java @@ -8,11 +8,13 @@ public class FormatBuilder { private final String format; private final List valueList; private String[] orderedKeys; + private boolean skipEmpty; private FormatBuilder(String format) { this.format = format; this.valueList = new ArrayList<>(); this.orderedKeys = new String[0]; + this.skipEmpty = true; } public static FormatBuilder create(String format) { @@ -29,18 +31,24 @@ public class FormatBuilder { return this; } + public FormatBuilder skipEmpty(boolean skipEmpty) { + this.skipEmpty = skipEmpty; + return this; + } + /** * Builds the current FormatBuilder instance into a list of strings. */ public List build() { List strings = new ArrayList<>(); + loop: for (String[] values : valueList) { String str = format; for (int i = 0; i < Math.min(values.length, orderedKeys.length); i++) { String value = values[i]; - if (value == null || value.isEmpty()) break; - str = str.replace(orderedKeys[i], value); + if ((value == null || value.isEmpty()) && skipEmpty) continue loop; + str = str.replace(orderedKeys[i], String.valueOf(value)); } strings.add(str); } diff --git a/Common/src/main/resources/commands.json b/Common/src/main/resources/commands.json index f895a2b..7f921c8 100644 --- a/Common/src/main/resources/commands.json +++ b/Common/src/main/resources/commands.json @@ -3,6 +3,7 @@ "main": "%prefix%plugins", "aliases": ["%prefix%pl"], "permission": "serverutils.plugins", + "description": "Displays the enabled plugins.", "display-in-help": true, "flags": { "version": { diff --git a/Common/src/main/resources/messages.json b/Common/src/main/resources/messages.json index 0775080..8f16263 100644 --- a/Common/src/main/resources/messages.json +++ b/Common/src/main/resources/messages.json @@ -26,7 +26,7 @@ }, "help": { "header": "&8&m-------------=&r&8[ &b&lServerUtils Help&r &8]&m=---------------", - "format": "&8/&3%command%&b%subcommand% &f(&7%help%&f)", + "format": "&8/&3%command% &8(&b%help%&8)", "footer": "&8&m-------------------------------------------------" }, "plugins": {