From e29e6f1682dd9a092070d96baf2ffe7da26bb9b8 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sun, 23 Dec 2018 00:39:27 +0100 Subject: [PATCH] First version of new events stuff Actually registered the debug message listener --- .../discordplugin/AsyncDiscordEvent.java | 27 +++++++ .../discordplugin/DiscordPlugin.java | 4 +- .../DebugMessageListener.java | 2 +- .../ExceptionListenerModule.java} | 20 ++++- .../listeners/CommandListener.java | 27 +++++++ .../listeners/CommonListeners.java | 7 ++ .../discordplugin/listeners/MCListener.java | 73 ++++++++++++++++++ .../discordplugin/mcchat/MCListener.java | 76 ++----------------- 8 files changed, 159 insertions(+), 77 deletions(-) create mode 100644 src/main/java/buttondevteam/discordplugin/AsyncDiscordEvent.java rename src/main/java/buttondevteam/discordplugin/{listeners => exceptions}/DebugMessageListener.java (91%) rename src/main/java/buttondevteam/discordplugin/{listeners/ExceptionListener.java => exceptions/ExceptionListenerModule.java} (79%) create mode 100644 src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java diff --git a/src/main/java/buttondevteam/discordplugin/AsyncDiscordEvent.java b/src/main/java/buttondevteam/discordplugin/AsyncDiscordEvent.java new file mode 100644 index 0000000..c4479f3 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/AsyncDiscordEvent.java @@ -0,0 +1,27 @@ +package buttondevteam.discordplugin; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +@RequiredArgsConstructor +public class AsyncDiscordEvent extends Event implements Cancellable { + private final @Getter T event; + @Getter + @Setter + private boolean cancelled; + + private static final HandlerList handlers = new HandlerList(); + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index da87790..9870d99 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -2,8 +2,8 @@ package buttondevteam.discordplugin; import buttondevteam.discordplugin.broadcaster.GeneralEventBroadcasterModule; import buttondevteam.discordplugin.commands.DiscordCommandBase; +import buttondevteam.discordplugin.exceptions.ExceptionListenerModule; import buttondevteam.discordplugin.listeners.CommonListeners; -import buttondevteam.discordplugin.listeners.ExceptionListener; import buttondevteam.discordplugin.listeners.MCListener; import buttondevteam.discordplugin.mcchat.*; import buttondevteam.discordplugin.mccommands.DiscordMCCommandBase; @@ -217,7 +217,7 @@ public class DiscordPlugin extends ButtonPlugin implements IListener dc.getDispatcher().registerListener(listener); Component.registerComponent(this, new GeneralEventBroadcasterModule()); Component.registerComponent(this, new MinecraftChatModule()); - Bukkit.getPluginManager().registerEvents(new ExceptionListener(), this); + Component.registerComponent(this, new ExceptionListenerModule()); TBMCCoreAPI.RegisterEventsForExceptions(new MCListener(), this); TBMCChatAPI.AddCommands(this, DiscordMCCommandBase.class); TBMCCoreAPI.RegisterUserClass(DiscordPlayer.class); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/DebugMessageListener.java b/src/main/java/buttondevteam/discordplugin/exceptions/DebugMessageListener.java similarity index 91% rename from src/main/java/buttondevteam/discordplugin/listeners/DebugMessageListener.java rename to src/main/java/buttondevteam/discordplugin/exceptions/DebugMessageListener.java index 1e163c4..cca3e98 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/DebugMessageListener.java +++ b/src/main/java/buttondevteam/discordplugin/exceptions/DebugMessageListener.java @@ -1,4 +1,4 @@ -package buttondevteam.discordplugin.listeners; +package buttondevteam.discordplugin.exceptions; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCDebugMessageEvent; diff --git a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java b/src/main/java/buttondevteam/discordplugin/exceptions/ExceptionListenerModule.java similarity index 79% rename from src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java rename to src/main/java/buttondevteam/discordplugin/exceptions/ExceptionListenerModule.java index 549bb97..f491a24 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/ExceptionListener.java +++ b/src/main/java/buttondevteam/discordplugin/exceptions/ExceptionListenerModule.java @@ -1,9 +1,12 @@ -package buttondevteam.discordplugin.listeners; +package buttondevteam.discordplugin.exceptions; +import buttondevteam.core.ComponentManager; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.TBMCExceptionEvent; +import buttondevteam.lib.architecture.Component; import org.apache.commons.lang.exception.ExceptionUtils; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import sx.blah.discord.handle.obj.IRole; @@ -13,13 +16,13 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -public class ExceptionListener implements Listener { +public class ExceptionListenerModule extends Component implements Listener { private List lastthrown = new ArrayList<>(); private List lastsourcemsg = new ArrayList<>(); @EventHandler public void onException(TBMCExceptionEvent e) { - if (DiscordPlugin.SafeMode) + if (DiscordPlugin.SafeMode || !ComponentManager.isEnabled(getClass())) return; if (lastthrown.stream() .anyMatch(ex -> Arrays.equals(e.getException().getStackTrace(), ex.getStackTrace()) @@ -59,4 +62,15 @@ public class ExceptionListener implements Listener { ex.printStackTrace(); } } + + @Override + protected void enable() { + Bukkit.getPluginManager().registerEvents(new ExceptionListenerModule(), getPlugin()); + TBMCCoreAPI.RegisterEventsForExceptions(new DebugMessageListener(), getPlugin()); + } + + @Override + protected void disable() { + + } } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java new file mode 100644 index 0000000..891edf5 --- /dev/null +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommandListener.java @@ -0,0 +1,27 @@ +package buttondevteam.discordplugin.listeners; + +import buttondevteam.discordplugin.AsyncDiscordEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import sx.blah.discord.api.events.Event; +import sx.blah.discord.handle.impl.events.guild.channel.message.MentionEvent; +import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent; + +public class CommandListener implements Listener { + @SuppressWarnings("unchecked") + @EventHandler + public void onEvent(AsyncDiscordEvent event_) { + if (event_.getEvent() instanceof MentionEvent) + onMention((AsyncDiscordEvent) event_); + else if (event_.getEvent() instanceof MessageReceivedEvent) + onMessageReceived((AsyncDiscordEvent) event_); + } + + private void onMention(AsyncDiscordEvent event) { + //TODO: Can't use priorities with this + } + + private void onMessageReceived(AsyncDiscordEvent event) { + + } +} diff --git a/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java b/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java index 737e5cf..800c40d 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/CommonListeners.java @@ -1,5 +1,6 @@ package buttondevteam.discordplugin.listeners; +import buttondevteam.discordplugin.AsyncDiscordEvent; import buttondevteam.discordplugin.DPUtils; import buttondevteam.discordplugin.DiscordPlugin; import buttondevteam.discordplugin.commands.DiscordCommandBase; @@ -8,6 +9,7 @@ import buttondevteam.discordplugin.mcchat.MCChatPrivate; import buttondevteam.lib.TBMCCoreAPI; import lombok.val; import org.bukkit.Bukkit; +import sx.blah.discord.api.events.Event; import sx.blah.discord.api.events.IListener; import sx.blah.discord.handle.impl.events.guild.channel.message.MentionEvent; import sx.blah.discord.handle.impl.events.guild.channel.message.MessageReceivedEvent; @@ -63,6 +65,10 @@ public class CommonListeners { list.add(i); } + private static void callDiscordEvent(Event event) { + MCListener.callEventExcluding(new AsyncDiscordEvent(event), true, "DiscordPlugin"); + } + private static long lasttime = 0; public static IListener[] getListeners() { @@ -71,6 +77,7 @@ public class CommonListeners { public void handle(MentionEvent event) { if (DiscordPlugin.SafeMode) return; + callDiscordEvent(event); if (event.getMessage().getAuthor().isBot()) return; final IChannel channel = event.getMessage().getChannel(); diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java index 89b4e17..a01e727 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCListener.java @@ -12,17 +12,27 @@ import buttondevteam.lib.player.TBMCPlayerBase; import buttondevteam.lib.player.TBMCPlayerGetInfoEvent; import buttondevteam.lib.player.TBMCYEEHAWEvent; import com.earth2me.essentials.CommandSource; +import lombok.val; import net.ess3.api.events.MuteStatusChangeEvent; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.server.BroadcastMessageEvent; import org.bukkit.event.server.ServerCommandEvent; +import org.bukkit.plugin.AuthorNagException; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.RegisteredListener; import sx.blah.discord.handle.obj.IRole; import sx.blah.discord.handle.obj.IUser; import sx.blah.discord.util.DiscordException; import sx.blah.discord.util.MissingPermissionsException; +import java.util.Arrays; +import java.util.logging.Level; + public class MCListener implements Listener { @EventHandler public void onGetInfo(TBMCPlayerGetInfoEvent e) { @@ -85,4 +95,67 @@ public class MCListener implements Listener { //Channel channel = ChromaGamerBase.getFromSender(event.getSender()).channel().get(); - TODO MCChatUtils.forAllMCChat(MCChatUtils.send(name + " <:YEEHAW:" + DiscordPlugin.mainServer.getEmojiByName("YEEHAW").getStringID() + ">s")); } + + private static final String[] EXCLUDED_PLUGINS = {"ProtocolLib", "LibsDisguises"}; + + public static void callEventExcludingSome(Event event) { + callEventExcluding(event, false, EXCLUDED_PLUGINS); + } + + /** + * Calls an event with the given details. + *

+ * This method only synchronizes when the event is not asynchronous. + * + * @param event Event details + * @param only Flips the operation and includes the listed plugins + * @param plugins The plugins to exclude. Not case sensitive. + */ + public static void callEventExcluding(Event event, boolean only, String... plugins) { // Copied from Spigot-API and modified a bit + if (event.isAsynchronous()) { + if (Thread.holdsLock(Bukkit.getPluginManager())) { + throw new IllegalStateException( + event.getEventName() + " cannot be triggered asynchronously from inside synchronized code."); + } + if (Bukkit.getServer().isPrimaryThread()) { + throw new IllegalStateException( + event.getEventName() + " cannot be triggered asynchronously from primary server thread."); + } + fireEventExcluding(event, only, plugins); + } else { + synchronized (Bukkit.getPluginManager()) { + fireEventExcluding(event, only, plugins); + } + } + } + + private static void fireEventExcluding(Event event, boolean only, String... plugins) { + HandlerList handlers = event.getHandlers(); // Code taken from SimplePluginManager in Spigot-API + RegisteredListener[] listeners = handlers.getRegisteredListeners(); + val server = Bukkit.getServer(); + + for (RegisteredListener registration : listeners) { + if (!registration.getPlugin().isEnabled() + || Arrays.stream(plugins).anyMatch(p -> only ^ p.equalsIgnoreCase(registration.getPlugin().getName()))) + continue; // Modified to exclude plugins + + try { + registration.callEvent(event); + } catch (AuthorNagException ex) { + Plugin plugin = registration.getPlugin(); + + if (plugin.isNaggable()) { + plugin.setNaggable(false); + + server.getLogger().log(Level.SEVERE, + String.format("Nag author(s): '%s' of '%s' about the following: %s", + plugin.getDescription().getAuthors(), plugin.getDescription().getFullName(), + ex.getMessage())); + } + } catch (Throwable ex) { + server.getLogger().log(Level.SEVERE, "Could not pass event " + event.getEventName() + " to " + + registration.getPlugin().getDescription().getFullName(), ex); + } + } + } } diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java index 1824ef8..9b419e9 100644 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCListener.java @@ -10,7 +10,9 @@ import lombok.val; import net.ess3.api.events.AfkStatusChangeEvent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.bukkit.event.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; @@ -18,14 +20,8 @@ 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.plugin.AuthorNagException; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.RegisteredListener; import sx.blah.discord.handle.obj.IUser; -import java.util.Arrays; -import java.util.logging.Level; - class MCListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerLogin(PlayerLoginEvent e) { @@ -33,7 +29,7 @@ class MCListener implements Listener { return; MCChatUtils.ConnectedSenders.values().stream().flatMap(v -> v.values().stream()) //Only private mcchat should be in ConnectedSenders .filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny() - .ifPresent(dcp -> callEventExcludingSome(new PlayerQuitEvent(dcp, ""))); + .ifPresent(dcp -> buttondevteam.discordplugin.listeners.MCListener.callEventExcludingSome(new PlayerQuitEvent(dcp, ""))); } @EventHandler(priority = EventPriority.LOWEST) @@ -73,7 +69,7 @@ class MCListener implements Listener { Bukkit.getScheduler().runTask(DiscordPlugin.plugin, () -> MCChatUtils.ConnectedSenders.values().stream().flatMap(v -> v.values().stream()) .filter(s -> s.getUniqueId().equals(e.getPlayer().getUniqueId())).findAny() - .ifPresent(dcp -> callEventExcludingSome(new PlayerJoinEvent(dcp, "")))); + .ifPresent(dcp -> buttondevteam.discordplugin.listeners.MCListener.callEventExcludingSome(new PlayerJoinEvent(dcp, "")))); Bukkit.getScheduler().runTaskLaterAsynchronously(DiscordPlugin.plugin, ChromaBot.getInstance()::updatePlayerList, 5); final String message = e.GetPlayer().PlayerName().get() + " left the game"; @@ -119,66 +115,4 @@ class MCListener implements Listener { //Channel channel = ChromaGamerBase.getFromSender(event.getSender()).channel().get(); - TODO MCChatUtils.forAllMCChat(MCChatUtils.send(name + " <:YEEHAW:" + DiscordPlugin.mainServer.getEmojiByName("YEEHAW").getStringID() + ">s")); } - - private static final String[] EXCLUDED_PLUGINS = {"ProtocolLib", "LibsDisguises"}; - - static void callEventExcludingSome(Event event) { - callEventExcluding(event, EXCLUDED_PLUGINS); - } - - /** - * Calls an event with the given details. - *

- * This method only synchronizes when the event is not asynchronous. - * - * @param event Event details - * @param plugins The plugins to exclude. Not case sensitive. - */ - 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( - event.getEventName() + " cannot be triggered asynchronously from inside synchronized code."); - } - if (Bukkit.getServer().isPrimaryThread()) { - throw new IllegalStateException( - event.getEventName() + " cannot be triggered asynchronously from primary server thread."); - } - fireEventExcluding(event, plugins); - } else { - synchronized (Bukkit.getPluginManager()) { - fireEventExcluding(event, plugins); - } - } - } - - private static void fireEventExcluding(Event event, String... plugins) { - HandlerList handlers = event.getHandlers(); // Code taken from SimplePluginManager in Spigot-API - RegisteredListener[] listeners = handlers.getRegisteredListeners(); - val server = Bukkit.getServer(); - - for (RegisteredListener registration : listeners) { - if (!registration.getPlugin().isEnabled() - || Arrays.stream(plugins).anyMatch(p -> p.equalsIgnoreCase(registration.getPlugin().getName()))) - continue; // Modified to exclude plugins - - try { - registration.callEvent(event); - } catch (AuthorNagException ex) { - Plugin plugin = registration.getPlugin(); - - if (plugin.isNaggable()) { - plugin.setNaggable(false); - - server.getLogger().log(Level.SEVERE, - String.format("Nag author(s): '%s' of '%s' about the following: %s", - plugin.getDescription().getAuthors(), plugin.getDescription().getFullName(), - ex.getMessage())); - } - } catch (Throwable ex) { - server.getLogger().log(Level.SEVERE, "Could not pass event " + event.getEventName() + " to " - + registration.getPlugin().getDescription().getFullName(), ex); - } - } - } }