From e8d4f03992297f20788c296c9b75660936881c4b Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 23 Dec 2016 22:53:36 +0100 Subject: [PATCH 1/4] Added embeds to sendMessageToChannel --- .../discordplugin/DiscordPlugin.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 96e0f23..eae781b 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -1,5 +1,6 @@ package buttondevteam.discordplugin; +import java.awt.Color; import java.io.BufferedReader; import java.io.File; import java.nio.charset.StandardCharsets; @@ -18,8 +19,10 @@ import buttondevteam.lib.chat.TBMCChatAPI; import net.milkbowl.vault.permission.Permission; import sx.blah.discord.api.*; import sx.blah.discord.api.events.IListener; +import sx.blah.discord.api.internal.json.objects.EmbedObject; import sx.blah.discord.handle.impl.events.ReadyEvent; import sx.blah.discord.handle.obj.*; +import sx.blah.discord.util.EmbedBuilder; import sx.blah.discord.util.RateLimitException; /** @@ -106,8 +109,8 @@ public class DiscordPlugin extends JavaPlugin implements IListener { officechannel = devServer.getChannelByID("219626707458457603"); // developers-office dc.changeStatus(Status.game("testing")); } - Bukkit.getScheduler().runTaskAsynchronously(this, - () -> sendMessageToChannel(chatchannel, "Server started - chat connected.")); + Bukkit.getScheduler().runTaskAsynchronously(this, () -> sendMessageToChannel(chatchannel, "", + new EmbedBuilder().withColor(Color.BLUE).withTitle("Server started - chat connected.").build())); Runnable r = new Runnable() { public void run() { AnnouncementGetterThreadMethod(); @@ -198,6 +201,10 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } public static IMessage sendMessageToChannel(IChannel channel, String message) { + return sendMessageToChannel(channel, message, null); + } + + public static IMessage sendMessageToChannel(IChannel channel, String message, EmbedObject embed) { if (message.length() > 1900) { message = message.substring(0, 1900); Bukkit.getLogger() @@ -210,8 +217,9 @@ public class DiscordPlugin extends JavaPlugin implements IListener { e2.printStackTrace(); } try { - return channel.sendMessage(TBMCCoreAPI.IsTestServer() && channel != chatchannel - ? "*The following message is from a test server*\n" + message : message); + final String content = TBMCCoreAPI.IsTestServer() && channel != chatchannel + ? "*The following message is from a test server*\n" + message : message; + return embed == null ? channel.sendMessage(content) : channel.sendMessage(content, embed, false); } catch (RateLimitException e) { try { Thread.sleep(e.getRetryDelay()); From 9383f5ea0c5f48783fe028d3fccb025612220132 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 23 Dec 2016 23:06:23 +0100 Subject: [PATCH 2/4] Moved update msgs to <#219530035365675010> #coffee-table --- src/main/java/buttondevteam/discordplugin/DiscordPlugin.java | 5 ++++- .../discordplugin/listeners/AutoUpdaterListener.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index eae781b..2a2b622 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -78,6 +78,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { public static IChannel issuechannel; public static IChannel botroomchannel; public static IChannel officechannel; + public static IChannel coffeechannel; public static IGuild mainServer; public static IGuild devServer; @@ -98,6 +99,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { issuechannel = devServer.getChannelByID("219643416496046081"); // server-issues botroomchannel = devServer.getChannelByID("239519012529111040"); // bot-room officechannel = devServer.getChannelByID("219626707458457603"); // developers-office + coffeechannel = devServer.getChannelByID("219530035365675010"); // coffee-table dc.changeStatus(Status.game("on TBMC")); } else { botchannel = devServer.getChannelByID("239519012529111040"); // bot-room @@ -106,7 +108,8 @@ public class DiscordPlugin extends JavaPlugin implements IListener { botroomchannel = botchannel;// bot-room issuechannel = botchannel; // bot-room chatchannel = devServer.getChannelByID("248185455508455424"); // minecraft_chat_test - officechannel = devServer.getChannelByID("219626707458457603"); // developers-office + officechannel = botchannel; // bot-room + coffeechannel = botchannel; // bot-room dc.changeStatus(Status.game("testing")); } Bukkit.getScheduler().runTaskAsynchronously(this, () -> sendMessageToChannel(chatchannel, "", diff --git a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java index 56551ed..541815b 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java @@ -22,7 +22,7 @@ public class AutoUpdaterListener implements IListener { String branch = title.substring(title.indexOf(':') + 1, title.indexOf(']')); String project = title.substring(title.indexOf('[') + 1, title.indexOf(':')); if (branch.equals("master") || (TBMCCoreAPI.IsTestServer() && branch.equals("dev")) - && TBMCCoreAPI.UpdatePlugin(project, new DiscordSender(null, DiscordPlugin.chatchannel), branch) + && TBMCCoreAPI.UpdatePlugin(project, new DiscordSender(null, TBMCCoreAPI.IsTestServer()?DiscordPlugin.chatchannel:DiscordPlugin.coffeechannel), branch) && (!TBMCCoreAPI.IsTestServer() || !branch.equals("master"))) try { event.getMessage().addReaction(DiscordPlugin.DELIVERED_REACTION); From 2f76583a87405eeac8ab4704ac366742625d2349 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 24 Dec 2016 16:50:14 +0100 Subject: [PATCH 3/4] Using embeds for chat and separated restart and stop messages --- .../discordplugin/DiscordPlugin.java | 10 ++++++++-- .../discordplugin/listeners/MCChatListener.java | 16 ++++++++++++---- .../discordplugin/listeners/MCListener.java | 8 ++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 2a2b622..a3793b9 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -113,7 +113,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { dc.changeStatus(Status.game("testing")); } Bukkit.getScheduler().runTaskAsynchronously(this, () -> sendMessageToChannel(chatchannel, "", - new EmbedBuilder().withColor(Color.BLUE).withTitle("Server started - chat connected.").build())); + new EmbedBuilder().withColor(Color.GREEN).withTitle("Server started - chat connected.").build())); Runnable r = new Runnable() { public void run() { AnnouncementGetterThreadMethod(); @@ -133,13 +133,19 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } } + /** + * Always true, except when running "stop" from console + */ + public static boolean Restart; + @Override public void onDisable() { stop = true; getConfig().set("lastannouncementtime", lastannouncementtime); getConfig().set("lastseentime", lastseentime); saveConfig(); - sendMessageToChannel(chatchannel, "Server restarting/stopping"); + sendMessageToChannel(chatchannel, "", new EmbedBuilder().withColor(Restart ? Color.ORANGE : Color.RED) + .withTitle(Restart ? "Server restarting" : "Server stopping").build()); try { dc.changeStatus(Status.game("on TBMC")); dc.logout(); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 69ee4cd..f93892c 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -1,5 +1,6 @@ package buttondevteam.discordplugin.listeners; +import java.time.LocalDateTime; import java.util.Arrays; import java.util.HashMap; import java.util.Optional; @@ -19,6 +20,7 @@ import sx.blah.discord.api.events.IListener; import sx.blah.discord.handle.impl.events.MessageReceivedEvent; import sx.blah.discord.handle.obj.IReaction; import sx.blah.discord.handle.obj.IUser; +import sx.blah.discord.util.EmbedBuilder; import sx.blah.discord.util.RateLimitException; public class MCChatListener implements Listener, IListener { @@ -28,11 +30,17 @@ public class MCChatListener implements Listener, IListener return; if (e.getSender() instanceof DiscordSender || e.getSender() instanceof DiscordPlayerSender) return; - if (e.getChannel().equals(Channel.GlobalChat)) - DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, - DiscordPlugin.sanitizeString("<" + (e.getSender() instanceof Player // + if (e.getChannel().equals(Channel.GlobalChat)) { + final EmbedBuilder embed = new EmbedBuilder() + .withAuthorName(DiscordPlugin.sanitizeString(e.getSender() instanceof Player // ? ((Player) e.getSender()).getDisplayName() // - : e.getSender().getName()) + "> " + e.getMessage())); + : e.getSender().getName())) + .withDescription(e.getMessage()); + DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, "", + e.getSender() instanceof Player ? embed + .withAuthorIcon("https://minotar.net/avatar/" + ((Player) e.getSender()).getName() + "/32.png") + .build() : embed.build()); + } // TODO: Author URL } private static final String[] UnconnectedCmds = new String[] { "list", "u", "shrug", "tableflip", "unflip", "mwiki", diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 0b31068..a85257f 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -1,11 +1,14 @@ package buttondevteam.discordplugin.listeners; import org.bukkit.Bukkit; +import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.server.ServerCommandEvent; + import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.commands.ConnectCommand; @@ -61,4 +64,9 @@ public class MCListener implements Listener { DiscordPlugin.sanitizeString(e.getAffected().getBase().getDisplayName()) + " is " + (e.getValue() ? "now" : "no longer") + " AFK."); } + + @EventHandler + public void onServerCommand(ServerCommandEvent e) { + DiscordPlugin.Restart = !e.getCommand().equalsIgnoreCase("stop"); // The variable is always true except if stopped + } } From 6c1b2e39c4789679ebc18c769b70b4d4ad8eb117 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 25 Dec 2016 00:48:56 +0100 Subject: [PATCH 4/4] IT WORKS! (See commit body) - Added message grouping - Moved listener and other registrations to the Discord ready event, so people can't do things before they should - Spent lot of time on message grouping --- .../discordplugin/DiscordPlugin.java | 20 ++++---- .../listeners/MCChatListener.java | 51 ++++++++++++------- .../discordplugin/listeners/MCListener.java | 1 - 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index a3793b9..d641f64 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -56,15 +56,6 @@ public class DiscordPlugin extends JavaPlugin implements IListener { cb.withToken(Files.readFirstLine(new File("TBMC", "Token.txt"), StandardCharsets.UTF_8)); dc = cb.login(); dc.getDispatcher().registerListener(this); - for (IListener listener : CommandListener.getListeners()) - dc.getDispatcher().registerListener(listener); - MCChatListener mcchat = new MCChatListener(); - dc.getDispatcher().registerListener(mcchat); - TBMCCoreAPI.RegisterEventsForExceptions(mcchat, this); - dc.getDispatcher().registerListener(new AutoUpdaterListener()); - Bukkit.getPluginManager().registerEvents(new ExceptionListener(), this); - TBMCCoreAPI.RegisterEventsForExceptions(new MCListener(), this); - TBMCChatAPI.AddCommands(this, DiscordMCCommandBase.class); } catch (Exception e) { e.printStackTrace(); Bukkit.getPluginManager().disablePlugin(this); @@ -112,6 +103,17 @@ public class DiscordPlugin extends JavaPlugin implements IListener { coffeechannel = botchannel; // bot-room dc.changeStatus(Status.game("testing")); } + + for (IListener listener : CommandListener.getListeners()) + dc.getDispatcher().registerListener(listener); + MCChatListener mcchat = new MCChatListener(); + dc.getDispatcher().registerListener(mcchat); + TBMCCoreAPI.RegisterEventsForExceptions(mcchat, this); + dc.getDispatcher().registerListener(new AutoUpdaterListener()); + Bukkit.getPluginManager().registerEvents(new ExceptionListener(), this); + TBMCCoreAPI.RegisterEventsForExceptions(new MCListener(), this); + TBMCChatAPI.AddCommands(this, DiscordMCCommandBase.class); + Bukkit.getScheduler().runTaskAsynchronously(this, () -> sendMessageToChannel(chatchannel, "", new EmbedBuilder().withColor(Color.GREEN).withTitle("Server started - chat connected.").build())); Runnable r = new Runnable() { diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index f93892c..338fbcb 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -1,6 +1,5 @@ package buttondevteam.discordplugin.listeners; -import java.time.LocalDateTime; import java.util.Arrays; import java.util.HashMap; import java.util.Optional; @@ -11,17 +10,14 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import buttondevteam.discordplugin.*; -import buttondevteam.lib.TBMCChatEvent; -import buttondevteam.lib.TBMCCoreAPI; -import buttondevteam.lib.TBMCPlayer; +import buttondevteam.lib.*; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.TBMCChatAPI; import sx.blah.discord.api.events.IListener; +import sx.blah.discord.api.internal.json.objects.EmbedObject; import sx.blah.discord.handle.impl.events.MessageReceivedEvent; -import sx.blah.discord.handle.obj.IReaction; -import sx.blah.discord.handle.obj.IUser; -import sx.blah.discord.util.EmbedBuilder; -import sx.blah.discord.util.RateLimitException; +import sx.blah.discord.handle.obj.*; +import sx.blah.discord.util.*; public class MCChatListener implements Listener, IListener { @EventHandler // Minecraft @@ -31,21 +27,41 @@ public class MCChatListener implements Listener, IListener if (e.getSender() instanceof DiscordSender || e.getSender() instanceof DiscordPlayerSender) return; if (e.getChannel().equals(Channel.GlobalChat)) { - final EmbedBuilder embed = new EmbedBuilder() - .withAuthorName(DiscordPlugin.sanitizeString(e.getSender() instanceof Player // - ? ((Player) e.getSender()).getDisplayName() // - : e.getSender().getName())) - .withDescription(e.getMessage()); - DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, "", - e.getSender() instanceof Player ? embed - .withAuthorIcon("https://minotar.net/avatar/" + ((Player) e.getSender()).getName() + "/32.png") - .build() : embed.build()); + final String authorPlayer = DiscordPlugin.sanitizeString(e.getSender() instanceof Player // + ? ((Player) e.getSender()).getDisplayName() // + : e.getSender().getName()); + final EmbedBuilder embed = new EmbedBuilder().withAuthorName(authorPlayer).withDescription(e.getMessage()); + final EmbedObject embedObject = e.getSender() instanceof Player + ? embed.withAuthorIcon( + "https://minotar.net/avatar/" + ((Player) e.getSender()).getName() + "/32.png").build() + : embed.build(); + final long nanoTime = System.nanoTime(); + if (lastmessage == null || lastmessage.isDeleted() + || !authorPlayer.equals(lastmessage.getEmbedded().get(0).getAuthor().getName()) + || lastmsgtime / 1000000000f < nanoTime / 1000000000f - 120) { + /*System.out.println("lastmsgtime: " + lastmsgtime); + System.out.println("Current: " + nanoTime); + System.out.println("2 mins before: " + (nanoTime - 120 * 1000000000)); + System.out.println("Diff: " + (nanoTime - (nanoTime - 120 * 1000000000)));*/ + lastmessage = DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, "", embedObject); + lastmsgtime = nanoTime; + } else + try { + embedObject.description = lastmessage.getEmbedded().get(0).getDescription() + "\n" + + embedObject.description; + lastmessage.edit("", embedObject); + } catch (MissingPermissionsException | RateLimitException | DiscordException e1) { + TBMCCoreAPI.SendException("An error occured while editing chat message!", e1); + } } // TODO: Author URL } private static final String[] UnconnectedCmds = new String[] { "list", "u", "shrug", "tableflip", "unflip", "mwiki", "yeehaw" }; + private static IMessage lastmessage = null; + private static long lastmsgtime = 0; + public static final HashMap UnconnectedSenders = new HashMap<>(); public static final HashMap ConnectedSenders = new HashMap<>(); @@ -57,6 +73,7 @@ public class MCChatListener implements Listener, IListener if (!event.getMessage().getChannel().getID().equals(DiscordPlugin.chatchannel.getID()) /* && !(event.getMessage().getChannel().isPrivate() && privatechat) */) return; + lastmessage = null; if (CommandListener.runCommand(event.getMessage(), true)) return; String dmessage = event.getMessage().getContent(); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index a85257f..f7a4b95 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -1,7 +1,6 @@ package buttondevteam.discordplugin.listeners; import org.bukkit.Bukkit; -import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority;