diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java b/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java index d86645e..7331310 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlayerSender.java @@ -2,8 +2,6 @@ package buttondevteam.discordplugin; import java.net.InetSocketAddress; import java.util.*; -import java.util.stream.Collectors; - import org.bukkit.*; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; @@ -24,29 +22,18 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.scoreboard.Scoreboard; import org.bukkit.util.Vector; -import buttondevteam.lib.TBMCCoreAPI; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; @SuppressWarnings("deprecation") -public class DiscordPlayerSender implements Player { - private IUser user; - private IChannel channel; +public class DiscordPlayerSender extends DiscordSenderBase implements Player { private Player player; - public DiscordPlayerSender(IUser user, Player player) { - this.user = user; + public DiscordPlayerSender(IUser user, IChannel channel, Player player) { + super(user, channel); this.player = player; } - public IChannel getChannel() { - return channel; - } - - public void setChannel(IChannel channel) { - this.channel = channel; - } - @Override public boolean isPermissionSet(String name) { return player.isPermissionSet(name); @@ -112,32 +99,6 @@ public class DiscordPlayerSender implements Player { player.setOp(value); } - @Override - public void sendMessage(String message) { - try { - final boolean broadcast = new Exception().getStackTrace()[2].getMethodName().contains("broadcast"); - String sanitizedMsg = ""; - for (int i = 0; i < message.length(); i++) { - if (message.charAt(i) != '§') { - sanitizedMsg += message.charAt(i); - } else { - i++; - } - } - final String sendmsg = sanitizedMsg; - Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, () -> DiscordPlugin - .sendMessageToChannel(channel, (broadcast ? user.mention() + " " : "") + sendmsg)); - } catch (Exception e) { - TBMCCoreAPI.SendException("An error occured while sending message to DiscordSender", e); - } - player.sendMessage(message); - } - - @Override - public void sendMessage(String[] messages) { - sendMessage(Arrays.stream(messages).collect(Collectors.joining("\n"))); - } - @Override public Server getServer() { return Bukkit.getServer(); diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 4c0ebf7..8373471 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -196,6 +196,11 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } public static IMessage sendMessageToChannel(IChannel channel, String message) { + if (message.length() > 1900) { + message = message.substring(0, 1900); + 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); @@ -238,4 +243,17 @@ public class DiscordPlugin extends JavaPlugin implements IListener { perms = permsProvider.getProvider(); return perms != null; } + + /** Removes §[char] colour codes from strings */ + public static String sanitizeString(String string) { + String sanitizedString = ""; + for (int i = 0; i < string.length(); i++) { + if (string.charAt(i) == '§') { + i++;// Skips the data value, the 4 in "§4Alisolarflare" + } else { + sanitizedString += string.charAt(i); + } + } + return sanitizedString; + } } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordSender.java b/src/main/java/buttondevteam/discordplugin/DiscordSender.java index 5d15375..33fb168 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordSender.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordSender.java @@ -1,37 +1,20 @@ package buttondevteam.discordplugin; -import java.util.Arrays; import java.util.Set; -import java.util.stream.Collectors; - import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.command.CommandSender; -import org.bukkit.permissions.PermissibleBase; -import org.bukkit.permissions.Permission; -import org.bukkit.permissions.PermissionAttachment; -import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.permissions.*; import org.bukkit.plugin.Plugin; -import buttondevteam.lib.TBMCCoreAPI; import sx.blah.discord.handle.obj.IChannel; import sx.blah.discord.handle.obj.IUser; -public class DiscordSender implements CommandSender { +public class DiscordSender extends DiscordSenderBase implements CommandSender { private PermissibleBase perm = new PermissibleBase(this); - private IUser user; - private IChannel channel; - public DiscordSender(IUser user) { - this.user = user; - } - - public IChannel getChannel() { - return channel; - } - - public void setChannel(IChannel channel) { - this.channel = channel; + public DiscordSender(IUser user, IChannel channel) { + super(user, channel); } @Override @@ -100,31 +83,6 @@ public class DiscordSender implements CommandSender { public void setOp(boolean value) { // TODO: Connect with TBMC acc } - @Override - public void sendMessage(String message) { - try { - final boolean broadcast = new Exception().getStackTrace()[2].getMethodName().contains("broadcast"); - String sanitizedMsg = ""; - for (int i = 0; i < message.length(); i++) { - if (message.charAt(i) != '§') { - sanitizedMsg += message.charAt(i); - } else { - i++; - } - } - final String sendmsg = sanitizedMsg; - Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, () -> DiscordPlugin - .sendMessageToChannel(channel, (!broadcast ? user.mention() + " " : "") + sendmsg)); - } catch (Exception e) { - TBMCCoreAPI.SendException("An error occured while sending message to DiscordSender", e); - } - } - - @Override - public void sendMessage(String[] messages) { - sendMessage(Arrays.stream(messages).collect(Collectors.joining("\n"))); - } - @Override public Server getServer() { return Bukkit.getServer(); diff --git a/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java b/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java new file mode 100644 index 0000000..30883e2 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java @@ -0,0 +1,49 @@ +package buttondevteam.discordplugin; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; + +import buttondevteam.lib.TBMCCoreAPI; +import sx.blah.discord.handle.obj.IChannel; +import sx.blah.discord.handle.obj.IUser; + +public abstract class DiscordSenderBase implements CommandSender { + protected IUser user; + protected IChannel channel; + + protected DiscordSenderBase(IUser user, IChannel channel) { + this.user = user; + this.channel = channel; + } + + private List broadcasts = new ArrayList<>(); + + @Override + public void sendMessage(String message) { + try { + final boolean broadcast = new Exception().getStackTrace()[2].getMethodName().contains("broadcast"); + if (broadcast) { + if (broadcasts.contains(message)) + return; + if (broadcasts.size() > 10) + broadcasts.clear(); + broadcasts.add(message); + } + final String sendmsg = DiscordPlugin.sanitizeString(message); + Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, () -> DiscordPlugin + .sendMessageToChannel(channel, (!broadcast ? user.mention() + " " : "") + sendmsg)); + } catch (Exception e) { + TBMCCoreAPI.SendException("An error occured while sending message to DiscordSender", e); + } + } + + @Override + public void sendMessage(String[] messages) { + sendMessage(Arrays.stream(messages).collect(Collectors.joining("\n"))); + } +} diff --git a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java b/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java index 894c5a8..7d548e6 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java @@ -20,8 +20,8 @@ public class ExceptionListener implements Listener { sb.append(sourcemessage).append("\n"); sb.append("```").append("\n"); String stackTrace = ExceptionUtils.getStackTrace(e); - if (stackTrace.length() > 2000) - stackTrace = stackTrace.substring(0, 2000); + if (stackTrace.length() > 1800) + stackTrace = stackTrace.substring(0, 1800); sb.append(stackTrace).append("\n"); sb.append("```"); DiscordPlugin.sendMessageToChannel(DiscordPlugin.botroomchannel, sb.toString()); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 5f821c3..44f0914 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -5,15 +5,11 @@ import java.util.HashMap; import java.util.Optional; import java.util.stream.Collectors; import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; -import buttondevteam.discordplugin.DiscordPlayer; -import buttondevteam.discordplugin.DiscordPlayerSender; -import buttondevteam.discordplugin.DiscordPlugin; -import buttondevteam.discordplugin.DiscordSender; +import buttondevteam.discordplugin.*; import buttondevteam.lib.TBMCChatEvent; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.TBMCPlayer; @@ -29,23 +25,12 @@ public class MCChatListener implements Listener, IListener if (e.getSender() instanceof DiscordSender || e.getSender() instanceof DiscordPlayerSender) return; if (e.getChannel().equals(Channel.GlobalChat)) - DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, "<" + (e.getSender() instanceof Player - ? sanitizeString(((Player) e.getSender()).getDisplayName()) : - sanitizeString(e.getSender().getName())) + "> " + sanitizeString(e.getMessage())); + DiscordPlugin.sendMessageToChannel(DiscordPlugin.chatchannel, + "<" + (e.getSender() instanceof Player + ? DiscordPlugin.sanitizeString(((Player) e.getSender()).getDisplayName()) + : DiscordPlugin.sanitizeString(e.getSender().getName())) + "> " + + DiscordPlugin.sanitizeString(e.getMessage())); } - /**Removes §[char] colour codes from strings*/ - private String sanitizeString(String string){ - String sanitizedString = ""; - for(int i = 0; i < string.length(); i++){ - if (string.charAt(i) == '§'){ - i++;//Skips the data value, the 4 in "§4Alisolarflare" - }else{ - sanitizedString += string.charAt(i); - } - } - return sanitizedString; - } - private static final String[] UnconnectedCmds = new String[] { "list", "u", "shrug", "tableflip", "unflip", "mwiki" }; @@ -66,26 +51,28 @@ public class MCChatListener implements Listener, IListener DiscordPlayer dp = TBMCPlayer.getPlayerAs(p, DiscordPlayer.class); // Online player, already loaded return author.getID().equals(dp.getDiscordID()); }).findAny(); - final CommandSender dsender; + final DiscordSenderBase dsender; if (player.isPresent()) // Connected? { // Execute as ingame player if (!ConnectedSenders.containsKey(author.getID())) - ConnectedSenders.put(author.getID(), new DiscordPlayerSender(author, player.get())); + ConnectedSenders.put(author.getID(), + new DiscordPlayerSender(author, event.getMessage().getChannel(), player.get())); dsender = ConnectedSenders.get(author.getID()); - ((DiscordPlayerSender) dsender).setChannel(event.getMessage().getChannel()); } else { if (!UnconnectedSenders.containsKey(author.getID())) - UnconnectedSenders.put(author.getID(), new DiscordSender(author)); + UnconnectedSenders.put(author.getID(), new DiscordSender(author, event.getMessage().getChannel())); dsender = UnconnectedSenders.get(author.getID()); - ((DiscordSender) dsender).setChannel(event.getMessage().getChannel()); } if (event.getMessage().getContent().startsWith("/")) { final String cmd = event.getMessage().getContent().substring(1).toLowerCase(); - if (!player.isPresent() && !Arrays.stream(UnconnectedCmds).anyMatch(s -> cmd.equals(s) || cmd.startsWith(s + " "))) { + if (!player.isPresent() + && !Arrays.stream(UnconnectedCmds).anyMatch(s -> cmd.equals(s) || cmd.startsWith(s + " "))) { // Command not whitelisted DiscordPlugin.sendMessageToChannel(event.getMessage().getChannel(), // TODO "Sorry, you need to be online on the server and have your accounts connected, you can only access these commands:\n" - + Arrays.toString(UnconnectedCmds)); + + Arrays.toString(UnconnectedCmds) + + "\nTo connect your accounts, use @ChromaBot connect in " + + DiscordPlugin.botchannel.mention()); return; } Bukkit.dispatchCommand(dsender, cmd);