From 12a21461c0c47c3f0edd3160c8ebc7ea3ab536c2 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 3 Aug 2018 23:23:55 +0200 Subject: [PATCH] Added escaping & fixed reset stuff Escaping everything, including names (#47) Player list unhooking added (#73) Also removed autoupdater stuff and did other smaller changes --- .../buttondevteam/discordplugin/DPUtils.java | 58 +++++++++++-------- .../discordplugin/DiscordPlugin.java | 20 +++++-- .../discordplugin/PlayerListWatcher.java | 19 ++++++ .../listeners/AutoUpdaterListener.java | 24 -------- .../listeners/CommandListener.java | 2 +- .../listeners/MCChatListener.java | 4 +- .../discordplugin/listeners/MCListener.java | 3 +- 7 files changed, 75 insertions(+), 55 deletions(-) delete mode 100755 src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java index 89c0b82..ea4d14d 100755 --- a/src/main/java/buttondevteam/discordplugin/DPUtils.java +++ b/src/main/java/buttondevteam/discordplugin/DPUtils.java @@ -9,6 +9,7 @@ import sx.blah.discord.util.RequestBuffer.IVoidRequest; import javax.annotation.Nullable; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.regex.Matcher; public final class DPUtils { @@ -16,24 +17,31 @@ public final class DPUtils { return builder.withAuthorIcon("https://minotar.net/avatar/" + playername + "/32.png"); } - /** Removes §[char] colour codes from strings */ - public static String sanitizeString(String string) { - String sanitizedString = ""; - boolean random = false; - for (int i = 0; i < string.length(); i++) { - if (string.charAt(i) == '§') { - i++;// Skips the data value, the 4 in "§4Alisolarflare" - if (string.charAt(i) == 'k') - random = true; - else - random = false; - } else { - if (!random) // Skip random/obfuscated characters - sanitizedString += string.charAt(i); - } - } - return sanitizedString; - } + /** + * Removes §[char] colour codes from strings & escapes them for Discord
+ * Ensure that this method only gets called once (escaping) + */ + public static String sanitizeString(String string) { + return escape(sanitizeStringNoEscape(string)); + } + + /** + * Removes §[char] colour codes from strings + */ + public static String sanitizeStringNoEscape(String string) { + String sanitizedString = ""; + boolean random = false; + for (int i = 0; i < string.length(); i++) { + if (string.charAt(i) == '§') { + i++;// Skips the data value, the 4 in "§4Alisolarflare" + random = string.charAt(i) == 'k'; + } else { + if (!random) // Skip random/obfuscated characters + sanitizedString += string.charAt(i); + } + } + return sanitizedString; + } /** * Performs Discord actions, retrying when ratelimited. May return null if action fails too many times or in safe mode. @@ -78,10 +86,14 @@ public final class DPUtils { RequestBuffer.request(action); } - public static void performNoWait(IRequest action) { - if (DiscordPlugin.SafeMode) - return; - RequestBuffer.request(action); - } + public static void performNoWait(IRequest action) { + if (DiscordPlugin.SafeMode) + return; + RequestBuffer.request(action); + } + + public static String escape(String message) { + return message.replaceAll("([*_~])", Matcher.quoteReplacement("\\")+"$1"); + } } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 1b91494..431f212 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -1,7 +1,10 @@ package buttondevteam.discordplugin; import buttondevteam.discordplugin.commands.DiscordCommandBase; -import buttondevteam.discordplugin.listeners.*; +import buttondevteam.discordplugin.listeners.CommandListener; +import buttondevteam.discordplugin.listeners.ExceptionListener; +import buttondevteam.discordplugin.listeners.MCChatListener; +import buttondevteam.discordplugin.listeners.MCListener; import buttondevteam.discordplugin.mccommands.DiscordMCCommandBase; import buttondevteam.discordplugin.mccommands.ResetMCCommand; import buttondevteam.lib.TBMCCoreAPI; @@ -188,9 +191,9 @@ public class DiscordPlugin extends JavaPlugin implements IListener { sent = true; if (TBMCCoreAPI.IsTestServer() && !dc.getOurUser().getName().toLowerCase().contains("test")) { TBMCCoreAPI.SendException( - "Won't load because we're in testing mode and not using the separate account.", + "Won't load because we're in testing mode and not using a separate account.", new Exception( - "The plugin refuses to load until you change the token to the testing account.")); + "The plugin refuses to load until you change the token to a testing account.")); Bukkit.getPluginManager().disablePlugin(this); } TBMCCoreAPI.SendUnsentExceptions(); @@ -213,7 +216,6 @@ public class DiscordPlugin extends JavaPlugin implements IListener { MCChatListener mcchat = new MCChatListener(); dc.getDispatcher().registerListener(mcchat); TBMCCoreAPI.RegisterEventsForExceptions(mcchat, this); - TBMCCoreAPI.RegisterEventsForExceptions(new AutoUpdaterListener(), this); Bukkit.getPluginManager().registerEvents(new ExceptionListener(), this); TBMCCoreAPI.RegisterEventsForExceptions(new MCListener(), this); TBMCChatAPI.AddCommands(this, DiscordMCCommandBase.class); @@ -288,6 +290,16 @@ public class DiscordPlugin extends JavaPlugin implements IListener { try { SafeMode = true; // Stop interacting with Discord MCChatListener.stop(true); + try { + if (PlayerListWatcher.hookDown()) + System.out.println("Finished unhooking the player list!"); + else + System.out.println("Didn't have the player list hooked."); + hooked = false; + } catch (Throwable e) { + e.printStackTrace(); + Bukkit.getLogger().warning("Couldn't unhook the player list!"); + } ChromaBot.delete(); dc.changePresence(StatusType.IDLE, ActivityType.PLAYING, "Chromacraft"); //No longer using the same account for testing dc.logout(); diff --git a/src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java b/src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java index e056737..c2c878c 100755 --- a/src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java +++ b/src/main/java/buttondevteam/discordplugin/PlayerListWatcher.java @@ -82,6 +82,25 @@ public class PlayerListWatcher extends DedicatedPlayerList { } } + public static boolean hookDown() { + try { + Field conf = CraftServer.class.getDeclaredField("console"); + conf.setAccessible(true); + val server = (MinecraftServer) conf.get(Bukkit.getServer()); + val plist = (DedicatedPlayerList) server.getPlayerList(); + if (!(plist instanceof PlayerListWatcher)) + return false; + server.a(((PlayerListWatcher) plist).plist); + Field pllf = CraftServer.class.getDeclaredField("playerList"); + pllf.setAccessible(true); + pllf.set(Bukkit.getServer(), ((PlayerListWatcher) plist).plist); + return true; + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while hacking the player list!", e); + return true; + } + } + public void a(EntityHuman entityhuman, IChatBaseComponent ichatbasecomponent) { plist.a(entityhuman, ichatbasecomponent); } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java deleted file mode 100755 index a6d0150..0000000 --- a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java +++ /dev/null @@ -1,24 +0,0 @@ -package buttondevteam.discordplugin.listeners; - -import buttondevteam.discordplugin.DPUtils; -import buttondevteam.discordplugin.DiscordPlugin; -import buttondevteam.lib.PluginUpdater; -import buttondevteam.lib.TBMCCoreAPI; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -public class AutoUpdaterListener implements Listener { - @EventHandler - public void handle(PluginUpdater.UpdatedEvent event) { - if (DiscordPlugin.SafeMode) - return; - try { - DPUtils.performNoWait(() -> DiscordPlugin.officechannel.getMessageHistory(10).stream() - .filter(m -> m.getWebhookLongID() == 239123781401051138L && m.getEmbeds().get(0).getTitle() - .contains(event.getData().get("repository").getAsJsonObject().get("name").getAsString())) - .findFirst().get().addReaction(DiscordPlugin.DELIVERED_REACTION)); - } catch (Exception e) { - TBMCCoreAPI.SendException("An error occured while reacting to plugin update!", e); - } - } -} diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 1db1fdc..9384c6e 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -213,7 +213,7 @@ public class CommandListener { private static boolean checkanddeletemention(StringBuilder cmdwithargs, String mention, IMessage message) { if (message.getContent().startsWith(mention)) // TODO: Resolve mentions: Compound arguments, either a mention or text if (cmdwithargs.length() > mention.length() + 1) - cmdwithargs = cmdwithargs.delete(0, + cmdwithargs.delete(0, cmdwithargs.charAt(mention.length()) == ' ' ? mention.length() + 1 : mention.length()); else cmdwithargs.replace(0, cmdwithargs.length(), "help"); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 393221a..e42085f 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -76,9 +76,9 @@ public class MCChatListener implements Listener, IListener e = se.getKey(); time = se.getValue(); - final String authorPlayer = "[" + DPUtils.sanitizeString(e.getChannel().DisplayName) + "] " // + final String authorPlayer = "[" + DPUtils.sanitizeStringNoEscape(e.getChannel().DisplayName) + "] " // + (e.getSender() instanceof DiscordSenderBase ? "[D]" : "") // - + (DPUtils.sanitizeString(e.getSender() instanceof Player // + + (DPUtils.sanitizeStringNoEscape(e.getSender() instanceof Player // ? ((Player) e.getSender()).getDisplayName() // : e.getSender().getName())); final EmbedBuilder embed = new EmbedBuilder().withAuthorName(authorPlayer) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 8eab392..49e337a 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -66,6 +66,7 @@ public class MCListener implements Listener { if (!DiscordPlugin.hooked) MCChatListener.sendSystemMessageToChat(message); MCChatListener.forAllowedCustomMCChat(ch -> DiscordPlugin.sendMessageToChannel(ch, message), e.getPlayer()); + //System.out.println("Does this appear more than once?"); //No MCChatListener.ListC = 0; ChromaBot.getInstance().updatePlayerList(); }); @@ -120,7 +121,7 @@ public class MCListener implements Listener { public void onPlayerAFK(AfkStatusChangeEvent e) { //TODO: Add AFK to custom chats? if (e.isCancelled() || !e.getAffected().getBase().isOnline()) return; - MCChatListener.sendSystemMessageToChat(DPUtils.sanitizeString(e.getAffected().getBase().getDisplayName()) + MCChatListener.sendSystemMessageToChat(e.getAffected().getBase().getDisplayName() + " is " + (e.getValue() ? "now" : "no longer") + " AFK."); }