package dev.plex.command.impl; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import dev.plex.command.ServerCommand; import dev.plex.command.ServerCommandContext; import dev.plex.module.ModuleManager; import dev.plex.module.PlexModule; import dev.plex.module.PlexModuleFile; import dev.plex.util.BuildInfo; import dev.plex.util.PlexLog; import dev.plex.util.PlexUtils; import dev.plex.util.TimeUtils; import dev.plex.util.UpdateChecker; import java.util.List; import java.util.stream.Collectors; import io.papermc.paper.command.brigadier.CommandSourceStack; import net.kyori.adventure.text.Component; import org.apache.commons.lang3.StringUtils; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; public class PlexCMD extends ServerCommand { public PlexCMD() { super(command("plex") .description("Show information about Plex or reload it") .usage("/ [reload | update | modules [reload | update | install | uninstall [-rmdir]]]") .build()); } // Don't modify this command @Override protected void buildCommand(LiteralArgumentBuilder command) { command.executes(context -> executeCommand(context)); command.then(literal("reload") .executes(context -> executeCommand(context, "reload"))); command.then(literal("update") .executes(context -> executeCommand(context, "update"))); command.then(literal("modules") .executes(context -> executeCommand(context, "modules")) .then(literal("reload") .executes(context -> executeCommand(context, "modules", "reload"))) .then(literal("update") .executes(context -> executeCommand(context, "modules", "update"))) .then(literal("install") .then(word("name") .executes(context -> executeCommand(context, "modules", "install", string(context, "name"))))) .then(literal("uninstall") .then(word("name") .suggests(suggest(() -> plugin.getModuleManager().getModules().stream() .map(module -> module.getPlexModuleFile().getName()) .collect(Collectors.toList()))) .executes(context -> executeCommand(context, "modules", "uninstall", string(context, "name"))) .then(literal("-rmdir") .executes(context -> executeCommand(context, "modules", "uninstall", string(context, "name"), "-rmdir")))))); } @Override protected Component execute(@NotNull ServerCommandContext context) { CommandSender sender = context.sender(); String[] args = context.args(); if (args.length == 0) { context.send(sender, context.mmString("Plex - A new freedom plugin.")); context.send(sender, context.mmString("Plugin version: " + plugin.getPluginMeta().getVersion() + " #" + BuildInfo.getNumber() + " Git: " + BuildInfo.shortenCommit(BuildInfo.getCommit()))); context.send(sender, context.mmString("Authors: Telesphoreo, Taahh")); context.send(sender, context.mmString("Built by: " + BuildInfo.getAuthor() + " on " + BuildInfo.getDate())); context.send(sender, context.mmString("Run /plex modules to see a list of modules.")); plugin.getApi().scheduler().runAsync(() -> plugin.getUpdateChecker().getUpdateStatusMessage(sender, true, 2)); return null; } if (args[0].equalsIgnoreCase("reload")) { context.checkPermission(sender, "plex.reload"); plugin.config.load(); PlexLog.setDebugEnabled(plugin.config.getBoolean("debug")); context.send(sender, "Reloaded config file"); plugin.messages.load(); PlexUtils.configure(plugin.config, plugin.messages); context.send(sender, "Reloaded messages file"); plugin.indefBans.load(false); plugin.getPunishmentManager().mergeIndefiniteBans(); context.send(sender, "Reloaded indefinite bans"); if (!plugin.getServer().getPluginManager().isPluginEnabled("Vault")) { throw new RuntimeException("Vault is required to run on the server if you use permissions!"); } plugin.getServiceManager().endServices(); plugin.getServiceManager().startServices(); context.send(sender, "Restarted services."); TimeUtils.TIMEZONE = plugin.config.getString("server.timezone"); context.send(sender, "Set timezone to: " + TimeUtils.TIMEZONE); context.send(sender, "Plex successfully reloaded."); return null; } else if (args[0].equalsIgnoreCase("modules")) { if (args.length == 1) { return context.mmString("Modules (" + plugin.getModuleManager().getModules().size() + "): " + StringUtils.join(plugin.getModuleManager().getModules().stream().map(PlexModule::getPlexModuleFile).map(PlexModuleFile::getName).collect(Collectors.toList()), ", ")); } if (args[1].equalsIgnoreCase("reload")) { context.checkPermission(sender, "plex.modules.reload"); plugin.getModuleManager().reloadModules(); return context.mmString("All modules reloaded!"); } else if (args[1].equalsIgnoreCase("update")) { context.checkPermission(sender, "plex.modules.update"); plugin.getApi().scheduler().runAsync(() -> { for (PlexModule module : plugin.getModuleManager().getModules()) { plugin.getUpdateChecker().updateModuleJar(sender, module); } plugin.getApi().scheduler().runGlobal(() -> { plugin.getModuleManager().reloadModules(); sender.sendMessage(context.mmString("All modules updated and reloaded!")); }); }); return null; } else if (args[1].equalsIgnoreCase("install")) { context.checkPermission(sender, "plex.modules.install"); if (args.length < 3) { return context.usage(); } String moduleName = args[2]; plugin.getApi().scheduler().runAsync(() -> plugin.getUpdateChecker().installModuleJar(sender, moduleName)); return context.mmString("Installing module " + moduleName + "..."); } else if (args[1].equalsIgnoreCase("uninstall")) { context.checkPermission(sender, "plex.modules.uninstall"); if (args.length < 3) { return context.usage(); } String moduleName = args[2]; boolean removeData = args.length >= 4 && args[3].equalsIgnoreCase("-rmdir"); ModuleManager.UninstallResult result = plugin.getModuleManager().uninstallModule(moduleName, removeData); switch (result) { case NOT_FOUND: return context.mmString("No installed module named " + moduleName + " was found."); case FAILED: return context.mmString("Failed to delete the JAR for " + moduleName + ". Check the server log."); case REMOVED: context.send(sender, context.mmString("Uninstalled module " + moduleName + "" + (removeData ? " and its data folder" : "") + ".")); return context.messageComponent("moduleRestartRequired"); } } } else if (args[0].equalsIgnoreCase("update")) { context.checkPermission(sender, "plex.update"); plugin.getApi().scheduler().runAsync(() -> { UpdateChecker.UpdateCheckResult result = plugin.getUpdateChecker().checkForUpdates(false); if (result.status() == UpdateChecker.UpdateCheckStatus.UPDATE_AVAILABLE) { plugin.getUpdateChecker().updateJar(sender, result.metadata(), () -> sendMessage(sender, context.mmString("Alert: Restart the server for the new JAR file to be applied."))); return; } if (result.status() == UpdateChecker.UpdateCheckStatus.UP_TO_DATE) { sendMessage(sender, context.mmString("Plex is already up to date!")); return; } plugin.getUpdateChecker().sendResultMessage(sender, result, 2); }); return null; } else { return context.usage(); } return null; } private void sendMessage(CommandSender sender, Component message) { if (sender instanceof Player player) { plugin.getApi().scheduler().runEntity(player, () -> sender.sendMessage(message)); return; } plugin.getApi().scheduler().runGlobal(() -> sender.sendMessage(message)); } }