diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java index f967d1646..4922d682b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/FrontDoor.java @@ -17,7 +17,7 @@ import java.util.function.Consumer; import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.banning.Ban; -import me.totalfreedom.totalfreedommod.command.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.fun.Jumppads; import me.totalfreedom.totalfreedommod.player.FPlayer; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java index 136c6c46d..7a4d20f0e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java @@ -10,7 +10,7 @@ import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker; import me.totalfreedom.totalfreedommod.bridge.*; import me.totalfreedom.totalfreedommod.caging.Cager; -import me.totalfreedom.totalfreedommod.command.CommandLoader; +import me.totalfreedom.totalfreedommod.command.handling.CommandLoader; import me.totalfreedom.totalfreedommod.config.MainConfig; import me.totalfreedom.totalfreedommod.freeze.Freezer; import me.totalfreedom.totalfreedommod.fun.*; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java index 0b5fdc959..5a43ed688 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java @@ -4,15 +4,13 @@ import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.rank.DisplayableGroup; import me.totalfreedom.totalfreedommod.rank.GroupProvider; -import me.totalfreedom.totalfreedommod.util.FLog; +import me.totalfreedom.totalfreedommod.sql.ResultSetProvider; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.entity.Player; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.*; public class Admin @@ -32,23 +30,22 @@ public Admin(Player player) this.ips.add(FUtil.getIp(player)); } - public Admin(ResultSet resultSet) + public Admin(ResultSetProvider resultSet) { - try + if (resultSet.getString("uuid") == null) { - this.uuid = UUID.fromString(resultSet.getString("uuid")); - this.active = resultSet.getBoolean("active"); - this.rank = GroupProvider.fromArgument(resultSet.getString("rank")).getGroup(); - this.ips.clear(); - this.ips.addAll(FUtil.stringToList(resultSet.getString("ips"))); - this.lastLogin = new Date(resultSet.getLong("last_login")); - this.commandSpy = resultSet.getBoolean("command_spy"); - this.potionSpy = resultSet.getBoolean("potion_spy"); - this.acFormat = resultSet.getString("ac_format"); - } catch (SQLException e) - { - FLog.severe("Failed to load admin: " + e.getMessage()); + throw new IllegalArgumentException("Failed to load admin, as the UUID is null."); } + + this.uuid = UUID.fromString(resultSet.getString("uuid")); + this.active = resultSet.getBoolean("active"); + this.rank = GroupProvider.fromString(resultSet.getString("rank")).getGroup(); + this.ips.clear(); + this.ips.addAll(FUtil.stringToList(resultSet.getString("ips"))); + this.lastLogin = new Date(resultSet.getLong("last_login")); + this.commandSpy = resultSet.getBoolean("command_spy"); + this.potionSpy = resultSet.getBoolean("potion_spy"); + this.acFormat = resultSet.getString("ac_format"); } @Override @@ -70,15 +67,15 @@ public String toString() public Map toSQLStorable() { HashMap map = new HashMap<>(); - map.put("uuid", uuid.toString()); - map.put("active", active); - map.put("rank", rank.toString()); - map.put("ips", FUtil.listToString(ips)); - map.put("last_login", lastLogin.getTime()); - map.put("command_spy", commandSpy); - map.put("potion_spy", potionSpy); - map.put("ac_format", acFormat); - return map; + map.put("uuid", uuid.toString()); + map.put("active", active); + map.put("rank", rank.toString()); + map.put("ips", FUtil.listToString(ips)); + map.put("last_login", lastLogin.getTime()); + map.put("command_spy", commandSpy); + map.put("potion_spy", potionSpy); + map.put("ac_format", acFormat); + return map; } diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java index 10bf705ed..cdfbe57d8 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java @@ -5,6 +5,8 @@ import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.rank.GroupProvider; +import me.totalfreedom.totalfreedommod.sql.ResultSetProvider; +import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; @@ -12,14 +14,15 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.*; +import java.util.concurrent.CompletionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; public class AdminList extends FreedomService { public static final List vanished = new ArrayList<>(); + public static final String SQL_SAVE_FAILED = "Failed to save admin: "; private final Set allAdmins = Sets.newHashSet(); // Includes disabled admins // Only active admins below private final Set activeAdmins = Sets.newHashSet(); @@ -43,33 +46,37 @@ public void onStop() public void load() { allAdmins.clear(); - try + plugin.sql.getAdminList().thenAcceptAsync(provider -> { - ResultSet adminSet = plugin.sql.getAdminList(); - while (adminSet.next()) + AtomicInteger row = new AtomicInteger(1); + provider.getAllRowsResultSet().forEach(adminSet -> { - tryAddAdmin(adminSet); - } - } catch (SQLException e) + try + { + tryAddAdmin(ResultSetProvider.fromRow(adminSet)); + row.set(row.get() + 1); + } catch (Throwable e) + { + FLog.warning("An error occurred whilst reading the admin entry at row #" + row.get()); + throw new CompletionException(e); // handle downstream. + } + }); + }).whenComplete((result, throwable) -> { - FLog.severe("Failed to load admin list: " + e.getMessage()); - } - - updateTables(); - FLog.info("Loaded " + allAdmins.size() + " admins (" + uuidTable.size() + " active, " + ipTable.size() + " IPs)"); + if (throwable != null) + { + FLog.severe(throwable.getMessage()); + return; + } + updateTables(); + FLog.info("Loaded " + allAdmins.size() + " admins (" + uuidTable.size() + " active, " + ipTable.size() + " IPs)"); + }); } - private void tryAddAdmin(ResultSet adminSet) throws SQLException + private void tryAddAdmin(ResultSetProvider adminSet) { - try - { - Admin admin = new Admin(adminSet); - allAdmins.add(admin); - } catch (Throwable ex) - { - FLog.warning("An error occurred whilst reading the admin entry at row #" + adminSet.getRow()); - FLog.warning(ex); - } + Admin admin = new Admin(adminSet); + allAdmins.add(admin); } public void messageAllAdmins(Component message) @@ -106,9 +113,10 @@ public boolean isAdmin(CommandSender sender) return admin != null && admin.isActive(); } - // Cast to OfflinePlayer public boolean isAdmin(Player player) { + if (Hierarchy.getHierarchy().isUserOnAdminTrack(player)) return true; + return isAdmin((OfflinePlayer) player); } @@ -124,19 +132,6 @@ public boolean isAdmin(OfflinePlayer player) return admin != null && admin.isActive(); } - public boolean isSeniorAdmin(CommandSender sender) - { - Admin admin = getAdmin(sender); - if (admin == null) - { - return false; - } - - return admin.getRank().getLuckPermsGroup().getWeight().orElse(0) - >= GroupProvider.SENIOR_ADMIN.getGroup().getLuckPermsGroup().getWeight().orElse(1); - // We don't want this to return true if there's no group weight available. - } - public Admin getAdmin(CommandSender sender) { if (sender instanceof Player player) @@ -198,7 +193,13 @@ public void addAdmin(Admin admin) updateTables(); // Save admin - plugin.sql.addAdmin(admin); + plugin.sql.addAdmin(admin).whenComplete((result, exception) -> + { + if (exception != null) + { + FLog.warning(SQL_SAVE_FAILED + admin.getName() + " to the database.\n" + exception.getMessage()); + } + }); } public boolean removeAdmin(Admin admin) @@ -216,7 +217,13 @@ public boolean removeAdmin(Admin admin) updateTables(); // Unsave admin - plugin.sql.removeAdmin(admin); + plugin.sql.removeAdmin(admin).whenComplete((result, exception) -> + { + if (exception != null) + { + FLog.warning("Failed to remove admin: " + admin.getName() + " from the database.\n" + exception.getMessage()); + } + }); return true; } @@ -261,21 +268,30 @@ public Set getAdminIps() public void save(Admin admin) { - try + plugin.sql.getAdminByUuid(admin.getUuid()).thenApplyAsync(result -> { - ResultSet currentSave = plugin.sql.getAdminByUuid(admin.getUuid()); for (Map.Entry entry : admin.toSQLStorable().entrySet()) { - Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue()); + Object storedValue = plugin.sql.getValue(result, entry.getKey(), entry.getValue()); if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null) { - plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue()); + plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue()).whenComplete((result2, exception) -> + { + if (exception != null) + { + throw new CompletionException(exception); // We want to handle downstream in #whenComplete() + } + }); } } - } catch (SQLException e) + return null; + }).whenComplete((result, exception) -> { - FLog.severe("Failed to save admin: " + e.getMessage()); - } + if (exception != null) + { + FLog.severe(SQL_SAVE_FAILED + exception.getMessage()); + } + }); } public void deactivateOldEntries(boolean verbose) diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java index c308d34cd..9721ca4c5 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java @@ -2,17 +2,8 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; import me.totalfreedom.totalfreedommod.FreedomService; +import me.totalfreedom.totalfreedommod.sql.ResultSetProvider; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.entity.Player; @@ -21,6 +12,8 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; +import java.util.*; + public class BanManager extends FreedomService { @@ -34,38 +27,38 @@ public class BanManager extends FreedomService public void onStart() { bans.clear(); - try + + plugin.sql.getBanList().whenComplete((result, throwable) -> { - ResultSet banSet = plugin.sql.getBanList(); + if (throwable != null) + { + FLog.severe("Failed to load ban list: " + throwable.getMessage()); + return; + } + + result.getAllRowsResultSet().forEach(row -> { - while (banSet.next()) + ResultSetProvider banSet = ResultSetProvider.fromRow(row); + String name = banSet.getString("name"); + UUID uuid = null; + String strUUID = banSet.getString("uuid"); + if (strUUID != null) { - String name = banSet.getString("name"); - UUID uuid = null; - String strUUID = banSet.getString("uuid"); - if (strUUID != null) - { - uuid = UUID.fromString(strUUID); - } - List ips = FUtil.stringToList(banSet.getString("ips")); - String by = banSet.getString("by"); - Date at = new Date(banSet.getLong("at")); - Date expires = new Date(banSet.getLong("expires")); - String reason = banSet.getString("reason"); - Ban ban = new Ban(name, uuid, ips, by, at, expires, reason); - bans.add(ban); + uuid = UUID.fromString(strUUID); } - } - } - catch (SQLException e) - { - FLog.severe("Failed to load ban list: " + e.getMessage()); - } - - // Remove expired bans, repopulate ipBans and nameBans, - updateViews(); - - FLog.info("Loaded " + ipBans.size() + " IP bans and " + nameBans.size() + " username bans."); + List ips = FUtil.stringToList(banSet.getString("ips")); + String by = banSet.getString("by"); + Date at = new Date(banSet.getLong("at")); + Date expires = new Date(banSet.getLong("expires")); + String reason = banSet.getString("reason"); + Ban ban = new Ban(name, uuid, ips, by, at, expires, reason); + bans.add(ban); + // Remove expired bans, repopulate ipBans and nameBans, + updateViews(); + + FLog.info("Loaded " + ipBans.size() + " IP bans and " + nameBans.size() + " username bans."); + }); + }); } @Override @@ -186,8 +179,7 @@ public void addBan(Ban ban) if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null) { removeBan(ban); - } - else + } else { for (String ip : ban.getIps()) @@ -202,8 +194,16 @@ public void addBan(Ban ban) if (bans.add(ban)) { - plugin.sql.addBan(ban); - updateViews(); + plugin.sql.addBan(ban).whenComplete((result, ex) -> + { + if (ex != null) + { + FLog.severe(ex.getMessage()); + return; + } + + updateViews(); + }); } } @@ -212,8 +212,16 @@ public void removeBan(Ban ban) { if (bans.remove(ban)) { - plugin.sql.removeBan(ban); - updateViews(); + plugin.sql.removeBan(ban).whenComplete((result, ex) -> + { + if (ex != null) + { + FLog.severe(ex.getMessage()); + return; + } + + updateViews(); + }); } } @@ -223,7 +231,13 @@ public int purge() int size = bans.size(); bans.clear(); updateViews(); - plugin.sql.truncate("bans"); + plugin.sql.truncate("bans").whenComplete((result, ex) -> + { + if (ex != null) + { + FLog.severe(ex.getMessage()); + } + }); return size; } @@ -267,8 +281,7 @@ public void onPlayerJoin(PlayerJoinEvent event) if (ban != null) { removeBan(ban); - } - else + } else { ban = getByIp(FUtil.getIp(player)); if (ban != null) @@ -286,7 +299,13 @@ private void updateViews() if (ban.isExpired()) { bans.remove(ban); - plugin.sql.removeBan(ban); + plugin.sql.removeBan(ban).whenComplete((result, ex) -> + { + if (ex != null) + { + FLog.severe(ex.getMessage()); + } + }); } } @@ -314,4 +333,4 @@ private void updateViews() } } } -} \ No newline at end of file +} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlocker.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlocker.java index 46b2e4d64..adc6bf52b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlocker.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/blocking/command/CommandBlocker.java @@ -30,24 +30,6 @@ public class CommandBlocker extends FreedomService private final Map entryList = Maps.newHashMap(); private final List unknownCommands = Lists.newArrayList(); - public static CommandMap getCommandMap() - { - try - { - SimplePluginManager simplePluginManager = (SimplePluginManager)Bukkit.getServer().getPluginManager(); - - Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap"); - commandMapField.setAccessible(true); - - return (SimpleCommandMap)commandMapField.get(simplePluginManager); - } - catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) - { - FLog.severe("Failed to get command map field (" + e.getMessage() + ")"); - } - return null; - } - @Override public void onStart() { @@ -65,7 +47,7 @@ public void load() // TODO: Complexity is 21. Need to fix this. entryList.clear(); unknownCommands.clear(); - final CommandMap commandMap = getCommandMap(); + final CommandMap commandMap = Bukkit.getCommandMap(); @SuppressWarnings("unchecked") List blockedCommands = (List)ConfigEntry.BLOCKED_COMMANDS.getList(); diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java deleted file mode 100644 index d7cb4b945..000000000 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java +++ /dev/null @@ -1,100 +0,0 @@ -package me.totalfreedom.totalfreedommod.command; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import me.totalfreedom.totalfreedommod.FreedomService; -import me.totalfreedom.totalfreedommod.util.FLog; -import org.reflections.Reflections; - -public class CommandLoader extends FreedomService -{ - private final List commands; - - public CommandLoader() - { - commands = new ArrayList<>(); - } - - @Override - public void onStart() - { - } - - @Override - public void onStop() - { - } - - public void add(FreedomCommand command) - { - commands.add(command); - command.register(); - } - - public FreedomCommand getByName(String name) - { - for (FreedomCommand command : commands) - { - if (name.equals(command.getName())) - { - return command; - } - } - return null; - } - - public boolean isAlias(String alias) - { - for (FreedomCommand command : commands) - { - if (Arrays.asList(command.getAliases().split(",")).contains(alias)) - { - return true; - } - } - return false; - } - - public void loadCommands() - { - Reflections commandDir = new Reflections("me.totalfreedom.totalfreedommod.command"); - - Set> commandClasses = commandDir.getSubTypesOf(FreedomCommand.class); - - commandLoading: - for (Class commandClass : commandClasses) - { - try - { - if (commandClass.isAnnotationPresent(CommandDependencies.class)) - { - String[] dependencies = commandClass.getAnnotation(CommandDependencies.class).value(); - - for (String plugin : dependencies) - { - if (!server.getPluginManager().isPluginEnabled(plugin)) - { - FLog.warning("Not loading command due to missing dependency (" + plugin + "): /" + commandClass.getSimpleName().replace("Command_", "")); - continue commandLoading; - } - } - } - - add(commandClass.newInstance()); - } - catch (InstantiationException | IllegalAccessException | ExceptionInInitializerError ex) - { - FLog.warning("Failed to register command: /" + commandClass.getSimpleName().replace("Command_", "")); - } - } - - FLog.info("Loaded " + commands.size() + " commands"); - } - - public List getCommands() - { - return commands; - } -} \ No newline at end of file diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminchat.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminchat.java index cb7f9b31c..ef7e5d028 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminchat.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminchat.java @@ -1,5 +1,10 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.api.event.AdminChatEvent; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_admininfo.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_admininfo.java index 25821da4a..ef144dc99 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_admininfo.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_admininfo.java @@ -1,6 +1,11 @@ package me.totalfreedom.totalfreedommod.command; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminmode.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminmode.java index f1ac034ce..d3782200c 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminmode.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminmode.java @@ -3,6 +3,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminworld.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminworld.java index fe4c08bd5..de9fb9438 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminworld.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_adminworld.java @@ -4,6 +4,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.world.WorldTime; import me.totalfreedom.totalfreedommod.world.WorldWeather; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_announce.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_announce.java index 694c7e11d..d6e78ace2 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_announce.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_announce.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_autoclear.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_autoclear.java index 3723b2275..cb953023b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_autoclear.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_autoclear.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_autotp.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_autotp.java index 908330bae..293064a2a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_autotp.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_autotp.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java index 5042f1d9b..03782cc46 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ban.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.User; import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; @@ -18,6 +19,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("ban") @CommandPermissions(permission = "ban", source = SourceType.BOTH, blockHostConsole = true) @CommandParameters(description = "Bans the specified player.", usage = "/ [reason] [-nrb | -q]", aliases = "gtfo") public class Command_ban extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banip.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banip.java index c2e616358..240aea46d 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banip.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banip.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.ArrayUtils; @@ -9,6 +10,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("banip") @CommandPermissions(permission = "banip", source = SourceType.BOTH, blockHostConsole = true) @CommandParameters(description = "Bans the specified ip.", usage = "/ [reason] [-q]") public class Command_banip extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banlist.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banlist.java index 7645c03a4..6b674bcef 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banlist.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banlist.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; @@ -9,6 +10,7 @@ import java.util.Collections; import java.util.List; +@Intercept("banlist") @CommandPermissions(permission = "banlist", source = SourceType.BOTH) @CommandParameters(description = "Shows all banned player names. Admins may optionally use 'purge' to clear the list.", usage = "/ [purge]") public class Command_banlist extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banname.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banname.java index a37a1df86..1808a483d 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banname.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_banname.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.ArrayUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_bird.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_bird.java index 6f49efc6c..ecb5a4515 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_bird.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_bird.java @@ -3,6 +3,11 @@ import java.util.Arrays; import java.util.List; import java.util.SplittableRandom; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java index ddb4e3a55..b5dab640a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockcmd.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockedit.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockedit.java index 1023f7375..73d12d012 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockedit.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockedit.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockpvp.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockpvp.java index 16253f0b1..c1969f4c8 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockpvp.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockpvp.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockredstone.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockredstone.java index 9372eab88..51d336f4a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockredstone.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_blockredstone.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cage.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cage.java index 7e12b63c9..5d2360dd1 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cage.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cage.java @@ -4,6 +4,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cake.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cake.java index 0bd5e793e..64915aab2 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cake.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cake.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.Material; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cleanchat.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cleanchat.java index 1ff6f0bcb..565feaefd 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cleanchat.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cleanchat.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cleardiscordqueue.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cleardiscordqueue.java index bd08aece1..d3a2cfb9d 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cleardiscordqueue.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cleardiscordqueue.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_clownfish.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_clownfish.java index 2dcf3f20b..74f905b3e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_clownfish.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_clownfish.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.*; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cmdspy.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cmdspy.java index 12cf18d6f..4e311e211 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cmdspy.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cmdspy.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.admin.Admin; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java index c9abb49fe..453c4a039 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_coins.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.util.FUtil; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_consolesay.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_consolesay.java index 4ace67b30..347ebb80f 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_consolesay.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_consolesay.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cookie.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cookie.java index 97515431a..b771c15a5 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cookie.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_cookie.java @@ -3,6 +3,10 @@ import java.util.Collections; import java.util.Random; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.Material; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deafen.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deafen.java index 9f9736f27..6ee703a16 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deafen.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deafen.java @@ -1,6 +1,11 @@ package me.totalfreedom.totalfreedommod.command; import java.util.SplittableRandom; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_debugstick.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_debugstick.java index c5002aafc..8dcd59a2b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_debugstick.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_debugstick.java @@ -1,6 +1,11 @@ package me.totalfreedom.totalfreedommod.command; import java.util.Arrays; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_denick.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_denick.java index d6867b514..6a2dfbd5e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_denick.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_denick.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deop.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deop.java index 947aeb9b4..f86aab32f 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deop.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deop.java @@ -1,10 +1,10 @@ package me.totalfreedom.totalfreedommod.command; -import me.totalfreedom.totalfreedommod.rank.GroupProvider; -import me.totalfreedom.totalfreedommod.rank.HierarchyProvider; +import me.totalfreedom.totalfreedommod.command.handling.*; +import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; -import net.luckperms.api.model.user.User; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -12,6 +12,7 @@ import java.util.concurrent.atomic.AtomicBoolean; +@Intercept("deop") @CommandPermissions(permission = "deop", source = SourceType.BOTH) @CommandParameters(description = "Deop a player", usage = "/ ") public class Command_deop extends FreedomCommand @@ -39,17 +40,22 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } AtomicBoolean atomicBoolean = new AtomicBoolean(silent); - User user = GroupProvider.getUser(player); - HierarchyProvider.OP.getHierarchy().demoteUser(user).whenComplete((result, throwable) -> + Hierarchy.getHierarchy().demoteUser(Hierarchy.getHierarchy().op(), player).whenComplete((result, throwable) -> { if (throwable != null) { - FLog.severe("Error while demoting " + player.getName() + " to OP: " + throwable.getMessage()); + msgNew("Could not demote to non-OP. Check the logs for more details.", player(player)); + FLog.severe("Error while demoting " + player.getName() + " to non-OP:"); + FLog.severe(throwable); + return; + } + + if (result == null || !result.wasSuccessful()) { + msgNew(" is already non-op.", Placeholder.unparsed("player", player.getName())); return; } msg(player, YOU_ARE_NOT_OP); - plugin.rm.updateDisplay(player); if (!atomicBoolean.get()) { diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deopall.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deopall.java index b452b6ab9..b903520df 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deopall.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_deopall.java @@ -1,10 +1,13 @@ package me.totalfreedom.totalfreedommod.command; -import me.totalfreedom.totalfreedommod.rank.GroupProvider; -import me.totalfreedom.totalfreedommod.rank.HierarchyProvider; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; +import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; -import net.luckperms.api.model.user.User; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -20,17 +23,23 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin FUtil.adminAction(sender.getName(), "De-opping all players on the server", true); server.getOnlinePlayers().forEach(player -> - { - User user = GroupProvider.getUser(player); - HierarchyProvider.OP.getHierarchy().demoteUser(user).whenComplete((result, ex) -> { - if (ex != null) { - FLog.severe("Failed to demote " + player.getName() + " to default rank"); - } + Hierarchy.getHierarchy().demoteUser(Hierarchy.getHierarchy().op(), player).whenComplete((result, ex) -> + { + if (ex != null) + { + msgNew("Could not demote to non-OP. Check the logs for more details.", player(player)); + FLog.severe("Failed to demote " + player.getName() + " to non-OP:"); + FLog.severe(ex); + return; + } - msg(player, YOU_ARE_NOT_OP); - plugin.rm.updateDisplay(player); - }); - }); + if (result == null || !result.wasSuccessful()) { + msgNew(" is already non-OP.", Placeholder.unparsed("player", player.getName())); + return; + } + + msg(player, YOU_ARE_NOT_OP); + })); return true; } diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_dispfill.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_dispfill.java index 51d247474..07d7350fa 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_dispfill.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_dispfill.java @@ -2,6 +2,11 @@ import java.util.ArrayList; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java index c6f711467..f72edc272 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_doom.java @@ -2,6 +2,10 @@ import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_eject.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_eject.java index 833dd10ce..bd8a6fb9b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_eject.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_eject.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_enchant.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_enchant.java index 9661d8d71..9952356da 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_enchant.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_enchant.java @@ -7,6 +7,10 @@ import java.util.Objects; import java.util.stream.IntStream; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_end.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_end.java index 435648b94..596346bb7 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_end.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_end.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_entitywipe.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_entitywipe.java index ab33c8480..28c07fbd6 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_entitywipe.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_entitywipe.java @@ -3,6 +3,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.Groups; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_expel.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_expel.java index aaeb84bd4..7ef8dae45 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_expel.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_expel.java @@ -2,6 +2,11 @@ import java.util.ArrayList; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_explode.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_explode.java index 53dedc526..ffbbed9f3 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_explode.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_explode.java @@ -2,6 +2,11 @@ import java.util.Collections; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_explosivearrows.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_explosivearrows.java index 70af7344c..06b507777 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_explosivearrows.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_explosivearrows.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.tag.Tag; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_findip.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_findip.java index b553ac1c0..27fe1b54e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_findip.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_findip.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fireball.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fireball.java index bca7675bc..036493001 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fireball.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fireball.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.*; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_flatlands.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_flatlands.java index 01eb27c7b..7e0c08ede 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_flatlands.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_flatlands.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_forcekill.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_forcekill.java index c8fafc38f..9e6f158f7 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_forcekill.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_forcekill.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_freeze.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_freeze.java index 79480e0e8..67dc6b6eb 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_freeze.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_freeze.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.freeze.FreezeData; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fuckoff.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fuckoff.java index ebed8bfff..75432fe34 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fuckoff.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_fuckoff.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import net.kyori.adventure.text.Component; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gcmd.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gcmd.java index 0a1997be4..b256f79b2 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gcmd.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gcmd.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.apache.commons.lang3.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glow.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glow.java index ed8d582d4..1f23ea1af 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glow.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_glow.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_grapplinghook.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_grapplinghook.java index bd3b0ea55..5051451de 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_grapplinghook.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_grapplinghook.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.*; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gravity.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gravity.java index 8d380980b..082ce65b4 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gravity.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_gravity.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_health.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_health.java index d5009c285..69cbee39e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_health.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_health.java @@ -3,6 +3,10 @@ import java.text.DecimalFormat; import java.util.concurrent.atomic.AtomicInteger; import me.totalfreedom.totalfreedommod.TotalFreedomMod; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FLog; import org.apache.commons.lang.math.DoubleRange; import org.bukkit.ChatColor; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_indefban.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_indefban.java index 02d92bdef..9385d8b86 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_indefban.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_indefban.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_inspect.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_inspect.java index 01cede9b8..3240b0d16 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_inspect.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_inspect.java @@ -5,9 +5,12 @@ import java.util.Optional; import java.util.stream.IntStream; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.PlayerData; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invis.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invis.java index d8e7cb487..a4eaa3d79 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invis.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invis.java @@ -3,6 +3,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invsee.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invsee.java index 0762a62a5..c7cd3dcaf 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invsee.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_invsee.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import org.bukkit.ChatColor; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_jumppads.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_jumppads.java index fdb3e1727..2caf8c46b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_jumppads.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_jumppads.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.fun.Jumppads; import org.bukkit.ChatColor; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java index 38dc826c3..c818dd46e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kick.java @@ -1,8 +1,8 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; -import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.ArrayUtils; @@ -12,6 +12,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("kick") @CommandPermissions(permission = "kick", source = SourceType.BOTH) @CommandParameters(description = "Kick the specified player.", usage = "/ [reason] [-q]") public class Command_kick extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kicknoob.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kicknoob.java index 05db1b2af..c414cdf0d 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kicknoob.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_kicknoob.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_landmine.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_landmine.java index dadc9f2e8..776661f9f 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_landmine.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_landmine.java @@ -1,6 +1,11 @@ package me.totalfreedom.totalfreedommod.command; import java.util.Iterator; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.fun.Landminer.Landmine; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_lightningrod.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_lightningrod.java index 65d3f686a..f0e0960a8 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_lightningrod.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_lightningrod.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.*; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_linkdiscord.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_linkdiscord.java index 7c37f8d82..bafdbd546 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_linkdiscord.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_linkdiscord.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.PlayerData; import org.bukkit.ChatColor; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_links.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_links.java index 54bbf74ab..aff8f87eb 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_links.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_links.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java index 254bbbc39..1ad278373 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_list.java @@ -1,19 +1,18 @@ package me.totalfreedom.totalfreedommod.command; -import me.totalfreedom.totalfreedommod.admin.Admin; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.JoinConfiguration; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import net.md_5.bungee.api.ChatColor; -import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.List; +@Intercept("list") @CommandPermissions(permission = "list", source = SourceType.BOTH) @CommandParameters(description = "Lists the real names of all online players.", usage = "/ [-a | -v]", aliases = "who,lsit") public class Command_list extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_localspawn.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_localspawn.java index 3bfae9c99..458b5d0ed 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_localspawn.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_localspawn.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import io.papermc.lib.PaperLib; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_lockup.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_lockup.java index 266a6dea2..5ab1ba64a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_lockup.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_lockup.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_loginmessage.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_loginmessage.java index 3f35590e9..123845f55 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_loginmessage.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_loginmessage.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_manageshop.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_manageshop.java index 5e5e4ef8a..c2a5f16b3 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_manageshop.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_manageshop.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderinfo.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderinfo.java index 23cb2bf8d..7858b3e69 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderinfo.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderinfo.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderworld.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderworld.java index c54972bb3..d6d8e65a8 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderworld.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_masterbuilderworld.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import io.papermc.lib.PaperLib; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.world.WorldTime; import me.totalfreedom.totalfreedommod.world.WorldWeather; import org.bukkit.World; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mbconfig.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mbconfig.java index 455c339fb..3c5071208 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mbconfig.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mbconfig.java @@ -1,6 +1,13 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.PlayerData; +import me.totalfreedom.totalfreedommod.util.FLog; +import me.totalfreedom.totalfreedommod.rank.GroupProvider; +import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; @@ -26,13 +33,12 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin switch (args[0]) { - case "list": + case "list" -> { msg("Master Builders: " + StringUtils.join(plugin.pl.getMasterBuilderNames(), ", "), ChatColor.GOLD); return true; } - - case "clearips": + case "clearips" -> { if (args.length > 1) { @@ -55,13 +61,23 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin int counter = data.getIps().size() - 1; data.clearIps(); data.addIp(FUtil.getIp(playerSender)); - plugin.sql.addPlayer(data); - msg(counter + " IPs removed."); - msg(data.getIps().get(0) + " is now your only IP address"); - FUtil.adminAction(sender.getName(), "Clearing my IPs", true); + plugin.sql.addPlayer(data).whenComplete((result, ex) -> + { + if (ex != null) + { + FLog.severe(ex.getMessage()); + msgNew("Failed to clear IPs!"); + return; + } + + msg(counter + " IPs removed."); + msg(data.getIps().get(0) + " is now your only IP address"); + FUtil.adminAction(sender.getName(), "Clearing my IPs", true); + }); + return true; } - case "clearip": + case "clearip" -> { if (args.length < 2) { @@ -89,12 +105,21 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return true; } data.removeIp(args[1]); - plugin.sql.addPlayer(data); - msg("Removed IP " + args[1]); - msg("Current IPs: " + StringUtils.join(data.getIps(), ", ")); + plugin.sql.addPlayer(data).whenComplete((result, ex) -> + { + if (ex != null) + { + FLog.severe(ex.getMessage()); + msgNew("Failed to remove IP!"); + return; + } + + msg("Removed IP " + args[1]); + msg("Current IPs: " + StringUtils.join(data.getIps(), ", ")); + }); return true; } - case "add": + case "add" -> { if (args.length < 2) { @@ -120,18 +145,16 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin { FUtil.adminAction(sender.getName(), "Adding " + data.getName() + " to the Master Builder list", true); data.setMasterBuilder(true); + Hierarchy.getHierarchy() + .addUserToGroup(GroupProvider.MASTER_BUILDER.getGroup(), player); plugin.pl.save(data); - if (player != null) - { - plugin.rm.updateDisplay(player); - } } else { msg("That player is already on the Master Builder list."); } return true; } - case "remove": + case "remove" -> { if (args.length < 2) { @@ -144,24 +167,23 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } Player player = getPlayer(args[1]); - PlayerData data = player != null ? plugin.pl.getData(player) : plugin.pl.getData(args[1]); + PlayerData data = plugin.pl.getData(args[1]); - if (data == null || !data.isMasterBuilder()) + if (player == null || data == null || !data.isMasterBuilder()) { - msg("Master Builder not found: " + args[1]); + msgNew("Master Builder not found: ", arg(args[1])); return true; } FUtil.adminAction(sender.getName(), "Removing " + data.getName() + " from the Master Builder list", true); + Hierarchy.getHierarchy() + .dropUserFromAll(Hierarchy.getHierarchy().builder(), player); data.setMasterBuilder(false); plugin.pl.save(data); - if (player != null) - { - plugin.rm.updateDisplay(player); - } + return true; } - default: + default -> { return false; } diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_moblimiter.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_moblimiter.java index 980d0e31a..e9b669634 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_moblimiter.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_moblimiter.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.GameRuleHandler; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import org.bukkit.ChatColor; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mobpurge.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mobpurge.java index 0f64ecc24..eb2b4ee0b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mobpurge.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mobpurge.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.Groups; import org.bukkit.ChatColor; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mp44.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mp44.java index 42510b377..44221e992 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mp44.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mp44.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import org.bukkit.ChatColor; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java index 0bbffaae8..54492a5ae 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_mute.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.util.FUtil; @@ -12,6 +13,7 @@ import java.util.*; +@Intercept("mute") @CommandPermissions(permission = "mute", source = SourceType.BOTH) @CommandParameters(description = "Mutes a player with brute force.", usage = "/ <[-q] [reason] | list | purge | all>", aliases = "stfu") public class Command_mute extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java index 449af1a1f..23416f6b1 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myadmin.java @@ -1,12 +1,15 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.admin.Admin; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.rank.GroupProvider; import me.totalfreedom.totalfreedommod.util.FConverter; import me.totalfreedom.totalfreedommod.util.FUtil; -import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myinfo.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myinfo.java index b40f4d1a1..ecd3546d2 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myinfo.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_myinfo.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nether.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nether.java index 0fc4ff130..c072a9a9e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nether.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nether.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java index 1b06d97a8..de30205ab 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickclean.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickmm.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickmm.java index 6d3576918..044f6336a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickmm.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_nickmm.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_notes.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_notes.java index ed0431c5d..17e67bb0a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_notes.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_notes.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_op.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_op.java index 46737cf30..443792cc7 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_op.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_op.java @@ -1,10 +1,9 @@ package me.totalfreedom.totalfreedommod.command; -import me.totalfreedom.totalfreedommod.rank.GroupProvider; -import me.totalfreedom.totalfreedommod.rank.HierarchyProvider; +import me.totalfreedom.totalfreedommod.command.handling.*; +import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; -import net.luckperms.api.model.user.User; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -12,6 +11,7 @@ import java.util.concurrent.atomic.AtomicBoolean; +@Intercept("op") @CommandPermissions(permission = "op", source = SourceType.BOTH, cooldown = 5) @CommandParameters(description = "OP a player", usage = "/ ") public class Command_op extends FreedomCommand @@ -40,17 +40,27 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } AtomicBoolean atomicBoolean = new AtomicBoolean(silent); - User user = GroupProvider.getUser(player); - HierarchyProvider.OP.getHierarchy().promoteUser(user).whenComplete((ignored, throwable) -> + Hierarchy.getHierarchy().promoteUser(Hierarchy.getHierarchy().op(), player).whenComplete((result, throwable) -> { if (throwable != null) { - FLog.severe("Failed to promote user " + player.getName()); + msgNew("Failed to promote to OP. Check logs for more details.", player(player)); + FLog.severe("Failed to promote " + player.getName() + " to OP:"); + FLog.severe(throwable); + return; + } + + if (result == null) { + msgNew(" was not on the track! Added.", player(player)); + } + else if (!result.wasSuccessful()) + { + msgNew(" is already OP!", player(player)); return; } msg(player, YOU_ARE_OP); - plugin.rm.updateDisplay(player); + if (!atomicBoolean.get()) { FUtil.adminAction(sender.getName(), "Opping " + player.getName(), false); diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java index 1b1e8744a..cee23de67 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opall.java @@ -1,10 +1,12 @@ package me.totalfreedom.totalfreedommod.command; -import me.totalfreedom.totalfreedommod.rank.GroupProvider; -import me.totalfreedom.totalfreedommod.rank.HierarchyProvider; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; +import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; -import net.luckperms.api.model.user.User; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -19,20 +21,25 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin FUtil.adminAction(sender.getName(), "Opping all players on the server", true); server.getOnlinePlayers().forEach(player -> - { - User user = GroupProvider.getUser(player); - HierarchyProvider.OP.getHierarchy().promoteUser(user).whenComplete((ignored, throwable) -> - { - if (throwable != null) + Hierarchy.getHierarchy().promoteUser(Hierarchy.getHierarchy().op(), player).whenComplete((result, throwable) -> { - FLog.severe("Failed to promote " + player.getName()); - return; - } + if (throwable != null) + { + msgNew("Failed to promote to OP. Check the logs for more details.", player(player)); + FLog.severe("Failed to promote " + player.getName()); + FLog.severe(throwable); + return; + } - msg(player, YOU_ARE_OP); - plugin.rm.updateDisplay(player); - }); - }); + if (result == null) { + msgNew(" was not present on the track! Added.", player(player)); + } else if (!result.wasSuccessful()) { + msgNew("Player is already OP!", player(player)); + return; + } + + msg(player, YOU_ARE_OP); + })); return true; } diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opme.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opme.java index b56f324e8..a9c1c660b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opme.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_opme.java @@ -1,10 +1,12 @@ package me.totalfreedom.totalfreedommod.command; -import me.totalfreedom.totalfreedommod.rank.GroupProvider; -import me.totalfreedom.totalfreedommod.rank.HierarchyProvider; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; +import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; -import net.luckperms.api.model.user.User; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -18,15 +20,21 @@ public class Command_opme extends FreedomCommand public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { FUtil.adminAction(sender.getName(), "Opping " + sender.getName(), false); - User user = GroupProvider.getUser(playerSender); - HierarchyProvider.OP.getHierarchy().promoteUser(user).whenComplete((result, error) -> { - if (error != null) { + Hierarchy.getHierarchy().promoteUser(Hierarchy.getHierarchy().op(), playerSender) + .whenComplete((result, error) -> + { + if (error != null) + { FLog.severe("Error while promoting " + playerSender.getName() + " to OP: " + error.getMessage()); return; } + if (result != null && !result.wasSuccessful()) { + msgNew("You are already op!"); + return; + } + msg(YOU_ARE_OP); - plugin.rm.updateDisplay(playerSender); }); return true; } diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_orbit.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_orbit.java index cd63bfe11..224a9cee0 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_orbit.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_orbit.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_plotworld.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_plotworld.java index 2bfe28f33..4d768730e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_plotworld.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_plotworld.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import io.papermc.lib.PaperLib; +import me.totalfreedom.totalfreedommod.command.handling.*; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_plugincontrol.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_plugincontrol.java index 43d685fbf..a2cd7ee86 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_plugincontrol.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_plugincontrol.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potion.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potion.java index ad9adaf5d..d48acd080 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potion.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potion.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.ChatColor; import org.bukkit.command.Command; @@ -13,6 +14,7 @@ import java.util.Collections; import java.util.List; +@Intercept("potion") @CommandPermissions(permission = "potion", source = SourceType.BOTH) @CommandParameters( description = "Manipulate your potion effects. Duration is measured in server ticks (~20 ticks per second).", diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potionspy.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potionspy.java index f6f5d759d..636538a3f 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potionspy.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_potionspy.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.admin.Admin; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.Bukkit; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_purgeall.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_purgeall.java index f73fe9fb0..6402dfeda 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_purgeall.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_purgeall.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.Bukkit; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java index b5fc7b4a3..5f13fd909 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rank.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.rank.Displayable; import me.totalfreedom.totalfreedommod.rank.DisplayableGroup; import org.bukkit.ChatColor; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rawsay.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rawsay.java index 48867633d..b6256a80a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rawsay.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rawsay.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_report.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_report.java index 6eff57d28..311a984f8 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_report.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_report.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; @@ -8,6 +9,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("report") @CommandPermissions(permission = "report", source = SourceType.ONLY_IN_GAME, blockHostConsole = true) @CommandParameters(description = "Report a player for all admins to see.", usage = "/ ") public class Command_report extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ride.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ride.java index 46f55f633..d9f1ead83 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ride.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ride.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import io.papermc.lib.PaperLib; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.util.FUtil; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rideablepearl.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rideablepearl.java index 6d82e39e0..c602e8da9 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rideablepearl.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rideablepearl.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.*; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java index 2be0fef54..16a81931b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_ro.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.Groups; import net.coreprotect.CoreProtectAPI; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rock.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rock.java index 6d78624c6..f307c9f24 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rock.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_rock.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.ChatColor; import org.bukkit.Material; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java index 23b630b9a..bead9b558 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_saconfig.java @@ -1,18 +1,21 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.admin.Admin; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; 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.rank.Hierarchy; 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 net.luckperms.api.model.group.Group; 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; @@ -73,72 +76,79 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin 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) + if (player == null) { - msgNew("Unknown admin: ", Placeholder.unparsed("player", args[1])); + msgNew("Player not found."); 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()); - } + Hierarchy.getHierarchy() + .promoteUser(Hierarchy.getHierarchy().admin(), player) + .whenComplete((result, ex) -> + { + if (ex != null) + { + FLog.severe("Failed to promote " + + player.getName() + + " to the next rank"); + return; + } + + if (result == null) { + msgNew("Added to the ADMIN group.", player(player)); + } + else if (!result.wasSuccessful() || result.getGroupTo().isEmpty()) + { + msgNew("Failed to promote to the next rank.", player(player)); + return; + } else { + result.getGroupTo().ifPresentOrElse(group -> + { + Admin admin = plugin.al.getAdmin(player); + + if (admin == null) + { + admin = new Admin(player); + plugin.al.addAdmin(admin); + } + + Group actual = Hierarchy.getHierarchy().getGroup(group); + DisplayableGroup rank = GroupProvider.fromLuckPermsGroup(actual).getGroup(); + + if (rank == null) + { + msgNew("Unknown rank: ", Placeholder.unparsed("rank", args[2])); + return; + } + + admin.setRank(rank); + admin.addIp(FUtil.getIp(player)); + admin.setActive(true); + admin.setLastLogin(new Date()); + + plugin.al.save(admin); + plugin.al.updateTables(); + + if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) + { + plugin.dc.syncRoles(admin, plugin.pl.getData(player).getDiscordID()); + } + + msgNew("Set 's rank to .", Placeholder.unparsed("admin", admin.getName()), Placeholder.component("rank", rank.getName())); + + final FPlayer fPlayer = plugin.pl.getPlayer(player); + if (fPlayer.getFreezeData().isFrozen()) + { + fPlayer.getFreezeData().setFrozen(false); + msgNew(player, "You have been unfrozen."); + } - msgNew("Set 's rank to .", Placeholder.unparsed("admin", admin.getName()), Placeholder.component("rank", rank.getName())); + msgNew("Admin has been promoted to ", + player(player), + Placeholder.unparsed("rank", group)); + }, () -> msgNew("Failed to promote to the next rank.", player(player))); + } + }); return true; } @@ -164,7 +174,7 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin if (admin == null) { - msgNew("Unknown admin: ", Placeholder.unparsed("player", args[1])); + msgNew("Unknown admin: ", arg(args[1])); return true; } else { @@ -173,78 +183,86 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return true; } - case "add" -> + case "demote" -> { + checkConsole(); + checkPermission("tfm.saconfig.demote"); + if (args.length < 2) { return false; } - checkConsole(); - checkPermission("tfm.saconfig.add"); - - // Player already admin? - final Player player = getPlayer(args[1]); + Player player = getPlayer(args[1]); if (player == null) { - msg(PLAYER_NOT_FOUND); + msgNew("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; + Hierarchy.getHierarchy() + .demoteUser(Hierarchy.getHierarchy().admin(), player) + .whenComplete((result, ex) -> + { + if (ex != null) + { + FLog.severe("Failed to demote " + + player.getName() + + " to the next rank"); + return; + } + + if (result == null || !result.wasSuccessful() || result.getGroupTo().isEmpty()) + { + msgNew("Failed to demote to the next rank.", player(player)); + return; + } + + result.getGroupTo().ifPresentOrElse(group -> + { + Admin admin = plugin.al.getAdmin(player); + + if (admin == null) + { + admin = new Admin(player); + plugin.al.addAdmin(admin); + } + + Group actual = Hierarchy.getHierarchy().getGroup(group); + DisplayableGroup rank = GroupProvider.fromLuckPermsGroup(actual).getGroup(); + + if (rank == null) + { + msgNew("Unknown rank: ", Placeholder.unparsed("rank", args[2])); + return; + } + + admin.setRank(rank); + admin.setLastLogin(new Date()); + + plugin.al.save(admin); + plugin.al.updateTables(); + + if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) + { + plugin.dc.syncRoles(admin, plugin.pl.getData(player).getDiscordID()); + } + + msgNew("Set 's rank to .", Placeholder.unparsed("admin", admin.getName()), Placeholder.component("rank", rank.getName())); + + final FPlayer fPlayer = plugin.pl.getPlayer(player); + if (fPlayer.getFreezeData().isFrozen()) + { + fPlayer.getFreezeData().setFrozen(false); + msgNew(player, "You have been unfrozen."); + } + + msgNew("Admin has been demoted to ", + Placeholder.unparsed("player", player.getName()), + Placeholder.unparsed("rank", group)); + }, () -> msgNew("Failed to demote to the next rank.", Placeholder.unparsed("player", player.getName()))); + }); } case "remove" -> { @@ -260,8 +278,7 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin Admin admin = plugin.al.getAdmin(player); plugin.al.removeAdmin(admin); - User user = GroupProvider.getUser(player); - HierarchyProvider.ADMIN.getHierarchy().dropUserFromAll(user); + Hierarchy.getHierarchy().dropUserFromAll(Hierarchy.getHierarchy().admin(), player); FUtil.adminAction(sender.getName(), "Removing " + admin.getName() + " from the admin list", true); admin.setActive(false); @@ -269,11 +286,6 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin 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()) @@ -297,11 +309,11 @@ public List getTabCompleteOptions(CommandSender sender, Command command, { return argumentCompletions(args[0], PermissibleCompletion.of("tfm.saconfig.info", "info"), - PermissibleCompletion.of("tfm.saconfig.add", "add"), + PermissibleCompletion.of("tfm.saconfig.demote", "demote"), PermissibleCompletion.of("tfm.saconfig.remove", "remove"), PermissibleCompletion.of("tfm.saconfig.reload", "reload"), PermissibleCompletion.of("tfm.saconfig.clean", "clean"), - PermissibleCompletion.of("tfm.saconfig.setrank", "setrank")); + PermissibleCompletion.of("tfm.saconfig.promote", "promote")); } if (args.length == 2 && (args[0].equals("add") || args[0].equals("remove") || args[0].equals("setrank") || args[0].equals("info"))) { diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_say.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_say.java index c11db5487..3d1285e48 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_say.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_say.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; @@ -7,6 +8,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("say") @CommandPermissions(permission = "say", source = SourceType.BOTH) @CommandParameters(description = "Broadcasts the given message as the server, includes sender name.", usage = "/ ") public class Command_say extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_scare.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_scare.java index fe31b0ad7..402333f73 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_scare.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_scare.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Particle; import org.bukkit.Sound; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_seed.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_seed.java index 83f52f156..03951ac3b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_seed.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_seed.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; @@ -13,6 +14,7 @@ import java.util.List; +@Intercept("seed") @CommandPermissions(permission = "seed", source = SourceType.BOTH) @CommandParameters(description = "Get the seed of the world you are currently in.", usage = "/seed [world]") public class Command_seed extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_serverstats.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_serverstats.java index a7c0172e2..50c0adb52 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_serverstats.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_serverstats.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import org.bukkit.ChatColor; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setcompass.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setcompass.java index 9e092c3dd..eb91b6467 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setcompass.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setcompass.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlimit.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlimit.java index 39f3bb416..08c51d99f 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlimit.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setlimit.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setplayerlimit.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setplayerlimit.java index 49e74903b..f8c843386 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setplayerlimit.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setplayerlimit.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Bukkit; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setspawnworld.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setspawnworld.java index 9921cc62c..2e84aed46 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setspawnworld.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_setspawnworld.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Location; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_shop.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_shop.java index 93621dc56..8b5c389a5 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_shop.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_shop.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java index 7aed7271c..5c25bb44c 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_smite.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.util.FUtil; @@ -13,6 +14,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("smite") @CommandPermissions(permission = "smite", source = SourceType.BOTH) @CommandParameters(description = "Someone being a little bitch? Smite them down...", usage = "/ [reason] [-ci | -q]") public class Command_smite extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java index 46bad22f8..87d84be4b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spawnmob.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; @@ -13,6 +14,7 @@ import java.util.Arrays; import java.util.List; +@Intercept("spawnmob") @CommandPermissions(permission = "spawnmob", source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "Spawns the specified entity.", usage = "/ [amount]", aliases = "spawnentity") public class Command_spawnmob extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectate.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectate.java index fccea416f..725e57608 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectate.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_spectate.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import io.papermc.lib.PaperLib; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.GameMode; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stackingpotato.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stackingpotato.java index 9e539afe1..4c0f171fa 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stackingpotato.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stackingpotato.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.*; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stop.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stop.java index 1be166560..de1966cb4 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stop.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stop.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +@Intercept("stop") @CommandPermissions(permission = "stop", source = SourceType.BOTH) @CommandParameters(description = "Kicks everyone and stops the server.", usage = "/ [reason]") public class Command_stop extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stopsound.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stopsound.java index 85df5c7b4..8799c2737 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stopsound.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_stopsound.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.Sound; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tag.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tag.java index 4b4956368..a5100f55a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tag.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tag.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.PlayerData; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java index aac022a02..b877395ab 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tempban.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.User; import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; @@ -19,6 +20,7 @@ import java.util.Date; import java.util.Objects; +@Intercept("tempban") @CommandPermissions(permission = "tempban", source = SourceType.BOTH) @CommandParameters(description = "Temporarily ban someone.", usage = "/ [-q] [duration] [reason]", aliases = "tban,noob") public class Command_tempban extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java index 02767f3a5..a176ba368 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggle.java @@ -2,6 +2,10 @@ import me.totalfreedom.totalfreedommod.GameRuleHandler; import me.totalfreedom.totalfreedommod.LoginProcess; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggleclownfish.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggleclownfish.java index bd3387e67..496e7e357 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggleclownfish.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_toggleclownfish.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.FPlayer; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglediscord.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglediscord.java index b07452cd3..17ddf4f43 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglediscord.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglediscord.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.PlayerData; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglepickup.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglepickup.java index e4d760f61..a641e929b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglepickup.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_togglepickup.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tossmob.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tossmob.java index 3e9abd582..38e139fd7 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tossmob.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tossmob.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FUtil; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_totalfreedommod.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_totalfreedommod.java index c15cba5d4..af9f23878 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_totalfreedommod.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_totalfreedommod.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.TotalFreedomMod; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FLog; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tprandom.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tprandom.java index 34b41a482..6153c7a96 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tprandom.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_tprandom.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import io.papermc.lib.PaperLib; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.Location; @@ -8,6 +9,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("tprandom") @CommandPermissions(permission = "tprandom", source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "Go to a random location in the current world you are in", usage = "/", aliases = "tpr,rtp") public class Command_tprandom extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java index 41ab266f7..456be2863 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_trail.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.api.ShopItem; +import me.totalfreedom.totalfreedommod.command.handling.*; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java index 62c523a4c..d2f4cccf0 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unban.java @@ -1,6 +1,7 @@ package me.totalfreedom.totalfreedommod.command; import com.earth2me.essentials.User; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; @@ -8,6 +9,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("unban") @CommandPermissions(permission = "unban", source = SourceType.BOTH) @CommandParameters(description = "Unbans the specified player.", usage = "/ [-r]") public class Command_unban extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanip.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanip.java index 16dc3bef6..6dd7d7786 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanip.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanip.java @@ -1,13 +1,14 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -// TODO: Merge with /unban. +@Intercept("unbanip") @CommandPermissions(permission = "unbanip", source = SourceType.BOTH) @CommandParameters(description = "Unbans the specified IP.", usage = "/ [-q]") public class Command_unbanip extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanname.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanname.java index 1f52f295f..bc167eb9d 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanname.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unbanname.java @@ -1,6 +1,10 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.banning.Ban; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unblockcmd.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unblockcmd.java index ddda05778..3ad355a5b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unblockcmd.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unblockcmd.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_uncage.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_uncage.java index a22e039c2..2a8c7ea54 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_uncage.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_uncage.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_undisguiseall.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_undisguiseall.java index 87739ee37..80cd86af3 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_undisguiseall.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_undisguiseall.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unlinkdiscord.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unlinkdiscord.java index 4549f6146..4fbab36a3 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unlinkdiscord.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unlinkdiscord.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.PlayerData; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unmute.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unmute.java index 5773c1679..886f8248e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unmute.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_unmute.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; @@ -8,6 +9,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("unmute") @CommandPermissions(permission = "unmute", source = SourceType.BOTH) @CommandParameters(description = "Unmutes a player", usage = "/ [-q] ") public class Command_unmute extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vanish.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vanish.java index 742f42461..9b46f157e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vanish.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vanish.java @@ -1,9 +1,9 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.admin.AdminList; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.rank.Displayable; -import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; @@ -13,6 +13,7 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; +@Intercept("vanish") @CommandPermissions(permission = "vanish", source = SourceType.ONLY_IN_GAME) @CommandParameters(description = "Vanish/unvanish yourself.", usage = "/ [-s[ilent]]", aliases = "v") public class Command_vanish extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vote.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vote.java index a317ab414..1c5d6b0dd 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vote.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_vote.java @@ -1,6 +1,11 @@ package me.totalfreedom.totalfreedommod.command; import java.util.List; + +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_warn.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_warn.java index 6b82e64d4..8563f1aea 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_warn.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_warn.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.PunishmentType; import me.totalfreedom.totalfreedommod.util.FUtil; @@ -10,6 +11,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +@Intercept("warn") @CommandPermissions(permission = "warn", source = SourceType.BOTH) @CommandParameters(description = "Warns the specified player.", usage = "/ [-q] ") public class Command_warn extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whitelist.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whitelist.java index d09de5ef1..34905341b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whitelist.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whitelist.java @@ -1,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.bukkit.OfflinePlayer; @@ -9,6 +10,7 @@ import java.util.*; +@Intercept("whitelist") @CommandPermissions(permission = "whitelist", source = SourceType.BOTH) @CommandParameters(description = "Manage the whitelist.", usage = "/ | remove | addall | purge>") public class Command_whitelist extends FreedomCommand diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whohas.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whohas.java index 5587af147..999223f28 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whohas.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_whohas.java @@ -1,5 +1,9 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; import org.bukkit.Material; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_wildcard.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_wildcard.java index 829ecdf67..f3f4f10a1 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_wildcard.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/Command_wildcard.java @@ -4,6 +4,10 @@ import java.util.Arrays; import java.util.List; +import me.totalfreedom.totalfreedommod.command.handling.CommandParameters; +import me.totalfreedom.totalfreedommod.command.handling.CommandPermissions; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.SourceType; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandDependencies.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandDependencies.java similarity index 76% rename from commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandDependencies.java rename to commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandDependencies.java index 349759e60..508d2f57f 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandDependencies.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandDependencies.java @@ -1,4 +1,4 @@ -package me.totalfreedom.totalfreedommod.command; +package me.totalfreedom.totalfreedommod.command.handling; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandFailException.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandFailException.java similarity index 78% rename from commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandFailException.java rename to commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandFailException.java index 9792fd484..673f15427 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandFailException.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandFailException.java @@ -1,4 +1,4 @@ -package me.totalfreedom.totalfreedommod.command; +package me.totalfreedom.totalfreedommod.command.handling; public class CommandFailException extends RuntimeException { diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandLoader.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandLoader.java new file mode 100644 index 000000000..4979cfd67 --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandLoader.java @@ -0,0 +1,145 @@ +package me.totalfreedom.totalfreedommod.command.handling; + +import me.totalfreedom.totalfreedommod.FreedomService; +import me.totalfreedom.totalfreedommod.util.FLog; +import org.bukkit.Bukkit; +import org.reflections.Reflections; + +import java.util.*; +import java.util.concurrent.CompletableFuture; + +public class CommandLoader extends FreedomService +{ + private final List commands; + + public CommandLoader() + { + commands = new ArrayList<>(); + } + + @Override + public void onStart() + { + } + + @Override + public void onStop() + { + } + + public void add(FreedomCommand command) + { + commands.add(command); + command.register(); + } + + public FreedomCommand getByName(String name) + { + for (FreedomCommand command : commands) + { + if (name.equals(command.getName())) + { + return command; + } + } + return null; + } + + public boolean isAlias(String alias) + { + for (FreedomCommand command : commands) + { + if (Arrays.asList(command.getAliases().split(",")).contains(alias)) + { + return true; + } + } + return false; + } + + public void loadCommands() + { + Reflections commandDir = new Reflections("me.totalfreedom.totalfreedommod.command"); + + Interceptor interceptor = new Interceptor(plugin); + + Set> commandClasses = commandDir.getSubTypesOf(FreedomCommand.class); + + Set> postLoadCommands = new HashSet<>(); + + for (Class commandClass : commandClasses) + { + if (commandClass.isAnnotationPresent(CommandDependencies.class)) + { + postLoadCommands.add(commandClass); + } + + if (commandClass.isAnnotationPresent(Intercept.class)) + { + Intercept intercept = commandClass.getAnnotation(Intercept.class); + interceptor.intercept(intercept.value()); + postLoadCommands.add(commandClass); + } + + addClass(commandClass); + } + + doPostLoading(interceptor, postLoadCommands); + + FLog.info("Loaded " + commands.size() + " commands"); + } + + private void doPostLoading(Interceptor interceptor, Set> postLoadCommands) + { + Bukkit.getScheduler().runTaskLater(plugin, () -> + CompletableFuture.runAsync(interceptor::setOverrides) + .whenComplete((v, th) -> + { + if (th != null) + { + FLog.severe("Failed to set command overrides"); + th.printStackTrace(); + return; + } + + for (Class commandClass : postLoadCommands) + { + if (checkDependencies(commandClass)) return; + + addClass(commandClass); + } + }), 1); + } + + private boolean checkDependencies(Class commandClass) + { + if (commandClass.isAnnotationPresent(CommandDependencies.class)) + { + for (String dependency : commandClass.getAnnotation(CommandDependencies.class).value()) + { + if (Bukkit.getPluginManager().getPlugin(dependency) == null) + { + FLog.warning("Failed to register command: /" + commandClass.getSimpleName().replace("Command_", "") + " (Missing dependency: " + dependency + ")"); + return true; + } + } + } + return false; + } + + private void addClass(Class commandClass) + { + try + { + add(commandClass.newInstance()); + } catch (InstantiationException | IllegalAccessException ex) + { + FLog.warning("Failed to register command: /" + commandClass.getSimpleName().replace("Command_", "")); + } + } + + public List getCommands() + { + return commands; + } +} \ No newline at end of file diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandParameters.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandParameters.java similarity index 82% rename from commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandParameters.java rename to commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandParameters.java index bae0e1887..8131df185 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandParameters.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandParameters.java @@ -1,4 +1,4 @@ -package me.totalfreedom.totalfreedommod.command; +package me.totalfreedom.totalfreedommod.command.handling; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandPermissions.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandPermissions.java similarity index 85% rename from commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandPermissions.java rename to commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandPermissions.java index e4a17030c..0fac3c9b9 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandPermissions.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandPermissions.java @@ -1,4 +1,4 @@ -package me.totalfreedom.totalfreedommod.command; +package me.totalfreedom.totalfreedommod.command.handling; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/FreedomCommand.java similarity index 89% rename from commons/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java rename to commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/FreedomCommand.java index ba21ec2e7..c34f87144 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/FreedomCommand.java @@ -1,4 +1,4 @@ -package me.totalfreedom.totalfreedommod.command; +package me.totalfreedom.totalfreedommod.command.handling; import com.earth2me.essentials.commands.PlayerNotFoundException; import com.google.common.collect.Lists; @@ -10,6 +10,7 @@ import me.totalfreedom.totalfreedommod.util.PermissibleCompletion; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; @@ -22,10 +23,10 @@ import org.bukkit.util.StringUtil; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.lang.annotation.AnnotationFormatError; import java.util.*; +import java.util.concurrent.CompletableFuture; public abstract class FreedomCommand implements CommandExecutor, TabCompleter { @@ -52,7 +53,7 @@ public abstract class FreedomCommand implements CommandExecutor, TabCompleter private final CommandPermissions perms; protected CommandSender sender; - FreedomCommand() + protected FreedomCommand() { if (getClass().getAnnotation(CommandParameters.class) == null || getClass().getAnnotation(CommandPermissions.class) == null) @@ -109,7 +110,23 @@ public void register() cmd.setPermission(this.permission); } server.getCommandMap().register("totalfreedommod", cmd); - cmd.setExecutor(this); + CompletableFuture.runAsync(() -> server.getCommandMap().register("totalfreedommod", cmd)) + .whenComplete((v, th) -> + { + if (th != null) + { + FLog.severe(th); + return; + } + + PluginCommand pluginCommand = server.getPluginCommand(cmd.getName()); + if (pluginCommand != null) + { + pluginCommand.setExecutor(this); + pluginCommand.setTabCompleter(this); + } + cmd.setExecutor(this); + }); } protected void msg(CommandSender sender, Component message) @@ -160,7 +177,8 @@ protected List argumentCompletions(String arg, PermissibleCompletion... .toList(); } - protected List playerCompletions(String arg) { + protected List playerCompletions(String arg) + { return Bukkit.getOnlinePlayers() .stream() .map(Player::getName) @@ -178,6 +196,24 @@ protected boolean isAdmin(CommandSender sender) return plugin.al.isAdmin(sender); } + @NotNull + public TagResolver.Single player(Player player) + { + return Placeholder.unparsed("player", player.getName()); + } + + @NotNull + public TagResolver.Single sender(CommandSender sender) + { + return Placeholder.unparsed("sender", sender.getName()); + } + + @NotNull + public TagResolver.Single usage() + { + return Placeholder.unparsed("usage", this.getUsage().replace("", this.getName().toLowerCase())); + } + protected void checkConsole() { if (!isConsole()) @@ -202,6 +238,7 @@ protected void checkPermission(String permission) } } + @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String commandLabel, @NotNull String[] args) { try @@ -220,6 +257,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @N } @NotNull + @Override public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { List options = getTabCompleteOptions(sender, command, alias, args); @@ -232,6 +270,11 @@ public List onTabComplete(@NotNull CommandSender sender, @NotNull Comman public abstract boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole); + protected TagResolver.Single arg(String arg) + { + return Placeholder.unparsed("arg", arg); + } + protected List getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args) { return FUtil.getPlayerList(); @@ -347,6 +390,7 @@ public boolean execute(@NotNull CommandSender sender, @NotNull String commandLab { if (cmd == null) { + msgNew(sender, "", usage()); return false; } // Reduce complexity! Exit immediately if the command is null. diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Intercept.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Intercept.java new file mode 100644 index 000000000..bebd1764d --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Intercept.java @@ -0,0 +1,13 @@ +package me.totalfreedom.totalfreedommod.command.handling; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Intercept +{ + String value(); +} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Interceptor.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Interceptor.java new file mode 100644 index 000000000..f43a60a1e --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Interceptor.java @@ -0,0 +1,74 @@ +package me.totalfreedom.totalfreedommod.command.handling; + +import me.totalfreedom.totalfreedommod.TotalFreedomMod; +import me.totalfreedom.totalfreedommod.util.FLog; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.PluginIdentifiableCommand; + +import java.util.HashMap; +import java.util.Map; + +public class Interceptor +{ + private final TotalFreedomMod plugin; + private final Map overrides = new HashMap<>(); + + public Interceptor(TotalFreedomMod plugin) + { + this.plugin = plugin; + } + + public void intercept(String command) + { + getPluginCommands().entrySet() + .stream() + .filter(entry -> !((PluginIdentifiableCommand) entry.getValue()) // Check that it isn't a tfm command + .getPlugin() + .getName() + .equalsIgnoreCase(plugin.getName())) + .filter(entry -> entry.getValue() // Check that the command is the one we want to intercept + .getName() + .equalsIgnoreCase(command)) + .forEach(entry -> overrides.put(entry.getKey(), entry.getValue())); // Intercept. + + getFallbackCommands().entrySet() + .stream() + .filter(entry -> entry.getValue() // Check that the command is the one we want to intercept + .getName() + .equalsIgnoreCase(command)) + .forEach(entry -> overrides.put(entry.getKey(), entry.getValue())); // Intercept. + } + + public void setOverrides() + { + overrides.forEach((key, value) -> + { + Bukkit.getCommandMap().getKnownCommands().remove(key, value); + FLog.info("Overriding command: " + key); + }); + } + + private Map getFallbackCommands() { + final Map fallbackCommands = new HashMap<>(); + for (final Map.Entry entry : Bukkit.getCommandMap().getKnownCommands().entrySet()) { + if (!(entry.getValue() instanceof PluginIdentifiableCommand)) { + fallbackCommands.put(entry.getKey(), entry.getValue()); + } + } + return fallbackCommands; + } + + private Map getPluginCommands() + { + final Map pluginCommands = new HashMap<>(); + for (final Map.Entry entry : Bukkit.getCommandMap().getKnownCommands().entrySet()) + { + if (entry.getValue() instanceof PluginIdentifiableCommand) + { + pluginCommands.put(entry.getKey(), entry.getValue()); + } + } + return pluginCommands; + } +} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/SourceType.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/SourceType.java similarity index 87% rename from commons/src/main/java/me/totalfreedom/totalfreedommod/command/SourceType.java rename to commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/SourceType.java index 7a678bd3b..73d775fee 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/SourceType.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/SourceType.java @@ -1,4 +1,4 @@ -package me.totalfreedom.totalfreedommod.command; +package me.totalfreedom.totalfreedommod.command.handling; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_help.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_help.java index c41e6b62e..4f55e0012 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_help.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/httpd/module/Module_help.java @@ -4,9 +4,8 @@ import java.util.*; -import me.totalfreedom.totalfreedommod.command.FreedomCommand; +import me.totalfreedom.totalfreedommod.command.handling.FreedomCommand; import me.totalfreedom.totalfreedommod.httpd.NanoHTTPD; -import me.totalfreedom.totalfreedommod.rank.DisplayableGroup; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.command.Command; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java new file mode 100644 index 000000000..017b47557 --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java @@ -0,0 +1,31 @@ +package me.totalfreedom.totalfreedommod.perms; + +import net.luckperms.api.model.group.Group; +import net.luckperms.api.model.group.GroupManager; + +import java.util.concurrent.CompletableFuture; + +public class GroupWrapper +{ + private final GroupManager manager; + + public GroupWrapper(GroupManager manager) + { + this.manager = manager; + } + + public CompletableFuture getGroup(String name) + { + if (!manager.isLoaded(name) || !manager.getLoadedGroups().contains(manager.getGroup(name))) + { + return manager.createAndLoadGroup(name); + } + + return CompletableFuture.supplyAsync(() -> manager.getGroup(name)); + } + + public void saveGroup(String name) + { + getGroup(name).thenAccept(manager::saveGroup); + } +} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java new file mode 100644 index 000000000..808c7943c --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java @@ -0,0 +1,39 @@ +package me.totalfreedom.totalfreedommod.perms; + +import net.luckperms.api.track.Track; +import net.luckperms.api.track.TrackManager; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class TrackWrapper +{ + private final TrackManager manager; + private final Set trackSet; + + public TrackWrapper(TrackManager manager) + { + this.manager = manager; + this.trackSet = new HashSet<>(); + trackSet.addAll(manager.getLoadedTracks()); + } + + public CompletableFuture getTrack(String name) + { + if (!manager.isLoaded(name) || !trackSet.contains(manager.getTrack(name))) + { + return manager.createAndLoadTrack(name).thenApplyAsync(a -> { + trackSet.add(a); + return a; + }); + } + + return CompletableFuture.supplyAsync(() -> manager.getTrack(name)); + } + + public void saveTrack(String name) + { + getTrack(name).thenAccept(manager::saveTrack); + } +} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java new file mode 100644 index 000000000..7e70985c2 --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java @@ -0,0 +1,84 @@ +package me.totalfreedom.totalfreedommod.perms; + +import net.luckperms.api.cacheddata.CachedMetaData; +import net.luckperms.api.cacheddata.CachedPermissionData; +import net.luckperms.api.context.ImmutableContextSet; +import net.luckperms.api.model.user.User; +import net.luckperms.api.query.QueryOptions; + +public class UserData +{ + private User user; + private CachedMetaData metaData; + private CachedPermissionData permissionData; + private ImmutableContextSet contextSet; + private QueryOptions queryOptions; + + public UserData(User user, CachedMetaData metaData, CachedPermissionData permissionData, ImmutableContextSet contextSet, QueryOptions queryOptions) + { + this.user = user; + this.metaData = metaData; + this.permissionData = permissionData; + this.contextSet = contextSet; + this.queryOptions = queryOptions; + } + + public User getUser() + { + return user; + } + + public void setUser(User user) + { + this.user = user; + } + + public CachedMetaData getMetaData() + { + return metaData; + } + + public void setMetaData(CachedMetaData metaData) + { + this.metaData = metaData; + } + + public CachedPermissionData getPermissionData() + { + return permissionData; + } + + public void setPermissionData(CachedPermissionData permissionData) + { + this.permissionData = permissionData; + } + + public ImmutableContextSet getContextSet() + { + return contextSet; + } + + public void setContextSet(ImmutableContextSet contextSet) + { + this.contextSet = contextSet; + } + + public QueryOptions getQueryOptions() + { + return queryOptions; + } + + public void setQueryOptions(QueryOptions queryOptions) + { + this.queryOptions = queryOptions; + } + + public UserData copy() + { + return new UserData(getUser(), + getMetaData(), + getPermissionData(), + getContextSet(), + getQueryOptions()); + } +} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java new file mode 100644 index 000000000..ba5d4d419 --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java @@ -0,0 +1,124 @@ +package me.totalfreedom.totalfreedommod.perms; + +import me.totalfreedom.totalfreedommod.rank.DisplayableGroup; +import me.totalfreedom.totalfreedommod.rank.GroupProvider; +import net.luckperms.api.cacheddata.CachedMetaData; +import net.luckperms.api.cacheddata.CachedPermissionData; +import net.luckperms.api.context.ImmutableContextSet; +import net.luckperms.api.model.group.Group; +import net.luckperms.api.model.user.User; +import net.luckperms.api.model.user.UserManager; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; +import net.luckperms.api.platform.PlayerAdapter; +import net.luckperms.api.query.QueryOptions; +import org.bukkit.entity.Player; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class UserWrapper +{ + private final UserManager manager; + private final PlayerAdapter playerAdapter; + private final Set userDataSet; + + public UserWrapper(UserManager manager, PlayerAdapter adapter) + { + this.manager = manager; + this.playerAdapter = adapter; + this.userDataSet = new HashSet<>(); + } + + public CompletableFuture addUserData(Player player) + { + User user = playerAdapter.getUser(player); + CachedPermissionData permissionData = playerAdapter.getPermissionData(player); + ImmutableContextSet contextSet = playerAdapter.getContext(player); + QueryOptions queryOptions = playerAdapter.getQueryOptions(player); + CachedMetaData metaData = playerAdapter.getMetaData(player); + + UserData userData = new UserData(user, metaData, permissionData, contextSet, queryOptions); + return CompletableFuture.runAsync(() -> userDataSet.add(userData)); + } + + public CompletableFuture getUser(Player player) + { + if (!manager.isLoaded(player.getUniqueId()) || !manager.getLoadedUsers().contains(manager.getUser(player.getUniqueId()))) + { + return manager.loadUser(player.getUniqueId()); + } + + return CompletableFuture.supplyAsync(() -> manager.getUser(player.getUniqueId())); + } + + public CompletableFuture getUserData(Player player) + { + return getUser(player).thenApply(user -> + { + for (UserData userData : userDataSet) + { + if (userData.getUser().getUniqueId().equals(user.getUniqueId())) + { + return userData; + } + } + return null; + }); + } + + public CompletableFuture removeUserData(Player player) + { + return getUserData(player).thenAccept(userDataSet::remove); + } + + public CompletableFuture updateUserData(Player player) + { + return getUserData(player).thenApply(userData -> + { + UserData newData = userData.copy(); + CachedPermissionData permissionData = playerAdapter.getPermissionData(player); + ImmutableContextSet contextSet = playerAdapter.getContext(player); + QueryOptions queryOptions = playerAdapter.getQueryOptions(player); + CachedMetaData metaData = playerAdapter.getMetaData(player); + + newData.setPermissionData(permissionData); + newData.setContextSet(contextSet); + newData.setQueryOptions(queryOptions); + newData.setMetaData(metaData); + + userDataSet.remove(userData); + return newData; + }).thenAccept(userDataSet::add); + } + + public void addToGroup(User user, DisplayableGroup group) + { + CompletableFuture.runAsync(() -> + manager.modifyUser(user.getUniqueId(), c -> + { + if (!c.getNodes(NodeType.INHERITANCE) + .contains(GroupProvider.inheritanceNode(group))) + c.data().add(GroupProvider.inheritanceNode(group)); + })); + } + + public void removeFromGroup(User user, Group group) + { + InheritanceNode groupNode = InheritanceNode.builder(group).build(); + + CompletableFuture.runAsync(() -> + manager.modifyUser(user.getUniqueId(), userConsumer -> + { + if (userConsumer.getNodes(NodeType.INHERITANCE) + .contains(groupNode)) + userConsumer.data().remove(groupNode); + })); + } + + public void saveUser(User user) + { + CompletableFuture.runAsync(() -> manager.saveUser(user)); + } +} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java index 08e648ce5..995dfe37a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java @@ -4,11 +4,10 @@ import com.google.common.collect.Lists; import me.totalfreedom.totalfreedommod.api.ShopItem; import me.totalfreedom.totalfreedommod.util.FConverter; +import me.totalfreedom.totalfreedommod.sql.ResultSetProvider; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -44,7 +43,7 @@ public class PlayerData private Boolean inspect = false; - public PlayerData(ResultSet resultSet) + public PlayerData(ResultSetProvider resultSet) { try { @@ -55,12 +54,16 @@ public PlayerData(ResultSet resultSet) notes.addAll(FUtil.stringToList(resultSet.getString("notes"))); String tempTag = resultSet.getString("tag"); //-- - if (!Strings.isNullOrEmpty(tempTag) && FUtil.containsChatColor(tempTag)) + if (!Strings.isNullOrEmpty(tempTag)) { - tempTag = FUtil.miniMessage(FUtil.colorizeAsComponentSection(tempTag)); + if (FUtil.containsChatColor(tempTag)) + { + tempTag = FUtil.miniMessage(FUtil.colorizeAsComponentSection(tempTag)); + } + + tag = FUtil.miniMessage(tempTag); } //-- - tag = FUtil.miniMessage(tempTag); discordID = resultSet.getString("discord_id"); masterBuilder = resultSet.getBoolean("master_builder"); rideMode = RideMode.valueOf(resultSet.getString("ride_mode").toUpperCase()); @@ -78,7 +81,7 @@ public PlayerData(ResultSet resultSet) loginMessage = tempLoginMessage; //-- inspect = resultSet.getBoolean("inspect"); - } catch (SQLException e) + } catch (Throwable e) { FLog.severe("Failed to load player: " + e.getMessage()); e.printStackTrace(); diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java index d04871110..3170b6dc4 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java @@ -5,14 +5,17 @@ import me.totalfreedom.totalfreedommod.admin.Admin; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.rank.GroupProvider; +import me.totalfreedom.totalfreedommod.sql.ResultSetProvider; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; +import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; -import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; public class PlayerList extends FreedomService { @@ -42,24 +45,18 @@ public FPlayer getPlayerSync(Player player) public void loadMasterBuilders() { - ResultSet resultSet = plugin.sql.getMasterBuilders(); - - if (resultSet == null) - { - return; - } + plugin.sql.getMasterBuilders().whenComplete((result, throwable) -> { + if (throwable != null) { + FLog.severe("Failed to load master builders: " + throwable.getMessage()); + return; + } - try - { - while (resultSet.next()) + result.getAllRowsResultSet().forEach(row -> { - PlayerData playerData = load(resultSet); + PlayerData playerData = load(ResultSetProvider.fromRow(row)); dataMap.put(playerData.getUuid(), playerData); - } - } catch (SQLException e) - { - FLog.severe("Failed to parse master builders: " + e.getMessage()); - } + }); + }); } public String getIp(OfflinePlayer player) @@ -91,10 +88,7 @@ public boolean canManageMasterBuilders(String name) { PlayerData data = getData(name); - return (!ConfigEntry.HOST_SENDER_NAMES.getStringList().contains(name.toLowerCase()) && data != null && !ConfigEntry.SERVER_OWNERS.getStringList().contains(data.getName())) - && !ConfigEntry.SERVER_EXECUTIVES.getStringList().contains(data.getName()) - && !isTelnetMasterBuilder(data) - && !ConfigEntry.HOST_SENDER_NAMES.getStringList().contains(name.toLowerCase()); + return (!ConfigEntry.HOST_SENDER_NAMES.getStringList().contains(name.toLowerCase()) && data != null && !ConfigEntry.SERVER_OWNERS.getStringList().contains(data.getName())) && !ConfigEntry.SERVER_EXECUTIVES.getStringList().contains(data.getName()) && !isTelnetMasterBuilder(data) && !ConfigEntry.HOST_SENDER_NAMES.getStringList().contains(name.toLowerCase()); } public boolean isTelnetMasterBuilder(PlayerData playerData) @@ -120,20 +114,61 @@ public FPlayer getPlayer(Player player) public PlayerData loadByUuid(UUID uuid) { - return load(plugin.sql.getPlayerByUuid(uuid)); + AtomicReference futureData = new AtomicReference<>(null); + AtomicBoolean loaded = new AtomicBoolean(false); + plugin.sql.getPlayerByUuid(uuid).thenApplyAsync(result -> { + futureData.set(load(result)); + return futureData; + }).whenComplete((result, throwable) -> { + if (throwable != null) { + FLog.severe("Failed to load player by UUID: " + throwable.getMessage()); + return; + } + loaded.set(true); + }); + + while (!loaded.get()) // Wait for the future to complete. + { + if (futureData.get() != null) { // This will break the loop if the result is available before the boolean is updated. + break; + } + } + + return futureData.get(); } public PlayerData loadByIp(String ip) { - return load(plugin.sql.getPlayerByIp(ip)); + AtomicReference futureData = new AtomicReference<>(null); + AtomicBoolean loaded = new AtomicBoolean(false); + plugin.sql.getPlayerByIp(ip).thenApplyAsync(result -> { + futureData.set(load(result)); + return futureData; + }).whenComplete((result, throwable) -> { + if (throwable != null) { + FLog.severe("Failed to load player by IP: " + throwable.getMessage()); + return; + } + loaded.set(true); + }); + + while (!loaded.get()) + { + if (futureData.get() != null) { + break; + } + } // Wait for the future to complete. + + return futureData.get(); } - public PlayerData load(ResultSet resultSet) + public PlayerData load(ResultSetProvider resultSet) { if (resultSet == null) { return null; } + return new PlayerData(resultSet); } @@ -147,21 +182,27 @@ public void syncIps(Admin admin) public void save(PlayerData player) { - try - { - ResultSet currentSave = plugin.sql.getPlayerByUuid(player.getUuid()); + plugin.sql.getPlayerByUuid(player.getUuid()).whenComplete((result, throwable) -> { + if (throwable != null) { + FLog.severe("Failed to save player: " + throwable.getMessage()); + return; + } + for (Map.Entry entry : player.toSQLStorable().entrySet()) { - Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue()); + Object storedValue = plugin.sql.getValue(result, entry.getKey(), entry.getValue()); if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null) { - plugin.sql.setPlayerValue(player, entry.getKey(), entry.getValue()); + plugin.sql.setPlayerValue(player, entry.getKey(), entry.getValue()).whenComplete((result1, ex) -> + { + if (ex != null) + { + FLog.severe("Failed to save player: " + ex.getMessage()); + } + }); } } - } catch (SQLException e) - { - FLog.severe("Failed to save player: " + e.getMessage()); - } + }); } public PlayerData getData(Player player) @@ -189,7 +230,11 @@ public PlayerData getData(Player player) dataMap.put(player.getUniqueId(), playerData); // Send it to the SQL database. - plugin.sql.addPlayer(playerData); + plugin.sql.addPlayer(playerData).whenComplete((result, throwable) -> { + if (throwable != null) { + FLog.severe(throwable.getMessage()); + } + }); // Returns it return playerData; diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/DisplayableGroup.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/DisplayableGroup.java index 621b66694..a2f6bfeb2 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/DisplayableGroup.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/DisplayableGroup.java @@ -39,7 +39,6 @@ public class DisplayableGroup implements Displayable private final boolean hasDefaultLoginMessage; public DisplayableGroup(String group, - String inheritance, Component plural, Component tag, int weight, @@ -65,11 +64,6 @@ public DisplayableGroup(String group, .prefix(FUtil.miniMessage(GroupProvider.OPEN.append(tag.color(color)).append(GroupProvider.CLOSE))) .priority(1) .build(); - if (inheritance != null) - { - InheritanceNode inheritanceNode = InheritanceNode.builder(inheritance).build(); - g.getData(DataType.NORMAL).add(inheritanceNode); - } g.getData(DataType.NORMAL).add(prefixNode); g.getData(DataType.NORMAL).add(weightNode); }).join(); // Block until the group is created and loaded. diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/GroupProvider.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/GroupProvider.java index 172dc14b2..9a77d025e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/GroupProvider.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/GroupProvider.java @@ -3,8 +3,10 @@ import me.totalfreedom.totalfreedommod.TotalFreedomMod; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; +import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; -import net.luckperms.api.track.TrackManager; +import net.luckperms.api.node.matcher.NodeMatcher; +import net.luckperms.api.node.types.InheritanceNode; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -16,11 +18,21 @@ public interface GroupProvider Component OPEN = Component.text("[", NamedTextColor.DARK_GRAY); Component CLOSE = Component.text("]", NamedTextColor.DARK_GRAY); - GroupProvider NON_OP = () -> new DisplayableGroup("default", null, Component.text("Non-Ops"), Component.empty(), 0, NamedTextColor.WHITE, null, false, false); - GroupProvider OP = () -> new DisplayableGroup("op", "default", Component.text("Operators"), Component.text("Op"), 1, NamedTextColor.GREEN, null, false, false); - GroupProvider MASTER_BUILDER = () -> new DisplayableGroup("builder", "op", Component.text("Master Builders"), Component.text("MB"), 2, NamedTextColor.DARK_AQUA, ChatColor.DARK_AQUA, true, true); - GroupProvider ADMIN = () -> new DisplayableGroup("admin", "builder", Component.text("Administrators"), Component.text("Admin"), 3, NamedTextColor.DARK_GREEN, ChatColor.DARK_GREEN, true, true); - GroupProvider SENIOR_ADMIN = () -> new DisplayableGroup("senior", "admin", Component.text("Senior Administrators"), Component.text("SrA"), 4, NamedTextColor.GOLD, ChatColor.GOLD, true, true); + GroupProvider NON_OP = () -> new DisplayableGroup("default", Component.text("Non-Ops"), Component.empty(), 0, NamedTextColor.WHITE, null, false, false); + GroupProvider OP = () -> new DisplayableGroup("op", Component.text("Operators"), Component.text("Op"), 1, NamedTextColor.GREEN, null, false, false); + GroupProvider MASTER_BUILDER = () -> new DisplayableGroup("builder", Component.text("Master Builders"), Component.text("MB"), 2, NamedTextColor.DARK_AQUA, ChatColor.DARK_AQUA, true, true); + GroupProvider ADMIN = () -> new DisplayableGroup("admin", Component.text("Administrators"), Component.text("Admin"), 3, NamedTextColor.DARK_GREEN, ChatColor.DARK_GREEN, true, true); + GroupProvider SENIOR_ADMIN = () -> new DisplayableGroup("senior", Component.text("Senior Administrators"), Component.text("SrA"), 4, NamedTextColor.GOLD, ChatColor.GOLD, true, true); + + static InheritanceNode inheritanceNode(DisplayableGroup group) + { + return InheritanceNode.builder(group.getLuckPermsGroup()).build(); + } + + static NodeMatcher nodeMatcher(DisplayableGroup group) + { + return NodeMatcher.key(inheritanceNode(group)); + } static User getUser(Player player) { @@ -30,16 +42,28 @@ static User getUser(Player player) .getUser(player); } - static GroupProvider fromArgument(String arg) + static GroupProvider fromString(String arg) { return switch (arg.toLowerCase()) - { - case "op" -> OP; - case "builder" -> MASTER_BUILDER; - case "admin" -> ADMIN; - case "senior" -> SENIOR_ADMIN; - default -> NON_OP; - }; + { + case "op" -> OP; + case "builder" -> MASTER_BUILDER; + case "admin" -> ADMIN; + case "senior" -> SENIOR_ADMIN; + default -> NON_OP; + }; + } + + static GroupProvider fromLuckPermsGroup(Group group) + { + return switch (group.getName().toLowerCase()) + { + case "op" -> OP; + case "builder" -> MASTER_BUILDER; + case "admin" -> ADMIN; + case "senior" -> SENIOR_ADMIN; + default -> NON_OP; + }; } static Set> providerSet() diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java index d3455bb70..e3546cd40 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java @@ -1,193 +1,245 @@ package me.totalfreedom.totalfreedommod.rank; import me.totalfreedom.totalfreedommod.TotalFreedomMod; +import me.totalfreedom.totalfreedommod.perms.GroupWrapper; +import me.totalfreedom.totalfreedommod.perms.TrackWrapper; +import me.totalfreedom.totalfreedommod.perms.UserWrapper; import me.totalfreedom.totalfreedommod.util.FLog; -import net.luckperms.api.LuckPerms; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.EventSubscription; +import net.luckperms.api.event.node.NodeAddEvent; +import net.luckperms.api.event.node.NodeRemoveEvent; import net.luckperms.api.model.group.Group; import net.luckperms.api.model.user.User; -import net.luckperms.api.query.QueryOptions; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; +import net.luckperms.api.platform.PlayerAdapter; +import net.luckperms.api.track.DemotionResult; import net.luckperms.api.track.PromotionResult; import net.luckperms.api.track.Track; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicReference; public class Hierarchy { - private final LuckPerms lp; - private final Track track; + private static final Hierarchy hierarchy = new Hierarchy(); // static singleton for global state. + private final GroupWrapper groupWrapper; + private final TrackWrapper trackWrapper; + private final UserWrapper userWrapper; + private final PlayerAdapter playerAdapter; - public Hierarchy(String name) + private Hierarchy() { - this.lp = TotalFreedomMod.getPlugin().lpb.getAPI(); + this.playerAdapter = TotalFreedomMod.getPlugin().lpb.getAPI().getPlayerAdapter(Player.class); + this.groupWrapper = new GroupWrapper(TotalFreedomMod.getPlugin().lpb.getAPI().getGroupManager()); + this.trackWrapper = new TrackWrapper(TotalFreedomMod.getPlugin().lpb.getAPI().getTrackManager()); + this.userWrapper = new UserWrapper(TotalFreedomMod.getPlugin().lpb.getAPI().getUserManager(), + getPlayerAdapter()); + new LuckPermsUserDataListener().register(); + } - if (lp == null) - { - throw new IllegalStateException("LuckPerms not found!"); - } + public static Hierarchy getHierarchy() + { + return hierarchy; + } - if (!lp.getTrackManager().isLoaded(name)) - { - this.track = lp.getTrackManager().createAndLoadTrack(name).whenComplete((ignored, throwable) -> - { - if (throwable != null) - { - throw new IllegalStateException("Failed to create track " + name, throwable); - } - }).join(); // Block and wait for the track to load. - } else - { - this.track = lp.getTrackManager().getTrack(name); - } + public PlayerAdapter getPlayerAdapter() + { + return playerAdapter; } - public void addGroup(DisplayableGroup group) + public boolean isUserOnAdminTrack(Player player) { - updateAppend(group.getLuckPermsGroup()).join(); // wait for the group to be updated. + return userWrapper.getUser(player) + .thenApply(user -> user.getNodes(NodeType.INHERITANCE) + .contains(GroupProvider.inheritanceNode(GroupProvider.ADMIN.getGroup()))) + .join(); } - public void addGroup(Group group, int index) + public Track op() { - updateInsert(group, index).join(); // wait for the group to be updated. + return trackWrapper.getTrack("OP").join(); } - public void dropGroup(Group group) // This is non-blocking by default. + public Track builder() { - updateDrop(group).whenComplete((ignored, throwable) -> - { - if (throwable != null) - { - FLog.severe("Failed to update track " + track.getName()); - } - }); + return trackWrapper.getTrack("BUILDER").join(); } - public void addGroupNonBlocking(Group group, int index) + public Track admin() { - updateInsert(group, index).whenComplete((ignored, throwable) -> + return trackWrapper.getTrack("ADMIN").join(); + } + + public void addInheritance(DisplayableGroup previous, DisplayableGroup current) + { + CompletableFuture.runAsync(() -> + { + current.getLuckPermsGroup().data().add(InheritanceNode.builder(previous.getLuckPermsGroup()).build()); + groupWrapper.saveGroup(current.getLuckPermsGroup().getName()); + }).whenComplete((a, b) -> { - if (throwable != null) + if (b != null) { - FLog.severe("Failed to update track " + track.getName()); + FLog.severe(b); } }); } - public CompletableFuture trackUser(User user) + public Group getGroup(String name) { - Group group = fromName(track.getGroups().get(0)); // First group. - - return CompletableFuture.supplyAsync(() -> - lp.getContextManager() - .getContext(user) - .map(context -> user - .getInheritedGroups(QueryOptions.defaultContextualOptions()) - .add(group)) - .orElse(false)); + return groupWrapper.getGroup(name).join(); } - public CompletableFuture promoteUser(User user) + public void addGroupToTrack(Track track, DisplayableGroup group) { - boolean empty = user.getInheritedGroups(QueryOptions.defaultContextualOptions()) - .stream() - .filter(group -> track.getGroups().contains(group.getName())) - .findFirst() - .isEmpty(); - - if (empty) trackUser(user).whenComplete((ignored, throwable) -> + trackWrapper.getTrack(track.getName()).thenAccept(t -> { - if (throwable != null) + t.appendGroup(group.getLuckPermsGroup()); + trackWrapper.saveTrack(t.getName()); + }).whenComplete((a, b) -> + { + if (b != null) { - FLog.severe("Failed to track user " + user.getFriendlyName()); + FLog.severe(b); } }); + } - return CompletableFuture.supplyAsync(() -> + public void addUserData(Player player) + { + userWrapper.addUserData(player).whenComplete((a, b) -> { - AtomicReference result = new AtomicReference<>(); - lp.getContextManager() - .getContext(user) - .ifPresent(context -> result.set(track.promote(user, context))); - return result.get(); + if (b != null) + { + FLog.severe(b); + } }); } - public void dropUserFromAll(User user) + public void updateUserData(Player player) { - for (String group : track.getGroups()) + userWrapper.updateUserData(player).whenComplete((a, b) -> { - dropUserFromGroup(user, fromName(group)) - .whenComplete((ignored, throwable) -> + if (b != null) { - if (throwable != null) - { - FLog.severe("Failed to drop user " - + user.getFriendlyName() - + " from group " - + group); - return; - } - FLog.info("Successfully removed " + user.getFriendlyName() + " from group " + group); - }); - } + FLog.severe(b); + } + }); } - public CompletableFuture demoteUser(User user) + public void dropUserData(Player player) { - return CompletableFuture.supplyAsync(() -> { - lp.getContextManager() - .getContext(user) - .ifPresent(context -> track.demote(user, context)); - return null; + userWrapper.removeUserData(player).whenComplete((a, b) -> + { + if (b != null) + { + FLog.severe(b); + } }); } - public CompletableFuture dropUserFromGroup(User user, Group group) + public CompletableFuture promoteUser(Track track, Player player) { - return CompletableFuture.supplyAsync(() -> user - .getInheritedGroups(QueryOptions.defaultContextualOptions()) - .remove(group)); + return userWrapper.getUserData(player) + .thenApply(data -> track.promote(data.getUser(), data.getContextSet())); } - public Group fromName(String name) + public CompletableFuture demoteUser(Track track, Player player) { - return lp.getGroupManager().getGroup(name); + return userWrapper.getUserData(player) + .thenApply(data -> track.demote(data.getUser(), data.getContextSet())); } - public CompletableFuture updateAppend(Group group) + public void addUserToGroup(DisplayableGroup group, Player player) { - return CompletableFuture.supplyAsync(() -> - { - if (!track.containsGroup(group.getName())) - { - track.appendGroup(group); - } - return null; - }); + userWrapper.getUserData(player).thenAccept(user -> + userWrapper.addToGroup(user.getUser(), group)) + .whenComplete((a, b) -> + { + if (b != null) + { + FLog.severe(b); + } + }); } - public CompletableFuture updateInsert(Group group, int index) + public void dropUserFromAll(Track track, Player player) { - return CompletableFuture.supplyAsync(() -> + userWrapper.getUserData(player).thenAccept(data -> { - if (!track.containsGroup(group)) + for (String group : track.getGroups()) { - track.insertGroup(group, index); + groupWrapper.getGroup(group).whenComplete((g, b) -> + { + if (b != null) + { + FLog.severe(b); + return; + } + + if (data.getUser().getNodes(NodeType.INHERITANCE) + .contains(InheritanceNode.builder(g).build())) + userWrapper.removeFromGroup(data.getUser(), g); + }); + } + }).whenComplete((a, b) -> + { + if (b != null) + { + FLog.severe(b); } - return null; }); } - public CompletableFuture updateDrop(Group group) + private class LuckPermsUserDataListener { - return CompletableFuture.supplyAsync(() -> + private final Map> subscriptions = new HashMap<>(); + + public void register() + { + EventBus eventBus = TotalFreedomMod.getPlugin().lpb.getAPI().getEventBus(); + subscriptions.put(new NamespacedKey(TotalFreedomMod.getPlugin(), "node_add"), eventBus.subscribe(TotalFreedomMod.getPlugin(), NodeAddEvent.class, this::onNodeAdd)); + subscriptions.put(new NamespacedKey(TotalFreedomMod.getPlugin(), "node_remove"), eventBus.subscribe(TotalFreedomMod.getPlugin(), NodeRemoveEvent.class, this::onNodeRemove)); + } + + public void unregister() + { + subscriptions.forEach((key, subscription) -> subscription.close()); + subscriptions.clear(); + } + + private void onNodeAdd(NodeAddEvent event) { - if (track.containsGroup(group)) + if (event.isUser()) { - track.removeGroup(group); + User user = (User) event.getTarget(); + Player player = Bukkit.getPlayer(user.getUniqueId()); + if (player != null) + { + TotalFreedomMod.getPlugin().rm.updateDisplay(player); + updateUserData(player); + } } + } - return null; - }); + private void onNodeRemove(NodeRemoveEvent event) + { + if (event.isUser()) + { + User user = (User) event.getTarget(); + Player player = Bukkit.getPlayer(user.getUniqueId()); + if (player != null) + { + TotalFreedomMod.getPlugin().rm.updateDisplay(player); + updateUserData(player); + } + } + } } } diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/HierarchyProvider.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/HierarchyProvider.java deleted file mode 100644 index 4ee9fa5f6..000000000 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/HierarchyProvider.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.totalfreedom.totalfreedommod.rank; - -@FunctionalInterface -public interface HierarchyProvider -{ - HierarchyProvider OP = () -> new Hierarchy("op-track"); - HierarchyProvider BUILDER = () -> new Hierarchy("builder-track"); - HierarchyProvider ADMIN = () -> new Hierarchy("admin-track"); - - T getHierarchy(); -} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java index 0fb2ff70e..fa0fbee85 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java @@ -7,6 +7,7 @@ import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import org.apache.commons.lang.StringUtils; import org.bukkit.command.CommandSender; @@ -15,6 +16,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.Team; @@ -25,11 +27,17 @@ public class RankManager extends FreedomService @Override public void onStart() { - HierarchyProvider.OP.getHierarchy().addGroup(GroupProvider.NON_OP.getGroup()); - HierarchyProvider.OP.getHierarchy().addGroup(GroupProvider.OP.getGroup()); - HierarchyProvider.BUILDER.getHierarchy().addGroup(GroupProvider.MASTER_BUILDER.getGroup()); - HierarchyProvider.ADMIN.getHierarchy().addGroup(GroupProvider.ADMIN.getGroup()); - HierarchyProvider.ADMIN.getHierarchy().addGroup(GroupProvider.SENIOR_ADMIN.getGroup()); + + // Here, we are automatically creating new tracks if they don't exist, and then adding groups to them. + Hierarchy hierarchy = Hierarchy.getHierarchy(); + hierarchy.addGroupToTrack(hierarchy.op(), GroupProvider.NON_OP.getGroup()); + hierarchy.addGroupToTrack(hierarchy.op(), GroupProvider.OP.getGroup()); + hierarchy.addGroupToTrack(hierarchy.builder(), GroupProvider.MASTER_BUILDER.getGroup()); + hierarchy.addGroupToTrack(hierarchy.admin(), GroupProvider.ADMIN.getGroup()); + hierarchy.addGroupToTrack(hierarchy.admin(), GroupProvider.SENIOR_ADMIN.getGroup()); + + hierarchy.addInheritance(GroupProvider.NON_OP.getGroup(), GroupProvider.OP.getGroup()); + hierarchy.addInheritance(GroupProvider.ADMIN.getGroup(), GroupProvider.SENIOR_ADMIN.getGroup()); } @Override @@ -71,7 +79,7 @@ public Displayable getDisplay(CommandSender sender) // Master builders show up if they are not an admin if (plugin.pl.getData(player).isMasterBuilder() && !plugin.al.isAdmin(player)) { - return Title.MASTER_BUILDER; + return GroupProvider.MASTER_BUILDER.getGroup(); } return getRank(player); @@ -137,13 +145,11 @@ public DisplayableGroup getRank(Player player) return entry.getRank(); } - return plugin.lpb.getAPI() + String primary = plugin.lpb.getAPI() .getPlayerAdapter(Player.class) .getUser(player) - .getPrimaryGroup() - .equalsIgnoreCase("op") - ? GroupProvider.OP.getGroup() - : GroupProvider.NON_OP.getGroup(); + .getPrimaryGroup(); + return GroupProvider.fromString(primary).getGroup(); } public Component getTag(Player player, Component defaultTag) @@ -176,17 +182,26 @@ public void updateDisplay(Player player) } else { fPlayer.setTag(null); - player.setPlayerListName(null); + player.playerListName(Component.empty()); } fPlayer.setTag(getTag(player, display.getColoredTag())); updatePlayerTeam(player); } + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerLeave(PlayerQuitEvent event) + { + Hierarchy.getHierarchy().dropUserData(event.getPlayer()); + } + @EventHandler(priority = EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent event) { final Player player = event.getPlayer(); + + Hierarchy.getHierarchy().addUserData(player); + PlayerData target = plugin.pl.getData(player); boolean isAdmin = plugin.al.isAdmin(player); @@ -238,6 +253,12 @@ public Component craftLoginMessage(Player player, String message) } if (message != null) { + if (!(message.contains(""))) + { + player.sendMessage(FUtil.miniMessage("You did not include the tag in your login message! We will append it for you.")); + message = " is " + message; + } + return FUtil.miniMessage(message, Placeholder.unparsed("name", player.getName()), Placeholder.component("rank", display.getName()), diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/ResultSetProvider.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/ResultSetProvider.java new file mode 100644 index 000000000..6118d399a --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/ResultSetProvider.java @@ -0,0 +1,93 @@ +package me.totalfreedom.totalfreedommod.sql; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ResultSetProvider +{ + List> allRowsResultSet = new ArrayList<>(); + + Map singularResultMap = new HashMap<>(); + + private ResultSetProvider(Map singularResultMap) + { + this.singularResultMap = singularResultMap; + } + + private ResultSetProvider(ResultSet resultSet, boolean allRows) throws SQLException + { + if (allRows) + { + while (resultSet.next()) + { + allRowsResultSet.add(mapResultSet(resultSet)); + } + } else + { + if (resultSet.next()) + { + this.singularResultMap = mapResultSet(resultSet); + } + } + } + + public static ResultSetProvider provideAllRows(ResultSet resultSet) throws SQLException + { + return new ResultSetProvider(resultSet, true); + } + + public static ResultSetProvider provideSpecificRow(ResultSet resultSet) throws SQLException + { + return new ResultSetProvider(resultSet, false); + } + + public static ResultSetProvider fromRow(Map row) + { + return new ResultSetProvider(row); + } + + public List> getAllRowsResultSet() + { + return allRowsResultSet; + } + + private Map mapResultSet(ResultSet rs) throws SQLException + { + Map result = new HashMap<>(); + while (rs.next()) + { + int columns = rs.getMetaData().getColumnCount(); + for (int i = 1; i <= columns; i++) + { + String columnName = rs.getMetaData().getColumnName(i); + Object columnValue = rs.getObject(i); + result.put(columnName, columnValue); + } + } + return result; + } + + public String getString(String key) + { + return (String) singularResultMap.get(key); + } + + public int getInt(String key) + { + return (int) singularResultMap.get(key); + } + + public boolean getBoolean(String key) + { + return (boolean) singularResultMap.get(key); + } + + public long getLong(String key) + { + return (long) singularResultMap.get(key); + } +} diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java index 5c4b200d0..05f2f386f 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java @@ -10,9 +10,12 @@ import java.sql.*; import java.text.MessageFormat; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; public class SQLite extends FreedomService { + public static final String TABLE_CHECK_FAILURE = "Failed to check tables on database: "; private final String FILE_NAME = "database.db"; private Connection connection; @@ -21,7 +24,13 @@ public class SQLite extends FreedomService public void onStart() { connect(); - checkTables(); + checkTables().whenComplete((result, throwable) -> + { + if (throwable != null) + { + FLog.severe(TABLE_CHECK_FAILURE + throwable.getMessage()); + } + }); } @Override @@ -56,344 +65,528 @@ public void disconnect() } } - public void checkTables() + public CompletableFuture checkTables() { - try + return CompletableFuture.supplyAsync(() -> { - DatabaseMetaData meta = connection.getMetaData(); - if (tableNotExists(meta, "bans")) + try + { + return connection.getMetaData(); + } catch (SQLException e) { - createBanTable(); + throw new CompletionException(TABLE_CHECK_FAILURE, e); } + }).thenAcceptAsync(meta -> + { + futureBansTable(meta); - if (tableNotExists(meta, "admins")) + futureAdminsTable(meta); + + futurePlayersTable(meta); + }); + } + + private void futurePlayersTable(DatabaseMetaData meta) + { + tableNotExists(meta, "players").whenComplete((result, throwable) -> + { + if (throwable != null) { - createAdminsTable(); + FLog.severe(throwable.getMessage()); + return; } - if (tableNotExists(meta, "players")) + + if (result) { - createPlayersTable(); + createPlayersTable().whenComplete((result2, throwable2) -> + { + if (throwable2 != null) + { + FLog.severe(throwable2.getMessage()); + } + }); } - } catch (SQLException e) - { - FLog.severe("Failed to check tables on database: " + e.getMessage()); - } + }); } - private void createPlayersTable() + private void futureAdminsTable(DatabaseMetaData meta) { - try (PreparedStatement statement = connection.prepareStatement("CREATE TABLE `players` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `notes` VARCHAR, `tag` VARCHAR, `discord_id` VARCHAR, `master_builder` BOOLEAN NOT NULL, `ride_mode` VARCHAR NOT NULL, `coins` INT, `items` VARCHAR, `total_votes` INT NOT NULL, `display_discord` BOOLEAN NOT NULL, `login_message` VARCHAR, `inspect` BOOLEAN NOT NULL);")) - { - statement.executeUpdate(); - } catch (SQLException e) + tableNotExists(meta, "admins").whenComplete((result, throwable) -> { - FLog.severe("Failed to create the players table: " + e.getMessage()); - } + if (throwable != null) + { + FLog.severe(throwable.getMessage()); + return; + } + + if (result) + { + createAdminsTable().whenComplete((result2, throwable2) -> + { + if (throwable2 != null) + { + FLog.severe(throwable2.getMessage()); + } + }); + } + }); } - private void createAdminsTable() + private void futureBansTable(DatabaseMetaData meta) { - try (PreparedStatement statement = connection.prepareStatement("CREATE TABLE `admins` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR);")) - { - statement.executeUpdate(); - } catch (SQLException e) + tableNotExists(meta, "bans").whenComplete((result, throwable) -> { - FLog.severe("Failed to create the admins table: " + e.getMessage()); - } + if (throwable != null) + { + FLog.severe(throwable.getMessage()); + return; + } + + if (Boolean.TRUE.equals(result)) // using primitive for some reason... ask SonarLint. + { + createBanTable().whenComplete((result2, throwable2) -> + { + if (throwable2 != null) + { + FLog.severe(throwable2.getMessage()); + } + }); + } + }); } - private void createBanTable() + private CompletableFuture createPlayersTable() { - try (PreparedStatement statement = connection.prepareStatement("CREATE TABLE `bans` (`name` VARCHAR, `uuid` VARCHAR, `ips` VARCHAR, `by` VARCHAR NOT NULL, `at` LONG NOT NULL, `expires` LONG, `reason` VARCHAR);")) + return CompletableFuture.supplyAsync(() -> { - statement.executeUpdate(); - } catch (SQLException e) - { - FLog.severe("Failed to create the bans table: " + e.getMessage()); - } + try (PreparedStatement statement = connection.prepareStatement("CREATE TABLE `players` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `notes` VARCHAR, `tag` VARCHAR, `discord_id` VARCHAR, `master_builder` BOOLEAN NOT NULL, `ride_mode` VARCHAR NOT NULL, `coins` INT, `items` VARCHAR, `total_votes` INT NOT NULL, `display_discord` BOOLEAN NOT NULL, `login_message` VARCHAR, `inspect` BOOLEAN NOT NULL);")) + { + statement.executeUpdate(); + } catch (SQLException e) + { + throw new CompletionException("Failed to create the players table.", e); + } + return null; + }); } - public void truncate(String table) + private CompletableFuture createAdminsTable() { - try (PreparedStatement statement = connection.prepareStatement("DELETE FROM ?")) - { - statement.setString(1, table); - statement.executeUpdate(); - } catch (SQLException e) + return CompletableFuture.supplyAsync(() -> { - FLog.severe("Failed to truncate " + table + ": " + e.getMessage()); - } + try (PreparedStatement statement = connection.prepareStatement("CREATE TABLE `admins` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR);")) + { + statement.executeUpdate(); + } catch (SQLException e) + { + throw new CompletionException("Failed to create the admins table.", e); + } + return null; + }); } - public ResultSet getBanList() throws SQLException + private CompletableFuture createBanTable() { - return connection.prepareStatement("SELECT * FROM bans").executeQuery(); + return CompletableFuture.supplyAsync(() -> + { + try (PreparedStatement statement = connection.prepareStatement("CREATE TABLE `bans` (`name` VARCHAR, `uuid` VARCHAR, `ips` VARCHAR, `by` VARCHAR NOT NULL, `at` LONG NOT NULL, `expires` LONG, `reason` VARCHAR);")) + { + statement.executeUpdate(); + } catch (SQLException e) + { + throw new CompletionException("Failed to create the bans table.", e); + } + return null; + }); } - public ResultSet getAdminList() throws SQLException + public CompletableFuture truncate(String table) { - return connection.prepareStatement("SELECT * FROM admins").executeQuery(); + return CompletableFuture.supplyAsync(() -> + { + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM ?")) + { + statement.setString(1, table); + statement.executeUpdate(); + } catch (SQLException e) + { + FLog.severe("Failed to truncate " + table + ": " + e.getMessage()); + } + return null; + }); } - public void setAdminValue(Admin admin, String key, Object value) + public CompletableFuture getBanList() { - try + return CompletableFuture.supplyAsync(() -> { - Object[] data = {key, admin.getUuid()}; - PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET {0}=? WHERE uuid=''{1}''", data)); - statement = setUnknownType(statement, 1, value); - statement.executeUpdate(); + ResultSetProvider provider; + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans")) + { + try (ResultSet result = statement.executeQuery()) + { + provider = ResultSetProvider.provideAllRows(result); + } + } catch (SQLException e) + { + throw new CompletionException("Failed to get ban list.", e); + } + return provider; + }); + } - } catch (SQLException e) + public CompletableFuture getAdminList() + { + return CompletableFuture.supplyAsync(() -> { - FLog.severe("Failed to update admin value:"); - FLog.severe(e); - } + ResultSetProvider provider; + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans")) + { + try (ResultSet result = statement.executeQuery()) + { + provider = ResultSetProvider.provideAllRows(result); + } + } catch (SQLException ex) + { + throw new CompletionException("Failed to get admin list.", ex); + } + return provider; + }); + } - public void setPlayerValue(PlayerData player, String key, Object value) + public CompletableFuture setAdminValue(Admin admin, String key, Object value) { - try + return CompletableFuture.supplyAsync(() -> { - Object[] data = {key, player.getUuid()}; - PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE players SET {0}=? WHERE uuid=''{1}''", data)); - statement = setUnknownType(statement, 1, value); - statement.executeUpdate(); + try + { + Object[] data = {key, admin.getUuid()}; + PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE admins SET {0}=? WHERE uuid=''{1}''", data)); + setUnknownType(statement, 1, value).whenComplete((result, throwable) -> + { + if (throwable != null) + { + FLog.severe(throwable.getMessage()); + } + + try + { + result.executeUpdate(); + } catch (SQLException ex) + { + throw new CompletionException("Failed to update admin value.", ex); + } + }); + } catch (SQLException e) + { + throw new CompletionException("Failed to update admin value.", e); + } + return null; + }); + } - } catch (SQLException e) + public CompletableFuture setPlayerValue(PlayerData player, String key, Object value) + { + return CompletableFuture.supplyAsync(() -> { - FLog.severe("Failed to update player value: " + e.getMessage()); - } + try + { + Object[] data = {key, player.getUuid()}; + PreparedStatement statement = connection.prepareStatement(MessageFormat.format("UPDATE players SET {0}=? WHERE uuid=''{1}''", data)); + setUnknownType(statement, 1, value).whenComplete((result, throwable) -> + { + if (throwable != null) + { + FLog.severe(throwable.getMessage()); + } + + try + { + result.executeUpdate(); + } catch (SQLException ex) + { + throw new CompletionException("Failed to update player value.", ex); + } + }); + } catch (SQLException e) + { + throw new CompletionException("Failed to update player value.", e); + } + return null; + }); } - public PreparedStatement setUnknownType(PreparedStatement statement, int index, Object value) throws SQLException + public CompletableFuture setUnknownType(PreparedStatement statement, int index, Object value) { - if (value == null) - { - statement.setString(index, null); - } else if (value.getClass().equals(String.class)) - { - String v = (String) value; - statement.setString(index, v); - } else if (value.getClass().equals(Integer.class)) - { - int v = (int) value; - statement.setInt(index, v); - } else if (value.getClass().equals(Boolean.class)) + return CompletableFuture.supplyAsync(() -> { - boolean v = (boolean) value; - statement.setBoolean(index, v); - } else if (value.getClass().equals(Long.class)) - { - long v = (long) value; - statement.setLong(index, v); - } - return statement; + try + { + if (value == null) + { + statement.setString(index, null); + } else if (value.getClass().equals(String.class)) + { + String v = (String) value; + statement.setString(index, v); + } else if (value.getClass().equals(Integer.class)) + { + int v = (int) value; + statement.setInt(index, v); + } else if (value.getClass().equals(Boolean.class)) + { + boolean v = (boolean) value; + statement.setBoolean(index, v); + } else if (value.getClass().equals(Long.class)) + { + long v = (long) value; + statement.setLong(index, v); + } + return statement; + } catch (SQLException ex) + { + throw new CompletionException("Failed to set unknown type.", ex); + } + }); } - public Object getValue(ResultSet resultSet, String key, Object value) throws SQLException + public Object getValue(ResultSetProvider provider, String key, Object value) { Object result = null; if (value instanceof String) { - result = resultSet.getString(key); + result = provider.getString(key); } else if (value instanceof Integer) { - result = resultSet.getInt(key); + result = provider.getInt(key); } else if (value instanceof Boolean) { - result = resultSet.getObject(key); + result = provider.getBoolean(key); } else if (value instanceof Long) { - result = resultSet.getLong(key); + result = provider.getLong(key); } return result; } - public void addAdmin(Admin admin) + public CompletableFuture addAdmin(Admin admin) { - - try (PreparedStatement statement = connection.prepareStatement("INSERT INTO admins VALUES (?, ?, ?, ?, ?, ?, ?, ?)")) - { - statement.setString(1, admin.getUuid().toString()); - statement.setString(2, FUtil.listToString(admin.getIps())); - statement.setString(3, admin.getRank().toString()); - statement.setBoolean(4, admin.isActive()); - statement.setLong(5, admin.getLastLogin().getTime()); - statement.setBoolean(6, admin.getCommandSpy()); - statement.setBoolean(7, admin.getPotionSpy()); - statement.setString(8, admin.getAcFormat()); - statement.executeUpdate(); - } catch (SQLException e) + return CompletableFuture.supplyAsync(() -> { - FLog.severe("Failed to add admin:"); - FLog.severe(e); - } - } + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO admins VALUES (?, ?, ?, ?, ?, ?, ?, ?)")) + { + statement.setString(1, admin.getUuid().toString()); + statement.setString(2, FUtil.listToString(admin.getIps())); + statement.setString(3, admin.getRank().toString()); + statement.setBoolean(4, admin.isActive()); + statement.setLong(5, admin.getLastLogin().getTime()); + statement.setBoolean(6, admin.getCommandSpy()); + statement.setBoolean(7, admin.getPotionSpy()); + statement.setString(8, admin.getAcFormat()); + statement.executeUpdate(); + } catch (SQLException e) + { + throw new CompletionException("Failed to add admin.", e); + } + return null; + }); - public void addPlayer(PlayerData player) - { - try (PreparedStatement statement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) - { - statement.setString(1, player.getUuid().toString()); - statement.setString(2, FUtil.listToString(player.getIps())); - statement.setString(3, FUtil.listToString(player.getNotes())); - statement.setString(4, FUtil.miniMessage(player.getTag())); - statement.setString(5, player.getDiscordID()); - statement.setBoolean(6, player.isMasterBuilder()); - statement.setString(7, player.getRideMode().name()); - statement.setInt(8, player.getCoins()); - statement.setString(9, FUtil.listToString(player.getItems())); - statement.setInt(10, player.getTotalVotes()); - statement.setBoolean(11, player.doesDisplayDiscord()); - statement.setString(12, player.getLoginMessage()); - statement.setBoolean(13, player.hasInspection()); - statement.executeUpdate(); - } catch (SQLException e) - { - FLog.severe("Failed to add player:"); - FLog.severe(e); - } } - public ResultSet getAdminByUuid(UUID uuid) + public CompletableFuture addPlayer(PlayerData player) { - try + return CompletableFuture.supplyAsync(() -> { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM admins WHERE uuid=?"); - statement.setString(1, uuid.toString()); - ResultSet resultSet = statement.executeQuery(); - if (resultSet.next()) + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) + { + statement.setString(1, player.getUuid().toString()); + statement.setString(2, FUtil.listToString(player.getIps())); + statement.setString(3, FUtil.listToString(player.getNotes())); + statement.setString(4, FUtil.miniMessage(player.getTag())); + statement.setString(5, player.getDiscordID()); + statement.setBoolean(6, player.isMasterBuilder()); + statement.setString(7, player.getRideMode().name()); + statement.setInt(8, player.getCoins()); + statement.setString(9, FUtil.listToString(player.getItems())); + statement.setInt(10, player.getTotalVotes()); + statement.setBoolean(11, player.doesDisplayDiscord()); + statement.setString(12, player.getLoginMessage()); + statement.setBoolean(13, player.hasInspection()); + statement.executeUpdate(); + } catch (SQLException e) { - return resultSet; + throw new CompletionException("Failed to add player.", e); } - } catch (SQLException e) - { - FLog.severe("Failed to get admin by name:"); - FLog.severe(e); - } - - return null; + return null; + }); } - public ResultSet getPlayerByUuid(UUID uuid) + public CompletableFuture getAdminByUuid(UUID uuid) { - try + return CompletableFuture.supplyAsync(() -> { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE uuid=?"); - statement.setString(1, uuid.toString()); - ResultSet resultSet = statement.executeQuery(); - - if (resultSet.next()) + ResultSetProvider provider; + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM admins WHERE uuid=?")) + { + statement.setString(1, uuid.toString()); + try (ResultSet set = statement.executeQuery()) + { + provider = ResultSetProvider.provideSpecificRow(set); + } + } catch (SQLException ex) { - return resultSet; + throw new CompletionException(ex); } - } catch (SQLException e) - { - FLog.severe("Failed to get player by UUID:"); - FLog.severe(e); - } - - return null; + return provider; + }); } - public ResultSet getMasterBuilders() + public CompletableFuture getPlayerByUuid(UUID uuid) { - try + return CompletableFuture.supplyAsync(() -> { - return connection.prepareStatement("SELECT * FROM players WHERE master_builder=true").executeQuery(); - } catch (SQLException e) - { - FLog.severe("Failed to get Master Builders:"); - FLog.severe(e); - } + ResultSetProvider provider; + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE uuid=?")) + { + statement.setString(1, uuid.toString()); + try (ResultSet set = statement.executeQuery()) + { + provider = ResultSetProvider.provideSpecificRow(set); + } + } catch (SQLException ex) + { + throw new CompletionException(ex); + } - return null; + return provider; + }); } - public ResultSet getPlayerByIp(String ip) + public CompletableFuture getMasterBuilders() { - try + return CompletableFuture.supplyAsync(() -> { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE ips LIKE %?%"); - statement.setString(1, ip); - ResultSet resultSet = statement.executeQuery(); - if (resultSet.next()) + ResultSetProvider provider; + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE master_builder=true")) { - return resultSet; + try (ResultSet result = statement.executeQuery()) + { + provider = ResultSetProvider.provideAllRows(result); + } + } catch (SQLException ex) + { + throw new CompletionException(ex); } - } catch (SQLException e) - { - FLog.severe("Failed to get player by ip:"); - FLog.severe(e); - } - - return null; + return provider; + }); } - public void removeAdmin(Admin admin) + public CompletableFuture getPlayerByIp(String ip) { - try (PreparedStatement statement = connection.prepareStatement("DELETE FROM admins where name=?")) + return CompletableFuture.supplyAsync(() -> { - statement.setString(1, admin.getName()); - statement.executeUpdate(); - } catch (SQLException e) - { - FLog.severe("Failed to remove admin:"); - FLog.severe(e); - } + ResultSetProvider provider; + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE ips LIKE %?%")) + { + statement.setString(1, ip); + try (ResultSet set = statement.executeQuery()) + { + provider = ResultSetProvider.provideSpecificRow(set); + } + } catch (SQLException e) + { + throw new CompletionException(e); + } + + return provider; + }); } - public void addBan(Ban ban) + public CompletableFuture removeAdmin(Admin admin) { - try (PreparedStatement statement = connection.prepareStatement("INSERT INTO bans VALUES (?, ?, ?, ?, ?, ?, ?)")) + return CompletableFuture.supplyAsync(() -> { - statement.setString(1, ban.getUsername()); - String uuid = null; - if (ban.hasUUID()) + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM admins where name=?")) + { + statement.setString(1, admin.getName()); + statement.executeUpdate(); + } catch (SQLException e) { - uuid = ban.getUuid().toString(); + throw new CompletionException("Failed to remove admin.", e); } - statement.setString(2, uuid); - statement.setString(3, FUtil.listToString(ban.getIps())); - statement.setString(4, ban.getBy()); - statement.setLong(5, ban.getAt().getTime()); - statement.setLong(6, ban.getExpiryUnix()); - statement.setString(7, ban.getReason()); - statement.executeUpdate(); - } catch (SQLException e) - { - FLog.severe("Failed to add ban: " + e.getMessage()); - } + return null; + }); } - public void removeBan(Ban ban) + + public CompletableFuture addBan(Ban ban) { - try + return CompletableFuture.supplyAsync(() -> { - try (PreparedStatement statement = connection.prepareStatement("DELETE FROM bans WHERE name=?")) + try (PreparedStatement statement = connection.prepareStatement("INSERT INTO bans VALUES (?, ?, ?, ?, ?, ?, ?)")) { statement.setString(1, ban.getUsername()); + String uuid = null; + if (ban.hasUUID()) + { + uuid = ban.getUuid().toString(); + } + statement.setString(2, uuid); + statement.setString(3, FUtil.listToString(ban.getIps())); + statement.setString(4, ban.getBy()); + statement.setLong(5, ban.getAt().getTime()); + statement.setLong(6, ban.getExpiryUnix()); + statement.setString(7, ban.getReason()); statement.executeUpdate(); + } catch (SQLException e) + { + throw new CompletionException("Failed to add ban.", e); } + return null; + }); + } - for (String ip : ban.getIps()) + public CompletableFuture removeBan(Ban ban) + { + return CompletableFuture.supplyAsync(() -> + { + try { - try (PreparedStatement statement = connection.prepareStatement("DELETE FROM bans WHERE ips LIKE %?%")) + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM bans WHERE name=?")) { - statement.setString(1, ip); + statement.setString(1, ban.getUsername()); statement.executeUpdate(); } + + for (String ip : ban.getIps()) + { + try (PreparedStatement statement = connection.prepareStatement("DELETE FROM bans WHERE ips LIKE %?%")) + { + statement.setString(1, ip); + statement.executeUpdate(); + } + } + } catch (SQLException e) + { + throw new CompletionException("Failed to remove ban.", e); } - } catch (SQLException e) - { - FLog.severe("Failed to remove ban: " + e.getMessage()); - } + return null; + }); } // We've changed this to read tableNotExists because it's more accurate in context. - public boolean tableNotExists(DatabaseMetaData meta, String name) throws SQLException + public CompletableFuture tableNotExists(DatabaseMetaData meta, String name) { - return !meta.getTables(null, null, name, null).next(); + return CompletableFuture.supplyAsync(() -> + { + try + { + return !meta.getTables(null, null, name, null).next(); + } catch (SQLException ex) + { + throw new CompletionException(TABLE_CHECK_FAILURE, ex); + } + }); } } \ No newline at end of file diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/util/PermissibleCompletion.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/util/PermissibleCompletion.java index 251cab732..d2c5e7032 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/util/PermissibleCompletion.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/util/PermissibleCompletion.java @@ -5,7 +5,7 @@ public class PermissibleCompletion private final String permission; private final String completion; - public PermissibleCompletion(String permission, String completion) + protected PermissibleCompletion(String permission, String completion) { this.completion = completion; this.permission = permission; diff --git a/discord/pom.xml b/discord/pom.xml index 6560804d0..f2f11df95 100644 --- a/discord/pom.xml +++ b/discord/pom.xml @@ -36,11 +36,5 @@ 3.5.4 provided - - me.totalfreedom - commons - 2023.03 - compile - \ No newline at end of file