diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 5cfe61d..2b76266 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -30,6 +30,7 @@ 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.impl.obj.ReactionEmoji; import sx.blah.discord.handle.obj.*; import sx.blah.discord.util.*; import sx.blah.discord.util.RequestBuffer.IRequest; @@ -195,7 +196,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { public void onDisable() { stop = true; for (val entry : MCChatListener.ConnectedSenders.entrySet()) - MCListener.callEventExcluding(new PlayerQuitEvent(entry.getValue(), ""), "ProtocolLib"); + MCListener.callEventExcludingSome(new PlayerQuitEvent(entry.getValue(), "")); getConfig().set("lastannouncementtime", lastannouncementtime); getConfig().set("lastseentime", lastseentime); getConfig().set("gameroles", GameRoles); @@ -213,7 +214,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { private long lastannouncementtime = 0; private long lastseentime = 0; - public static final String DELIVERED_REACTION = "✅"; + public static final ReactionEmoji DELIVERED_REACTION = ReactionEmoji.of("✅"); private void AnnouncementGetterThreadMethod() { while (!stop) { @@ -362,15 +363,12 @@ public class DiscordPlugin extends JavaPlugin implements IListener { public static void updatePlayerList() { perform(() -> { String[] s = chatchannel.getTopic().split("\\n----\\n"); - //System.out.println("Len: " + s.length); - //System.out.println("s0: " + s[0]); if (s.length < 3) return; s[0] = Bukkit.getOnlinePlayers().size() + " player" + (Bukkit.getOnlinePlayers().size() != 1 ? "s" : "") + " online"; s[s.length - 1] = "Players: " + Bukkit.getOnlinePlayers().stream() .map(p -> DiscordPlugin.sanitizeString(p.getDisplayName())).collect(Collectors.joining(", ")); - //System.out.println("s0 after: " + s[0]); chatchannel.changeTopic(Arrays.stream(s).collect(Collectors.joining("\n----\n"))); }); } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java b/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java index 16e9a3d..5b18f50 100644 --- a/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordSenderBase.java @@ -1,8 +1,6 @@ package buttondevteam.discordplugin; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.stream.Collectors; import org.bukkit.Bukkit; @@ -30,8 +28,6 @@ public abstract class DiscordSenderBase implements IDiscordSender { this.channel = channel; } - private static volatile List broadcasts = new ArrayList<>(); - private volatile String msgtosend = ""; private volatile BukkitTask sendtask; @@ -52,13 +48,8 @@ public abstract class DiscordSenderBase implements IDiscordSender { 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); - } + if (broadcast) + return; final String sendmsg = DiscordPlugin.sanitizeString(message); msgtosend += "\n" + sendmsg; if (sendtask == null) diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index c5f71ef..0441d89 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -153,11 +153,11 @@ public class MCChatListener implements Listener, IListener val sender = new DiscordConnectedPlayer(user, channel, mcp.getUUID(), op.getName()); ConnectedSenders.put(user.getStringID(), sender); if (p == null)// Player is offline - If the player is online, that takes precedence - MCListener.callEventExcluding(new PlayerJoinEvent(sender, ""), "ProtocolLib"); + MCListener.callEventExcludingSome(new PlayerJoinEvent(sender, "")); } else { val sender = ConnectedSenders.remove(user.getStringID()); if (p == null)// Player is offline - If the player is online, that takes precedence - MCListener.callEventExcluding(new PlayerQuitEvent(sender, ""), "ProtocolLib"); + MCListener.callEventExcludingSome(new PlayerQuitEvent(sender, "")); } } return start // @@ -332,9 +332,9 @@ public class MCChatListener implements Listener, IListener if (react) { event.getMessage().getChannel().getMessageHistory().stream().forEach(m -> { try { - final IReaction reaction = m.getReactionByUnicode(DiscordPlugin.DELIVERED_REACTION); + final IReaction reaction = m.getReactionByEmoji(DiscordPlugin.DELIVERED_REACTION); if (reaction != null) - DiscordPlugin.perform(() -> m.removeReaction(reaction)); + DiscordPlugin.perform(() -> m.removeReaction(DiscordPlugin.dc.getOurUser(), reaction)); } catch (Exception e) { TBMCCoreAPI.SendException("An error occured while removing reactions from chat!", e); } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 6407a5a..e7d8221 100644 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -12,7 +12,10 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.server.BroadcastMessageEvent; import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.plugin.AuthorNagException; import org.bukkit.plugin.Plugin; @@ -36,6 +39,17 @@ import sx.blah.discord.util.DiscordException; import sx.blah.discord.util.MissingPermissionsException; public class MCListener implements Listener { + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerLogin(PlayerLoginEvent e) { + if (e.getResult() != Result.ALLOWED) + return; + MCChatListener.ConnectedSenders.values().stream() + .filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny().ifPresent(dcp -> { + callEventExcludingSome(new PlayerQuitEvent(dcp, "")); + //dcp.sendMessage("Real login detected, logged fake player out."); + }); + } + @EventHandler(priority = EventPriority.LOWEST) public void onPlayerJoin(TBMCPlayerJoinEvent e) { if (e.getPlayer() instanceof DiscordConnectedPlayer) @@ -48,9 +62,6 @@ public class MCListener implements Listener { new DiscordPlayerSender(user, user.getOrCreatePMChannel(), p)); MCChatListener.OnlineSenders.put("P" + dp.getDiscordID(), new DiscordPlayerSender(user, DiscordPlugin.chatchannel, p)); - MCChatListener.ConnectedSenders.values().stream() - .filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny() - .ifPresent(dcp -> callEventExcluding(new PlayerQuitEvent(dcp, ""), "ProtocolLib")); } if (ConnectCommand.WaitingToConnect.containsKey(e.GetPlayer().PlayerName().get())) { IUser user = DiscordPlugin.dc @@ -70,11 +81,12 @@ public class MCListener implements Listener { return; // Only care about real users MCChatListener.OnlineSenders.entrySet() .removeIf(entry -> entry.getValue().getUniqueId().equals(e.getPlayer().getUniqueId())); - MCChatListener.ConnectedSenders.values().stream() - .filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny() - .ifPresent(dcp -> callEventExcluding(new PlayerJoinEvent(dcp, ""), "ProtocolLib")); + Bukkit.getScheduler().runTask(DiscordPlugin.plugin, + () -> MCChatListener.ConnectedSenders.values().stream() + .filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny() + .ifPresent(dcp -> callEventExcludingSome(new PlayerJoinEvent(dcp, "")))); MCChatListener.sendSystemMessageToChat(e.GetPlayer().PlayerName().get() + " left the game"); - DiscordPlugin.updatePlayerList(); + Bukkit.getScheduler().runTaskLaterAsynchronously(DiscordPlugin.plugin, DiscordPlugin::updatePlayerList, 5); } @EventHandler @@ -138,6 +150,17 @@ public class MCListener implements Listener { MCChatListener.sendSystemMessageToChat(event); } + @EventHandler + public void onBroadcastMessage(BroadcastMessageEvent event) { + MCChatListener.sendSystemMessageToChat(event.getMessage()); + } + + private static final String[] EXCLUDED_PLUGINS = { "ProtocolLib", "LibsDisguises" }; + + public static void callEventExcludingSome(Event event) { + callEventExcluding(event, EXCLUDED_PLUGINS); + } + /** * Calls an event with the given details. *

@@ -148,7 +171,7 @@ public class MCListener implements Listener { * @param plugins * The plugins to exclude. Not case sensitive. */ - public static void callEventExcluding(Event event, String... plugins) { // Copied from Spigot-API and modified a bit + private static void callEventExcluding(Event event, String... plugins) { // Copied from Spigot-API and modified a bit if (event.isAsynchronous()) { if (Thread.holdsLock(Bukkit.getPluginManager())) { throw new IllegalStateException(