package net.frankheijden.serverutils.commands; import co.aikar.commands.BaseCommand; import co.aikar.commands.annotation.*; import net.frankheijden.serverutils.ServerUtils; import net.frankheijden.serverutils.config.Messenger; import net.frankheijden.serverutils.managers.*; import net.frankheijden.serverutils.reflection.*; import net.frankheijden.serverutils.utils.*; import org.bukkit.Bukkit; import org.bukkit.command.*; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import java.util.*; import static net.frankheijden.serverutils.config.Messenger.sendMessage; import static net.frankheijden.serverutils.reflection.ReflectionUtils.MINOR; @CommandAlias("serverutils|su") public class CommandServerUtils extends BaseCommand { private static final Set ALIASES; private static final Map supportedConfigs; static { ALIASES = new HashSet<>(); ALIASES.add("serverutils"); ALIASES.add("plugins"); supportedConfigs = new HashMap<>(); supportedConfigs.put("bukkit", RCraftServer::reloadBukkitConfiguration); supportedConfigs.put("commands.yml", RCraftServer::reloadCommandsConfiguration); supportedConfigs.put("server-icon.png", RCraftServer::loadIcon); supportedConfigs.put("banned-ips.json", RCraftServer::reloadIPBans); supportedConfigs.put("banned-players.json", RCraftServer::reloadProfileBans); } @Dependency private ServerUtils plugin; public static Set getSupportedConfigs() { return supportedConfigs.keySet(); } @Default @Subcommand("help") @CommandPermission("serverutils.help") @Description("Shows a help page with a few commands.") public void onHelp(CommandSender sender) { Messenger.sendMessage(sender, "serverutils.help.header"); FormatBuilder builder = FormatBuilder.create(Messenger.getMessage("serverutils.help.format")) .orderedKeys("%command%", "%subcommand%", "%help%"); plugin.getCommandManager().getRegisteredRootCommands().stream() .filter(c -> !ALIASES.contains(c.getCommandName().toLowerCase())) .forEach(rootCommand -> { builder.add(rootCommand.getCommandName(), "", rootCommand.getDescription()); rootCommand.getSubCommands().forEach((str, cmd) -> { if (cmd.getPrefSubCommand().isEmpty()) return; builder.add(rootCommand.getCommandName(), " " + cmd.getPrefSubCommand(), cmd.getHelpText()); }); }); builder.sendTo(sender); Messenger.sendMessage(sender, "serverutils.help.footer"); } @Subcommand("reload") @CommandPermission("serverutils.reload") @Description("Reloads the ServerUtils plugin.") public void onReload(CommandSender sender) { plugin.reload(); sendMessage(sender, "serverutils.success", "%action%", "reload", "%what%", "ServerUtils configurations"); } @Subcommand("reloadconfig") @CommandCompletion("@supportedConfigs") @CommandPermission("serverutils.reloadconfig") @Description("Reloads individual Server configurations.") public void onReloadCommands(CommandSender sender, String config) { ReloadHandler handler = supportedConfigs.get(config); if (handler == null) { this.doHelp(sender); return; } String[] replacements = new String[]{ "%action%", "reload", "%what%", config }; ForwardFilter filter = new ForwardFilter(sender); filter.start(Bukkit.getLogger()); try { handler.handle(); filter.stop(Bukkit.getLogger()); String path = "serverutils." + (filter.hasWarnings() ? "warning" : "success"); sendMessage(sender, path, replacements); } catch (Exception ex) { filter.stop(Bukkit.getLogger()); ex.printStackTrace(); sendMessage(sender, "serverutils.error", replacements); } } @Subcommand("loadplugin") @CommandCompletion("@pluginJars") @CommandPermission("serverutils.loadplugin") @Description("Loads the specified jar file as a plugin.") public void onLoadPlugin(CommandSender sender, String jarFile) { LoadResult loadResult = PluginManager.loadPlugin(jarFile); if (!loadResult.isSuccess()) { loadResult.getResult().sendTo(sender, "load", jarFile); return; } Result result = PluginManager.enablePlugin(loadResult.getPlugin()); result.sendTo(sender, "load", jarFile); } @Subcommand("unloadplugin") @CommandCompletion("@plugins") @CommandPermission("serverutils.unloadplugin") @Description("Disables and unloads the specified plugin.") public void onUnloadPlugin(CommandSender sender, String pluginName) { Result disableResult = PluginManager.disablePlugin(pluginName); if (disableResult != Result.SUCCESS && disableResult != Result.ALREADY_DISABLED) { disableResult.sendTo(sender, "disabl", pluginName); return; } Result unloadResult = PluginManager.unloadPlugin(pluginName); unloadResult.sendTo(sender, "unload", pluginName); } @Subcommand("reloadplugin") @CommandCompletion("@plugins") @CommandPermission("serverutils.reloadplugin") @Description("Reloads a specified plugin.") public void onReloadPlugin(CommandSender sender, String pluginName) { Result result = PluginManager.reloadPlugin(pluginName); result.sendTo(sender, "reload", pluginName); } @Subcommand("enableplugin") @CommandCompletion("@plugins") @CommandPermission("serverutils.enableplugin") @Description("Enables the loaded plugin.") public void onEnablePlugin(CommandSender sender, String pluginName) { Result result = PluginManager.enablePlugin(pluginName); result.sendTo(sender, "enabl", pluginName); } @Subcommand("disableplugin") @CommandCompletion("@plugins") @CommandPermission("serverutils.disableplugin") @Description("Disables the specified plugin.") public void onDisablePlugin(CommandSender sender, String pluginName) { Result result = PluginManager.disablePlugin(pluginName); result.sendTo(sender, "disabl", pluginName); } @Subcommand("plugininfo") @CommandCompletion("@plugins") @CommandPermission("serverutils.plugininfo") @Description("Shows information about the specified plugin.") public void onPluginInfo(CommandSender sender, String pluginName) { Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName); if (plugin == null) { Result.NOT_EXISTS.sendTo(sender, "fetch", pluginName); return; } PluginDescriptionFile description = plugin.getDescription(); String format = Messenger.getMessage("serverutils.plugininfo.format"); String listFormatString = Messenger.getMessage("serverutils.plugininfo.list_format"); String seperator = Messenger.getMessage("serverutils.plugininfo.seperator"); String lastSeperator = Messenger.getMessage("serverutils.plugininfo.last_seperator"); ListFormat listFormat = str -> listFormatString.replace("%value%", str); Messenger.sendMessage(sender, "serverutils.plugininfo.header"); FormatBuilder builder = FormatBuilder.create(format) .orderedKeys("%key%", "%value%") .add("Name", plugin.getName()) .add("Full Name", description.getFullName()) .add("Version", description.getVersion()); if (MINOR >= 13) builder.add( "API Version", description.getAPIVersion()); builder.add("Website", description.getWebsite()) .add("Authors", ListBuilder.create(description.getAuthors()) .format(listFormat) .seperator(seperator) .lastSeperator(lastSeperator) .toString()) .add("Description", description.getDescription()) .add("Main", description.getMain()) .add("Prefix", description.getPrefix()) .add("Load Order", description.getLoad().name()) .add("Load Before", ListBuilder.create(description.getLoadBefore()) .format(listFormat) .seperator(seperator) .lastSeperator(lastSeperator) .toString()) .add("Depend", ListBuilder.create(description.getDepend()) .format(listFormat) .seperator(seperator) .lastSeperator(lastSeperator) .toString()) .add("Soft Depend", ListBuilder.create(description.getSoftDepend()) .format(listFormat) .seperator(seperator) .lastSeperator(lastSeperator) .toString()); if (MINOR >= 15) builder.add("Provides", ListBuilder.create(description.getProvides()) .format(listFormat) .seperator(seperator) .lastSeperator(lastSeperator) .toString()); 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"); } }