From 251c152efa2914fde99f288d53636e11b95b0334 Mon Sep 17 00:00:00 2001 From: jgeboski Date: Sat, 26 Jan 2013 18:19:13 -0500 Subject: [PATCH] McMMOChatEvent: added a field to hold the dispatching plugin Currently, there is no sane way to detect which plugin dispatched an McMMOChatEvent. This is problematic for plugins using the ChatAPI while also listening for McMMOChatEvents as it leads to a message loop being created. A "simple" solution is to store a reference to the dispatching plugin in the McMMOChatEvent. This allows for a plugin to determine if it is an event dispatched by itself, or some other plugin. In addition, this can allow for better control within third party plugins to determine where McMMOChatEvents are dispatched from. This patch is backwards with existing interfaces. --- .../java/com/gmail/nossr50/api/ChatAPI.java | 35 +++++++++++++++++++ .../events/chat/McMMOAdminChatEvent.java | 8 ++++- .../nossr50/events/chat/McMMOChatEvent.java | 18 +++++++++- .../events/chat/McMMOPartyChatEvent.java | 10 ++++-- .../com/gmail/nossr50/util/ChatManager.java | 19 +++++++--- 5 files changed, 81 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/api/ChatAPI.java b/src/main/java/com/gmail/nossr50/api/ChatAPI.java index 1bc85ae58..12436172f 100644 --- a/src/main/java/com/gmail/nossr50/api/ChatAPI.java +++ b/src/main/java/com/gmail/nossr50/api/ChatAPI.java @@ -1,5 +1,7 @@ package com.gmail.nossr50.api; +import org.bukkit.plugin.Plugin; + import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.util.ChatManager; @@ -11,10 +13,27 @@ public final class ChatAPI { *
* This function is designed for API usage. * + * @param plugin The plugin sending the message * @param sender The name of the sender to display in the chat * @param party The name of the party to send to * @param message The message to send */ + public static void sendPartyChat(Plugin plugin, String sender, String party, String message) { + ChatManager.handlePartyChat(plugin, PartyManager.getParty(party), sender, message); + } + + /** + * Send a message to all members of a party + *
+ * This function is designed for API usage. + * + * @deprecated Replaced by sendPartyChat(Plugin, String, String, String) + * + * @param sender The name of the sender to display in the chat + * @param party The name of the party to send to + * @param message The message to send + */ + @Deprecated public static void sendPartyChat(String sender, String party, String message) { ChatManager.handlePartyChat(PartyManager.getParty(party), sender, message); } @@ -24,9 +43,25 @@ public final class ChatAPI { *
* This function is designed for API usage. * + * @param plugin The plugin sending the message * @param sender The name of the sender to display in the chat * @param message The message to send */ + public static void sendAdminChat(Plugin plugin, String sender, String message) { + ChatManager.handleAdminChat(plugin, sender, message); + } + + /** + * Send a message to administrators + *
+ * This function is designed for API usage. + * + * @deprecated Replaced by sendAdminChat(Plugin, String, String) + * + * @param sender The name of the sender to display in the chat + * @param message The message to send + */ + @Deprecated public static void sendAdminChat(String sender, String message) { ChatManager.handleAdminChat(sender, message); } diff --git a/src/main/java/com/gmail/nossr50/events/chat/McMMOAdminChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOAdminChatEvent.java index a48d2dac9..1fe2b0624 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOAdminChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOAdminChatEvent.java @@ -1,10 +1,16 @@ package com.gmail.nossr50.events.chat; +import org.bukkit.plugin.Plugin; + /** * Called when a chat is sent to the admin chat channel */ public class McMMOAdminChatEvent extends McMMOChatEvent { + public McMMOAdminChatEvent(Plugin plugin, String sender, String message) { + super(plugin, sender, message); + } + public McMMOAdminChatEvent(String sender, String message) { - super(sender, message); + this(null, sender, message); } } diff --git a/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java index d7d79ec7f..108a62dbe 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOChatEvent.java @@ -3,17 +3,33 @@ package com.gmail.nossr50.events.chat; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.bukkit.plugin.Plugin; + +import com.gmail.nossr50.mcMMO; public class McMMOChatEvent extends Event implements Cancellable { private boolean cancelled; + private Plugin plugin; private String sender; private String message; - protected McMMOChatEvent(String sender, String message) { + protected McMMOChatEvent(Plugin plugin, String sender, String message) { + if (plugin == null) { + plugin = mcMMO.p; + } + + this.plugin = plugin; this.sender = sender; this.message = message; } + /** + * @return The plugin responsible for this event + */ + public Plugin getPlugin() { + return plugin; + } + /** * @return String name of the player who sent the chat, or "Console" */ diff --git a/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java b/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java index 6dde6fe88..219ca5b21 100644 --- a/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java +++ b/src/main/java/com/gmail/nossr50/events/chat/McMMOPartyChatEvent.java @@ -1,16 +1,22 @@ package com.gmail.nossr50.events.chat; +import org.bukkit.plugin.Plugin; + /** * Called when a chat is sent to a party channel */ public class McMMOPartyChatEvent extends McMMOChatEvent { private String party; - public McMMOPartyChatEvent(String sender, String party, String message) { - super(sender, message); + public McMMOPartyChatEvent(Plugin plugin, String sender, String party, String message) { + super(plugin, sender, message); this.party = party; } + public McMMOPartyChatEvent(String sender, String party, String message) { + this(null, sender, party, message); + } + /** * @return String name of the party the message will be sent to */ diff --git a/src/main/java/com/gmail/nossr50/util/ChatManager.java b/src/main/java/com/gmail/nossr50/util/ChatManager.java index 415d0f2e8..29dc87c98 100644 --- a/src/main/java/com/gmail/nossr50/util/ChatManager.java +++ b/src/main/java/com/gmail/nossr50/util/ChatManager.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.util; import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.events.chat.McMMOAdminChatEvent; @@ -11,8 +12,8 @@ import com.gmail.nossr50.party.Party; public final class ChatManager { public ChatManager () {} - public static void handleAdminChat(String playerName, String message) { - McMMOAdminChatEvent chatEvent = new McMMOAdminChatEvent(playerName, message); + public static void handleAdminChat(Plugin plugin, String playerName, String message) { + McMMOAdminChatEvent chatEvent = new McMMOAdminChatEvent(plugin, playerName, message); mcMMO.p.getServer().getPluginManager().callEvent(chatEvent); if (chatEvent.isCancelled()) { @@ -30,10 +31,14 @@ public final class ChatManager { } } - public static void handlePartyChat(Party party, String playerName, String message) { - String partyName = party.getName(); + public static void handleAdminChat(String playerName, String message) { + handleAdminChat(null, playerName, message); + } - McMMOPartyChatEvent chatEvent = new McMMOPartyChatEvent(playerName, partyName, message); + public static void handlePartyChat(Plugin plugin, Party party, String playerName, String message) { + String partyName = party.getName(); + + McMMOPartyChatEvent chatEvent = new McMMOPartyChatEvent(plugin, playerName, partyName, message); mcMMO.p.getServer().getPluginManager().callEvent(chatEvent); if (chatEvent.isCancelled()) { @@ -48,4 +53,8 @@ public final class ChatManager { member.sendMessage(LocaleLoader.getString("Commands.Party.Chat.Prefix", new Object[] {playerName}) + partyMessage); } } + + public static void handlePartyChat(Party party, String playerName, String message) { + handlePartyChat(null, party, playerName, message); + } }