From 8296201f01029cf77918c81a692117be15f772d1 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 22:23:20 +0100 Subject: [PATCH 01/19] Add argument validation & feedback for resetplayer command (implements #45) --- .../TotalFreedomMod/commands/Command_offlinetp.java | 4 ++++ .../TotalFreedomMod/commands/Command_resetplayer.java | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_offlinetp.java b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_offlinetp.java index 75ea1bd..966651c 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_offlinetp.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_offlinetp.java @@ -13,6 +13,10 @@ import org.bukkit.entity.Player; public class Command_offlinetp extends FreedomCommand { @Override public boolean run(CommandSender sender, Player sender_p, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { + if(args.length < 1) { + return false; + } + OfflinePlayer target = null; String searchString = args[0]; diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_resetplayer.java b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_resetplayer.java index eeb6ad7..ed70db7 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_resetplayer.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_resetplayer.java @@ -1,5 +1,6 @@ package me.StevenLawson.TotalFreedomMod.commands; +import me.StevenLawson.TotalFreedomMod.util.Utilities; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; @@ -14,6 +15,10 @@ import java.nio.file.Paths; public class Command_resetplayer extends FreedomCommand { @Override public boolean run(CommandSender sender, Player sender_p, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) { + if(args.length < 1) { + return false; + } + OfflinePlayer target = null; String searchString = args[0]; @@ -36,7 +41,8 @@ public class Command_resetplayer extends FreedomCommand { target.getPlayer().kickPlayer(ChatColor.RED + "YOU ARE BEING RESET."); } - playerMsg(sender, String.format("Resetting %s's user data (excluding TFM)...", target.getName())); + Utilities.adminAction(sender.getName(), String.format("Resetting %s's player data", target.getName()), true); + playerMsg(sender, String.format("Resetting %s's player data (excluding TFM)...", target.getName())); try { String uuid = target.getUniqueId().toString(); Files.deleteIfExists(Paths.get(".", "world", "playerdata", uuid + ".dat")); From a293ae64ddcbe243e10489489f825857bb84c414 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 22:26:12 +0100 Subject: [PATCH 02/19] Sanitize join & leave usernames --- .../TotalFreedomMod/listener/PlayerListener.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java index 39ef933..ecece22 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java @@ -756,7 +756,7 @@ public class PlayerListener implements Listener { } if (PlayerList.existsEntry(player)) { - DiscordBridge.transmitMessage(String.format("**%s left the server**", player.getDisplayName())); + DiscordBridge.transmitMessage(String.format("**%s left the server**", DiscordBridge.sanitizeMessage(player.getDisplayName()))); } PlayerList.removeEntry(player); @@ -771,6 +771,7 @@ public class PlayerListener implements Listener { final String ip = Utilities.getIp(player); final Player playerEntry; Log.info("[JOIN] " + Utilities.formatPlayer(player) + " joined the game with IP address: " + ip, true); + // Check absolute value to account for negatives if (Math.abs(player.getLocation().getX()) >= MAX_XY_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XY_COORD) { @@ -907,7 +908,7 @@ public class PlayerListener implements Listener { PlayerData.getPlayerData(player).setTag(playerTag); } } - DiscordBridge.transmitMessage(String.format("**%s joined the server**", player.getDisplayName())); + DiscordBridge.transmitMessage(String.format("**%s joined the server**", DiscordBridge.sanitizeMessage(player.getDisplayName()))); } @EventHandler(priority = EventPriority.HIGHEST) From c71cf1a14cdc359b652472103810deafd09ef000 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 22:28:32 +0100 Subject: [PATCH 03/19] Use readable message content for the discord bridge --- .../TotalFreedomMod/discord/bridge/DiscordBridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index 59c4b6d..0c6797b 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -38,7 +38,7 @@ public class DiscordBridge { isAdmin = message.getChannel().getIdAsString().equalsIgnoreCase(ADMIN_CHANNEL.getIdAsString()); } catch (Exception ignored) {} - String content = message.getMessageContent(); + String content = message.getReadableMessageContent(); String prefix = MainConfig.getString(ConfigurationEntry.DISCORD_PREFIX); MessageAuthor author = message.getMessage().getAuthor(); From 97c337d5a491e65a2b6a754ea6fd41b6bfdae9f3 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 22:35:52 +0100 Subject: [PATCH 04/19] Fully sanitize Discord messages --- .../TotalFreedomMod/discord/bridge/DiscordBridge.java | 6 ++++++ .../TotalFreedomMod/listener/PlayerListener.java | 7 +++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index 0c6797b..cc8640a 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -211,4 +211,10 @@ public class DiscordBridge { Log.info("TFM 4.3 Reloaded Discord stopped."); } + + public static String fullySanitizeDiscordMessage(String message) + { + String partiallySanitized = sanitizeMessage(message); + return partiallySanitized.replaceAll("\\\\", "\\\\\\").replaceAll("([`_~*|])", "\\\\$1"); + } } diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java index ecece22..c769eeb 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java @@ -19,7 +19,6 @@ import me.StevenLawson.TotalFreedomMod.util.Utilities; import me.StevenLawson.TotalFreedomMod.world.AdminWorld; import me.StevenLawson.TotalFreedomMod.world.RollbackManager; import me.StevenLawson.TotalFreedomMod.world.RollbackManager.RollbackEntry; -import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.bukkit.*; import org.bukkit.block.Block; @@ -632,7 +631,7 @@ public class PlayerListener implements Listener { event.setFormat(ChatColor.translateAlternateColorCodes('&', MainConfig.getString(ConfigurationEntry.CHAT_FORMAT)).replace("{RANK}", playerdata.getTag().replaceAll("%", "%%"))); } - DiscordBridge.transmitMessage(String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()).replaceAll("([`_~*])", "\\\\$1")); + DiscordBridge.transmitMessage(String.format(event.getFormat(), event.getPlayer().getDisplayName(), DiscordBridge.fullySanitizeDiscordMessage(event.getMessage()))); } catch (Exception ex) { @@ -756,7 +755,7 @@ public class PlayerListener implements Listener { } if (PlayerList.existsEntry(player)) { - DiscordBridge.transmitMessage(String.format("**%s left the server**", DiscordBridge.sanitizeMessage(player.getDisplayName()))); + DiscordBridge.transmitMessage(String.format("**%s left the server**", DiscordBridge.fullySanitizeDiscordMessage(player.getDisplayName()))); } PlayerList.removeEntry(player); @@ -908,7 +907,7 @@ public class PlayerListener implements Listener { PlayerData.getPlayerData(player).setTag(playerTag); } } - DiscordBridge.transmitMessage(String.format("**%s joined the server**", DiscordBridge.sanitizeMessage(player.getDisplayName()))); + DiscordBridge.transmitMessage(String.format("**%s joined the server**", DiscordBridge.fullySanitizeDiscordMessage(player.getDisplayName()))); } @EventHandler(priority = EventPriority.HIGHEST) From 71a100f0e4b98e48914a4fad72f3c648cd53cff4 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 22:37:31 +0100 Subject: [PATCH 05/19] Properly escape backslash --- .../TotalFreedomMod/discord/bridge/DiscordBridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index cc8640a..0fa5449 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -215,6 +215,6 @@ public class DiscordBridge { public static String fullySanitizeDiscordMessage(String message) { String partiallySanitized = sanitizeMessage(message); - return partiallySanitized.replaceAll("\\\\", "\\\\\\").replaceAll("([`_~*|])", "\\\\$1"); + return partiallySanitized.replaceAll("([`_~*|\\\\])", "\\\\$1"); } } From d0a93c2204fd7b294718f2205ac4e252b94e1e68 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 22:39:09 +0100 Subject: [PATCH 06/19] Fully sanitize EVERYTHING! --- .../StevenLawson/TotalFreedomMod/listener/PlayerListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java index c769eeb..18421e4 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java @@ -631,7 +631,7 @@ public class PlayerListener implements Listener { event.setFormat(ChatColor.translateAlternateColorCodes('&', MainConfig.getString(ConfigurationEntry.CHAT_FORMAT)).replace("{RANK}", playerdata.getTag().replaceAll("%", "%%"))); } - DiscordBridge.transmitMessage(String.format(event.getFormat(), event.getPlayer().getDisplayName(), DiscordBridge.fullySanitizeDiscordMessage(event.getMessage()))); + DiscordBridge.transmitMessage(DiscordBridge.fullySanitizeDiscordMessage(String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()))); } catch (Exception ex) { From 36928a3bd6d0fcb6f594e1598193f4dce9afe008 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 22:44:45 +0100 Subject: [PATCH 07/19] Not null. --- .../TotalFreedomMod/config/MainConfig.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/config/MainConfig.java b/src/main/java/me/StevenLawson/TotalFreedomMod/config/MainConfig.java index 5254a92..e1967c6 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/config/MainConfig.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/config/MainConfig.java @@ -1,5 +1,7 @@ package me.StevenLawson.TotalFreedomMod.config; +import com.avaje.ebean.validation.NotNull; +import com.google.common.collect.ImmutableList; import me.StevenLawson.TotalFreedomMod.Log; import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; import org.apache.commons.io.FileUtils; @@ -100,6 +102,7 @@ public class MainConfig } } + @NotNull public static String getString(ConfigurationEntry entry) { try @@ -110,7 +113,7 @@ public class MainConfig { Log.severe(ex); } - return null; + return ""; } public static void setString(ConfigurationEntry entry, String value) @@ -125,6 +128,7 @@ public class MainConfig } } + @NotNull public static Double getDouble(ConfigurationEntry entry) { try @@ -135,7 +139,7 @@ public class MainConfig { Log.severe(ex); } - return null; + return 0D; } public static void setDouble(ConfigurationEntry entry, Double value) @@ -150,6 +154,7 @@ public class MainConfig } } + @NotNull public static Boolean getBoolean(ConfigurationEntry entry) { try @@ -160,7 +165,7 @@ public class MainConfig { Log.severe(ex); } - return null; + return false; } public static void setBoolean(ConfigurationEntry entry, Boolean value) @@ -175,6 +180,7 @@ public class MainConfig } } + @NotNull public static Integer getInteger(ConfigurationEntry entry) { try @@ -185,7 +191,7 @@ public class MainConfig { Log.severe(ex); } - return null; + return 0; } public static void setInteger(ConfigurationEntry entry, Integer value) @@ -200,6 +206,7 @@ public class MainConfig } } + @NotNull public static List getList(ConfigurationEntry entry) { try @@ -210,9 +217,10 @@ public class MainConfig { Log.severe(ex); } - return null; + return ImmutableList.of(); } + @NotNull public static T get(ConfigurationEntry entry, Class type) throws IllegalArgumentException { Object value = ENTRY_MAP.get(entry); From 9699439e82aede51caade33db204b780f6144e8c Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:01:21 +0100 Subject: [PATCH 08/19] Replace IPs of admins that are higher or equal to you in rank with their fuzzied IPs, and make /saconfig info always return the admin's fuzzied IPs. Also, if you're not a senior admin, you are unable to view full IPs. Closes #44. --- .../me/StevenLawson/TotalFreedomMod/Server.java | 14 ++++++++++++++ .../StevenLawson/TotalFreedomMod/admin/Admin.java | 8 +++++++- .../TotalFreedomMod/commands/Command_findip.java | 15 ++++++++++++++- .../TotalFreedomMod/listener/PlayerListener.java | 4 ++++ .../TotalFreedomMod/player/Player.java | 14 ++++++++++++++ 5 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/Server.java b/src/main/java/me/StevenLawson/TotalFreedomMod/Server.java index 95cf60e..cc1fd8d 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/Server.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/Server.java @@ -7,9 +7,11 @@ import me.StevenLawson.TotalFreedomMod.ban.BanManager; import me.StevenLawson.TotalFreedomMod.ban.PermbanList; import me.StevenLawson.TotalFreedomMod.bridge.EssentialsBridge; import me.StevenLawson.TotalFreedomMod.config.ConfigurationEntry; +import me.StevenLawson.TotalFreedomMod.discord.bridge.DiscordBridge; import me.StevenLawson.TotalFreedomMod.player.UUIDManager; import me.StevenLawson.TotalFreedomMod.util.SynchronousUtil; import me.StevenLawson.TotalFreedomMod.util.Utilities; +import net.md_5.bungee.api.chat.TextComponent; import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.MinecraftServer; import net.minecraft.server.v1_8_R3.PropertyManager; @@ -80,6 +82,18 @@ public class Server { final String ip = event.getAddress().getHostAddress().trim(); final boolean isAdmin = AdminList.isSuperAdminSafe(null, ip); + TextComponent textComponent = new TextComponent(String.format("%s is attempting to join with IP %s.", event.getName(), Utilities.getFuzzyIp(ip))); + textComponent.setColor(ChatColor.GRAY.asBungee()); + + for (org.bukkit.entity.Player player : Bukkit.getOnlinePlayers()) + { + if (AdminList.isSuperAdmin(player)) + { + player.spigot().sendMessage(textComponent); + } + } + + DiscordBridge.transmitAdminMessage(textComponent.getText()); // Check if the player is already online for (Player onlinePlayer : TotalFreedomMod.server.getOnlinePlayers()) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/admin/Admin.java b/src/main/java/me/StevenLawson/TotalFreedomMod/admin/Admin.java index fad3a4a..df19de9 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/admin/Admin.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/admin/Admin.java @@ -55,10 +55,16 @@ public class Admin public String toString() { final StringBuilder output = new StringBuilder(); + final ArrayList fuzziedIps = new ArrayList<>(); + + for (String ip : ips) + { + fuzziedIps.add(Utilities.getFuzzyIp(ip)); + } output.append("UUID: ").append(uuid.toString()).append("\n"); output.append("- Last Login Name: ").append(lastLoginName).append("\n"); - output.append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n"); + output.append("- IPs: ").append(StringUtils.join(fuzziedIps, ", ")).append("\n"); output.append("- Last Login: ").append(Utilities.dateToString(lastLogin)).append("\n"); output.append("- Custom Login Message: ").append(loginMessage).append("\n"); output.append("- Is Senior Admin: ").append(isSeniorAdmin).append("\n"); diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_findip.java b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_findip.java index 3f7b178..b914eeb 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_findip.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_findip.java @@ -1,11 +1,14 @@ package me.StevenLawson.TotalFreedomMod.commands; import me.StevenLawson.TotalFreedomMod.player.PlayerList; +import me.StevenLawson.TotalFreedomMod.player.PlayerRank; import org.apache.commons.lang3.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.ArrayList; + @CommandPermissions(level = AdminLevel.SUPER, source = SourceType.BOTH) public class Command_findip extends FreedomCommand { @Override @@ -22,7 +25,17 @@ public class Command_findip extends FreedomCommand { return true; } - playerMsg(sender, "Player IPs: " + StringUtils.join(PlayerList.getEntry(player).getIps(), ", ")); + PlayerRank rank = PlayerRank.fromSender(sender); + PlayerRank targetRank = PlayerRank.fromSender(player); + + ArrayList ipsToShow = (ArrayList) PlayerList.getEntry(player).getIps(); + + if(rank.getOrdinal() < PlayerRank.SENIOR.getOrdinal() || targetRank.getOrdinal() >= rank.getOrdinal()) { + ipsToShow = (ArrayList) PlayerList.getEntry(player).getFuzziedIps(); + } + + + playerMsg(sender, "Player IPs: " + StringUtils.join(ipsToShow, ", ")); return true; } diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java index 18421e4..f7ffa17 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java @@ -19,6 +19,7 @@ import me.StevenLawson.TotalFreedomMod.util.Utilities; import me.StevenLawson.TotalFreedomMod.world.AdminWorld; import me.StevenLawson.TotalFreedomMod.world.RollbackManager; import me.StevenLawson.TotalFreedomMod.world.RollbackManager.RollbackEntry; +import net.md_5.bungee.api.chat.TextComponent; import org.apache.commons.lang3.StringUtils; import org.bukkit.*; import org.bukkit.block.Block; @@ -33,8 +34,11 @@ import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; +import org.javacord.api.entity.message.component.Component; +import java.awt.*; import java.util.*; +import java.util.List; import java.util.Map.Entry; import java.util.regex.Pattern; diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/player/Player.java b/src/main/java/me/StevenLawson/TotalFreedomMod/player/Player.java index 433c6f9..cc2f8cc 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/player/Player.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/player/Player.java @@ -1,10 +1,13 @@ package me.StevenLawson.TotalFreedomMod.player; +import java.sql.Array; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; +import com.google.common.collect.ImmutableList; +import me.StevenLawson.TotalFreedomMod.util.Utilities; import org.bukkit.configuration.ConfigurationSection; public class Player @@ -59,6 +62,17 @@ public class Player return uuid; } + public List getFuzziedIps() { + final ArrayList fuzziedIps = new ArrayList<>(); + + for (String ip : ips) + { + fuzziedIps.add(Utilities.getFuzzyIp(ip)); + } + + return ImmutableList.copyOf(fuzziedIps); + } + public List getIps() { return Collections.unmodifiableList(ips); From be57759e6cb353e87f0be622f6eeba2e5e593ccc Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:03:43 +0100 Subject: [PATCH 09/19] Generics. --- .../TotalFreedomMod/commands/Command_findip.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_findip.java b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_findip.java index b914eeb..ef3b14e 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_findip.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_findip.java @@ -8,6 +8,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.ArrayList; +import java.util.List; @CommandPermissions(level = AdminLevel.SUPER, source = SourceType.BOTH) public class Command_findip extends FreedomCommand { @@ -28,10 +29,10 @@ public class Command_findip extends FreedomCommand { PlayerRank rank = PlayerRank.fromSender(sender); PlayerRank targetRank = PlayerRank.fromSender(player); - ArrayList ipsToShow = (ArrayList) PlayerList.getEntry(player).getIps(); + List ipsToShow = PlayerList.getEntry(player).getIps(); if(rank.getOrdinal() < PlayerRank.SENIOR.getOrdinal() || targetRank.getOrdinal() >= rank.getOrdinal()) { - ipsToShow = (ArrayList) PlayerList.getEntry(player).getFuzziedIps(); + ipsToShow = PlayerList.getEntry(player).getFuzziedIps(); } From c2e4d2939dad5569b223e3b021a39f3edfeb7f6b Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:06:33 +0100 Subject: [PATCH 10/19] Move IP on join from prelogin event to join event --- .../java/me/StevenLawson/TotalFreedomMod/Server.java | 12 ------------ .../TotalFreedomMod/listener/PlayerListener.java | 12 ++++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/Server.java b/src/main/java/me/StevenLawson/TotalFreedomMod/Server.java index cc1fd8d..a6c1b4f 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/Server.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/Server.java @@ -82,18 +82,6 @@ public class Server { final String ip = event.getAddress().getHostAddress().trim(); final boolean isAdmin = AdminList.isSuperAdminSafe(null, ip); - TextComponent textComponent = new TextComponent(String.format("%s is attempting to join with IP %s.", event.getName(), Utilities.getFuzzyIp(ip))); - textComponent.setColor(ChatColor.GRAY.asBungee()); - - for (org.bukkit.entity.Player player : Bukkit.getOnlinePlayers()) - { - if (AdminList.isSuperAdmin(player)) - { - player.spigot().sendMessage(textComponent); - } - } - - DiscordBridge.transmitAdminMessage(textComponent.getText()); // Check if the player is already online for (Player onlinePlayer : TotalFreedomMod.server.getOnlinePlayers()) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java index f7ffa17..7db8523 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java @@ -774,6 +774,18 @@ public class PlayerListener implements Listener { final String ip = Utilities.getIp(player); final Player playerEntry; Log.info("[JOIN] " + Utilities.formatPlayer(player) + " joined the game with IP address: " + ip, true); + TextComponent textComponent = new TextComponent(String.format("%s is joining with IP %s.", player.getName(), Utilities.getFuzzyIp(ip))); + textComponent.setColor(ChatColor.GRAY.asBungee()); + + for (org.bukkit.entity.Player onlinePlayer : Bukkit.getOnlinePlayers()) + { + if (AdminList.isSuperAdmin(player)) + { + onlinePlayer.spigot().sendMessage(textComponent); + } + } + + DiscordBridge.transmitAdminMessage(textComponent.getText()); // Check absolute value to account for negatives if (Math.abs(player.getLocation().getX()) >= MAX_XY_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XY_COORD) From bedb4618cf5ff271df2656e8295f8ce4dbe88e60 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:07:06 +0100 Subject: [PATCH 11/19] Fully sanitize IP join messages --- .../StevenLawson/TotalFreedomMod/listener/PlayerListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java index 7db8523..3477f9c 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/listener/PlayerListener.java @@ -785,7 +785,7 @@ public class PlayerListener implements Listener { } } - DiscordBridge.transmitAdminMessage(textComponent.getText()); + DiscordBridge.transmitAdminMessage(DiscordBridge.fullySanitizeDiscordMessage(textComponent.getText())); // Check absolute value to account for negatives if (Math.abs(player.getLocation().getX()) >= MAX_XY_COORD || Math.abs(player.getLocation().getZ()) >= MAX_XY_COORD) From 3ba470d580e9097d28bd016af9d3e79d5016e5df Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:15:34 +0100 Subject: [PATCH 12/19] Block unknown is useless, pretend to support it but actually just make it the default blocked command message --- .../TotalFreedomMod/command/CommandBlocker.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/command/CommandBlocker.java b/src/main/java/me/StevenLawson/TotalFreedomMod/command/CommandBlocker.java index 65f82c1..5b9cb34 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/command/CommandBlocker.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/command/CommandBlocker.java @@ -316,12 +316,6 @@ public class CommandBlocker return; } - if (action == CommandBlockerAction.BLOCK_UNKNOWN) - { - Utilities.playerMsg(sender, "Unknown command. Type \"help\" for help.", ChatColor.RESET); - return; - } - Utilities.playerMsg(sender, Utilities.colorize(message)); } } From a09986329160c8ea4df95fb68fa570ad951049cf Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:25:33 +0100 Subject: [PATCH 13/19] Use a different method? --- .../TotalFreedomMod/discord/bridge/DiscordBridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index 0fa5449..5c0cfe9 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -38,7 +38,7 @@ public class DiscordBridge { isAdmin = message.getChannel().getIdAsString().equalsIgnoreCase(ADMIN_CHANNEL.getIdAsString()); } catch (Exception ignored) {} - String content = message.getReadableMessageContent(); + String content = message.getMessage().getReadableContent(); String prefix = MainConfig.getString(ConfigurationEntry.DISCORD_PREFIX); MessageAuthor author = message.getMessage().getAuthor(); From 33371045babf9c62c3e26d5f8d9df7766344b2fd Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:39:31 +0100 Subject: [PATCH 14/19] Add replies --- .../TotalFreedomMod/discord/bridge/DiscordBridge.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index 5c0cfe9..b7d51c5 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -15,6 +15,7 @@ import org.bukkit.ChatColor; import org.javacord.api.DiscordApi; import org.javacord.api.DiscordApiBuilder; import org.javacord.api.entity.channel.TextChannel; +import org.javacord.api.entity.message.Message; import org.javacord.api.entity.message.MessageAttachment; import org.javacord.api.entity.message.MessageAuthor; import org.javacord.api.entity.server.Server; @@ -65,11 +66,19 @@ public class DiscordBridge { if (content.toLowerCase().startsWith(prefix)) { COMMAND_MANAGER.parse(content, user.get(), server.get(), message.getChannel(), prefix); } else { + Optional referenced = message.getMessage().getReferencedMessage(); + + String reply = ""; + if(referenced.isPresent()) { + Message replyingTo = referenced.get(); + reply = String.format("┌ %s\t%s\n", replyingTo.getAuthor().getDiscriminatedName(), replyingTo.getReadableContent()); + } + String format = MainConfig.getString((isAdmin) ? ConfigurationEntry.DISCORD_ADMIN_FORMAT : ConfigurationEntry.DISCORD_FORMAT); format = format.replace("{TAG}", author.getDiscriminatedName()); format = format.replace("{USERNAME}", author.getName()); BaseComponent[] components = TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', String.format(format, content))); - TextComponent component = new TextComponent(""); + TextComponent component = new TextComponent(reply); for (BaseComponent baseComponent : components) { component.addExtra(baseComponent); From 599f031e54f62a3d3f228cd338b532894ecf1204 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:41:37 +0100 Subject: [PATCH 15/19] Add replies --- .../TotalFreedomMod/discord/bridge/DiscordBridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index b7d51c5..a7ebe77 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -71,7 +71,7 @@ public class DiscordBridge { String reply = ""; if(referenced.isPresent()) { Message replyingTo = referenced.get(); - reply = String.format("┌ %s\t%s\n", replyingTo.getAuthor().getDiscriminatedName(), replyingTo.getReadableContent()); + reply = String.format("┌ %s %s\n", replyingTo.getAuthor().getDiscriminatedName(), replyingTo.getReadableContent()); } String format = MainConfig.getString((isAdmin) ? ConfigurationEntry.DISCORD_ADMIN_FORMAT : ConfigurationEntry.DISCORD_FORMAT); From 5ebc7596e57649600b1d1f32d4e628832f9dbdb2 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:47:31 +0100 Subject: [PATCH 16/19] Add replies --- .../TotalFreedomMod/discord/bridge/DiscordBridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index a7ebe77..fc36477 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -71,7 +71,7 @@ public class DiscordBridge { String reply = ""; if(referenced.isPresent()) { Message replyingTo = referenced.get(); - reply = String.format("┌ %s %s\n", replyingTo.getAuthor().getDiscriminatedName(), replyingTo.getReadableContent()); + reply = String.format(ChatColor.GRAY + "┌ " + ChatColor.YELLOW + "%s" + ChatColor.GRAY + " %s\n" + ChatColor.WHITE, replyingTo.getAuthor().getDiscriminatedName(), replyingTo.getReadableContent()); } String format = MainConfig.getString((isAdmin) ? ConfigurationEntry.DISCORD_ADMIN_FORMAT : ConfigurationEntry.DISCORD_FORMAT); From b222edc531f1a844ec49e2d2a1b6b110e0442029 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:50:55 +0100 Subject: [PATCH 17/19] Kill Discord properly --- .../TotalFreedomMod/commands/Command_updatetfm.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_updatetfm.java b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_updatetfm.java index 5eb61b9..ef64ba4 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_updatetfm.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/commands/Command_updatetfm.java @@ -2,6 +2,7 @@ package me.StevenLawson.TotalFreedomMod.commands; import me.StevenLawson.TotalFreedomMod.config.ConfigurationEntry; import me.StevenLawson.TotalFreedomMod.config.MainConfig; +import me.StevenLawson.TotalFreedomMod.discord.bridge.DiscordBridge; import me.StevenLawson.TotalFreedomMod.util.SynchronousUtil; import me.StevenLawson.TotalFreedomMod.util.Utilities; import org.bukkit.Bukkit; @@ -27,6 +28,7 @@ public class Command_updatetfm extends FreedomCommand { ProcessBuilder proc = new ProcessBuilder("/bin/bash", "-c", command); Process process = proc.start(); process.waitFor(); + DiscordBridge.transmitMessage("**TFM is being reloaded...**", true); playerMsg(sender, "Compiled TFM! Reloading..."); Utilities.adminAction(sender.getName(), "Compilation successful, reloading TFM...", false); for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { From cc00f65e7217eddc79f89cd9d4a888c060732f73 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Tue, 29 Mar 2022 23:59:58 +0100 Subject: [PATCH 18/19] Hopefully fix discord being killed incorrectly --- pom.xml | 1 + .../TotalFreedomMod/discord/bridge/DiscordBridge.java | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/pom.xml b/pom.xml index 636460a..808d0dd 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,7 @@ org.bukkit craftbukkit 1.8.8-R0.1-SNAPSHOT + provided diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index fc36477..ae9153b 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -24,6 +24,8 @@ import org.javacord.api.event.message.MessageCreateEvent; import org.javacord.api.event.message.MessageEvent; import java.util.Optional; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; public class DiscordBridge { @@ -189,7 +191,15 @@ public class DiscordBridge { CHANNEL.sendMessage(sanitizeMessage(message)).get(); } catch (Exception ignored) { } + CountDownLatch shutdownWaiter = new CountDownLatch(1); + + DISCORD_API.addLostConnectionListener(lostConnectionEvent -> shutdownWaiter.countDown()); DISCORD_API.disconnect(); + + try { + shutdownWaiter.await(30, TimeUnit.SECONDS); + } catch (InterruptedException ignored) { + } } } From 82e70bef71f514ca1a2fdbb4573302d008d5f263 Mon Sep 17 00:00:00 2001 From: Business Goose Date: Wed, 30 Mar 2022 00:03:22 +0100 Subject: [PATCH 19/19] Hopefully fix discord being killed incorrectly --- .../discord/bridge/DiscordBridge.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java index ae9153b..8d2640b 100644 --- a/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java +++ b/src/main/java/me/StevenLawson/TotalFreedomMod/discord/bridge/DiscordBridge.java @@ -193,13 +193,16 @@ public class DiscordBridge { } CountDownLatch shutdownWaiter = new CountDownLatch(1); - DISCORD_API.addLostConnectionListener(lostConnectionEvent -> shutdownWaiter.countDown()); - DISCORD_API.disconnect(); + Thread t = new Thread(() -> { + DISCORD_API.addLostConnectionListener(lostConnectionEvent -> shutdownWaiter.countDown()); + DISCORD_API.disconnect(); - try { - shutdownWaiter.await(30, TimeUnit.SECONDS); - } catch (InterruptedException ignored) { - } + try { + shutdownWaiter.await(30, TimeUnit.SECONDS); + } catch (InterruptedException ignored) { + } + }); + t.start(); } }