diff --git a/src/main/java/net/frankheijden/serverutils/ServerUtils.java b/src/main/java/net/frankheijden/serverutils/ServerUtils.java index 5d7ce8c..12255c6 100644 --- a/src/main/java/net/frankheijden/serverutils/ServerUtils.java +++ b/src/main/java/net/frankheijden/serverutils/ServerUtils.java @@ -13,13 +13,12 @@ import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.command.*; import org.bukkit.command.defaults.PluginsCommand; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; -import java.util.Arrays; -import java.util.Map; +import java.lang.reflect.InvocationTargetException; +import java.util.*; import java.util.stream.Collectors; public class ServerUtils extends JavaPlugin implements CommandExecutor { @@ -52,6 +51,14 @@ public class ServerUtils extends JavaPlugin implements CommandExecutor { .map(File::getName) .collect(Collectors.toList())); commandManager.getCommandCompletions().registerAsyncCompletion("supportedConfigs", context -> CommandServerUtils.getSupportedConfigs()); + commandManager.getCommandCompletions().registerAsyncCompletion("commands", context -> { + try { + return RCommandMap.getKnownCommands((SimpleCommandMap) Bukkit.getCommandMap()).keySet(); + } catch (IllegalAccessException | InvocationTargetException ex) { + ex.printStackTrace(); + } + return Collections.emptyList(); + }); reload(); Bukkit.getPluginManager().registerEvents(new MainListener(), this); diff --git a/src/main/java/net/frankheijden/serverutils/commands/CommandServerUtils.java b/src/main/java/net/frankheijden/serverutils/commands/CommandServerUtils.java index ad070b0..bccccbd 100644 --- a/src/main/java/net/frankheijden/serverutils/commands/CommandServerUtils.java +++ b/src/main/java/net/frankheijden/serverutils/commands/CommandServerUtils.java @@ -197,4 +197,46 @@ public class CommandServerUtils extends BaseCommand { builder.sendTo(sender); Messenger.sendMessage(sender, "serverutils.plugininfo.footer"); } + + @Subcommand("commandinfo") + @CommandCompletion("@commands") + @CommandPermission("serverutils.commandinfo") + @Description("Shows information about the specified command.") + public void onCommandInfo(CommandSender sender, String command) { + Command cmd = PluginManager.getCommand(command); + if (cmd == null) { + Messenger.sendMessage(sender, "serverutils.commandinfo.not_exists"); + return; + } + + String format = Messenger.getMessage("serverutils.commandinfo.format"); + String listFormatString = Messenger.getMessage("serverutils.commandinfo.list_format"); + String seperator = Messenger.getMessage("serverutils.commandinfo.seperator"); + String lastSeperator = Messenger.getMessage("serverutils.commandinfo.last_seperator"); + + ListFormat listFormat = str -> listFormatString.replace("%value%", str); + + Messenger.sendMessage(sender, "serverutils.commandinfo.header"); + FormatBuilder builder = FormatBuilder.create(format) + .orderedKeys("%key%", "%value%") + .add("Name", cmd.getName()); + if (cmd instanceof PluginIdentifiableCommand) { + PluginIdentifiableCommand pc = (PluginIdentifiableCommand) cmd; + builder.add("Plugin", pc.getPlugin().getName()); + } + builder.add("Usage", cmd.getUsage()) + .add("Description", cmd.getDescription()) + .add("Aliases", ListBuilder.create(cmd.getAliases()) + .format(listFormat) + .seperator(seperator) + .lastSeperator(lastSeperator) + .toString()) + .add("Label", cmd.getLabel()) + .add("Timings Name", cmd.getTimingName()) + .add("Permission", cmd.getPermission()) + .add("Permission Message", cmd.getPermissionMessage()); + + builder.sendTo(sender); + Messenger.sendMessage(sender, "serverutils.commandinfo.footer"); + } } diff --git a/src/main/java/net/frankheijden/serverutils/config/Messenger.java b/src/main/java/net/frankheijden/serverutils/config/Messenger.java index 564b3fd..98dcee0 100644 --- a/src/main/java/net/frankheijden/serverutils/config/Messenger.java +++ b/src/main/java/net/frankheijden/serverutils/config/Messenger.java @@ -54,6 +54,15 @@ public class Messenger { "seperator", "&8, ", "last_seperator", " &8and ", "footer", "&8&m-------------------------------------------------" + ), + "commandinfo", Defaults.of( + "header", "&8&m-----------=&r&8[ &b&lServerUtils CommandInfo&r &8]&m=----------", + "format", " &3%key%&8: &b%value%", + "list_format", "&b%value%", + "seperator", "&8, ", + "last_seperator", " &8and ", + "footer", "&8&m-------------------------------------------------", + "not_exists", "&cThat command is not a valid registered command." ) ) ); diff --git a/src/main/java/net/frankheijden/serverutils/managers/PluginManager.java b/src/main/java/net/frankheijden/serverutils/managers/PluginManager.java index cf3974a..6d38e8d 100644 --- a/src/main/java/net/frankheijden/serverutils/managers/PluginManager.java +++ b/src/main/java/net/frankheijden/serverutils/managers/PluginManager.java @@ -107,17 +107,20 @@ public class PluginManager { return enablePlugin(loadResult.getPlugin()); } - public static void unregisterCommands(Plugin plugin) { - SimpleCommandMap commandMap = RCraftServer.getCommandMap(); - Map map; + public static Map getKnownCommands() { try { - map = RCommandMap.getKnownCommands(commandMap); + return RCommandMap.getKnownCommands(RCraftServer.getCommandMap()); } catch (Exception ex) { ex.printStackTrace(); - return; + return null; } + } - map.values().removeIf(c -> { + public static void unregisterCommands(Plugin plugin) { + Map knownCommands = getKnownCommands(); + if (knownCommands == null) return; + + knownCommands.values().removeIf(c -> { if (c instanceof PluginCommand) { PluginCommand pc = (PluginCommand) c; if (pc.getPlugin() == plugin) { @@ -129,4 +132,10 @@ public class PluginManager { return false; }); } + + public static Command getCommand(String command) { + Map knownCommands = getKnownCommands(); + if (knownCommands == null) return null; + return knownCommands.get(command); + } }