From 06f96dd655bba701caeee26433bad972c577a04f Mon Sep 17 00:00:00 2001 From: Pedro <3602279+Doc94@users.noreply.github.com> Date: Sun, 16 Feb 2025 17:10:45 -0300 Subject: [PATCH] Improvement in /plugins command (#12121) --- .../paper/command/PaperPluginsCommand.java | 137 +++++++++--------- 1 file changed, 70 insertions(+), 67 deletions(-) diff --git a/paper-server/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java b/paper-server/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java index f0fce4113..c4b2a8bf9 100644 --- a/paper-server/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java +++ b/paper-server/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java @@ -11,6 +11,11 @@ import io.papermc.paper.plugin.provider.ProviderStatus; import io.papermc.paper.plugin.provider.ProviderStatusHolder; import io.papermc.paper.plugin.provider.type.paper.PaperPluginParent; import io.papermc.paper.plugin.provider.type.spigot.SpigotPluginProvider; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.TreeMap; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.JoinConfiguration; import net.kyori.adventure.text.TextComponent; @@ -23,51 +28,38 @@ import org.bukkit.command.defaults.BukkitCommand; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.TreeMap; +import org.jspecify.annotations.NullMarked; +@NullMarked public class PaperPluginsCommand extends BukkitCommand { private static final TextColor INFO_COLOR = TextColor.color(52, 159, 218); - // TODO: LINK? private static final Component SERVER_PLUGIN_INFO = Component.text("ℹ What is a server plugin?", INFO_COLOR) .append(asPlainComponents(""" - Server plugins can add new behavior to your server! - You can find new plugins on Paper's plugin repository, Hangar. - - - """)); - - private static final Component SERVER_INITIALIZER_INFO = Component.text("ℹ What is a server initializer?", INFO_COLOR) - .append(asPlainComponents(""" - Server initializers are ran before your server - starts and are provided by paper plugins. - """)); + Server plugins can add new behavior to your server! + You can find new plugins on Paper's plugin repository, Hangar. + + https://hangar.papermc.io/ + """)); private static final Component LEGACY_PLUGIN_INFO = Component.text("ℹ What is a legacy plugin?", INFO_COLOR) .append(asPlainComponents(""" - A legacy plugin is a plugin that was made on - very old unsupported versions of the game. - - It is encouraged that you replace this plugin, - as they might not work in the future and may cause - performance issues. - """)); + A legacy plugin is a plugin that was made on + very old unsupported versions of the game. + + It is encouraged that you replace this plugin, + as they might not work in the future and may cause + performance issues. + """)); private static final Component LEGACY_PLUGIN_STAR = Component.text('*', TextColor.color(255, 212, 42)).hoverEvent(LEGACY_PLUGIN_INFO); private static final Component INFO_ICON_START = Component.text("ℹ ", INFO_COLOR); - private static final Component PAPER_HEADER = Component.text("Paper Plugins:", TextColor.color(2, 136, 209)); - private static final Component BUKKIT_HEADER = Component.text("Bukkit Plugins:", TextColor.color(237, 129, 6)); private static final Component PLUGIN_TICK = Component.text("- ", NamedTextColor.DARK_GRAY); private static final Component PLUGIN_TICK_EMPTY = Component.text(" "); + private static final Component INFO_ICON_SERVER_PLUGIN = INFO_ICON_START.hoverEvent(SERVER_PLUGIN_INFO).clickEvent(ClickEvent.openUrl("https://docs.papermc.io/paper/adding-plugins")); + private static final Type JAVA_PLUGIN_PROVIDER_TYPE = new TypeToken>() {}.getType(); public PaperPluginsCommand() { @@ -75,17 +67,17 @@ public class PaperPluginsCommand extends BukkitCommand { this.description = "Gets a list of plugins running on the server"; this.usageMessage = "/plugins"; this.setPermission("bukkit.command.plugins"); - this.setAliases(Arrays.asList("pl")); + this.setAliases(List.of("pl")); } - private static List formatProviders(TreeMap> plugins) { - List components = new ArrayList<>(plugins.size()); - for (PluginProvider entry : plugins.values()) { + private static List formatProviders(final TreeMap> plugins) { + final List components = new ArrayList<>(plugins.size()); + for (final PluginProvider entry : plugins.values()) { components.add(formatProvider(entry)); } boolean isFirst = true; - List formattedSublists = new ArrayList<>(); + final List formattedSubLists = new ArrayList<>(); /* Split up the plugin list for each 10 plugins to get size down @@ -93,30 +85,29 @@ public class PaperPluginsCommand extends BukkitCommand { - Plugin 1, Plugin 2, .... Plugin 10, Plugin 11, Plugin 12 ... Plugin 20, */ - for (List componentSublist : Lists.partition(components, 10)) { + for (final List componentSublist : Lists.partition(components, 10)) { Component component = Component.space(); if (isFirst) { component = component.append(PLUGIN_TICK); isFirst = false; } else { component = PLUGIN_TICK_EMPTY; - //formattedSublists.add(Component.empty()); // Add an empty line, the auto chat wrapping and this makes it quite jarring. } - formattedSublists.add(component.append(Component.join(JoinConfiguration.commas(true), componentSublist))); + formattedSubLists.add(component.append(Component.join(JoinConfiguration.commas(true), componentSublist))); } - return formattedSublists; + return formattedSubLists; } - private static Component formatProvider(PluginProvider provider) { - TextComponent.Builder builder = Component.text(); - if (provider instanceof SpigotPluginProvider spigotPluginProvider && CraftMagicNumbers.isLegacy(spigotPluginProvider.getMeta())) { + private static Component formatProvider(final PluginProvider provider) { + final TextComponent.Builder builder = Component.text(); + if (provider instanceof final SpigotPluginProvider spigotPluginProvider && CraftMagicNumbers.isLegacy(spigotPluginProvider.getMeta())) { builder.append(LEGACY_PLUGIN_STAR); } - String name = provider.getMeta().getName(); - Component pluginName = Component.text(name, fromStatus(provider)) + final String name = provider.getMeta().getName(); + final Component pluginName = Component.text(name, fromStatus(provider)) .clickEvent(ClickEvent.runCommand("/version " + name)); builder.append(pluginName); @@ -124,9 +115,20 @@ public class PaperPluginsCommand extends BukkitCommand { return builder.build(); } - private static Component asPlainComponents(String strings) { - net.kyori.adventure.text.TextComponent.Builder builder = Component.text(); - for (String string : strings.split("\n")) { + private static Component header(final String header, final int color, final int count, final boolean showSize) { + final TextComponent.Builder componentHeader = Component.text().color(TextColor.color(color)) + .append(Component.text(header)); + + if (showSize) { + componentHeader.appendSpace().append(Component.text("(" + count + ")")); + } + + return componentHeader.append(Component.text(":")).build(); + } + + private static Component asPlainComponents(final String strings) { + final net.kyori.adventure.text.TextComponent.Builder builder = Component.text(); + for (final String string : strings.split("\n")) { builder.append(Component.newline()); builder.append(Component.text(string, NamedTextColor.WHITE)); } @@ -134,13 +136,13 @@ public class PaperPluginsCommand extends BukkitCommand { return builder.build(); } - private static TextColor fromStatus(PluginProvider provider) { - if (provider instanceof ProviderStatusHolder statusHolder && statusHolder.getLastProvidedStatus() != null) { - ProviderStatus status = statusHolder.getLastProvidedStatus(); + private static TextColor fromStatus(final PluginProvider provider) { + if (provider instanceof final ProviderStatusHolder statusHolder && statusHolder.getLastProvidedStatus() != null) { + final ProviderStatus status = statusHolder.getLastProvidedStatus(); // Handle enabled/disabled game plugins if (status == ProviderStatus.INITIALIZED && GenericTypeReflector.isSuperType(JAVA_PLUGIN_PROVIDER_TYPE, provider.getClass())) { - Plugin plugin = Bukkit.getPluginManager().getPlugin(provider.getMeta().getName()); + final Plugin plugin = Bukkit.getPluginManager().getPlugin(provider.getMeta().getName()); // Plugin doesn't exist? Could be due to it being removed. if (plugin == null) { return NamedTextColor.RED; @@ -153,7 +155,7 @@ public class PaperPluginsCommand extends BukkitCommand { case INITIALIZED -> NamedTextColor.GREEN; case ERRORED -> NamedTextColor.RED; }; - } else if (provider instanceof PaperPluginParent.PaperServerPluginProvider serverPluginProvider && serverPluginProvider.shouldSkipCreation()) { + } else if (provider instanceof final PaperPluginParent.PaperServerPluginProvider serverPluginProvider && serverPluginProvider.shouldSkipCreation()) { // Paper plugins will be skipped if their provider is skipped due to their initializer failing. // Show them as red return NamedTextColor.RED; @@ -165,15 +167,14 @@ public class PaperPluginsCommand extends BukkitCommand { } @Override - public boolean execute(@NotNull CommandSender sender, @NotNull String currentAlias, @NotNull String[] args) { + public boolean execute(final CommandSender sender, final String currentAlias, final String[] args) { if (!this.testPermission(sender)) return true; - TreeMap> paperPlugins = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - TreeMap> spigotPlugins = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + final TreeMap> paperPlugins = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + final TreeMap> spigotPlugins = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - - for (PluginProvider provider : LaunchEntryPointHandler.INSTANCE.get(Entrypoint.PLUGIN).getRegisteredProviders()) { - PluginMeta configuration = provider.getMeta(); + for (final PluginProvider provider : LaunchEntryPointHandler.INSTANCE.get(Entrypoint.PLUGIN).getRegisteredProviders()) { + final PluginMeta configuration = provider.getMeta(); if (provider instanceof SpigotPluginProvider) { spigotPlugins.put(configuration.getDisplayName(), provider); @@ -182,34 +183,36 @@ public class PaperPluginsCommand extends BukkitCommand { } } - Component infoMessage = Component.text("Server Plugins (%s):".formatted(paperPlugins.size() + spigotPlugins.size()), NamedTextColor.WHITE); - //.append(INFO_ICON_START.hoverEvent(SERVER_PLUGIN_INFO)); TODO: Add docs + final int sizePaperPlugins = paperPlugins.size(); + final int sizeSpigotPlugins = spigotPlugins.size(); + final int sizePlugins = sizePaperPlugins + sizeSpigotPlugins; + final boolean hasAllPluginTypes = (sizePaperPlugins > 0 && sizeSpigotPlugins > 0); + + final Component infoMessage = Component.text().append(INFO_ICON_SERVER_PLUGIN).append(Component.text("Server Plugins (%s):".formatted(sizePlugins), NamedTextColor.WHITE)).build(); sender.sendMessage(infoMessage); if (!paperPlugins.isEmpty()) { - sender.sendMessage(PAPER_HEADER); + sender.sendMessage(header("Paper Plugins", 0x0288D1, sizePaperPlugins, hasAllPluginTypes)); } - for (Component component : formatProviders(paperPlugins)) { + for (final Component component : formatProviders(paperPlugins)) { sender.sendMessage(component); } if (!spigotPlugins.isEmpty()) { - sender.sendMessage(BUKKIT_HEADER); + sender.sendMessage(header("Bukkit Plugins", 0xED8106, sizePaperPlugins, hasAllPluginTypes)); } - - for (Component component : formatProviders(spigotPlugins)) { + + for (final Component component : formatProviders(spigotPlugins)) { sender.sendMessage(component); } return true; } - @NotNull @Override - public List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { + public List tabComplete(final CommandSender sender, final String alias, final String[] args) throws IllegalArgumentException { return Collections.emptyList(); } - }