From 4934cac1c6510ecb7aca4f6adc70356f7a78c10f Mon Sep 17 00:00:00 2001 From: KHobbits Date: Sat, 13 Jul 2013 17:24:40 +0100 Subject: Remove old chat hook Use Bukkit API for local chat handling Implement localChatSpy event --- .../chat/EssentialsChatPlayerListenerNormal.java | 101 ++++++++++++++++++--- 1 file changed, 89 insertions(+), 12 deletions(-) (limited to 'EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java') diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java index 910518302..4fe8e7df5 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java @@ -3,9 +3,17 @@ package com.earth2me.essentials.chat; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.User; +import static com.earth2me.essentials.chat.EssentialsChatPlayer.logger; +import java.util.HashSet; +import java.util.Iterator; import java.util.Locale; import java.util.Map; +import java.util.Set; +import net.ess3.api.events.LocalChatSpyEvent; +import org.bukkit.Location; import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.AsyncPlayerChatEvent; @@ -15,12 +23,11 @@ public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer { public EssentialsChatPlayerListenerNormal(final Server server, final IEssentials ess, - final Map listeners, final Map chatStorage) { - super(server, ess, listeners, chatStorage); + super(server, ess, chatStorage); } - + @EventHandler(priority = EventPriority.NORMAL) @Override public void onPlayerChat(final AsyncPlayerChatEvent event) @@ -33,40 +40,110 @@ public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer /** * This file should handle detection of the local chat features... if local chat is enabled, we need to handle * it here - */ + */ long radius = ess.getSettings().getChatRadius(); if (radius < 1) { return; } radius *= radius; - + final ChatStore chatStore = getChatStore(event); final User user = chatStore.getUser(); chatStore.setRadius(radius); - + if (event.getMessage().length() > 1 && chatStore.getType().length() > 0) { final StringBuilder permission = new StringBuilder(); permission.append("essentials.chat.").append(chatStore.getType()); - + if (user.isAuthorized(permission.toString())) { final StringBuilder format = new StringBuilder(); format.append(chatStore.getType()).append("Format"); event.setMessage(event.getMessage().substring(1)); - event.setFormat(_(format.toString(), event.getFormat())); + event.setFormat(_(format.toString(), event.getFormat())); return; } - + final StringBuilder errorMsg = new StringBuilder(); errorMsg.append("notAllowedTo").append(chatStore.getType().substring(0, 1).toUpperCase(Locale.ENGLISH)).append(chatStore.getType().substring(1)); - + user.sendMessage(_(errorMsg.toString())); event.setCancelled(true); return; } - - sendLocalChat(event, chatStore); + + final Location loc = user.getLocation(); + final World world = loc.getWorld(); + + if (charge(event, chatStore) == false) + { + return; + } + + Set outList = event.getRecipients(); + Set spyList = new HashSet(); + + try + { + outList.add(event.getPlayer()); + } + catch (UnsupportedOperationException ex) + { + if (ess.getSettings().isDebug()) + { + ess.getLogger().info("Plugin triggered custom chat event, local chat handling aborted."); + } + return; + } + + String type = _("chatTypeLocal"); + event.setFormat(type.concat(event.getFormat())); + + logger.info(_("localFormat", user.getName(), event.getMessage())); + + final Iterator it = outList.iterator(); + while (it.hasNext()) + { + final Player onlinePlayer = it.next(); + final User onlineUser = ess.getUser(onlinePlayer); + if (!onlineUser.equals(user)) + { + boolean abort = false; + final Location playerLoc = onlineUser.getLocation(); + if (playerLoc.getWorld() != world) + { + abort = true; + } + else + { + final double delta = playerLoc.distanceSquared(loc); + if (delta > chatStore.getRadius()) + { + abort = true; + } + } + if (abort) + { + if (onlineUser.isAuthorized("essentials.chat.spy")) + { + spyList.add(onlinePlayer); + } + outList.remove(onlinePlayer); + } + } + } + + LocalChatSpyEvent spyEvent = new LocalChatSpyEvent(event.isAsynchronous(), event.getPlayer(), event.getFormat(), event.getMessage(), spyList); + server.getPluginManager().callEvent(spyEvent); + + if (!spyEvent.isCancelled()) + { + for (Player onlinePlayer : spyEvent.getRecipients()) + { + onlinePlayer.sendMessage(String.format(event.getFormat(), user.getDisplayName(), event.getMessage())); + } + } } } -- cgit v1.2.3