From 997210a16ffbd60a6ee3c900b3ec0077b01e56c3 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 31 Mar 2023 00:52:53 -0500 Subject: [PATCH 01/15] Retrieving ResultSets correctly --- .../totalfreedommod/admin/Admin.java | 49 ++++---- .../totalfreedommod/admin/AdminList.java | 32 ++--- .../totalfreedommod/banning/BanManager.java | 56 ++++----- .../totalfreedommod/player/PlayerData.java | 5 +- .../totalfreedommod/player/PlayerList.java | 23 ++-- .../sql/ResultSetProvider.java | 114 ++++++++++++++++++ .../totalfreedommod/sql/SQLite.java | 66 +++++----- 7 files changed, 216 insertions(+), 129 deletions(-) create mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/sql/ResultSetProvider.java 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..3d0eae5fa 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.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"); } @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..c9ef00c97 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,7 @@ 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.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; @@ -12,10 +13,10 @@ 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.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; public class AdminList extends FreedomService { @@ -45,11 +46,19 @@ public void load() allAdmins.clear(); try { - ResultSet adminSet = plugin.sql.getAdminList(); - while (adminSet.next()) - { - tryAddAdmin(adminSet); - } + ResultSetProvider adminList = plugin.sql.getAdminList(); + AtomicInteger row = new AtomicInteger(1); + adminList.getAllRowsResultSet().forEach(adminSet -> { + 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()); + FLog.warning(e); + } + }); } catch (SQLException e) { FLog.severe("Failed to load admin list: " + e.getMessage()); @@ -59,17 +68,10 @@ public void load() 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); - } } public void messageAllAdmins(Component message) @@ -263,7 +265,7 @@ public void save(Admin admin) { try { - ResultSet currentSave = plugin.sql.getAdminByUuid(admin.getUuid()); + ResultSetProvider currentSave = plugin.sql.getAdminByUuid(admin.getUuid()); for (Map.Entry entry : admin.toSQLStorable().entrySet()) { Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue()); 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..b261a2e5a 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,9 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; +import java.sql.SQLException; +import java.util.*; + public class BanManager extends FreedomService { @@ -36,28 +30,24 @@ public void onStart() bans.clear(); try { - ResultSet banSet = plugin.sql.getBanList(); - { - while (banSet.next()) + plugin.sql.getBanList().getAllRowsResultSet().forEach(row -> { + 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) + 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); + }); + } catch (SQLException e) { FLog.severe("Failed to load ban list: " + e.getMessage()); } @@ -186,8 +176,7 @@ public void addBan(Ban ban) if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null) { removeBan(ban); - } - else + } else { for (String ip : ban.getIps()) @@ -267,8 +256,7 @@ public void onPlayerJoin(PlayerJoinEvent event) if (ban != null) { removeBan(ban); - } - else + } else { ban = getByIp(FUtil.getIp(player)); if (ban != null) 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 2872a2f80..452e087aa 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java @@ -4,6 +4,7 @@ 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; @@ -44,7 +45,7 @@ public class PlayerData private Boolean inspect = false; - public PlayerData(ResultSet resultSet) + public PlayerData(ResultSetProvider resultSet) { try { @@ -71,7 +72,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..ea9b8d312 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java @@ -5,6 +5,7 @@ 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.OfflinePlayer; @@ -42,24 +43,17 @@ public FPlayer getPlayerSync(Player player) public void loadMasterBuilders() { - ResultSet resultSet = plugin.sql.getMasterBuilders(); + ResultSetProvider resultSet = plugin.sql.getMasterBuilders(); if (resultSet == null) { return; } - try - { - while (resultSet.next()) - { - PlayerData playerData = load(resultSet); - dataMap.put(playerData.getUuid(), playerData); - } - } catch (SQLException e) - { - FLog.severe("Failed to parse master builders: " + e.getMessage()); - } + resultSet.getAllRowsResultSet().forEach(row -> { + PlayerData playerData = load(ResultSetProvider.fromRow(row)); + dataMap.put(playerData.getUuid(), playerData); + }); } public String getIp(OfflinePlayer player) @@ -128,12 +122,13 @@ public PlayerData loadByIp(String ip) return load(plugin.sql.getPlayerByIp(ip)); } - public PlayerData load(ResultSet resultSet) + public PlayerData load(ResultSetProvider resultSet) { if (resultSet == null) { return null; } + return new PlayerData(resultSet); } @@ -149,7 +144,7 @@ public void save(PlayerData player) { try { - ResultSet currentSave = plugin.sql.getPlayerByUuid(player.getUuid()); + ResultSetProvider currentSave = plugin.sql.getPlayerByUuid(player.getUuid()); for (Map.Entry entry : player.toSQLStorable().entrySet()) { Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue()); 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..b3cb73737 --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/ResultSetProvider.java @@ -0,0 +1,114 @@ +package me.totalfreedom.totalfreedommod.sql; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Wrapper; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +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 CompletableFuture provideAllRows(ResultSet resultSet) + { + return CompletableFuture.supplyAsync(() -> + { + try + { + return new ResultSetProvider(resultSet, true); + } catch (SQLException e) + { + return null; + } + }); + } + + public static CompletableFuture provideSpecificRow(ResultSet resultSet) throws SQLException + { + return CompletableFuture.supplyAsync(() -> { + try + { + return new ResultSetProvider(resultSet, false); + } catch (SQLException e) + { + throw new RuntimeException(e); // We don't want to handle this exception, we want the delegate to handle it instead. + } + }); + } + + 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..e595edea2 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/SQLite.java @@ -125,14 +125,20 @@ public void truncate(String table) } } - public ResultSet getBanList() throws SQLException + public ResultSetProvider getBanList() throws SQLException { - return connection.prepareStatement("SELECT * FROM bans").executeQuery(); + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans")) + { + return ResultSetProvider.provideAllRows(statement.executeQuery()).join(); + } } - public ResultSet getAdminList() throws SQLException + public ResultSetProvider getAdminList() throws SQLException { - return connection.prepareStatement("SELECT * FROM admins").executeQuery(); + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans")) + { + return ResultSetProvider.provideAllRows(statement.executeQuery()).join(); + } } public void setAdminValue(Admin admin, String key, Object value) @@ -191,21 +197,21 @@ public PreparedStatement setUnknownType(PreparedStatement statement, int index, return statement; } - public Object getValue(ResultSet resultSet, String key, Object value) throws SQLException + public Object getValue(ResultSetProvider provider, String key, Object value) throws SQLException { 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; } @@ -256,17 +262,12 @@ public void addPlayer(PlayerData player) } } - public ResultSet getAdminByUuid(UUID uuid) + public ResultSetProvider getAdminByUuid(UUID uuid) { - try + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM admins WHERE uuid=?")) { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM admins WHERE uuid=?"); statement.setString(1, uuid.toString()); - ResultSet resultSet = statement.executeQuery(); - if (resultSet.next()) - { - return resultSet; - } + return ResultSetProvider.provideSpecificRow(statement.executeQuery()).join(); } catch (SQLException e) { FLog.severe("Failed to get admin by name:"); @@ -276,18 +277,12 @@ public ResultSet getAdminByUuid(UUID uuid) return null; } - public ResultSet getPlayerByUuid(UUID uuid) + public ResultSetProvider getPlayerByUuid(UUID uuid) { - try + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE uuid=?")) { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE uuid=?"); - statement.setString(1, uuid.toString()); - ResultSet resultSet = statement.executeQuery(); - - if (resultSet.next()) - { - return resultSet; - } + statement.setString(1, uuid.toString()); + return ResultSetProvider.provideSpecificRow(statement.executeQuery()).join(); } catch (SQLException e) { FLog.severe("Failed to get player by UUID:"); @@ -297,11 +292,11 @@ public ResultSet getPlayerByUuid(UUID uuid) return null; } - public ResultSet getMasterBuilders() + public ResultSetProvider getMasterBuilders() { - try + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE master_builder=true")) { - return connection.prepareStatement("SELECT * FROM players WHERE master_builder=true").executeQuery(); + return ResultSetProvider.provideAllRows(statement.executeQuery()).join(); } catch (SQLException e) { FLog.severe("Failed to get Master Builders:"); @@ -311,17 +306,12 @@ public ResultSet getMasterBuilders() return null; } - public ResultSet getPlayerByIp(String ip) + public ResultSetProvider getPlayerByIp(String ip) { - try + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE ips LIKE %?%")) { - PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE ips LIKE %?%"); statement.setString(1, ip); - ResultSet resultSet = statement.executeQuery(); - if (resultSet.next()) - { - return resultSet; - } + return ResultSetProvider.provideSpecificRow(statement.executeQuery()).join(); } catch (SQLException e) { FLog.severe("Failed to get player by ip:"); From 0d0fbf2c0499986654d85ae3956fe12cf3a7a590 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 31 Mar 2023 17:21:19 -0500 Subject: [PATCH 02/15] Implement sql properly --- .../totalfreedommod/admin/AdminList.java | 69 +- .../totalfreedommod/banning/BanManager.java | 58 +- .../command/Command_mbconfig.java | 47 +- .../totalfreedommod/player/PlayerList.java | 102 ++- .../sql/ResultSetProvider.java | 33 +- .../totalfreedommod/sql/SQLite.java | 629 ++++++++++++------ 6 files changed, 623 insertions(+), 315 deletions(-) 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 c9ef00c97..a01e6ab02 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/AdminList.java @@ -13,14 +13,15 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -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(); @@ -44,11 +45,11 @@ public void onStop() public void load() { allAdmins.clear(); - try + plugin.sql.getAdminList().thenAcceptAsync(provider -> { - ResultSetProvider adminList = plugin.sql.getAdminList(); AtomicInteger row = new AtomicInteger(1); - adminList.getAllRowsResultSet().forEach(adminSet -> { + provider.getAllRowsResultSet().forEach(adminSet -> + { try { tryAddAdmin(ResultSetProvider.fromRow(adminSet)); @@ -56,22 +57,25 @@ public void load() } catch (Throwable e) { FLog.warning("An error occurred whilst reading the admin entry at row #" + row.get()); - FLog.warning(e); + throw new CompletionException(e); // handle downstream. } }); - } catch (SQLException e) + }).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(ResultSetProvider adminSet) { - Admin admin = new Admin(adminSet); - allAdmins.add(admin); + Admin admin = new Admin(adminSet); + allAdmins.add(admin); } public void messageAllAdmins(Component message) @@ -200,7 +204,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) @@ -218,7 +228,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; } @@ -263,21 +279,30 @@ public Set getAdminIps() public void save(Admin admin) { - try + plugin.sql.getAdminByUuid(admin.getUuid()).thenApplyAsync(result -> { - ResultSetProvider 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 b261a2e5a..96c8c81e4 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java @@ -12,7 +12,6 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerLoginEvent; -import java.sql.SQLException; import java.util.*; public class BanManager extends FreedomService @@ -28,9 +27,17 @@ public class BanManager extends FreedomService public void onStart() { bans.clear(); - try + + plugin.sql.getBanList().whenComplete((result, throwable) -> { - plugin.sql.getBanList().getAllRowsResultSet().forEach(row -> { + if (throwable != null) + { + FLog.severe("Failed to load ban list: " + throwable.getMessage()); + return; + } + + result.getAllRowsResultSet().forEach(row -> + { ResultSetProvider banSet = ResultSetProvider.fromRow(row); String name = banSet.getString("name"); UUID uuid = null; @@ -47,10 +54,7 @@ public void onStart() Ban ban = new Ban(name, uuid, ips, by, at, expires, reason); bans.add(ban); }); - } catch (SQLException e) - { - FLog.severe("Failed to load ban list: " + e.getMessage()); - } + }); // Remove expired bans, repopulate ipBans and nameBans, updateViews(); @@ -191,8 +195,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(); + }); } } @@ -201,8 +213,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(); + }); } } @@ -212,7 +232,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; } @@ -274,7 +300,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()); + } + }); } } 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..b0fb71d6c 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,7 @@ package me.totalfreedom.totalfreedommod.command; import me.totalfreedom.totalfreedommod.player.PlayerData; +import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; @@ -26,13 +27,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 +55,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 +99,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) { @@ -131,7 +150,7 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } return true; } - case "remove": + case "remove" -> { if (args.length < 2) { @@ -161,7 +180,7 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } return true; } - default: + default -> { return false; } 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 ea9b8d312..3170b6dc4 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java @@ -8,12 +8,14 @@ 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 { @@ -43,16 +45,17 @@ public FPlayer getPlayerSync(Player player) public void loadMasterBuilders() { - ResultSetProvider 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; + } - resultSet.getAllRowsResultSet().forEach(row -> { - PlayerData playerData = load(ResultSetProvider.fromRow(row)); - dataMap.put(playerData.getUuid(), playerData); + result.getAllRowsResultSet().forEach(row -> + { + PlayerData playerData = load(ResultSetProvider.fromRow(row)); + dataMap.put(playerData.getUuid(), playerData); + }); }); } @@ -85,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) @@ -114,12 +114,52 @@ 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(ResultSetProvider resultSet) @@ -142,21 +182,27 @@ public void syncIps(Admin admin) public void save(PlayerData player) { - try - { - ResultSetProvider 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) @@ -184,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/sql/ResultSetProvider.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/ResultSetProvider.java index b3cb73737..6118d399a 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/ResultSetProvider.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/sql/ResultSetProvider.java @@ -2,15 +2,10 @@ import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Wrapper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BiConsumer; -import java.util.function.Consumer; public class ResultSetProvider { @@ -40,34 +35,18 @@ private ResultSetProvider(ResultSet resultSet, boolean allRows) throws SQLExcept } } - public static CompletableFuture provideAllRows(ResultSet resultSet) + public static ResultSetProvider provideAllRows(ResultSet resultSet) throws SQLException { - return CompletableFuture.supplyAsync(() -> - { - try - { - return new ResultSetProvider(resultSet, true); - } catch (SQLException e) - { - return null; - } - }); + return new ResultSetProvider(resultSet, true); } - public static CompletableFuture provideSpecificRow(ResultSet resultSet) throws SQLException + public static ResultSetProvider provideSpecificRow(ResultSet resultSet) throws SQLException { - return CompletableFuture.supplyAsync(() -> { - try - { - return new ResultSetProvider(resultSet, false); - } catch (SQLException e) - { - throw new RuntimeException(e); // We don't want to handle this exception, we want the delegate to handle it instead. - } - }); + return new ResultSetProvider(resultSet, false); } - public static ResultSetProvider fromRow(Map row) { + public static ResultSetProvider fromRow(Map row) + { return new ResultSetProvider(row); } 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 e595edea2..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,148 +65,293 @@ 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 ResultSetProvider getBanList() throws SQLException + private CompletableFuture createBanTable() { - try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans")) + return CompletableFuture.supplyAsync(() -> { - return ResultSetProvider.provideAllRows(statement.executeQuery()).join(); - } + 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 ResultSetProvider getAdminList() throws SQLException + public CompletableFuture truncate(String table) { - try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM bans")) + return CompletableFuture.supplyAsync(() -> { - return ResultSetProvider.provideAllRows(statement.executeQuery()).join(); - } + 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(ResultSetProvider provider, String key, Object value) throws SQLException + public Object getValue(ResultSetProvider provider, String key, Object value) { Object result = null; if (value instanceof String) @@ -216,174 +370,223 @@ public Object getValue(ResultSetProvider provider, String key, Object value) thr 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 ResultSetProvider getAdminByUuid(UUID uuid) + public CompletableFuture addPlayer(PlayerData player) { - try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM admins WHERE uuid=?")) + return CompletableFuture.supplyAsync(() -> { - statement.setString(1, uuid.toString()); - return ResultSetProvider.provideSpecificRow(statement.executeQuery()).join(); - } catch (SQLException e) - { - FLog.severe("Failed to get admin by name:"); - FLog.severe(e); - } - - return null; + 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) + { + throw new CompletionException("Failed to add player.", e); + } + return null; + }); } - public ResultSetProvider getPlayerByUuid(UUID uuid) + public CompletableFuture getAdminByUuid(UUID uuid) { - try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE uuid=?")) + return CompletableFuture.supplyAsync(() -> { - statement.setString(1, uuid.toString()); - return ResultSetProvider.provideSpecificRow(statement.executeQuery()).join(); - } catch (SQLException e) - { - FLog.severe("Failed to get player by UUID:"); - FLog.severe(e); - } - - return null; + 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) + { + throw new CompletionException(ex); + } + return provider; + }); } - public ResultSetProvider getMasterBuilders() + public CompletableFuture getPlayerByUuid(UUID uuid) { - try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE master_builder=true")) + return CompletableFuture.supplyAsync(() -> { - return ResultSetProvider.provideAllRows(statement.executeQuery()).join(); - } 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 ResultSetProvider getPlayerByIp(String ip) + public CompletableFuture getMasterBuilders() { - try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE ips LIKE %?%")) + return CompletableFuture.supplyAsync(() -> { - statement.setString(1, ip); - return ResultSetProvider.provideSpecificRow(statement.executeQuery()).join(); - } catch (SQLException e) - { - FLog.severe("Failed to get player by ip:"); - FLog.severe(e); - } - - return null; + ResultSetProvider provider; + try (PreparedStatement statement = connection.prepareStatement("SELECT * FROM players WHERE master_builder=true")) + { + try (ResultSet result = statement.executeQuery()) + { + provider = ResultSetProvider.provideAllRows(result); + } + } catch (SQLException ex) + { + throw new CompletionException(ex); + } + 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 From a3530ad143005fd9ecb7b6e0466a6d7b1ceb165e Mon Sep 17 00:00:00 2001 From: Paldiu Date: Fri, 31 Mar 2023 21:41:28 -0500 Subject: [PATCH 03/15] Fixed a code discrepancy. --- .../totalfreedommod/banning/BanManager.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) 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 96c8c81e4..9721ca4c5 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/banning/BanManager.java @@ -35,7 +35,7 @@ public void onStart() FLog.severe("Failed to load ban list: " + throwable.getMessage()); return; } - + result.getAllRowsResultSet().forEach(row -> { ResultSetProvider banSet = ResultSetProvider.fromRow(row); @@ -53,13 +53,12 @@ public void onStart() 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."); }); }); - - // Remove expired bans, repopulate ipBans and nameBans, - updateViews(); - - FLog.info("Loaded " + ipBans.size() + " IP bans and " + nameBans.size() + " username bans."); } @Override @@ -334,4 +333,4 @@ private void updateViews() } } } -} \ No newline at end of file +} From e2d7f6ebcbd367580055c14ae47156bda87f03b4 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 7 Apr 2023 16:06:11 -0500 Subject: [PATCH 04/15] Adjusting some stuff :) --- .../totalfreedommod/admin/Admin.java | 20 +- .../totalfreedommod/admin/AdminList.java | 17 +- .../totalfreedommod/command/Command_deop.java | 17 +- .../command/Command_deopall.java | 32 ++- .../command/Command_mbconfig.java | 42 ++- .../totalfreedommod/command/Command_op.java | 16 +- .../command/Command_opall.java | 27 +- .../totalfreedommod/command/Command_opme.java | 11 +- .../command/Command_saconfig.java | 270 +++++++++--------- .../command/FreedomCommand.java | 29 +- .../totalfreedommod/perms/GroupWrapper.java | 48 ++++ .../totalfreedommod/perms/TrackWrapper.java | 37 +++ .../totalfreedommod/perms/UserData.java | 80 ++++++ .../totalfreedommod/perms/UserWrapper.java | 107 +++++++ .../totalfreedommod/player/PlayerList.java | 2 +- .../rank/DisplayableGroup.java | 6 - .../totalfreedommod/rank/GroupProvider.java | 38 ++- .../totalfreedommod/rank/Hierarchy.java | 230 +++++++-------- .../rank/HierarchyProvider.java | 11 - .../totalfreedommod/rank/RankManager.java | 26 +- discord/pom.xml | 6 - 21 files changed, 687 insertions(+), 385 deletions(-) create mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java create mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java create mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java create mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java delete mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/rank/HierarchyProvider.java 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..ce491f8b4 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/admin/Admin.java @@ -38,7 +38,7 @@ public Admin(ResultSet resultSet) { this.uuid = UUID.fromString(resultSet.getString("uuid")); this.active = resultSet.getBoolean("active"); - this.rank = GroupProvider.fromArgument(resultSet.getString("rank")).getGroup(); + 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")); @@ -70,15 +70,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..6ba49090d 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,7 @@ import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.rank.GroupProvider; +import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; import net.kyori.adventure.text.Component; @@ -106,9 +107,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 +126,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) 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..c901c1372 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,9 @@ package me.totalfreedom.totalfreedommod.command; -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 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; @@ -39,12 +38,18 @@ 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.wasSuccessful()) { + msgNew(" is already non-op.", Placeholder.unparsed("player", player.getName())); return; } 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..7c70cf8c4 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,9 @@ package me.totalfreedom.totalfreedommod.command; -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 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 +19,24 @@ 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.wasSuccessful()) { + msgNew(" is already non-OP.", Placeholder.unparsed("player", player.getName())); + return; + } + + msg(player, YOU_ARE_NOT_OP); + plugin.rm.updateDisplay(player); + })); return true; } 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..f7125ee3e 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,9 +1,13 @@ package me.totalfreedom.totalfreedommod.command; +import com.earth2me.essentials.commands.PlayerNotFoundException; import me.totalfreedom.totalfreedommod.player.PlayerData; +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; +import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -120,6 +124,7 @@ 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) { @@ -143,23 +148,34 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return noPerms(); } - Player player = getPlayer(args[1]); - PlayerData data = player != null ? plugin.pl.getData(player) : plugin.pl.getData(args[1]); - - if (data == null || !data.isMasterBuilder()) + try { - msg("Master Builder not found: " + args[1]); - return true; - } + OfflinePlayer player = getOfflinePlayer(args[1]); + PlayerData data = plugin.pl.getData(args[1]); - FUtil.adminAction(sender.getName(), "Removing " + data.getName() + " from the Master Builder list", true); - data.setMasterBuilder(false); - plugin.pl.save(data); - if (player != null) + if (data == null || !data.isMasterBuilder()) + { + 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.isOnline()) + { + // This is not null because the player is online, so we can safely call this method. + plugin.rm.updateDisplay(player.getPlayer()); + } + + return true; + } catch (PlayerNotFoundException e) { - plugin.rm.updateDisplay(player); + msgNew("Player not found: ", arg(args[1])); + return true; } - return true; } default: { 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..750a6e18c 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,8 @@ package me.totalfreedom.totalfreedommod.command; -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 net.luckperms.api.model.user.User; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -40,15 +38,21 @@ 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.wasSuccessful()) + { + msgNew(" is already OP!", player(player)); + } + msg(player, YOU_ARE_OP); plugin.rm.updateDisplay(player); if (!atomicBoolean.get()) 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..6ecd3bebc 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,8 @@ package me.totalfreedom.totalfreedommod.command; -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 net.luckperms.api.model.user.User; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -19,20 +17,19 @@ 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((ignored, 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); - }); - }); + msg(player, YOU_ARE_OP); + plugin.rm.updateDisplay(player); + })); 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..14b17427f 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,8 @@ package me.totalfreedom.totalfreedommod.command; -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 net.luckperms.api.model.user.User; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -18,9 +16,10 @@ 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; } 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..58f7e3cd6 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 @@ -5,14 +5,13 @@ 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 +72,77 @@ 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()); - } - - msgNew("Set 's rank to .", Placeholder.unparsed("admin", admin.getName()), Placeholder.component("rank", rank.getName())); + 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.wasSuccessful() || result.getGroupTo().isEmpty()) + { + msgNew("Failed to promote 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.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()); + } + + 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 promoted to ", + player(player), + Placeholder.unparsed("rank", group)); + }, () -> msgNew("Failed to promote to the next rank.", player(player))); + }); return true; } @@ -173,78 +177,87 @@ 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.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(); + 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()); + } + + 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 +273,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); @@ -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/FreedomCommand.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java index ba21ec2e7..f59d82e76 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/FreedomCommand.java @@ -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,7 +23,6 @@ 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.*; @@ -160,7 +160,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 +179,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()) @@ -232,6 +251,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 +371,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/perms/GroupWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java new file mode 100644 index 000000000..08079a4b5 --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java @@ -0,0 +1,48 @@ +package me.totalfreedom.totalfreedommod.perms; + +import net.luckperms.api.model.group.Group; +import net.luckperms.api.model.group.GroupManager; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class GroupWrapper +{ + private final GroupManager manager; + private final Set groupSet; + + public GroupWrapper(GroupManager manager) + { + this.manager = manager; + this.groupSet = manager.getLoadedGroups(); + } + + public CompletableFuture getGroup(String name) + { + if (!manager.isLoaded(name) || !groupSet.contains(manager.getGroup(name))) + { + return manager.createAndLoadGroup(name); + } + + return CompletableFuture.supplyAsync(() -> manager.getGroup(name)); + } + + public CompletableFuture removeGroup(String name) + { + return getGroup(name).thenAccept(a -> + { + manager.deleteGroup(a); + groupSet.remove(a); + }); + } + + public CompletableFuture addGroup(String name) + { + return getGroup(name).thenAccept(groupSet::add); + } + + public CompletableFuture saveGroup(String name) + { + return 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..8d2f244c0 --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java @@ -0,0 +1,37 @@ +package me.totalfreedom.totalfreedommod.perms; + +import net.luckperms.api.track.Track; +import net.luckperms.api.track.TrackManager; + +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 = 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 CompletableFuture saveTrack(String name) + { + return 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..3ba2e5b5b --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java @@ -0,0 +1,80 @@ +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 clone() + { + return new UserData(user, metaData, permissionData, contextSet, queryOptions); + } +} 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..b4cf794df --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java @@ -0,0 +1,107 @@ +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.model.user.UserManager; +import net.luckperms.api.platform.PlayerAdapter; +import net.luckperms.api.query.QueryOptions; +import org.bukkit.OfflinePlayer; +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 userSet; + private final Set userDataSet; + + public UserWrapper(UserManager manager, PlayerAdapter adapter) + { + this.manager = manager; + this.userSet = manager.getLoadedUsers(); + this.playerAdapter = adapter; + this.userDataSet = new HashSet<>(); + } + + public CompletableFuture addUserData(OfflinePlayer 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(OfflinePlayer player) + { + if (!manager.isLoaded(player.getUniqueId()) || !userSet.contains(manager.getUser(player.getUniqueId()))) + { + return manager.loadUser(player.getUniqueId()); + } + + return CompletableFuture.supplyAsync(() -> manager.getUser(player.getUniqueId())); + } + + public CompletableFuture removeUser(OfflinePlayer player) + { + return getUser(player).thenAccept(a -> + { + manager.cleanupUser(a); + userSet.remove(a); + }); + } + + public CompletableFuture getUserData(OfflinePlayer player) + { + return getUser(player).thenApply(user -> + { + for (UserData userData : userDataSet) + { + if (userData.getUser().getUniqueId().equals(user.getUniqueId())) + { + return userData; + } + } + return null; + }); + } + + public CompletableFuture removeUserData(OfflinePlayer player) + { + return getUserData(player).thenAccept(userDataSet::remove); + } + + public CompletableFuture updateUserData(OfflinePlayer player) + { + return getUserData(player).thenApply(userData -> + { + UserData newData = userData.clone(); + 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 CompletableFuture saveUser(User user) + { + return CompletableFuture.runAsync(() -> manager.saveUser(user)); + } +} 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..6c11ed0b4 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java @@ -104,7 +104,7 @@ public boolean isTelnetMasterBuilder(PlayerData playerData) } // May not return null - public FPlayer getPlayer(Player player) + public FPlayer getPlayer(OfflinePlayer player) { FPlayer tPlayer = playerMap.get(player.getUniqueId()); if (tPlayer != null) 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..40f39a706 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,8 @@ 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 org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -16,11 +16,11 @@ 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 User getUser(Player player) { @@ -30,16 +30,26 @@ 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..9ddc0c37f 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,179 @@ 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.model.group.Group; -import net.luckperms.api.model.user.User; -import net.luckperms.api.query.QueryOptions; +import net.luckperms.api.node.NodeEqualityPredicate; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.node.types.InheritanceNode; +import net.luckperms.api.track.DemotionResult; import net.luckperms.api.track.PromotionResult; import net.luckperms.api.track.Track; +import org.bukkit.OfflinePlayer; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.AtomicBoolean; 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; - public Hierarchy(String name) + private Hierarchy() { - this.lp = TotalFreedomMod.getPlugin().lpb.getAPI(); - - if (lp == null) - { - throw new IllegalStateException("LuckPerms not found!"); - } - - 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 void addGroup(DisplayableGroup group) - { - updateAppend(group.getLuckPermsGroup()).join(); // wait for the group to be updated. + 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(), + TotalFreedomMod.getPlugin().lpb.getAPI().getPlayerAdapter(OfflinePlayer.class)); } - public void addGroup(Group group, int index) + public static Hierarchy getHierarchy() { - updateInsert(group, index).join(); // wait for the group to be updated. + return hierarchy; } - public void dropGroup(Group group) // This is non-blocking by default. + public boolean isUserOnAdminTrack(OfflinePlayer player) { - updateDrop(group).whenComplete((ignored, throwable) -> + AtomicBoolean isOnAdminTrack = new AtomicBoolean(false); + userWrapper.getUser(player).thenAccept(user -> + user.data().toCollection().stream() + .filter(NodeType.INHERITANCE::matches) + .map(NodeType.INHERITANCE::cast) + .filter(NodeEqualityPredicate.ONLY_KEY + .equalTo(InheritanceNode + .builder(GroupProvider.ADMIN.getGroup().getLuckPermsGroup().getName()) + .build())) + .forEach(node -> + { + if (node.getGroupName().startsWith("admin")) + { + isOnAdminTrack.set(true); + } + })).whenComplete((a, b) -> { - if (throwable != null) + if (b != null) { - FLog.severe("Failed to update track " + track.getName()); + FLog.severe(b); } }); + + return isOnAdminTrack.get(); } - public void addGroupNonBlocking(Group group, int index) + public Track op() { - updateInsert(group, index).whenComplete((ignored, throwable) -> - { - if (throwable != null) - { - FLog.severe("Failed to update track " + track.getName()); - } - }); + return trackWrapper.getTrack("OP").join(); } - public CompletableFuture trackUser(User user) + public Track builder() { - 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 trackWrapper.getTrack("BUILDER").join(); } - public CompletableFuture promoteUser(User user) + public Track admin() { - boolean empty = user.getInheritedGroups(QueryOptions.defaultContextualOptions()) - .stream() - .filter(group -> track.getGroups().contains(group.getName())) - .findFirst() - .isEmpty(); + return trackWrapper.getTrack("ADMIN").join(); + } - if (empty) trackUser(user).whenComplete((ignored, throwable) -> + 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 track user " + user.getFriendlyName()); + FLog.severe(b); } }); + } - return CompletableFuture.supplyAsync(() -> - { - AtomicReference result = new AtomicReference<>(); - lp.getContextManager() - .getContext(user) - .ifPresent(context -> result.set(track.promote(user, context))); - return result.get(); - }); + public Group getGroup(String name) { + return groupWrapper.getGroup(name).join(); } - public void dropUserFromAll(User user) + public void addGroupToTrack(Track track, DisplayableGroup group) { - for (String group : track.getGroups()) + trackWrapper.getTrack(track.getName()).thenAccept(t -> { - dropUserFromGroup(user, fromName(group)) - .whenComplete((ignored, throwable) -> + t.appendGroup(group.getLuckPermsGroup()); + trackWrapper.saveTrack(t.getName()); + }).whenComplete((a, b) -> + { + 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); - }); - } - } - - public CompletableFuture demoteUser(User user) - { - return CompletableFuture.supplyAsync(() -> { - lp.getContextManager() - .getContext(user) - .ifPresent(context -> track.demote(user, context)); - return null; + FLog.severe(b); + } }); } - public CompletableFuture dropUserFromGroup(User user, Group group) + public CompletableFuture promoteUser(Track track, OfflinePlayer 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, OfflinePlayer 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, OfflinePlayer player) { - return CompletableFuture.supplyAsync(() -> + userWrapper.getUserData(player).thenAccept(user -> { - if (!track.containsGroup(group.getName())) + for (InheritanceNode node : group.getLuckPermsGroup().getNodes(NodeType.INHERITANCE)) { - track.appendGroup(group); + user.getUser().data().add(node); } - return null; - }); - } - public CompletableFuture updateInsert(Group group, int index) - { - return CompletableFuture.supplyAsync(() -> + user.getUser().getInheritedGroups(user.getQueryOptions()).add(group.getLuckPermsGroup()); + + userWrapper.saveUser(user.getUser()); + }).whenComplete((a, b) -> { - if (!track.containsGroup(group)) + if (b != null) { - track.insertGroup(group, index); + FLog.severe(b); } - return null; }); } - public CompletableFuture updateDrop(Group group) + public void dropUserFromAll(Track track, OfflinePlayer player) { - return CompletableFuture.supplyAsync(() -> + userWrapper.getUserData(player).thenAccept(data -> { - if (track.containsGroup(group)) + for (String group : track.getGroups()) { - track.removeGroup(group); + groupWrapper.getGroup(group).whenComplete((g, b) -> + { + if (b != null) + { + FLog.severe(b); + return; + } + + for (InheritanceNode node : g.getNodes(NodeType.INHERITANCE)) + { + data.getUser().data().remove(node); + } + }); + } + userWrapper.saveUser(data.getUser()); + }).whenComplete((a, b) -> + { + if (b != null) + { + FLog.severe(b); } - - return null; }); } } 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..f2d9c3d44 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java @@ -25,11 +25,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 +77,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 +143,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) 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 From 71fe940049dde33c3217958f4a92f819290296c1 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 7 Apr 2023 16:09:23 -0500 Subject: [PATCH 05/15] Oops --- .../java/me/totalfreedom/totalfreedommod/player/PlayerList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6c11ed0b4..d04871110 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerList.java @@ -104,7 +104,7 @@ public boolean isTelnetMasterBuilder(PlayerData playerData) } // May not return null - public FPlayer getPlayer(OfflinePlayer player) + public FPlayer getPlayer(Player player) { FPlayer tPlayer = playerMap.get(player.getUniqueId()); if (tPlayer != null) From 6566c7f305c4cbf43e950a5a8741b8fdc6acd4eb Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 7 Apr 2023 16:22:43 -0500 Subject: [PATCH 06/15] Fixed some dumb shit --- .../command/Command_mbconfig.java | 38 ++++++------------- .../totalfreedommod/perms/UserWrapper.java | 17 ++++----- .../totalfreedommod/rank/Hierarchy.java | 19 +++++----- 3 files changed, 30 insertions(+), 44 deletions(-) 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 f7125ee3e..2e3b9fa4c 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,13 +1,11 @@ package me.totalfreedom.totalfreedommod.command; -import com.earth2me.essentials.commands.PlayerNotFoundException; import me.totalfreedom.totalfreedommod.player.PlayerData; 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; -import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -148,34 +146,22 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return noPerms(); } - try - { - OfflinePlayer player = getOfflinePlayer(args[1]); - PlayerData data = plugin.pl.getData(args[1]); - - if (data == null || !data.isMasterBuilder()) - { - msgNew("Master Builder not found: ", arg(args[1])); - return true; - } + Player player = getPlayer(args[1]); + PlayerData data = plugin.pl.getData(args[1]); - 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.isOnline()) - { - // This is not null because the player is online, so we can safely call this method. - plugin.rm.updateDisplay(player.getPlayer()); - } - - return true; - } catch (PlayerNotFoundException e) + if (player == null || data == null || !data.isMasterBuilder()) { - msgNew("Player not found: ", arg(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); + plugin.rm.updateDisplay(player); + + return true; } default: { diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java index b4cf794df..9495dd89d 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java @@ -7,7 +7,6 @@ import net.luckperms.api.model.user.UserManager; import net.luckperms.api.platform.PlayerAdapter; import net.luckperms.api.query.QueryOptions; -import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import java.util.HashSet; @@ -17,11 +16,11 @@ public class UserWrapper { private final UserManager manager; - private final PlayerAdapter playerAdapter; + private final PlayerAdapter playerAdapter; private final Set userSet; private final Set userDataSet; - public UserWrapper(UserManager manager, PlayerAdapter adapter) + public UserWrapper(UserManager manager, PlayerAdapter adapter) { this.manager = manager; this.userSet = manager.getLoadedUsers(); @@ -29,7 +28,7 @@ public UserWrapper(UserManager manager, PlayerAdapter adapter) this.userDataSet = new HashSet<>(); } - public CompletableFuture addUserData(OfflinePlayer player) + public CompletableFuture addUserData(Player player) { User user = playerAdapter.getUser(player); CachedPermissionData permissionData = playerAdapter.getPermissionData(player); @@ -41,7 +40,7 @@ public CompletableFuture addUserData(OfflinePlayer player) return CompletableFuture.runAsync(() -> userDataSet.add(userData)); } - public CompletableFuture getUser(OfflinePlayer player) + public CompletableFuture getUser(Player player) { if (!manager.isLoaded(player.getUniqueId()) || !userSet.contains(manager.getUser(player.getUniqueId()))) { @@ -51,7 +50,7 @@ public CompletableFuture getUser(OfflinePlayer player) return CompletableFuture.supplyAsync(() -> manager.getUser(player.getUniqueId())); } - public CompletableFuture removeUser(OfflinePlayer player) + public CompletableFuture removeUser(Player player) { return getUser(player).thenAccept(a -> { @@ -60,7 +59,7 @@ public CompletableFuture removeUser(OfflinePlayer player) }); } - public CompletableFuture getUserData(OfflinePlayer player) + public CompletableFuture getUserData(Player player) { return getUser(player).thenApply(user -> { @@ -75,12 +74,12 @@ public CompletableFuture getUserData(OfflinePlayer player) }); } - public CompletableFuture removeUserData(OfflinePlayer player) + public CompletableFuture removeUserData(Player player) { return getUserData(player).thenAccept(userDataSet::remove); } - public CompletableFuture updateUserData(OfflinePlayer player) + public CompletableFuture updateUserData(Player player) { return getUserData(player).thenApply(userData -> { 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 9ddc0c37f..35564afce 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java @@ -12,7 +12,7 @@ import net.luckperms.api.track.DemotionResult; import net.luckperms.api.track.PromotionResult; import net.luckperms.api.track.Track; -import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; @@ -29,7 +29,7 @@ private Hierarchy() 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(), - TotalFreedomMod.getPlugin().lpb.getAPI().getPlayerAdapter(OfflinePlayer.class)); + TotalFreedomMod.getPlugin().lpb.getAPI().getPlayerAdapter(Player.class)); } public static Hierarchy getHierarchy() @@ -37,7 +37,7 @@ public static Hierarchy getHierarchy() return hierarchy; } - public boolean isUserOnAdminTrack(OfflinePlayer player) + public boolean isUserOnAdminTrack(Player player) { AtomicBoolean isOnAdminTrack = new AtomicBoolean(false); userWrapper.getUser(player).thenAccept(user -> @@ -95,7 +95,8 @@ public void addInheritance(DisplayableGroup previous, DisplayableGroup current) }); } - public Group getGroup(String name) { + public Group getGroup(String name) + { return groupWrapper.getGroup(name).join(); } @@ -114,19 +115,19 @@ public void addGroupToTrack(Track track, DisplayableGroup group) }); } - public CompletableFuture promoteUser(Track track, OfflinePlayer player) + public CompletableFuture promoteUser(Track track, Player player) { return userWrapper.getUserData(player).thenApply(data -> track.promote(data.getUser(), data.getContextSet())); } - public CompletableFuture demoteUser(Track track, OfflinePlayer player) + public CompletableFuture demoteUser(Track track, Player player) { return userWrapper.getUserData(player).thenApply(data -> - track.demote(data.getUser(), data.getContextSet())); + track.demote(data.getUser(), data.getContextSet())); } - public void addUserToGroup(DisplayableGroup group, OfflinePlayer player) + public void addUserToGroup(DisplayableGroup group, Player player) { userWrapper.getUserData(player).thenAccept(user -> { @@ -147,7 +148,7 @@ public void addUserToGroup(DisplayableGroup group, OfflinePlayer player) }); } - public void dropUserFromAll(Track track, OfflinePlayer player) + public void dropUserFromAll(Track track, Player player) { userWrapper.getUserData(player).thenAccept(data -> { From 7967bfc9f89b1387b8a91d74b17b533ce26c30e2 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 7 Apr 2023 16:28:13 -0500 Subject: [PATCH 07/15] Dumb thing 1 --- .../me/totalfreedom/totalfreedommod/perms/TrackWrapper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java index 8d2f244c0..d54219440 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java @@ -3,6 +3,7 @@ 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; @@ -14,7 +15,8 @@ public class TrackWrapper public TrackWrapper(TrackManager manager) { this.manager = manager; - this.trackSet = manager.getLoadedTracks(); + this.trackSet = new HashSet<>(); + trackSet.addAll(manager.getLoadedTracks()); } public CompletableFuture getTrack(String name) From 198f1d3acf138cc389ca49091195c93820f6b049 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 7 Apr 2023 16:35:12 -0500 Subject: [PATCH 08/15] Another stupid fix. --- .../totalfreedommod/player/PlayerData.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) 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..d4ecf7c58 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java @@ -55,12 +55,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()); From 3dde5ef578185c980d63d2cb10be4fbbeb5bbbb4 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 7 Apr 2023 17:37:56 -0500 Subject: [PATCH 09/15] More fixes --- .../totalfreedommod/command/Command_deop.java | 3 +- .../command/Command_deopall.java | 3 +- .../totalfreedommod/command/Command_op.java | 7 +- .../command/Command_opall.java | 10 +- .../totalfreedommod/command/Command_opme.java | 6 + .../command/Command_saconfig.java | 107 ++++++++++-------- .../totalfreedommod/perms/UserWrapper.java | 13 +-- .../totalfreedommod/player/PlayerData.java | 2 - .../totalfreedommod/rank/Hierarchy.java | 79 ++++++++++++- .../totalfreedommod/rank/RankManager.java | 9 ++ 10 files changed, 169 insertions(+), 70 deletions(-) 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 c901c1372..01ff29521 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 @@ -48,7 +48,7 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return; } - if (!result.wasSuccessful()) { + if (result == null || !result.wasSuccessful()) { msgNew(" is already non-op.", Placeholder.unparsed("player", player.getName())); return; } @@ -60,6 +60,7 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin { FUtil.adminAction(sender.getName(), "De-opping " + player.getName(), false); } + Hierarchy.getHierarchy().updateUserData(player); }); return true; 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 7c70cf8c4..31114e850 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 @@ -29,13 +29,14 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return; } - if (!result.wasSuccessful()) { + 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); + Hierarchy.getHierarchy().updateUserData(player); })); return true; 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 750a6e18c..6861bbb27 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 @@ -48,13 +48,18 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return; } - if (!result.wasSuccessful()) + 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); + Hierarchy.getHierarchy().updateUserData(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 6ecd3bebc..ee1f0280d 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 @@ -17,7 +17,7 @@ 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 -> - Hierarchy.getHierarchy().promoteUser(Hierarchy.getHierarchy().op(), player).whenComplete((ignored, throwable) -> + Hierarchy.getHierarchy().promoteUser(Hierarchy.getHierarchy().op(), player).whenComplete((result, throwable) -> { if (throwable != null) { @@ -27,8 +27,16 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return; } + 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); plugin.rm.updateDisplay(player); + Hierarchy.getHierarchy().updateUserData(player); })); 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 14b17427f..c037366ec 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 @@ -24,8 +24,14 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return; } + if (result != null && !result.wasSuccessful()) { + msgNew("You are already op!"); + return; + } + msg(YOU_ARE_OP); plugin.rm.updateDisplay(playerSender); + Hierarchy.getHierarchy().updateUserData(playerSender); }); return true; } 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 58f7e3cd6..abe3923f3 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 @@ -90,58 +90,63 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return; } - if (!result.wasSuccessful() || result.getGroupTo().isEmpty()) + 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; - } - - result.getGroupTo().ifPresentOrElse(group -> - { - Admin admin = plugin.al.getAdmin(player); - - if (admin == null) + } else { + result.getGroupTo().ifPresentOrElse(group -> { - 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(); - 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()); - } - - 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 promoted to ", - player(player), - Placeholder.unparsed("rank", group)); - }, () -> msgNew("Failed to promote to the next rank.", player(player))); + 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(); + 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()); + } + + 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."); + } + + Hierarchy.getHierarchy().updateUserData(player); + + msgNew("Admin has been promoted to ", + player(player), + Placeholder.unparsed("rank", group)); + }, () -> msgNew("Failed to promote to the next rank.", player(player))); + } }); return true; @@ -168,7 +173,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 { @@ -207,7 +212,7 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin return; } - if (!result.wasSuccessful() || result.getGroupTo().isEmpty()) + if (result == null || !result.wasSuccessful() || result.getGroupTo().isEmpty()) { msgNew("Failed to demote to the next rank.", player(player)); return; @@ -253,6 +258,8 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin msgNew(player, "You have been unfrozen."); } + Hierarchy.getHierarchy().updateUserData(player); + msgNew("Admin has been demoted to ", Placeholder.unparsed("player", player.getName()), Placeholder.unparsed("rank", group)); diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java index 9495dd89d..2c1725e96 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java @@ -17,13 +17,11 @@ public class UserWrapper { private final UserManager manager; private final PlayerAdapter playerAdapter; - private final Set userSet; private final Set userDataSet; public UserWrapper(UserManager manager, PlayerAdapter adapter) { this.manager = manager; - this.userSet = manager.getLoadedUsers(); this.playerAdapter = adapter; this.userDataSet = new HashSet<>(); } @@ -42,7 +40,7 @@ public CompletableFuture addUserData(Player player) public CompletableFuture getUser(Player player) { - if (!manager.isLoaded(player.getUniqueId()) || !userSet.contains(manager.getUser(player.getUniqueId()))) + if (!manager.isLoaded(player.getUniqueId()) || !manager.getLoadedUsers().contains(manager.getUser(player.getUniqueId()))) { return manager.loadUser(player.getUniqueId()); } @@ -50,15 +48,6 @@ public CompletableFuture getUser(Player player) return CompletableFuture.supplyAsync(() -> manager.getUser(player.getUniqueId())); } - public CompletableFuture removeUser(Player player) - { - return getUser(player).thenAccept(a -> - { - manager.cleanupUser(a); - userSet.remove(a); - }); - } - public CompletableFuture getUserData(Player player) { return getUser(player).thenApply(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 d4ecf7c58..622acf71f 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/player/PlayerData.java @@ -7,8 +7,6 @@ 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; 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 35564afce..997cb8c7b 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java @@ -115,16 +115,87 @@ public void addGroupToTrack(Track track, DisplayableGroup group) }); } + public void addUserData(Player player) { + userWrapper.addUserData(player).whenComplete((a, b) -> + { + if (b != null) + { + FLog.severe(b); + } + }); + } + + public void updateUserData(Player player) { + userWrapper.updateUserData(player).whenComplete((a, b) -> + { + if (b != null) + { + FLog.severe(b); + } + }); + } + + public void dropUserData(Player player) { + userWrapper.removeUserData(player).whenComplete((a, b) -> + { + if (b != null) + { + FLog.severe(b); + } + }); + } + public CompletableFuture promoteUser(Track track, Player player) { return userWrapper.getUserData(player).thenApply(data -> - track.promote(data.getUser(), data.getContextSet())); + { + boolean isOnTrack = false; + for (String trackGroup : track.getGroups()) + { + for (Group userGroup : data.getUser().getInheritedGroups(data.getQueryOptions())) + { + if (userGroup.getName().equals(trackGroup)) + { + isOnTrack = true; + } + } + } + + if (isOnTrack) + { + return track.promote(data.getUser(), data.getContextSet()); + } else + { + addUserToGroup(GroupProvider.fromString(track.getGroups().get(0)).getGroup(), player); + return null; + } + }); } public CompletableFuture demoteUser(Track track, Player player) { return userWrapper.getUserData(player).thenApply(data -> - track.demote(data.getUser(), data.getContextSet())); + { + boolean isOnTrack = false; + for (String trackGroup : track.getGroups()) + { + for (Group userGroup : data.getUser().getInheritedGroups(data.getQueryOptions())) + { + if (userGroup.getName().equals(trackGroup)) + { + isOnTrack = true; + } + } + } + + if (isOnTrack) + { + return track.demote(data.getUser(), data.getContextSet()); + } else + { + return null; + } + }); } public void addUserToGroup(DisplayableGroup group, Player player) @@ -145,6 +216,8 @@ public void addUserToGroup(DisplayableGroup group, Player player) { FLog.severe(b); } + + updateUserData(player); }); } @@ -175,6 +248,8 @@ public void dropUserFromAll(Track track, Player player) { FLog.severe(b); } + + updateUserData(player); }); } } 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 f2d9c3d44..5fee49670 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java @@ -15,6 +15,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; @@ -187,10 +188,18 @@ public void updateDisplay(Player player) 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); From 2a3a48f2ae5f2a01458e390f6a9174d260d4f000 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Fri, 7 Apr 2023 17:59:23 -0500 Subject: [PATCH 10/15] Fixing errors --- .../totalfreedommod/perms/GroupWrapper.java | 23 +++---------------- .../totalfreedommod/perms/TrackWrapper.java | 4 ++-- .../totalfreedommod/perms/UserWrapper.java | 20 ++++++++++++++-- .../totalfreedommod/rank/Hierarchy.java | 13 ++--------- 4 files changed, 25 insertions(+), 35 deletions(-) diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java index 08079a4b5..017b47557 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/GroupWrapper.java @@ -3,23 +3,20 @@ import net.luckperms.api.model.group.Group; import net.luckperms.api.model.group.GroupManager; -import java.util.Set; import java.util.concurrent.CompletableFuture; public class GroupWrapper { private final GroupManager manager; - private final Set groupSet; public GroupWrapper(GroupManager manager) { this.manager = manager; - this.groupSet = manager.getLoadedGroups(); } public CompletableFuture getGroup(String name) { - if (!manager.isLoaded(name) || !groupSet.contains(manager.getGroup(name))) + if (!manager.isLoaded(name) || !manager.getLoadedGroups().contains(manager.getGroup(name))) { return manager.createAndLoadGroup(name); } @@ -27,22 +24,8 @@ public CompletableFuture getGroup(String name) return CompletableFuture.supplyAsync(() -> manager.getGroup(name)); } - public CompletableFuture removeGroup(String name) + public void saveGroup(String name) { - return getGroup(name).thenAccept(a -> - { - manager.deleteGroup(a); - groupSet.remove(a); - }); - } - - public CompletableFuture addGroup(String name) - { - return getGroup(name).thenAccept(groupSet::add); - } - - public CompletableFuture saveGroup(String name) - { - return getGroup(name).thenAccept(manager::saveGroup); + 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 index d54219440..808c7943c 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/TrackWrapper.java @@ -32,8 +32,8 @@ public CompletableFuture getTrack(String name) return CompletableFuture.supplyAsync(() -> manager.getTrack(name)); } - public CompletableFuture saveTrack(String name) + public void saveTrack(String name) { - return getTrack(name).thenAccept(manager::saveTrack); + getTrack(name).thenAccept(manager::saveTrack); } } diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java index 2c1725e96..95579d348 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java @@ -3,8 +3,10 @@ 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.platform.PlayerAdapter; import net.luckperms.api.query.QueryOptions; import org.bukkit.entity.Player; @@ -88,8 +90,22 @@ public CompletableFuture updateUserData(Player player) }).thenAccept(userDataSet::add); } - public CompletableFuture saveUser(User user) + public void addToGroup(User user, Group group) { + CompletableFuture.runAsync(() -> + manager.modifyUser(user.getUniqueId(), c -> + group.getNodes(NodeType.INHERITANCE).forEach(node -> + c.data().add(node)))); + } + + public void removeFromGroup(User user, Group group) { + CompletableFuture.runAsync(() -> + manager.modifyUser(user.getUniqueId(), c -> + group.getNodes(NodeType.INHERITANCE).forEach(node -> + c.data().remove(node)))); + } + + public void saveUser(User user) { - return CompletableFuture.runAsync(() -> manager.saveUser(user)); + CompletableFuture.runAsync(() -> manager.saveUser(user)); } } 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 997cb8c7b..cfe51c685 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java @@ -202,13 +202,7 @@ public void addUserToGroup(DisplayableGroup group, Player player) { userWrapper.getUserData(player).thenAccept(user -> { - for (InheritanceNode node : group.getLuckPermsGroup().getNodes(NodeType.INHERITANCE)) - { - user.getUser().data().add(node); - } - - user.getUser().getInheritedGroups(user.getQueryOptions()).add(group.getLuckPermsGroup()); - + userWrapper.addToGroup(user.getUser(), group.getLuckPermsGroup()); userWrapper.saveUser(user.getUser()); }).whenComplete((a, b) -> { @@ -235,10 +229,7 @@ public void dropUserFromAll(Track track, Player player) return; } - for (InheritanceNode node : g.getNodes(NodeType.INHERITANCE)) - { - data.getUser().data().remove(node); - } + userWrapper.removeFromGroup(data.getUser(), g); }); } userWrapper.saveUser(data.getUser()); From 11f9313653d871078ee2ad60fdac360dc43434c9 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Sun, 9 Apr 2023 23:05:57 -0500 Subject: [PATCH 11/15] This should work properly! --- .../totalfreedommod/command/Command_deop.java | 2 - .../command/Command_deopall.java | 2 - .../command/Command_mbconfig.java | 11 +- .../totalfreedommod/command/Command_op.java | 3 +- .../command/Command_opall.java | 2 - .../totalfreedommod/command/Command_opme.java | 5 +- .../command/Command_saconfig.java | 11 -- .../totalfreedommod/perms/UserData.java | 8 +- .../totalfreedommod/perms/UserWrapper.java | 29 +++- .../totalfreedommod/rank/GroupProvider.java | 18 +- .../totalfreedommod/rank/Hierarchy.java | 162 +++++++++--------- .../totalfreedommod/rank/RankManager.java | 2 +- 12 files changed, 128 insertions(+), 127 deletions(-) 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 01ff29521..717bf45bc 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 @@ -54,13 +54,11 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } msg(player, YOU_ARE_NOT_OP); - plugin.rm.updateDisplay(player); if (!atomicBoolean.get()) { FUtil.adminAction(sender.getName(), "De-opping " + player.getName(), false); } - Hierarchy.getHierarchy().updateUserData(player); }); return true; 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 31114e850..16aa61293 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 @@ -35,8 +35,6 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } msg(player, YOU_ARE_NOT_OP); - plugin.rm.updateDisplay(player); - Hierarchy.getHierarchy().updateUserData(player); })); return true; 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 2e3b9fa4c..4ca3d72e0 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 @@ -122,12 +122,9 @@ 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); + 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."); @@ -156,10 +153,10 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } FUtil.adminAction(sender.getName(), "Removing " + data.getName() + " from the Master Builder list", true); - Hierarchy.getHierarchy().dropUserFromAll(Hierarchy.getHierarchy().builder(), player); + Hierarchy.getHierarchy() + .dropUserFromAll(Hierarchy.getHierarchy().builder(), player); data.setMasterBuilder(false); plugin.pl.save(data); - plugin.rm.updateDisplay(player); return true; } 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 6861bbb27..07f4a3203 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 @@ -58,8 +58,7 @@ else if (!result.wasSuccessful()) } msg(player, YOU_ARE_OP); - plugin.rm.updateDisplay(player); - Hierarchy.getHierarchy().updateUserData(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 ee1f0280d..457687db1 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 @@ -35,8 +35,6 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } msg(player, YOU_ARE_OP); - plugin.rm.updateDisplay(player); - Hierarchy.getHierarchy().updateUserData(player); })); 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 c037366ec..9e755371e 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 @@ -16,7 +16,8 @@ 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); - Hierarchy.getHierarchy().promoteUser(Hierarchy.getHierarchy().op(), playerSender).whenComplete((result, error) -> + Hierarchy.getHierarchy().promoteUser(Hierarchy.getHierarchy().op(), playerSender) + .whenComplete((result, error) -> { if (error != null) { @@ -30,8 +31,6 @@ public boolean run(CommandSender sender, Player playerSender, Command cmd, Strin } msg(YOU_ARE_OP); - plugin.rm.updateDisplay(playerSender); - Hierarchy.getHierarchy().updateUserData(playerSender); }); return true; } 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 abe3923f3..447b89462 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 @@ -124,7 +124,6 @@ else if (!result.wasSuccessful() || result.getGroupTo().isEmpty()) plugin.al.save(admin); plugin.al.updateTables(); - plugin.rm.updateDisplay(player); if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) { @@ -140,8 +139,6 @@ else if (!result.wasSuccessful() || result.getGroupTo().isEmpty()) msgNew(player, "You have been unfrozen."); } - Hierarchy.getHierarchy().updateUserData(player); - msgNew("Admin has been promoted to ", player(player), Placeholder.unparsed("rank", group)); @@ -242,7 +239,6 @@ else if (!result.wasSuccessful() || result.getGroupTo().isEmpty()) plugin.al.save(admin); plugin.al.updateTables(); - plugin.rm.updateDisplay(player); if (plugin.dc != null && plugin.dc.isEnabled() && ConfigEntry.DISCORD_ROLE_SYNC.getBoolean()) { @@ -258,8 +254,6 @@ else if (!result.wasSuccessful() || result.getGroupTo().isEmpty()) msgNew(player, "You have been unfrozen."); } - Hierarchy.getHierarchy().updateUserData(player); - msgNew("Admin has been demoted to ", Placeholder.unparsed("player", player.getName()), Placeholder.unparsed("rank", group)); @@ -288,11 +282,6 @@ else if (!result.wasSuccessful() || result.getGroupTo().isEmpty()) 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()) diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java index 3ba2e5b5b..7e70985c2 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserData.java @@ -73,8 +73,12 @@ public void setQueryOptions(QueryOptions queryOptions) this.queryOptions = queryOptions; } - public UserData clone() + public UserData copy() { - return new UserData(user, metaData, permissionData, contextSet, queryOptions); + 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 index 95579d348..ba5d4d419 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/perms/UserWrapper.java @@ -1,5 +1,7 @@ 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; @@ -7,6 +9,7 @@ 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; @@ -74,7 +77,7 @@ public CompletableFuture updateUserData(Player player) { return getUserData(player).thenApply(userData -> { - UserData newData = userData.clone(); + UserData newData = userData.copy(); CachedPermissionData permissionData = playerAdapter.getPermissionData(player); ImmutableContextSet contextSet = playerAdapter.getContext(player); QueryOptions queryOptions = playerAdapter.getQueryOptions(player); @@ -90,18 +93,28 @@ public CompletableFuture updateUserData(Player player) }).thenAccept(userDataSet::add); } - public void addToGroup(User user, Group group) { + public void addToGroup(User user, DisplayableGroup group) + { CompletableFuture.runAsync(() -> manager.modifyUser(user.getUniqueId(), c -> - group.getNodes(NodeType.INHERITANCE).forEach(node -> - c.data().add(node)))); + { + if (!c.getNodes(NodeType.INHERITANCE) + .contains(GroupProvider.inheritanceNode(group))) + c.data().add(GroupProvider.inheritanceNode(group)); + })); } - public void removeFromGroup(User user, Group group) { + public void removeFromGroup(User user, Group group) + { + InheritanceNode groupNode = InheritanceNode.builder(group).build(); + CompletableFuture.runAsync(() -> - manager.modifyUser(user.getUniqueId(), c -> - group.getNodes(NodeType.INHERITANCE).forEach(node -> - c.data().remove(node)))); + manager.modifyUser(user.getUniqueId(), userConsumer -> + { + if (userConsumer.getNodes(NodeType.INHERITANCE) + .contains(groupNode)) + userConsumer.data().remove(groupNode); + })); } public void saveUser(User user) 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 40f39a706..9a77d025e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/GroupProvider.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/GroupProvider.java @@ -5,6 +5,8 @@ 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.node.matcher.NodeMatcher; +import net.luckperms.api.node.types.InheritanceNode; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -22,6 +24,16 @@ public interface GroupProvider 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) { return TotalFreedomMod.getPlugin() @@ -42,8 +54,10 @@ static GroupProvider fromString(String arg) }; } - static GroupProvider fromLuckPermsGroup(Group group) { - return switch (group.getName().toLowerCase()) { + static GroupProvider fromLuckPermsGroup(Group group) + { + return switch (group.getName().toLowerCase()) + { case "op" -> OP; case "builder" -> MASTER_BUILDER; case "admin" -> ADMIN; 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 cfe51c685..495fab62d 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java @@ -5,17 +5,25 @@ import me.totalfreedom.totalfreedommod.perms.TrackWrapper; import me.totalfreedom.totalfreedommod.perms.UserWrapper; import me.totalfreedom.totalfreedommod.util.FLog; +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.node.NodeEqualityPredicate; +import net.luckperms.api.model.user.User; 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.AtomicBoolean; public class Hierarchy { @@ -23,13 +31,16 @@ public class Hierarchy private final GroupWrapper groupWrapper; private final TrackWrapper trackWrapper; private final UserWrapper userWrapper; + private final PlayerAdapter playerAdapter; private Hierarchy() { + 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(), - TotalFreedomMod.getPlugin().lpb.getAPI().getPlayerAdapter(Player.class)); + getPlayerAdapter()); + new LuckPermsUserDataListener().register(); } public static Hierarchy getHierarchy() @@ -37,32 +48,17 @@ public static Hierarchy getHierarchy() return hierarchy; } - public boolean isUserOnAdminTrack(Player player) + public PlayerAdapter getPlayerAdapter() { - AtomicBoolean isOnAdminTrack = new AtomicBoolean(false); - userWrapper.getUser(player).thenAccept(user -> - user.data().toCollection().stream() - .filter(NodeType.INHERITANCE::matches) - .map(NodeType.INHERITANCE::cast) - .filter(NodeEqualityPredicate.ONLY_KEY - .equalTo(InheritanceNode - .builder(GroupProvider.ADMIN.getGroup().getLuckPermsGroup().getName()) - .build())) - .forEach(node -> - { - if (node.getGroupName().startsWith("admin")) - { - isOnAdminTrack.set(true); - } - })).whenComplete((a, b) -> - { - if (b != null) - { - FLog.severe(b); - } - }); + return playerAdapter; + } - return isOnAdminTrack.get(); + public boolean isUserOnAdminTrack(Player player) + { + return userWrapper.getUser(player) + .thenApply(user -> user.getNodes(NodeType.INHERITANCE) + .contains(GroupProvider.inheritanceNode(GroupProvider.ADMIN.getGroup()))) + .join(); } public Track op() @@ -115,7 +111,8 @@ public void addGroupToTrack(Track track, DisplayableGroup group) }); } - public void addUserData(Player player) { + public void addUserData(Player player) + { userWrapper.addUserData(player).whenComplete((a, b) -> { if (b != null) @@ -125,7 +122,8 @@ public void addUserData(Player player) { }); } - public void updateUserData(Player player) { + public void updateUserData(Player player) + { userWrapper.updateUserData(player).whenComplete((a, b) -> { if (b != null) @@ -135,7 +133,8 @@ public void updateUserData(Player player) { }); } - public void dropUserData(Player player) { + public void dropUserData(Player player) + { userWrapper.removeUserData(player).whenComplete((a, b) -> { if (b != null) @@ -147,71 +146,26 @@ public void dropUserData(Player player) { public CompletableFuture promoteUser(Track track, Player player) { - return userWrapper.getUserData(player).thenApply(data -> - { - boolean isOnTrack = false; - for (String trackGroup : track.getGroups()) - { - for (Group userGroup : data.getUser().getInheritedGroups(data.getQueryOptions())) - { - if (userGroup.getName().equals(trackGroup)) - { - isOnTrack = true; - } - } - } - - if (isOnTrack) - { - return track.promote(data.getUser(), data.getContextSet()); - } else - { - addUserToGroup(GroupProvider.fromString(track.getGroups().get(0)).getGroup(), player); - return null; - } - }); + return userWrapper.getUserData(player) + .thenApply(data -> track.promote(data.getUser(), data.getContextSet())); } public CompletableFuture demoteUser(Track track, Player player) { - return userWrapper.getUserData(player).thenApply(data -> - { - boolean isOnTrack = false; - for (String trackGroup : track.getGroups()) - { - for (Group userGroup : data.getUser().getInheritedGroups(data.getQueryOptions())) - { - if (userGroup.getName().equals(trackGroup)) - { - isOnTrack = true; - } - } - } - - if (isOnTrack) - { - return track.demote(data.getUser(), data.getContextSet()); - } else - { - return null; - } - }); + return userWrapper.getUserData(player) + .thenApply(data -> track.demote(data.getUser(), data.getContextSet())); } public void addUserToGroup(DisplayableGroup group, Player player) { userWrapper.getUserData(player).thenAccept(user -> - { - userWrapper.addToGroup(user.getUser(), group.getLuckPermsGroup()); - userWrapper.saveUser(user.getUser()); - }).whenComplete((a, b) -> + userWrapper.addToGroup(user.getUser(), group)) + .whenComplete((a, b) -> { if (b != null) { FLog.severe(b); } - - updateUserData(player); }); } @@ -229,18 +183,56 @@ public void dropUserFromAll(Track track, Player player) return; } - userWrapper.removeFromGroup(data.getUser(), g); + if (data.getUser().getNodes(NodeType.INHERITANCE) + .contains(InheritanceNode.builder(g).build())) + userWrapper.removeFromGroup(data.getUser(), g); }); } - userWrapper.saveUser(data.getUser()); }).whenComplete((a, b) -> { if (b != null) { FLog.severe(b); } - - updateUserData(player); }); } + + private class LuckPermsUserDataListener + { + 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)); + } + + private void onNodeAdd(NodeAddEvent event) + { + if (event.isUser()) + { + User user = (User) event.getTarget(); + Player player = Bukkit.getPlayer(user.getUniqueId()); + if (player != null) + { + updateUserData(player); + } + } + } + + 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/RankManager.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java index 5fee49670..3cf3a09ca 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java @@ -181,7 +181,7 @@ public void updateDisplay(Player player) } else { fPlayer.setTag(null); - player.setPlayerListName(null); + player.playerListName(Component.empty()); } fPlayer.setTag(getTag(player, display.getColoredTag())); From 42482ef8e7390867560b4c11f53b1e8179fbceec Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Sun, 9 Apr 2023 23:17:31 -0500 Subject: [PATCH 12/15] Deferred command loading Moved command loading into a runnable that will execute on the first server tick. This way, we can ensure that all the plugins are loaded before we load our commands, so TFD4J and Shop can both have their respective commands loaded in. --- .../java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java index 136c6c46d..97c65713c 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java @@ -161,7 +161,8 @@ public void onEnable() } cl = new CommandLoader(); - cl.loadCommands(); + Bukkit.getScheduler().runTaskLater(plugin, cl::loadCommands, 1); + // Deferring command loading allowing TFD4J and Shop to load before registering our commands. BackupManager backups = new BackupManager(); backups.createAllBackups(); From 33ac3a36ca65d271c3d86d19b2acc1e27345ba30 Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Mon, 10 Apr 2023 01:18:06 -0500 Subject: [PATCH 13/15] Command fixing --- .../totalfreedommod/FrontDoor.java | 2 +- .../totalfreedommod/TotalFreedomMod.java | 2 +- .../blocking/command/CommandBlocker.java | 20 +-- .../command/CommandLoader.java | 100 ------------ .../command/Command_adminchat.java | 5 + .../command/Command_admininfo.java | 5 + .../command/Command_adminmode.java | 5 + .../command/Command_adminworld.java | 5 + .../command/Command_announce.java | 4 + .../command/Command_autoclear.java | 4 + .../command/Command_autotp.java | 4 + .../totalfreedommod/command/Command_ban.java | 2 + .../command/Command_banip.java | 2 + .../command/Command_banlist.java | 2 + .../command/Command_banname.java | 4 + .../totalfreedommod/command/Command_bird.java | 5 + .../command/Command_blockcmd.java | 4 + .../command/Command_blockedit.java | 4 + .../command/Command_blockpvp.java | 4 + .../command/Command_blockredstone.java | 4 + .../totalfreedommod/command/Command_cage.java | 5 + .../totalfreedommod/command/Command_cake.java | 4 + .../command/Command_cleanchat.java | 4 + .../command/Command_cleardiscordqueue.java | 1 + .../command/Command_clownfish.java | 1 + .../command/Command_cmdspy.java | 4 + .../command/Command_coins.java | 1 + .../command/Command_consolesay.java | 4 + .../command/Command_cookie.java | 4 + .../command/Command_deafen.java | 5 + .../command/Command_debugstick.java | 5 + .../command/Command_denick.java | 4 + .../totalfreedommod/command/Command_deop.java | 2 + .../command/Command_deopall.java | 4 + .../command/Command_dispfill.java | 5 + .../totalfreedommod/command/Command_doom.java | 4 + .../command/Command_eject.java | 4 + .../command/Command_enchant.java | 4 + .../totalfreedommod/command/Command_end.java | 4 + .../command/Command_entitywipe.java | 5 + .../command/Command_expel.java | 5 + .../command/Command_explode.java | 5 + .../command/Command_explosivearrows.java | 4 + .../command/Command_findip.java | 4 + .../command/Command_fireball.java | 1 + .../command/Command_flatlands.java | 4 + .../command/Command_forcekill.java | 4 + .../command/Command_freeze.java | 4 + .../command/Command_fuckoff.java | 4 + .../totalfreedommod/command/Command_gcmd.java | 4 + .../totalfreedommod/command/Command_glow.java | 4 + .../command/Command_grapplinghook.java | 1 + .../command/Command_gravity.java | 4 + .../command/Command_health.java | 4 + .../command/Command_indefban.java | 4 + .../command/Command_inspect.java | 5 +- .../command/Command_invis.java | 5 + .../command/Command_invsee.java | 4 + .../command/Command_jumppads.java | 4 + .../totalfreedommod/command/Command_kick.java | 3 +- .../command/Command_kicknoob.java | 4 + .../command/Command_landmine.java | 5 + .../command/Command_lightningrod.java | 1 + .../command/Command_linkdiscord.java | 1 + .../command/Command_links.java | 4 + .../totalfreedommod/command/Command_list.java | 5 +- .../command/Command_localspawn.java | 4 + .../command/Command_lockup.java | 4 + .../command/Command_loginmessage.java | 4 + .../command/Command_manageshop.java | 1 + .../command/Command_masterbuilderinfo.java | 4 + .../command/Command_masterbuilderworld.java | 4 + .../command/Command_mbconfig.java | 4 + .../command/Command_moblimiter.java | 4 + .../command/Command_mobpurge.java | 4 + .../totalfreedommod/command/Command_mp44.java | 4 + .../totalfreedommod/command/Command_mute.java | 2 + .../command/Command_myadmin.java | 5 +- .../command/Command_myinfo.java | 4 + .../command/Command_nether.java | 4 + .../command/Command_nickclean.java | 4 + .../command/Command_nickmm.java | 4 + .../command/Command_notes.java | 4 + .../totalfreedommod/command/Command_op.java | 2 + .../command/Command_opall.java | 4 + .../totalfreedommod/command/Command_opme.java | 4 + .../command/Command_orbit.java | 4 + .../command/Command_plotworld.java | 1 + .../command/Command_plugincontrol.java | 4 + .../command/Command_potion.java | 2 + .../command/Command_potionspy.java | 4 + .../command/Command_purgeall.java | 4 + .../totalfreedommod/command/Command_rank.java | 4 + .../command/Command_rawsay.java | 4 + .../command/Command_report.java | 2 + .../totalfreedommod/command/Command_ride.java | 4 + .../command/Command_rideablepearl.java | 1 + .../totalfreedommod/command/Command_ro.java | 4 + .../totalfreedommod/command/Command_rock.java | 4 + .../command/Command_saconfig.java | 4 + .../totalfreedommod/command/Command_say.java | 2 + .../command/Command_scare.java | 4 + .../totalfreedommod/command/Command_seed.java | 2 + .../command/Command_serverstats.java | 4 + .../command/Command_setcompass.java | 4 + .../command/Command_setlimit.java | 1 + .../command/Command_setplayerlimit.java | 1 + .../command/Command_setspawnworld.java | 4 + .../totalfreedommod/command/Command_shop.java | 1 + .../command/Command_smite.java | 2 + .../command/Command_spawnmob.java | 2 + .../command/Command_spectate.java | 4 + .../command/Command_stackingpotato.java | 1 + .../totalfreedommod/command/Command_stop.java | 2 + .../command/Command_stopsound.java | 4 + .../totalfreedommod/command/Command_tag.java | 4 + .../command/Command_tempban.java | 2 + .../command/Command_toggle.java | 4 + .../command/Command_toggleclownfish.java | 1 + .../command/Command_togglediscord.java | 1 + .../command/Command_togglepickup.java | 4 + .../command/Command_tossmob.java | 4 + .../command/Command_totalfreedommod.java | 4 + .../command/Command_tprandom.java | 2 + .../command/Command_trail.java | 1 + .../command/Command_unban.java | 2 + .../command/Command_unbanip.java | 3 +- .../command/Command_unbanname.java | 4 + .../command/Command_unblockcmd.java | 4 + .../command/Command_uncage.java | 4 + .../command/Command_undisguiseall.java | 1 + .../command/Command_unlinkdiscord.java | 1 + .../command/Command_unmute.java | 2 + .../command/Command_vanish.java | 3 +- .../totalfreedommod/command/Command_vote.java | 5 + .../totalfreedommod/command/Command_warn.java | 2 + .../command/Command_whitelist.java | 2 + .../command/Command_whohas.java | 4 + .../command/Command_wildcard.java | 4 + .../{ => handling}/CommandDependencies.java | 2 +- .../{ => handling}/CommandFailException.java | 2 +- .../command/handling/CommandLoader.java | 145 ++++++++++++++++++ .../{ => handling}/CommandParameters.java | 2 +- .../{ => handling}/CommandPermissions.java | 2 +- .../{ => handling}/FreedomCommand.java | 25 ++- .../command/handling/Intercept.java | 13 ++ .../command/handling/Interceptor.java | 57 +++++++ .../command/{ => handling}/SourceType.java | 2 +- .../httpd/module/Module_help.java | 3 +- 149 files changed, 698 insertions(+), 139 deletions(-) delete mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/command/CommandLoader.java rename commons/src/main/java/me/totalfreedom/totalfreedommod/command/{ => handling}/CommandDependencies.java (76%) rename commons/src/main/java/me/totalfreedom/totalfreedommod/command/{ => handling}/CommandFailException.java (78%) create mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/CommandLoader.java rename commons/src/main/java/me/totalfreedom/totalfreedommod/command/{ => handling}/CommandParameters.java (82%) rename commons/src/main/java/me/totalfreedom/totalfreedommod/command/{ => handling}/CommandPermissions.java (85%) rename commons/src/main/java/me/totalfreedom/totalfreedommod/command/{ => handling}/FreedomCommand.java (94%) create mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Intercept.java create mode 100644 commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Interceptor.java rename commons/src/main/java/me/totalfreedom/totalfreedommod/command/{ => handling}/SourceType.java (87%) 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 97c65713c..041a426b5 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/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 717bf45bc..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,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; @@ -11,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 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 16aa61293..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,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.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; 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 4ca3d72e0..eae9388e4 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,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.rank.GroupProvider; import me.totalfreedom.totalfreedommod.rank.Hierarchy; 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 07f4a3203..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,5 +1,6 @@ package me.totalfreedom.totalfreedommod.command; +import me.totalfreedom.totalfreedommod.command.handling.*; import me.totalfreedom.totalfreedommod.rank.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; @@ -10,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 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 457687db1..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,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.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; 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 9e755371e..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,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.Hierarchy; import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FUtil; 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 447b89462..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,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.config.ConfigEntry; import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.rank.DisplayableGroup; 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 94% 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 f59d82e76..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; @@ -26,6 +26,7 @@ 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) @@ -221,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 @@ -239,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); 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..fbdd2c470 --- /dev/null +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Interceptor.java @@ -0,0 +1,57 @@ +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. + } + + public void setOverrides() + { + overrides.forEach((key, value) -> + { + Bukkit.getCommandMap().getKnownCommands().remove(key, value); + FLog.info("Overriding command: " + key); + }); + } + + 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; From 6c0856d64741ab69efa6f231fe282422a0d4f19e Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Mon, 10 Apr 2023 01:27:30 -0500 Subject: [PATCH 14/15] Attempt to intercept native commands --- .../totalfreedommod/TotalFreedomMod.java | 3 +-- .../command/handling/Interceptor.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java index 041a426b5..7a4d20f0e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/TotalFreedomMod.java @@ -161,8 +161,7 @@ public void onEnable() } cl = new CommandLoader(); - Bukkit.getScheduler().runTaskLater(plugin, cl::loadCommands, 1); - // Deferring command loading allowing TFD4J and Shop to load before registering our commands. + cl.loadCommands(); BackupManager backups = new BackupManager(); backups.createAllBackups(); 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 index fbdd2c470..f43a60a1e 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Interceptor.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/command/handling/Interceptor.java @@ -31,6 +31,13 @@ public void intercept(String command) .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() @@ -42,6 +49,16 @@ public void setOverrides() }); } + 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<>(); From f4f60a7993acb85456dd5ecf1bc63e1f7330783e Mon Sep 17 00:00:00 2001 From: Paul Reilly Date: Mon, 10 Apr 2023 20:02:42 -0500 Subject: [PATCH 15/15] Fix some minor issues --- .../totalfreedommod/rank/Hierarchy.java | 21 ++++++++++++------- .../totalfreedommod/rank/RankManager.java | 10 ++++++++- .../util/PermissibleCompletion.java | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) 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 495fab62d..e3546cd40 100644 --- a/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java +++ b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/Hierarchy.java @@ -159,14 +159,14 @@ public CompletableFuture demoteUser(Track track, Player player) public void addUserToGroup(DisplayableGroup group, Player player) { userWrapper.getUserData(player).thenAccept(user -> - userWrapper.addToGroup(user.getUser(), group)) + userWrapper.addToGroup(user.getUser(), group)) .whenComplete((a, b) -> - { - if (b != null) - { - FLog.severe(b); - } - }); + { + if (b != null) + { + FLog.severe(b); + } + }); } public void dropUserFromAll(Track track, Player player) @@ -208,6 +208,12 @@ public void register() 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 (event.isUser()) @@ -216,6 +222,7 @@ private void onNodeAdd(NodeAddEvent event) 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/RankManager.java b/commons/src/main/java/me/totalfreedom/totalfreedommod/rank/RankManager.java index 3cf3a09ca..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; @@ -189,7 +190,8 @@ public void updateDisplay(Player player) } @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerLeave(PlayerQuitEvent event) { + public void onPlayerLeave(PlayerQuitEvent event) + { Hierarchy.getHierarchy().dropUserData(event.getPlayer()); } @@ -251,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/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;