package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.rank.DisplayableGroup; import me.totalfreedom.totalfreedommod.rank.GroupProvider; import me.totalfreedom.totalfreedommod.rank.HierarchyProvider; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.PermissibleCompletion; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.luckperms.api.model.user.User; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; @CommandPermissions(permission = "saconfig", source = SourceType.BOTH) @CommandParameters(description = "List, add, remove, or set the rank of admins, clean or reload the admin list, or view admin information.", usage = "/ | >", aliases = "slconfig") public class Command_saconfig extends FreedomCommand { @Override public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { if (args.length < 1) { return false; } switch (args[0]) { case "list" -> { msgNew("Admins: ", Placeholder.unparsed("admins", StringUtils.join(plugin.al.getAdminNames(), ", "))); return true; } case "clean" -> { checkConsole(); checkPermission("tfm.saconfig.clean"); FUtil.adminAction(sender.getName(), "Cleaning the admin list", true); plugin.al.deactivateOldEntries(true); msgNew("Admins: ", Placeholder.unparsed("admins", StringUtils.join(plugin.al.getAdminNames(), ", "))); return true; } case "reload" -> { checkPermission("tfm.saconfig.reload"); FUtil.adminAction(sender.getName(), "Reloading the admin list", true); plugin.al.load(); msgNew("Admin list reloaded!"); return true; } case "promote" -> { checkConsole(); checkPermission("tfm.saconfig.promote"); if (args.length < 2) { return false; } Player player = getPlayer(args[1]); FUtil.adminAction(sender.getName(), "Promoting " + player.getName() + " to the next rank", true); HierarchyProvider.ADMIN.getHierarchy() .promoteUser(GroupProvider.getUser(player)) .whenComplete((result, ex) -> { if (ex != null) { FLog.severe("Failed to promote " + player.getName() + " to the next rank"); return; } result.getGroupTo() .ifPresent(group -> msgNew("Admin has been promoted to ", Placeholder.unparsed("player", player.getName()), Placeholder.unparsed("rank", group))); }); } case "setrank" -> { checkConsole(); checkPermission("tfm.saconfig.setrank"); if (args.length < 3) { return false; } DisplayableGroup rank = GroupProvider.fromArgument(args[2]).getGroup(); if (rank == null) { msgNew("Unknown rank: ", Placeholder.unparsed("rank", args[2])); return true; } if (!rank.isAtLeast(GroupProvider.ADMIN.getGroup())) { msgNew("Rank must be Admin or higher."); return true; } Admin admin = plugin.al.getEntryByName(args[1]); if (admin == null) { msgNew("Unknown admin: ", Placeholder.unparsed("player", args[1])); return true; } FUtil.adminAction(sender.getName(), "Setting " + admin.getName() + "'s rank to " + rank.getName(), true); admin.setRank(rank); plugin.al.save(admin); Player player = getPlayer(admin.getName()); if (player != null) { plugin.rm.updateDisplay(player); } if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) { plugin.dc.syncRoles(admin, plugin.pl.getData(admin.getName()).getDiscordID()); } msgNew("Set 's rank to .", Placeholder.unparsed("admin", admin.getName()), Placeholder.component("rank", rank.getName())); return true; } case "info" -> { if (args.length < 2) { return false; } checkPermission("tfm.saconfig.info"); Admin admin = plugin.al.getEntryByName(args[1]); if (admin == null) { final Player player = getPlayer(args[1]); if (player != null) { admin = plugin.al.getAdmin(player); } } if (admin == null) { msgNew("Unknown admin: ", Placeholder.unparsed("player", args[1])); return true; } else { msgNew(admin.toString()); } return true; } case "add" -> { if (args.length < 2) { return false; } checkConsole(); checkPermission("tfm.saconfig.add"); // Player already admin? final Player player = getPlayer(args[1]); if (player == null) { msg(PLAYER_NOT_FOUND); return true; } if (plugin.al.isAdmin(player)) { msgNew("That player is already an admin."); return true; } // Find the old admin entry Admin admin = null; for (Admin loopAdmin : plugin.al.getAllAdmins()) { if (loopAdmin.getUuid().equals(player.getUniqueId())) { admin = loopAdmin; break; } } if (admin == null) // New admin { FUtil.adminAction(sender.getName(), "Adding " + player.getName() + " to the admin list", true); admin = new Admin(player); User user = GroupProvider.getUser(player); HierarchyProvider.ADMIN.getHierarchy().promoteUser(user); plugin.al.addAdmin(admin); plugin.rm.updateDisplay(player); } else // Existing admin { User user = GroupProvider.getUser(player); HierarchyProvider.ADMIN.getHierarchy().promoteUser(user); FUtil.adminAction(sender.getName(), "Re-adding " + player.getName() + " to the admin list", true); admin.addIp(FUtil.getIp(player)); admin.setActive(true); admin.setLastLogin(new Date()); plugin.al.save(admin); plugin.al.updateTables(); plugin.rm.updateDisplay(player); if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) { plugin.dc.syncRoles(admin, plugin.pl.getData(player).getDiscordID()); } } final FPlayer fPlayer = plugin.pl.getPlayer(player); if (fPlayer.getFreezeData().isFrozen()) { fPlayer.getFreezeData().setFrozen(false); msgNew(player, "You have been unfrozen."); } return true; } case "remove" -> { if (args.length < 2) { return false; } checkConsole(); checkPermission("tfm.saconfig.remove"); Player player = getPlayer(args[1]); Admin admin = plugin.al.getAdmin(player); plugin.al.removeAdmin(admin); User user = GroupProvider.getUser(player); HierarchyProvider.ADMIN.getHierarchy().dropUserFromAll(user); FUtil.adminAction(sender.getName(), "Removing " + admin.getName() + " from the admin list", true); admin.setActive(false); plugin.al.save(admin); plugin.al.updateTables(); if (player != null) { plugin.rm.updateDisplay(player); } if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) { plugin.dc.syncRoles(admin, plugin.pl.getData(admin.getName()) .getDiscordID()); } return true; } default -> { return false; } } return false; } @Override public List getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args) { if (args.length == 1) { return argumentCompletions(args[0], PermissibleCompletion.of("tfm.saconfig.info", "info"), PermissibleCompletion.of("tfm.saconfig.add", "add"), PermissibleCompletion.of("tfm.saconfig.remove", "remove"), PermissibleCompletion.of("tfm.saconfig.reload", "reload"), PermissibleCompletion.of("tfm.saconfig.clean", "clean"), PermissibleCompletion.of("tfm.saconfig.setrank", "setrank")); } if (args.length == 2 && (args[0].equals("add") || args[0].equals("remove") || args[0].equals("setrank") || args[0].equals("info"))) { return playerCompletions(args[1]); } if (args.length == 3 && args[0].equals("setrank") && sender.hasPermission("tfm.saconfig.setrank")) { return Arrays.asList("ADMIN", "SENIOR_ADMIN"); } return Collections.emptyList(); } }