From 1b85eb027aa5b7037b18a060c92b2ef2e6fe8418 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 8 Jun 2018 23:45:10 +0200 Subject: [PATCH] Channelcon works, chat not yet Sending/receiving or saving connections doesn't work yet Command logging for Discord / prefix works from #bot Plugin update update (#37) #52 --- deploy.sh | 2 +- .../commands/ChannelconCommand.java | 26 +- .../discordplugin/commands/MCChatCommand.java | 2 +- .../listeners/CommandListener.java | 297 +++++++++--------- .../listeners/MCChatListener.java | 19 +- 5 files changed, 179 insertions(+), 167 deletions(-) diff --git a/deploy.sh b/deploy.sh index 606423b..a40b486 100755 --- a/deploy.sh +++ b/deploy.sh @@ -6,5 +6,5 @@ if [ $1 = 'production' ]; then echo Production mode echo $UPLOAD_KEY > upload_key chmod 400 upload_key -yes | scp -B -i upload_key -o StrictHostKeyChecking=no $FILENAME travis@server.figytuna.com:/minecraft/main/plugins +yes | scp -B -i upload_key -o StrictHostKeyChecking=no $FILENAME travis@server.figytuna.com:/minecraft/main/pluginupdates fi diff --git a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java index 1b336c1..c7f4d13 100644 --- a/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/ChannelconCommand.java @@ -3,7 +3,7 @@ package buttondevteam.discordplugin.commands; import buttondevteam.discordplugin.DiscordConnectedPlayer; import buttondevteam.discordplugin.DiscordPlayer; import buttondevteam.discordplugin.listeners.MCChatListener; -import buttondevteam.lib.TBMCChannelConnectEvent; +import buttondevteam.lib.TBMCChannelConnectFakeEvent; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.player.TBMCPlayer; import lombok.val; @@ -17,7 +17,7 @@ import java.util.Arrays; public class ChannelconCommand extends DiscordCommandBase { @Override public String getCommandName() { - return "here"; + return "channelcon"; } @Override @@ -31,8 +31,10 @@ public class ChannelconCommand extends DiscordCommandBase { //TODO: What if they no longer have permission to view the channel - check on some message events and startup - if somebody who can view the channel (on both platforms) has their accounts connected, keep it if (MCChatListener.hasCustomChat(message.getChannel())) { if (args.equalsIgnoreCase("remove")) { - MCChatListener.removeCustomChat(message.getChannel()); - message.reply("channel connection removed."); + if (MCChatListener.removeCustomChat(message.getChannel())) + message.reply("channel connection removed."); + else + message.reply("wait what, couldn't remove channel connection."); return true; } message.reply("this channel is already connected to a Minecraft channel. Use `/channelcon remove` to remove it."); @@ -48,14 +50,15 @@ public class ChannelconCommand extends DiscordCommandBase { message.reply("you need to connect your Minecraft account. In this channel or on our server in #bot do /connect "); return true; } - val ev = new TBMCChannelConnectEvent(new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()), chan.get()); - Bukkit.getPluginManager().callEvent(ev); //Using a fake player with no login/logout, should be fine for this event - if (ev.isCancelled() || ev.getGroupid() == null) { + val ev = new TBMCChannelConnectFakeEvent(new DiscordConnectedPlayer(message.getAuthor(), message.getChannel(), chp.getUUID(), Bukkit.getOfflinePlayer(chp.getUUID()).getName()), chan.get()); + //Using a fake player with no login/logout, should be fine for this event + String groupid = ev.getGroupID(ev.getSender()); //We're not trying to send in a specific group, we want to know which group the user belongs to (so not getGroupID()) + if (groupid == null) { message.reply("sorry, that didn't work. You cannot use that Minecraft channel."); return true; } MCChatListener.addCustomChat(message.getChannel(), args, ev.getChannel()); - message.reply("alright, connection made!"); + message.reply("alright, connection made to group `" + groupid + "`!"); return true; } @@ -66,9 +69,10 @@ public class ChannelconCommand extends DiscordCommandBase { "This command allows you to connect a Minecraft channel to a Discord channel (just like how the global chat is connected to #minecraft-chat).", // "You need to have access to the MC channel and have manage permissions on the Discord channel.", // "You also need to have your Minecraft account connected. In #bot use /connect .", // - "Call this command from the channel you want to use. Usage: /channelcon ", // - "To remove a connection use /channelcon remove in the channel.", // - "Invite link: https://discordapp.com/oauth2/authorize?client_id=226443037893591041&scope=bot" // + "Call this command from the channel you want to use. Usage: @ChromaBot channelcon ", // + "To remove a connection use @ChromaBot channelcon remove in the channel.", // + "Mentioning the bot is needed in this case because the / prefix only works in #bot.", // + "Invite link: " // }; } } diff --git a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java index 0a59667..e2ca2ca 100755 --- a/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java +++ b/src/main/java/buttondevteam/discordplugin/commands/MCChatCommand.java @@ -25,7 +25,7 @@ public class MCChatCommand extends DiscordCommandBase { MCChatListener.privateMCChat(message.getChannel(), mcchat, message.getAuthor(), user); DiscordPlugin.sendMessageToChannel(message.getChannel(), "Minecraft chat " + (mcchat // - ? "enabled. Use '/mcchat' to disable." // + ? "enabled. Use '/mcchat' again to turn it off." // : "disabled.")); } catch (Exception e) { TBMCCoreAPI.SendException("Error while setting mcchat for user" + message.getAuthor().getName(), e); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java index e42de00..eaf0927 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -26,105 +26,109 @@ import java.util.concurrent.TimeUnit; public class CommandListener { - private static final String[] serverReadyStrings = new String[] { "In one week from now", // Ali - "Between now and the heat-death of the universe.", // Ghostise - "Soon™", "Ask again this time next month", // Ghostise - "In about 3 seconds", // Nicolai - "After we finish 8 plugins", // Ali - "Tomorrow.", // Ali - "After one tiiiny feature", // Ali - "Next commit", // Ali - "After we finish strangling Towny", // Ali - "When we kill every *fucking* bug", // Ali - "Once the server stops screaming.", // Ali - "After HL3 comes out", // Ali - "Next time you ask", // Ali - "When will *you* be open?" // Ali - }; + private static final String[] serverReadyStrings = new String[]{"In one week from now", // Ali + "Between now and the heat-death of the universe.", // Ghostise + "Soon™", "Ask again this time next month", // Ghostise + "In about 3 seconds", // Nicolai + "After we finish 8 plugins", // Ali + "Tomorrow.", // Ali + "After one tiiiny feature", // Ali + "Next commit", // Ali + "After we finish strangling Towny", // Ali + "When we kill every *fucking* bug", // Ali + "Once the server stops screaming.", // Ali + "After HL3 comes out", // Ali + "Next time you ask", // Ali + "When will *you* be open?" // Ali + }; - private static final String[] serverReadyQuestions = new String[] { "when will the server be open", - "when will the server be ready", "when will the server be done", "when will the server be complete", - "when will the server be finished", "when's the server ready", "when's the server open", - "Vhen vill ze server be open?" }; + private static final String[] serverReadyQuestions = new String[]{"when will the server be open", + "when will the server be ready", "when will the server be done", "when will the server be complete", + "when will the server be finished", "when's the server ready", "when's the server open", + "Vhen vill ze server be open?"}; - private static final Random serverReadyRandom = new Random(); - private static final ArrayList usableServerReadyStrings = new ArrayList(serverReadyStrings.length) { - private static final long serialVersionUID = 2213771460909848770L; - { - createUsableServerReadyStrings(this); - } - }; + private static final Random serverReadyRandom = new Random(); + private static final ArrayList usableServerReadyStrings = new ArrayList(serverReadyStrings.length) { + private static final long serialVersionUID = 2213771460909848770L; - private static void createUsableServerReadyStrings(ArrayList list) { - for (short i = 0; i < serverReadyStrings.length; i++) - list.add(i); - } + { + createUsableServerReadyStrings(this); + } + }; - private static long lasttime = 0; + private static void createUsableServerReadyStrings(ArrayList list) { + for (short i = 0; i < serverReadyStrings.length; i++) + list.add(i); + } - public static IListener[] getListeners() { - return new IListener[] { new IListener() { - @Override - public void handle(MentionEvent event) { - if (DiscordPlugin.SafeMode) - return; - if (event.getMessage().getAuthor().isBot()) - return; - final IChannel channel = event.getMessage().getChannel(); - if (!channel.getStringID().equals(DiscordPlugin.botchannel.getStringID())) - return; - if (channel.getStringID().equals(DiscordPlugin.chatchannel.getStringID())) - return; // The chat code already handles this - Right now while testing botchannel is the same as chatchannel - event.getMessage().getChannel().setTypingStatus(true); // Fun - runCommand(event.getMessage(), true); - } - }, new IListener() { - @Override - public void handle(MessageReceivedEvent event) { - if (DiscordPlugin.SafeMode) - return; - final String msglowercase = event.getMessage().getContent().toLowerCase(); - if (!TBMCCoreAPI.IsTestServer() - && Arrays.stream(serverReadyQuestions).anyMatch(s -> msglowercase.contains(s))) { - int next; - if (usableServerReadyStrings.size() == 0) - createUsableServerReadyStrings(usableServerReadyStrings); - next = usableServerReadyStrings.remove(serverReadyRandom.nextInt(usableServerReadyStrings.size())); - DiscordPlugin.sendMessageToChannel(event.getMessage().getChannel(), serverReadyStrings[next]); - return; - } - if (!event.getMessage().getChannel().isPrivate()) // - return; - if (DiscordPlayer.getUser(event.getAuthor().getStringID(), DiscordPlayer.class) - .isMinecraftChatEnabled()) - if (!event.getMessage().getContent().equalsIgnoreCase("mcchat")) - return; - if (event.getMessage().getAuthor().isBot()) - return; - runCommand(event.getMessage(), false); - } - }, new IListener() { - @Override - public void handle(PresenceUpdateEvent event) { - if (DiscordPlugin.SafeMode) - return; - val devrole = DiscordPlugin.devServer.getRolesByName("Developer").get(0); - if (event.getOldPresence().getStatus().equals(StatusType.OFFLINE) - && !event.getNewPresence().getStatus().equals(StatusType.OFFLINE) - && event.getUser().getRolesForGuild(DiscordPlugin.devServer).stream() + private static long lasttime = 0; + + public static IListener[] getListeners() { + return new IListener[]{new IListener() { + @Override + public void handle(MentionEvent event) { + if (DiscordPlugin.SafeMode) + return; + if (event.getMessage().getAuthor().isBot()) + return; + final IChannel channel = event.getMessage().getChannel(); + if (!channel.getStringID().equals(DiscordPlugin.botchannel.getStringID()) + && !event.getMessage().getContent().contains("channelcon")) + return; + if (channel.getStringID().equals(DiscordPlugin.chatchannel.getStringID())) + return; // The chat code already handles this - Right now while testing botchannel is the same as chatchannel + event.getMessage().getChannel().setTypingStatus(true); // Fun + runCommand(event.getMessage(), true); + } + }, new IListener() { + @Override + public void handle(MessageReceivedEvent event) { + if (DiscordPlugin.SafeMode) + return; + final String msglowercase = event.getMessage().getContent().toLowerCase(); + if (!TBMCCoreAPI.IsTestServer() + && Arrays.stream(serverReadyQuestions).anyMatch(s -> msglowercase.contains(s))) { + int next; + if (usableServerReadyStrings.size() == 0) + createUsableServerReadyStrings(usableServerReadyStrings); + next = usableServerReadyStrings.remove(serverReadyRandom.nextInt(usableServerReadyStrings.size())); + DiscordPlugin.sendMessageToChannel(event.getMessage().getChannel(), serverReadyStrings[next]); + return; + } + if (!event.getMessage().getChannel().isPrivate() + && !(event.getMessage().getContent().startsWith("/") + && event.getChannel().getStringID().equals(DiscordPlugin.botchannel.getStringID()))) // + return; + if (DiscordPlayer.getUser(event.getAuthor().getStringID(), DiscordPlayer.class) + .isMinecraftChatEnabled()) + if (!event.getMessage().getContent().equalsIgnoreCase("mcchat")) + return; + if (event.getMessage().getAuthor().isBot()) + return; + runCommand(event.getMessage(), false); + } + }, new IListener() { + @Override + public void handle(PresenceUpdateEvent event) { + if (DiscordPlugin.SafeMode) + return; + val devrole = DiscordPlugin.devServer.getRolesByName("Developer").get(0); + if (event.getOldPresence().getStatus().equals(StatusType.OFFLINE) + && !event.getNewPresence().getStatus().equals(StatusType.OFFLINE) + && event.getUser().getRolesForGuild(DiscordPlugin.devServer).stream() .anyMatch(r -> r.getLongID() == devrole.getLongID()) - && DiscordPlugin.devServer.getUsersByRole(devrole).stream() + && DiscordPlugin.devServer.getUsersByRole(devrole).stream() .noneMatch(u -> u.getPresence().getStatus().equals(StatusType.OFFLINE)) - && lasttime + 10 < TimeUnit.NANOSECONDS.toHours(System.nanoTime()) - && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) % 5 == 0) { - DiscordPlugin.sendMessageToChannel(DiscordPlugin.devofficechannel, "Full house!", - new EmbedBuilder() - .withImage( - "https://cdn.discordapp.com/attachments/249295547263877121/249687682618359808/poker-hand-full-house-aces-kings-playing-cards-15553791.png") - .build()); - lasttime = TimeUnit.NANOSECONDS.toHours(System.nanoTime()); - } - } + && lasttime + 10 < TimeUnit.NANOSECONDS.toHours(System.nanoTime()) + && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) % 5 == 0) { + DiscordPlugin.sendMessageToChannel(DiscordPlugin.devofficechannel, "Full house!", + new EmbedBuilder() + .withImage( + "https://cdn.discordapp.com/attachments/249295547263877121/249687682618359808/poker-hand-full-house-aces-kings-playing-cards-15553791.png") + .build()); + lasttime = TimeUnit.NANOSECONDS.toHours(System.nanoTime()); + } + } }, (IListener) event -> { Bukkit.getScheduler().runTaskLaterAsynchronously(DiscordPlugin.plugin, () -> { if (event.getRole().isDeleted() || DiscordPlugin.plugin.isGameRole(event.getRole())) @@ -135,65 +139,63 @@ public class CommandListener { }, (IListener) event -> { if (DiscordPlugin.GameRoles.remove(event.getRole().getName())) DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getRole().getName() + " as a game role."); - }, (IListener) event -> { //Role update event + }, (IListener) event -> { //Role update event if (!DiscordPlugin.plugin.isGameRole(event.getNewRole())) { - if (DiscordPlugin.GameRoles.remove(event.getOldRole().getName())) + if (DiscordPlugin.GameRoles.remove(event.getOldRole().getName())) DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Removed " + event.getOldRole().getName() + " as a game role because it's color changed."); } else { - boolean removed = DiscordPlugin.GameRoles.remove(event.getOldRole().getName()); //Regardless of whether it was a game role - DiscordPlugin.GameRoles.add(event.getNewRole().getName()); //Add it because it has no color - if (removed) - DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Changed game role from " + event.getOldRole().getName() + " to " + event.getNewRole().getName() + "."); - else - DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getNewRole().getName() + " as game role because it has the default color."); - } + boolean removed = DiscordPlugin.GameRoles.remove(event.getOldRole().getName()); //Regardless of whether it was a game role + DiscordPlugin.GameRoles.add(event.getNewRole().getName()); //Add it because it has no color + if (removed) + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Changed game role from " + event.getOldRole().getName() + " to " + event.getNewRole().getName() + "."); + else + DiscordPlugin.sendMessageToChannel(DiscordPlugin.modlogchannel, "Added " + event.getNewRole().getName() + " as game role because it has the default color."); + } }}; - } + } - /** - * Runs a ChromaBot command. + /** + * Runs a ChromaBot command. * - * @param message - * The Discord message - * @param mentionedonly - * Only run the command if ChromaBot is mentioned at the start of the message - * @return Whether it ran the command (always true if mentionedonly is false) - */ - public static boolean runCommand(IMessage message, boolean mentionedonly) { + * @param message The Discord message + * @param mentionedonly Only run the command if ChromaBot is mentioned at the start of the message + * @return Whether it ran the command (always true if mentionedonly is false) + */ + public static boolean runCommand(IMessage message, boolean mentionedonly) { debug("A"); - if (DiscordPlugin.SafeMode) - return true; + if (DiscordPlugin.SafeMode) + return true; debug("B"); - final StringBuilder cmdwithargs = new StringBuilder(message.getContent()); - final String mention = DiscordPlugin.dc.getOurUser().mention(false); - final String mentionNick = DiscordPlugin.dc.getOurUser().mention(true); - boolean gotmention = checkanddeletemention(cmdwithargs, mention, message); - gotmention = checkanddeletemention(cmdwithargs, mentionNick, message) || gotmention; + final StringBuilder cmdwithargs = new StringBuilder(message.getContent()); + final String mention = DiscordPlugin.dc.getOurUser().mention(false); + final String mentionNick = DiscordPlugin.dc.getOurUser().mention(true); + boolean gotmention = checkanddeletemention(cmdwithargs, mention, message); + gotmention = checkanddeletemention(cmdwithargs, mentionNick, message) || gotmention; for (String mentionRole : (Iterable) message.getRoleMentions().stream().filter(r -> DiscordPlugin.dc.getOurUser().hasRole(r)).map(r -> r.mention())::iterator) - gotmention = checkanddeletemention(cmdwithargs, mentionRole, message) || gotmention; // Delete all mentions + gotmention = checkanddeletemention(cmdwithargs, mentionRole, message) || gotmention; // Delete all mentions debug("C"); - if (mentionedonly && !gotmention) { - message.getChannel().setTypingStatus(false); - return false; - } + if (mentionedonly && !gotmention) { + message.getChannel().setTypingStatus(false); + return false; + } debug("D"); - message.getChannel().setTypingStatus(true); + message.getChannel().setTypingStatus(true); String cmdwithargsString = cmdwithargs.toString().trim(); //Remove spaces between mention and command int index = cmdwithargsString.indexOf(" "); - String cmd; - String args; - if (index == -1) { + String cmd; + String args; + if (index == -1) { cmd = cmdwithargsString; - args = ""; - } else { + args = ""; + } else { cmd = cmdwithargsString.substring(0, index); args = cmdwithargsString.substring(index + 1).trim(); //In case there are multiple spaces } debug("E"); - DiscordCommandBase.runCommand(cmd.toLowerCase(), args, message); - message.getChannel().setTypingStatus(false); - return true; - } + DiscordCommandBase.runCommand(cmd.toLowerCase(), args, message); + message.getChannel().setTypingStatus(false); + return true; + } private static boolean debug = false; @@ -206,17 +208,20 @@ public class CommandListener { return debug = !debug; } - 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.charAt(mention.length()) == ' ' ? mention.length() + 1 : mention.length()); - else - cmdwithargs.replace(0, cmdwithargs.length(), "help"); - else - return false; - if (cmdwithargs.length() == 0) - cmdwithargs.replace(0, cmdwithargs.length(), "help"); - return true; - } + 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.charAt(mention.length()) == ' ' ? mention.length() + 1 : mention.length()); + else + cmdwithargs.replace(0, cmdwithargs.length(), "help"); + else { + if (cmdwithargs.charAt(0) == '/') + cmdwithargs.deleteCharAt(0); //Don't treat / as mention, mentions can be used in public mcchat + return false; + } + if (cmdwithargs.length() == 0) + cmdwithargs.replace(0, cmdwithargs.length(), "help"); + return true; + } } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 6ec910e..5d2f67e 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -373,9 +373,9 @@ public class MCChatListener implements Listener, IListener event.getMessage().delete(); }); preprocessChat(dsender, dmessage); - final String cmd = dmessage.substring(1).toLowerCase(); + final String cmdlowercased = dmessage.substring(1).toLowerCase(); if (dsender instanceof DiscordSender && Arrays.stream(UnconnectedCmds) - .noneMatch(s -> cmd.equals(s) || cmd.startsWith(s + " "))) { + .noneMatch(s -> cmdlowercased.equals(s) || cmdlowercased.startsWith(s + " "))) { // Command not whitelisted dsender.sendMessage("Sorry, you can only access these commands:\n" + Arrays.stream(UnconnectedCmds).map(uc -> "/" + uc) @@ -392,20 +392,23 @@ public class MCChatListener implements Listener, IListener ListC = 0; lastlist = 0; } - if (cmd.equals("list") && Bukkit.getOnlinePlayers().size() == lastlistp && ListC++ > 2) // Lowered already + if (cmdlowercased.equals("list") && Bukkit.getOnlinePlayers().size() == lastlistp && ListC++ > 2) // Lowered already { dsender.sendMessage("Stop it. You know the answer."); lastlist = 0; } else { - int spi = cmd.indexOf(' '); - final String topcmd = spi == -1 ? cmd : cmd.substring(0, spi); + int spi = cmdlowercased.indexOf(' '); + final String topcmd = spi == -1 ? cmdlowercased : cmdlowercased.substring(0, spi); Optional ch = Channel.getChannels().stream() .filter(c -> c.ID.equalsIgnoreCase(topcmd) || (c.IDs != null && c.IDs.length > 0 && Arrays.stream(c.IDs).anyMatch(id -> id.equalsIgnoreCase(topcmd)))).findAny(); if (!ch.isPresent()) Bukkit.getScheduler().runTask(DiscordPlugin.plugin, - () -> VanillaCommandListener.runBukkitOrVanillaCommand(dsender, cmd)); + () -> { + VanillaCommandListener.runBukkitOrVanillaCommand(dsender, cmdlowercased); + Bukkit.getLogger().info(dsender.getName() + " issued command from Discord: /" + cmdlowercased); + }); else { Channel chc = ch.get(); if (!chc.ID.equals(Channel.GlobalChat.ID) && !chc.ID.equals("rp") && !event.getMessage().getChannel().isPrivate()) @@ -426,7 +429,7 @@ public class MCChatListener implements Listener, IListener dsender.sendMessage("You're now talking in: " + DPUtils.sanitizeString(dsender.getMcchannel().DisplayName)); } else { // Send single message - sendChatMessage.accept(chc, cmd.substring(spi + 1)); + sendChatMessage.accept(chc, event.getMessage().getContent().substring(spi + 2)); react = true; } } @@ -436,7 +439,7 @@ public class MCChatListener implements Listener, IListener } else {// Not a command if (dmessage.length() == 0 && event.getMessage().getAttachments().size() == 0 && !event.getChannel().isPrivate()) - TBMCChatAPI.SendSystemMessage(Channel.GlobalChat, 0, + TBMCChatAPI.SendSystemMessage(Channel.GlobalChat, 0, "everyone", (dsender instanceof Player ? ((Player) dsender).getDisplayName() : dsender.getName()) + " pinned a message on Discord."); else {