From d50e9a23ced1972759901fb9b3ab15fa38cda060 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 4 Jan 2017 20:56:00 +0100 Subject: [PATCH 1/9] Fixed start message not showing --- .../java/buttondevteam/discordplugin/DiscordPlugin.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 41c425d..f871d45 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -74,6 +74,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { public static IGuild devServer; private static volatile BukkitTask task; + private static volatile boolean sent = false; @Override public void handle(ReadyEvent event) { @@ -110,6 +111,11 @@ public class DiscordPlugin extends JavaPlugin implements IListener { SafeMode = false; if (task != null) task.cancel(); + if (!sent) { + sendMessageToChannel(chatchannel, "", new EmbedBuilder().withColor(Color.GREEN) + .withTitle("Server started - chat connected.").build()); + sent = true; + } }, 0, 10); for (IListener listener : CommandListener.getListeners()) dc.getDispatcher().registerListener(listener); @@ -120,9 +126,6 @@ public class DiscordPlugin extends JavaPlugin implements IListener { 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() { public void run() { AnnouncementGetterThreadMethod(); From 519e0f468e78c8184e45205c93ae6ce7a2749a35 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 14 Jan 2017 01:33:44 +0100 Subject: [PATCH 2/9] Started game role commands --- .../commands/DiscordCommandBase.java | 3 +- .../discordplugin/commands/RoleCommand.java | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java diff --git a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java index df1846c..be80fbf 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java +++ b/src/main/java/buttondevteam/discordplugin/commands/DiscordCommandBase.java @@ -10,7 +10,7 @@ public abstract class DiscordCommandBase { public abstract String getCommandName(); public abstract void run(IMessage message, String args); - + public abstract String[] getHelpText(); static final HashMap commands = new HashMap(); @@ -19,6 +19,7 @@ public abstract class DiscordCommandBase { commands.put("connect", new ConnectCommand()); // TODO: API for adding commands? commands.put("userinfo", new UserinfoCommand()); commands.put("help", new HelpCommand()); + commands.put("role", new RoleCommand()); } public static void runCommand(String cmd, String args, IMessage message) { diff --git a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java new file mode 100644 index 0000000..a4a5bd9 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java @@ -0,0 +1,44 @@ +package buttondevteam.discordplugin.commands; + +import buttondevteam.discordplugin.DiscordPlugin; +import sx.blah.discord.handle.obj.IMessage; + +public class RoleCommand extends DiscordCommandBase { + + @Override + public String getCommandName() { + return "role"; + } + + @Override + public void run(IMessage message, String args) { + final String usagemsg = "Subcommands: add, remove, list"; + if (args.length() == 0) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), usagemsg); + return; + } + String[] argsa = args.split(" "); + if (argsa[0].equalsIgnoreCase("add")) { + if (argsa.length < 2) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "This command adds a game role to your account.\nUsage: add "); + return; + } + } else if (argsa[0].equalsIgnoreCase("remove")) { + if (argsa.length < 2) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "This command removes a game role from your account.\nUsage: remove "); + return; + } + } else if (argsa[0].equalsIgnoreCase("list")) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), "List of game roles:"); + } + } + + @Override + public String[] getHelpText() { + // TODO Auto-generated method stub + return null; + } + +} From 2b9164ebc610f5017555c9565fe6c29309e9863d Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 14 Jan 2017 13:32:33 +0100 Subject: [PATCH 3/9] Fixes and probably added add cmd --- .../discordplugin/DiscordPlugin.java | 41 ++++++++---------- .../discordplugin/commands/RoleCommand.java | 43 ++++++++++++++++++- 2 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index f871d45..b600ee6 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -4,6 +4,7 @@ import java.awt.Color; import java.io.BufferedReader; import java.io.File; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.List; import org.bukkit.Bukkit; import org.bukkit.plugin.RegisteredServiceProvider; @@ -32,24 +33,18 @@ public class DiscordPlugin extends JavaPlugin implements IListener { public static IDiscordClient dc; public static DiscordPlugin plugin; public static boolean SafeMode = true; + public static List GameRoles; + @SuppressWarnings("unchecked") @Override public void onEnable() { try { Bukkit.getLogger().info("Initializing DiscordPlugin..."); plugin = this; - final File file = new File("TBMC", "DiscordRedditLastAnnouncement.txt"); - if (file.exists()) { - BufferedReader reader = Files.newReader(file, StandardCharsets.UTF_8); - String line = reader.readLine(); - lastannouncementtime = Long.parseLong(line); - reader.close(); - file.delete(); - } else { - lastannouncementtime = getConfig().getLong("lastannouncementtime"); - lastseentime = getConfig().getLong("lastseentime"); - saveConfig(); - } + lastannouncementtime = getConfig().getLong("lastannouncementtime"); + lastseentime = getConfig().getLong("lastseentime"); + GameRoles = (List) getConfig().getList("gameroles", new ArrayList()); + saveConfig(); ClientBuilder cb = new ClientBuilder(); cb.withToken(Files.readFirstLine(new File("TBMC", "Token.txt"), StandardCharsets.UTF_8)); dc = cb.login(); @@ -114,6 +109,15 @@ public class DiscordPlugin extends JavaPlugin implements IListener { if (!sent) { sendMessageToChannel(chatchannel, "", new EmbedBuilder().withColor(Color.GREEN) .withTitle("Server started - chat connected.").build()); + try { + List msgs = genchannel.getPinnedMessages(); + for (int i = msgs.size() - 1; i >= 10; i--) { // Unpin all pinned messages except the newest 10 + genchannel.unpin(msgs.get(i)); + Thread.sleep(10); + } + } catch (Exception e) { + TBMCCoreAPI.SendException("Error occured while unpinning messages!", e); + } sent = true; } }, 0, 10); @@ -126,17 +130,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { Bukkit.getPluginManager().registerEvents(new ExceptionListener(), this); TBMCCoreAPI.RegisterEventsForExceptions(new MCListener(), this); TBMCChatAPI.AddCommands(this, DiscordMCCommandBase.class); - Runnable r = new Runnable() { - public void run() { - AnnouncementGetterThreadMethod(); - } - }; - Thread t = new Thread(r); - t.start(); - List msgs = genchannel.getPinnedMessages(); - for (int i = msgs.size() - 1; i >= 10; i--) { // Unpin all pinned messages except the newest 10 - genchannel.unpin(msgs.get(i)); - } + new Thread(() -> AnnouncementGetterThreadMethod()).start(); setupProviders(); TBMCCoreAPI.SendUnsentExceptions(); TBMCCoreAPI.SendUnsentDebugMessages(); @@ -155,6 +149,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { stop = true; getConfig().set("lastannouncementtime", lastannouncementtime); getConfig().set("lastseentime", lastseentime); + getConfig().set("gameroles", GameRoles); saveConfig(); sendMessageToChannel(chatchannel, "", new EmbedBuilder().withColor(Restart ? Color.ORANGE : Color.RED) .withTitle(Restart ? "Server restarting" : "Server stopping").build()); diff --git a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java index a4a5bd9..09c6696 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java @@ -1,7 +1,13 @@ package buttondevteam.discordplugin.commands; +import java.util.List; +import java.util.stream.Collectors; + import buttondevteam.discordplugin.DiscordPlugin; +import buttondevteam.lib.TBMCCoreAPI; import sx.blah.discord.handle.obj.IMessage; +import sx.blah.discord.handle.obj.IRole; +import sx.blah.discord.util.RateLimitException; public class RoleCommand extends DiscordCommandBase { @@ -24,6 +30,40 @@ public class RoleCommand extends DiscordCommandBase { "This command adds a game role to your account.\nUsage: add "); return; } + if (!DiscordPlugin.GameRoles.contains(argsa[1].toLowerCase())) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "That game role cannot be found.\nList of game roles:\n" + + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); + return; + } + final List roles = (TBMCCoreAPI.IsTestServer() ? DiscordPlugin.devServer : DiscordPlugin.mainServer) + .getRolesByName(argsa[1]); + if (roles.size() == 0) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "The specified role cannot be found on Discord! Removing from the list."); + DiscordPlugin.GameRoles.remove(argsa[1].toLowerCase()); + return; + } + if (roles.size() > 1) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "There are more roles with this name. Why are there more roles with this name?"); + return; + } + while (true) { + try { + message.getAuthor().addRole(roles.get(0)); + break; + } catch (RateLimitException e) { + try { + Thread.sleep(e.getRetryDelay() > 0 ? e.getRetryDelay() : 10); + } catch (InterruptedException e1) { + } + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while adding role!", e); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while adding the role."); + break; + } + } } else if (argsa[0].equalsIgnoreCase("remove")) { if (argsa.length < 2) { DiscordPlugin.sendMessageToChannel(message.getChannel(), @@ -31,7 +71,8 @@ public class RoleCommand extends DiscordCommandBase { return; } } else if (argsa[0].equalsIgnoreCase("list")) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), "List of game roles:"); + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "List of game roles:\n" + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); } } From dfeae5de9e20edc62949c61d9819bc927be84aaf Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 15 Jan 2017 21:19:44 +0100 Subject: [PATCH 4/9] Added removing cmds from chat and perform method The perform method handles safe mode and ratelimiting. --- .../discordplugin/DiscordPlugin.java | 82 ++++++++++++------- .../discordplugin/DiscordRunnable.java | 10 +++ .../discordplugin/DiscordSupplier.java | 11 +++ .../discordplugin/commands/RoleCommand.java | 24 ++---- .../listeners/AutoUpdaterListener.java | 19 ++--- .../listeners/MCChatListener.java | 45 ++++------ 6 files changed, 101 insertions(+), 90 deletions(-) create mode 100644 src/main/java/buttondevteam/discordplugin/DiscordRunnable.java create mode 100644 src/main/java/buttondevteam/discordplugin/DiscordSupplier.java diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index b600ee6..6260fda 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -1,7 +1,6 @@ package buttondevteam.discordplugin; import java.awt.Color; -import java.io.BufferedReader; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -24,7 +23,9 @@ 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.DiscordException; import sx.blah.discord.util.EmbedBuilder; +import sx.blah.discord.util.MissingPermissionsException; import sx.blah.discord.util.RateLimitException; public class DiscordPlugin extends JavaPlugin implements IListener { @@ -230,36 +231,18 @@ public class DiscordPlugin extends JavaPlugin implements IListener { Bukkit.getLogger() .warning("Message was too long to send to discord and got truncated. In " + channel.getName()); } - for (int i = 0; i < 10; i++) { - try { - Thread.sleep(i * 100); - } catch (InterruptedException e2) { - e2.printStackTrace(); - } - try { - if (SafeMode) - return null; - if (channel == chatchannel) - MCChatListener.resetLastMessage(); // If this is a chat message, it'll be set again - 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()); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - } catch (Exception e) { - if (i == 9) { - Bukkit.getLogger().warning("Failed to deliver message to Discord! Channel: " + channel.getName() - + " Message: " + message); - throw new RuntimeException(e); - } else - continue; - } + try { + if (channel == chatchannel) + MCChatListener.resetLastMessage(); // If this is a chat message, it'll be set again + final String content = TBMCCoreAPI.IsTestServer() && channel != chatchannel + ? "*The following message is from a test server*\n" + message : message; + return perform( + () -> embed == null ? channel.sendMessage(content) : channel.sendMessage(content, embed, false)); + } catch (Exception e) { + Bukkit.getLogger().warning( + "Failed to deliver message to Discord! Channel: " + channel.getName() + " Message: " + message); + throw new RuntimeException(e); } - return null; } public static Permission perms; @@ -296,4 +279,43 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } return sanitizedString; } + + /** + * Performs Discord actions, retrying when ratelimited. May return null if action fails too many times or in safe mode. + */ + public static > T perform(DiscordSupplier action) + throws DiscordException, MissingPermissionsException { + for (int i = 0; i < 20; i++) + try { + if (SafeMode) + return null; + return action.get(); + } catch (RateLimitException e) { + try { + Thread.sleep(e.getRetryDelay() > 0 ? e.getRetryDelay() : 10); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + } + return null; + } + + /** + * Performs Discord actions, retrying when ratelimited. + */ + public static void perform(DiscordRunnable action) throws DiscordException, MissingPermissionsException { + for (int i = 0; i < 20; i++) + try { + if (SafeMode) + return; + action.run(); + return; // Gotta escape that loop + } catch (RateLimitException e) { + try { + Thread.sleep(e.getRetryDelay() > 0 ? e.getRetryDelay() : 10); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + } + } } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordRunnable.java b/src/main/java/buttondevteam/discordplugin/DiscordRunnable.java new file mode 100644 index 0000000..fb27234 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/DiscordRunnable.java @@ -0,0 +1,10 @@ +package buttondevteam.discordplugin; + +import sx.blah.discord.util.DiscordException; +import sx.blah.discord.util.MissingPermissionsException; +import sx.blah.discord.util.RateLimitException; + +@FunctionalInterface +public interface DiscordRunnable { + public abstract void run() throws DiscordException, RateLimitException, MissingPermissionsException; +} diff --git a/src/main/java/buttondevteam/discordplugin/DiscordSupplier.java b/src/main/java/buttondevteam/discordplugin/DiscordSupplier.java new file mode 100644 index 0000000..e2fb570 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/DiscordSupplier.java @@ -0,0 +1,11 @@ +package buttondevteam.discordplugin; + +import sx.blah.discord.handle.obj.IDiscordObject; +import sx.blah.discord.util.DiscordException; +import sx.blah.discord.util.MissingPermissionsException; +import sx.blah.discord.util.RateLimitException; + +@FunctionalInterface +public interface DiscordSupplier> { + public abstract T get() throws DiscordException, RateLimitException, MissingPermissionsException; +} diff --git a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java index 09c6696..6ebe986 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java @@ -7,7 +7,6 @@ import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCCoreAPI; import sx.blah.discord.handle.obj.IMessage; import sx.blah.discord.handle.obj.IRole; -import sx.blah.discord.util.RateLimitException; public class RoleCommand extends DiscordCommandBase { @@ -49,22 +48,15 @@ public class RoleCommand extends DiscordCommandBase { "There are more roles with this name. Why are there more roles with this name?"); return; } - while (true) { - try { - message.getAuthor().addRole(roles.get(0)); - break; - } catch (RateLimitException e) { - try { - Thread.sleep(e.getRetryDelay() > 0 ? e.getRetryDelay() : 10); - } catch (InterruptedException e1) { - } - } catch (Exception e) { - TBMCCoreAPI.SendException("Error while adding role!", e); - DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while adding the role."); - break; - } + try { + DiscordPlugin.perform(() -> message.getAuthor().addRole(roles.get(0))); + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while adding role!", e); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while adding the role."); } - } else if (argsa[0].equalsIgnoreCase("remove")) { + } else if (argsa[0].equalsIgnoreCase("remove")) + + { if (argsa.length < 2) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "This command removes a game role from your account.\nUsage: remove "); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java index 8f06b3a..865f75c 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java @@ -10,7 +10,6 @@ import sx.blah.discord.api.events.IListener; import sx.blah.discord.handle.impl.events.MessageReceivedEvent; import sx.blah.discord.handle.obj.IEmbed; import sx.blah.discord.util.EmbedBuilder; -import sx.blah.discord.util.RateLimitException; public class AutoUpdaterListener implements IListener { @Override @@ -57,18 +56,10 @@ public class AutoUpdaterListener implements IListener { } return true; }).get() && (!TBMCCoreAPI.IsTestServer() || !branch.equals("master"))) - while (true) - try { - event.getMessage().addReaction(DiscordPlugin.DELIVERED_REACTION); - break; - } catch (RateLimitException e) { - try { - if (e.getRetryDelay() > 0) - Thread.sleep(e.getRetryDelay()); - } catch (InterruptedException ie) { - } - } catch (Exception e) { - TBMCCoreAPI.SendException("An error occured while reacting to plugin update!", e); - } + try { + DiscordPlugin.perform(() -> event.getMessage().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/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 6b318d9..7a32a0e 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -46,8 +46,8 @@ public class MCChatListener implements Listener, IListener try { embedObject.description = lastmessage.getEmbedded().get(0).getDescription() + "\n" + embedObject.description; - lastmessage.edit("", embedObject); - } catch (MissingPermissionsException | RateLimitException | DiscordException e1) { + DiscordPlugin.perform(() -> lastmessage.edit("", embedObject)); + } catch (MissingPermissionsException | DiscordException e1) { TBMCCoreAPI.SendException("An error occured while editing chat message!", e1); } } // TODO: Author URL @@ -130,39 +130,24 @@ public class MCChatListener implements Listener, IListener } else Bukkit.dispatchCommand(dsender, cmd); lastlistp = (short) Bukkit.getOnlinePlayers().size(); - } else + if (!event.getMessage().isDeleted()) + event.getMessage().delete(); + } else { TBMCChatAPI.SendChatMessage(Channel.GlobalChat, dsender, dmessage + (event.getMessage().getAttachments().size() > 0 ? "\n" + event.getMessage() .getAttachments().stream().map(a -> a.getUrl()).collect(Collectors.joining("\n")) : "")); - event.getMessage().getChannel().getMessages().stream().forEach(m -> { - try { - final IReaction reaction = m.getReactionByName(DiscordPlugin.DELIVERED_REACTION); - if (reaction != null) { - while (true) - try { - m.removeReaction(reaction); - Thread.sleep(100); - break; - } catch (RateLimitException e) { - if (e.getRetryDelay() > 0) - Thread.sleep(e.getRetryDelay()); - } + event.getMessage().getChannel().getMessages().stream().forEach(m -> { + try { + final IReaction reaction = m.getReactionByName(DiscordPlugin.DELIVERED_REACTION); + if (reaction != null) + DiscordPlugin.perform(() -> m.removeReaction(reaction)); + } catch (Exception e) { + TBMCCoreAPI.SendException("An error occured while removing reactions from chat!", e); } - } catch (Exception e) { - TBMCCoreAPI.SendException("An error occured while removing reactions from chat!", e); - } - }); - while (true) - try { - event.getMessage().addReaction(DiscordPlugin.DELIVERED_REACTION); - break; - } catch (RateLimitException e) { - if (e.getRetryDelay() > 0) - Thread.sleep(e.getRetryDelay()); - else - Thread.sleep(100); - } + }); + DiscordPlugin.perform(() -> event.getMessage().addReaction(DiscordPlugin.DELIVERED_REACTION)); + } } catch (Exception e) { TBMCCoreAPI.SendException("An error occured while handling message \"" + dmessage + "\"!", e); return; From 6ce730016d3021e158bed8d13e34cc3c7e2c39af Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 29 Jan 2017 01:49:25 +0100 Subject: [PATCH 5/9] Implemented new player data thingy --- .../discordplugin/DiscordPlayer.java | 13 ++++++---- .../discordplugin/DiscordSender.java | 9 ++++++- .../commands/ConnectCommand.java | 6 ++--- .../commands/UserinfoCommand.java | 24 +++++++------------ .../listeners/MCChatListener.java | 20 +++++++++------- .../discordplugin/listeners/MCListener.java | 15 +++++++----- .../mccommands/AcceptMCCommand.java | 7 +++++- 7 files changed, 55 insertions(+), 39 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java b/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java index 3678524..7e0428b 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java @@ -1,13 +1,18 @@ package buttondevteam.discordplugin; -import buttondevteam.lib.player.TBMCPlayer; +import buttondevteam.lib.player.ChromaGamerBase; -public class DiscordPlayer extends TBMCPlayer { +public class DiscordPlayer extends ChromaGamerBase { public String getDiscordID() { - return getData(); + return plugindata.getString("id"); } public void setDiscordID(String id) { - setData(id); + plugindata.set("id", id); + } + + @Override + public String getFileName() { + return "discord"; } } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordSender.java b/src/main/java/buttondevteam/discordplugin/DiscordSender.java index c9ad56e..9942973 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordSender.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordSender.java @@ -13,10 +13,17 @@ import sx.blah.discord.handle.obj.IUser; public class DiscordSender extends DiscordSenderBase implements CommandSender { private PermissibleBase perm = new PermissibleBase(this); + private String name = null; + public DiscordSender(IUser user, IChannel channel) { super(user, channel); } + public DiscordSender(IUser user, IChannel channel, String name) { + super(user, channel); + this.name = name; + } + @Override public boolean isPermissionSet(String name) { return perm.isPermissionSet(name); @@ -92,7 +99,7 @@ public class DiscordSender extends DiscordSenderBase implements CommandSender { public String getName() { if (user == null) return "Discord user"; - return user.getDisplayName(DiscordPlugin.mainServer); + return name == null ? user.getDisplayName(DiscordPlugin.mainServer) : name; } } diff --git a/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java index 8b746a0..f68fa1b 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ConnectCommand.java @@ -9,7 +9,7 @@ import com.google.common.collect.HashBiMap; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCCoreAPI; -import buttondevteam.lib.player.TBMCPlayer; +import buttondevteam.lib.player.ChromaGamerBase; import sx.blah.discord.handle.obj.IMessage; public class ConnectCommand extends DiscordCommandBase { @@ -47,8 +47,8 @@ public class ConnectCommand extends DiscordCommandBase { DiscordPlugin.sendMessageToChannel(message.getChannel(), "The specified Minecraft player cannot be found"); return; } - try (TBMCPlayer pl = TBMCPlayer.getPlayer(p)) { - if (message.getAuthor().getID().equals(pl.asPluginPlayer(DiscordPlayer.class).getDiscordID())) { + try (DiscordPlayer pl = ChromaGamerBase.getUser(message.getAuthor().getID(), DiscordPlayer.class)) { + if (message.getAuthor().getID().equals(pl.getDiscordID())) { DiscordPlugin.sendMessageToChannel(message.getChannel(), "You already have this account connected."); return; } diff --git a/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java b/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java index c4da764..aaeb415 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/UserinfoCommand.java @@ -6,8 +6,9 @@ import java.util.stream.Stream; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.DiscordPlugin; -import buttondevteam.lib.player.TBMCPlayer; -import buttondevteam.lib.player.TBMCPlayer.InfoTarget; +import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.player.ChromaGamerBase; +import buttondevteam.lib.player.ChromaGamerBase.InfoTarget; import sx.blah.discord.handle.obj.IMessage; import sx.blah.discord.handle.obj.IUser; @@ -68,20 +69,13 @@ public class UserinfoCommand extends DiscordCommandBase { target = targets.get(0); } } - boolean found = false; - for (TBMCPlayer player : TBMCPlayer.getLoadedPlayers().values()) { - DiscordPlayer dp = player.asPluginPlayer(DiscordPlayer.class); - if (target.getID().equals(dp.getDiscordID())) { - StringBuilder uinfo = new StringBuilder("User info for ").append(target.getName()).append(":\n"); - uinfo.append(player.getInfo(InfoTarget.Discord)); - DiscordPlugin.sendMessageToChannel(message.getChannel(), uinfo.toString()); - found = true; - break; - } + try (DiscordPlayer dp = ChromaGamerBase.getUser(target.getID(), DiscordPlayer.class)) { + StringBuilder uinfo = new StringBuilder("User info for ").append(target.getName()).append(":\n"); + uinfo.append(dp.getInfo(InfoTarget.Discord)); + DiscordPlugin.sendMessageToChannel(message.getChannel(), uinfo.toString()); + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while getting info about " + target.getName() + "!", e); } - if (!found) - DiscordPlugin.sendMessageToChannel(message.getChannel(), "The user (" + target.getName() - + ") is not found in our system (player has to be on the MC server for now)!"); } private List getUsers(IMessage message, String args) { diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 7a32a0e..83772c3 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -13,6 +13,7 @@ import buttondevteam.discordplugin.*; import buttondevteam.lib.*; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.TBMCChatAPI; +import buttondevteam.lib.player.ChromaGamerBase; import buttondevteam.lib.player.TBMCPlayer; import sx.blah.discord.api.events.IListener; import sx.blah.discord.api.internal.json.objects.EmbedObject; @@ -83,20 +84,21 @@ public class MCChatListener implements Listener, IListener return; String dmessage = event.getMessage().getContent(); try { - Optional player = Bukkit.getOnlinePlayers().stream().filter(p -> { // TODO: Support offline players - DiscordPlayer dp = TBMCPlayer.getPlayerAs(p, DiscordPlayer.class); // Online player, already loaded - return author.getID().equals(dp.getDiscordID()); - }).findAny(); + DiscordPlayer dp = ChromaGamerBase.getUser(author.getID(), DiscordPlayer.class); final DiscordSenderBase dsender; - if (player.isPresent()) // Connected? - { // Execute as ingame player + Player mcp = null; // Offline players can't really run commands + final String cid; + if ((cid = dp.getConnectedID(TBMCPlayer.class)) != null // Connected? + && (mcp = Bukkit.getPlayer(cid)) != null) { // Execute as ingame player, if online if (!ConnectedSenders.containsKey(author.getID())) ConnectedSenders.put(author.getID(), - new DiscordPlayerSender(author, event.getMessage().getChannel(), player.get())); + new DiscordPlayerSender(author, event.getMessage().getChannel(), mcp)); dsender = ConnectedSenders.get(author.getID()); } else { + TBMCPlayer p = dp.getAs(TBMCPlayer.class); if (!UnconnectedSenders.containsKey(author.getID())) - UnconnectedSenders.put(author.getID(), new DiscordSender(author, event.getMessage().getChannel())); + UnconnectedSenders.put(author.getID(), new DiscordSender(author, event.getMessage().getChannel(), + p == null ? null : p.getPlayerName())); // Display the playername, if found dsender = UnconnectedSenders.get(author.getID()); } @@ -108,7 +110,7 @@ public class MCChatListener implements Listener, IListener if (dmessage.startsWith("/")) { final String cmd = dmessage.substring(1).toLowerCase(); - if (!player.isPresent() + if (mcp == null && !Arrays.stream(UnconnectedCmds).anyMatch(s -> cmd.equals(s) || cmd.startsWith(s + " "))) { // Command not whitelisted DiscordPlugin.sendMessageToChannel(event.getMessage().getChannel(), // TODO diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 3fb3fa9..2a5acb1 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -11,17 +11,15 @@ import org.bukkit.event.server.ServerCommandEvent; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.commands.ConnectCommand; -import buttondevteam.lib.player.TBMCPlayerGetInfoEvent; -import buttondevteam.lib.player.TBMCPlayerJoinEvent; -import buttondevteam.lib.player.TBMCPlayerQuitEvent; -import net.ess3.api.events.AfkStatusChangeEvent; +import buttondevteam.lib.player.*; +import net.ess3.api.events.*; import sx.blah.discord.handle.obj.IUser; import sx.blah.discord.handle.obj.Status.StatusType; public class MCListener implements Listener { @EventHandler public void onPlayerJoin(TBMCPlayerJoinEvent e) { - final Player p = Bukkit.getPlayer(e.GetPlayer().getUuid()); + final Player p = Bukkit.getPlayer(e.GetPlayer().getUUID()); if (ConnectCommand.WaitingToConnect.containsKey(e.GetPlayer().getPlayerName())) { p.sendMessage("§bTo connect with the Discord account " + ConnectCommand.WaitingToConnect.get(e.GetPlayer().getPlayerName()) + " do /discord accept"); @@ -41,7 +39,7 @@ public class MCListener implements Listener { public void onGetInfo(TBMCPlayerGetInfoEvent e) { if (DiscordPlugin.SafeMode) return; - DiscordPlayer dp = e.getPlayer().asPluginPlayer(DiscordPlayer.class); + DiscordPlayer dp = e.getPlayer().getAs(DiscordPlayer.class); if (dp.getDiscordID() == null || dp.getDiscordID() == "") return; IUser user = DiscordPlugin.dc.getUserByID(dp.getDiscordID()); @@ -71,4 +69,9 @@ public class MCListener implements Listener { public void onServerCommand(ServerCommandEvent e) { DiscordPlugin.Restart = !e.getCommand().equalsIgnoreCase("stop"); // The variable is always true except if stopped } + + /*@EventHandler + public void onPlayerMute(MuteStatusChangeEvent e) { + e.getAffected() + }*/ } diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java index b7cab8c..4f7a159 100644 --- a/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java +++ b/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.commands.ConnectCommand; import buttondevteam.discordplugin.listeners.MCChatListener; +import buttondevteam.lib.player.ChromaGamerBase; import buttondevteam.lib.player.TBMCPlayer; public class AcceptMCCommand extends DiscordMCCommandBase { @@ -42,7 +43,11 @@ public class AcceptMCCommand extends DiscordMCCommandBase { sender.sendMessage("§cYou don't have a pending connection to Discord."); return true; } - TBMCPlayer.getPlayerAs((Player) sender, DiscordPlayer.class).setDiscordID(did); + final TBMCPlayer mcp = ChromaGamerBase.getUser(((Player) sender).getUniqueId().toString(), TBMCPlayer.class); + final DiscordPlayer dp = ChromaGamerBase.getUser(did, DiscordPlayer.class); + mcp.connectWith(dp); + mcp.save(); + dp.save(); ConnectCommand.WaitingToConnect.remove(sender.getName()); MCChatListener.UnconnectedSenders.remove(did); sender.sendMessage("§bAccounts connected."); From b21a6b2f5fe09afa1c78c99a12bb406b9c78bd6a Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 4 Feb 2017 21:06:39 +0100 Subject: [PATCH 6/9] Moved update progress msgs to bot room --- .../discordplugin/listeners/AutoUpdaterListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java index 865f75c..114d588 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/AutoUpdaterListener.java @@ -33,7 +33,7 @@ public class AutoUpdaterListener implements IListener { new DiscordSender(null, TBMCCoreAPI.IsTestServer() // ? DiscordPlugin.chatchannel // - : DiscordPlugin.updatechannel), + : DiscordPlugin.botroomchannel), branch) && ((Supplier) () -> { // Best looking code I've ever written try { From e7963e4f9a88a941f2f4ca9b7903eb5a7bb1136f Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 11 Apr 2017 21:17:47 +0200 Subject: [PATCH 7/9] Fixes and applied changes from the Core --- .../buttondevteam/discordplugin/DiscordPlayer.java | 7 ++----- .../buttondevteam/discordplugin/DiscordPlugin.java | 1 + .../discordplugin/listeners/CommandListener.java | 2 ++ .../discordplugin/listeners/MCChatListener.java | 2 +- .../discordplugin/listeners/MCListener.java | 10 ++++++---- .../discordplugin/mccommands/AcceptMCCommand.java | 2 +- 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java b/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java index 4432dba..5389a42 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlayer.java @@ -11,11 +11,8 @@ public class DiscordPlayer extends ChromaGamerBase { } public String getDiscordID() { - return did; - } - - @Override - public String getFileName() { + if (did == null) + did = plugindata.getString(getFolder() + "_id"); return did; } } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index f531020..cf815b2 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -131,6 +131,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { Bukkit.getPluginManager().registerEvents(new ExceptionListener(), this); TBMCCoreAPI.RegisterEventsForExceptions(new MCListener(), this); TBMCChatAPI.AddCommands(this, DiscordMCCommandBase.class); + TBMCCoreAPI.RegisterUserClass(DiscordPlayer.class); new Thread(() -> AnnouncementGetterThreadMethod()).start(); setupProviders(); TBMCCoreAPI.SendUnsentExceptions(); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index 88a60e1..b7717d3 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -21,6 +21,8 @@ public class CommandListener { final IChannel channel = event.getMessage().getChannel(); if (!channel.getID().equals(DiscordPlugin.botchannel.getID()) && !channel.isPrivate()) return; + if (channel.getID().equals(DiscordPlugin.chatchannel.getID())) + return; // The chat code already handles this - Right now while testing botchannel is the same as chatchannel runCommand(event.getMessage(), true); } }, new IListener() { diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 83772c3..e5143bc 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -98,7 +98,7 @@ public class MCChatListener implements Listener, IListener TBMCPlayer p = dp.getAs(TBMCPlayer.class); if (!UnconnectedSenders.containsKey(author.getID())) UnconnectedSenders.put(author.getID(), new DiscordSender(author, event.getMessage().getChannel(), - p == null ? null : p.getPlayerName())); // Display the playername, if found + p == null ? null : p.PlayerName().get())); // Display the playername, if found dsender = UnconnectedSenders.get(author.getID()); } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 96d2013..919b0e8 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -43,6 +43,9 @@ public class MCListener implements Listener { if (DiscordPlugin.SafeMode) return; DiscordPlayer dp = e.getPlayer().getAs(DiscordPlayer.class); + /*System.out.println("dp: " + dp); + if (dp != null) + System.out.println("dp.did: " + dp.getDiscordID());*/ if (dp == null || dp.getDiscordID() == null || dp.getDiscordID() == "") return; IUser user = DiscordPlugin.dc.getUserByID(dp.getDiscordID()); @@ -73,8 +76,7 @@ public class MCListener implements Listener { DiscordPlugin.Restart = !e.getCommand().equalsIgnoreCase("stop"); // The variable is always true except if stopped } - /*@EventHandler - public void onPlayerMute(MuteStatusChangeEvent e) { - e.getAffected() - }*/ + /* + * @EventHandler public void onPlayerMute(MuteStatusChangeEvent e) { e.getAffected() } + */ } diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java index bc9377a..17dbcbf 100644 --- a/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java +++ b/src/main/java/buttondevteam/discordplugin/mccommands/AcceptMCCommand.java @@ -46,7 +46,7 @@ public class AcceptMCCommand extends DiscordMCCommandBase { } DiscordPlayer dp = ChromaGamerBase.getUser(did, DiscordPlayer.class); TBMCPlayer mcp = TBMCPlayerBase.getPlayer(((Player) sender).getUniqueId(), TBMCPlayer.class); - dp.connectWith(mcp); // TODO: Fix null.yml and empty playerinfos + dp.connectWith(mcp); dp.save(); mcp.save(); ConnectCommand.WaitingToConnect.remove(sender.getName()); From 355ba01929bc26c14fe467da59396e128ef76540 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 15 Apr 2017 13:22:05 +0200 Subject: [PATCH 8/9] Finished game roles --- .../discordplugin/DiscordPlugin.java | 1 - .../discordplugin/commands/RoleCommand.java | 84 ++++++++++++------- 2 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index cf815b2..709fb65 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -45,7 +45,6 @@ public class DiscordPlugin extends JavaPlugin implements IListener { lastannouncementtime = getConfig().getLong("lastannouncementtime"); lastseentime = getConfig().getLong("lastseentime"); GameRoles = (List) getConfig().getList("gameroles", new ArrayList()); - saveConfig(); ClientBuilder cb = new ClientBuilder(); cb.withToken(Files.readFirstLine(new File("TBMC", "Token.txt"), StandardCharsets.UTF_8)); dc = cb.login(); diff --git a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java index 6ebe986..ab9e133 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/RoleCommand.java @@ -24,23 +24,35 @@ public class RoleCommand extends DiscordCommandBase { } String[] argsa = args.split(" "); if (argsa[0].equalsIgnoreCase("add")) { - if (argsa.length < 2) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "This command adds a game role to your account.\nUsage: add "); + final IRole role = checkAndGetRole(message, argsa, "This command adds a game role to your account."); + if (role == null) return; + try { + DiscordPlugin.perform(() -> message.getAuthor().addRole(role)); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "Added game role."); + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while adding role!", e); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while adding the role."); } - if (!DiscordPlugin.GameRoles.contains(argsa[1].toLowerCase())) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "That game role cannot be found.\nList of game roles:\n" - + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); + } else if (argsa[0].equalsIgnoreCase("remove")) { + final IRole role = checkAndGetRole(message, argsa, "This command removes a game role from your account."); + if (role == null) return; + try { + DiscordPlugin.perform(() -> message.getAuthor().removeRole(role)); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "Removed game role."); + } catch (Exception e) { + TBMCCoreAPI.SendException("Error while removing role!", e); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while removing the role."); } + } else if (argsa[0].equalsIgnoreCase("list")) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "List of game roles:\n" + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); + } else if (argsa[0].equalsIgnoreCase("addrole")) { final List roles = (TBMCCoreAPI.IsTestServer() ? DiscordPlugin.devServer : DiscordPlugin.mainServer) .getRolesByName(argsa[1]); if (roles.size() == 0) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "The specified role cannot be found on Discord! Removing from the list."); - DiscordPlugin.GameRoles.remove(argsa[1].toLowerCase()); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "That role cannot be found on Discord."); return; } if (roles.size() > 1) { @@ -48,30 +60,44 @@ public class RoleCommand extends DiscordCommandBase { "There are more roles with this name. Why are there more roles with this name?"); return; } - try { - DiscordPlugin.perform(() -> message.getAuthor().addRole(roles.get(0))); - } catch (Exception e) { - TBMCCoreAPI.SendException("Error while adding role!", e); - DiscordPlugin.sendMessageToChannel(message.getChannel(), "An error occured while adding the role."); - } - } else if (argsa[0].equalsIgnoreCase("remove")) - - { - if (argsa.length < 2) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "This command removes a game role from your account.\nUsage: remove "); - return; - } - } else if (argsa[0].equalsIgnoreCase("list")) { - DiscordPlugin.sendMessageToChannel(message.getChannel(), - "List of game roles:\n" + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); + DiscordPlugin.GameRoles.add(roles.get(0).getName()); + DiscordPlugin.sendMessageToChannel(message.getChannel(), "Game role added."); } } + private IRole checkAndGetRole(IMessage message, String[] argsa, String usage) { + if (argsa.length < 2) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), usage + "\nUsage: " + argsa[0] + " "); + return null; + } + if (!DiscordPlugin.GameRoles.contains(argsa[1])) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "That game role cannot be found.\nList of game roles:\n" + + DiscordPlugin.GameRoles.stream().collect(Collectors.joining("\n"))); + return null; + } + final List roles = (TBMCCoreAPI.IsTestServer() ? DiscordPlugin.devServer : DiscordPlugin.mainServer) + .getRolesByName(argsa[1]); + if (roles.size() == 0) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "The specified role cannot be found on Discord! Removing from the list."); + DiscordPlugin.GameRoles.remove(argsa[1].toLowerCase()); + return null; + } + if (roles.size() > 1) { + DiscordPlugin.sendMessageToChannel(message.getChannel(), + "There are more roles with this name. Why are there more roles with this name?"); + return null; + } + return roles.get(0); + } + @Override public String[] getHelpText() { - // TODO Auto-generated method stub - return null; + return new String[] { // + "Add or remove game roles from yourself.", // + "Usage: role add|remove or role list", // + "Mods can use role addrole to add a role as a game role" }; } } From 1ae389c2aaa9336391351c553af30966848dfe10 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 15 Apr 2017 13:36:06 +0200 Subject: [PATCH 9/9] Added @ Coder ping for exceptions --- .../discordplugin/listeners/ExceptionListener.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java b/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java index e89f5ba..c894e4b 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java @@ -10,7 +10,9 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import buttondevteam.discordplugin.DiscordPlugin; +import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.TBMCExceptionEvent; +import sx.blah.discord.handle.obj.IRole; public class ExceptionListener implements Listener { private List lastthrown = new ArrayList<>(); @@ -35,9 +37,14 @@ public class ExceptionListener implements Listener { e.setHandled(); } + private static IRole coderRole; + private static void SendException(Throwable e, String sourcemessage) { try { - StringBuilder sb = new StringBuilder(); + if (coderRole == null) + coderRole = DiscordPlugin.devServer.getRolesByName("Coder").get(0); + StringBuilder sb = TBMCCoreAPI.IsTestServer() ? new StringBuilder() + : new StringBuilder(coderRole.mention()).append("\n"); sb.append(sourcemessage).append("\n"); sb.append("```").append("\n"); String stackTrace = Arrays.stream(ExceptionUtils.getStackTrace(e).split("\\n"))