diff options
Diffstat (limited to 'EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java')
-rw-r--r-- | EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java | 212 |
1 files changed, 118 insertions, 94 deletions
diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java index ddf928725..d55cfe9cb 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java @@ -2,156 +2,180 @@ package com.earth2me.essentials.chat; import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; +import java.util.Locale; import java.util.Map; import java.util.logging.Logger; -import org.bukkit.Location; import org.bukkit.Server; -import org.bukkit.World; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.PlayerListener; //TODO: Translate the local/spy tags -public abstract class EssentialsChatPlayer implements Listener +public abstract class EssentialsChatPlayer extends PlayerListener { protected transient IEssentials ess; protected final static Logger logger = Logger.getLogger("Minecraft"); - protected final transient Map<String, IEssentialsChatListener> listeners; - protected final transient Server server; - protected final transient Map<PlayerChatEvent, ChatStore> chatStorage; - - public EssentialsChatPlayer(final Server server, - final IEssentials ess, - final Map<String, IEssentialsChatListener> listeners, - final Map<PlayerChatEvent, ChatStore> chatStorage) + protected final transient Server server; + + public EssentialsChatPlayer(final Server server, final IEssentials ess) { this.ess = ess; - this.listeners = listeners; this.server = server; - this.chatStorage = chatStorage; } + @Override public void onPlayerChat(final PlayerChatEvent event) { } public boolean isAborted(final PlayerChatEvent event) { + return isAborted(event, "chat"); + } + + public boolean isAborted(final PlayerChatEvent event, final String command) + { if (event.isCancelled()) { return true; } - for (IEssentialsChatListener listener : listeners.values()) + + final IUser user = ess.getUser(event.getPlayer()); + if (!isAffordableFor(user, command)) { - if (listener.shouldHandleThisChat(event)) - { - return true; - } + event.setCancelled(true); + return true; } return false; } + + protected void chargeChat (final PlayerChatEvent event, final Map<PlayerChatEvent, String> charges) { + + final IUser user = ess.getUser(event.getPlayer()); + + String charge = charges.remove(event); + if (charge == null) + { + charge = "chat"; + } - public String getChatType(final String message) - { - switch (message.charAt(0)) + try { - case '!': - return "shout"; - case '?': - return "question"; - default: - return ""; + charge(user, charge); + } + catch (ChargeException e) + { + ess.getCommandHandler().showCommandError(user, charge, e); + event.setCancelled(true); } } - public ChatStore getChatStore(final PlayerChatEvent event) - { - return chatStorage.get(event); - } - - public void setChatStore(final PlayerChatEvent event, final ChatStore chatStore) + protected void charge(final CommandSender sender, final String command) throws ChargeException { - chatStorage.put(event, chatStore); + if (sender instanceof Player) + { + final Trade charge = new Trade(command, ess); + charge.charge(ess.getUser((Player)sender)); + } } - public ChatStore delChatStore(final PlayerChatEvent event) + protected boolean isAffordableFor(final CommandSender sender, final String command) { - return chatStorage.remove(event); - } + if (sender instanceof Player) + { + try + { + final Trade charge = new Trade(command, ess); + charge.isAffordableFor(ess.getUser((Player)sender)); + } + catch (ChargeException e) + { + return false; + } + } + else + { + return false; + } - protected void charge(final User user, final Trade charge) throws ChargeException - { - charge.charge(user); + return true; } - protected boolean charge(final PlayerChatEvent event, final ChatStore chatStore) + protected void formatChat(final PlayerChatEvent event) { - try + final IUser user = ess.getUser(event.getPlayer()); + if (user.isAuthorized("essentials.chat.color")) { - charge(chatStore.getUser(), chatStore.getCharge()); + event.setMessage(event.getMessage().replaceAll("&([0-9a-f])", "\u00a7$1")); } - catch (ChargeException e) + String format = ess.getGroups().getChatFormat(user); + event.setFormat(format.replace('&', '\u00a7').replace("\u00a7\u00a7", "&").replace("{DISPLAYNAME}", "%1$s").replace("{GROUP}", user.getGroup()).replace("{MESSAGE}", "%2$s").replace("{WORLDNAME}", user.getWorld().getName()).replace("{SHORTWORLDNAME}", user.getWorld().getName().substring(0, 1).toUpperCase(Locale.ENGLISH))); + } + + protected String getChatType(final String message) + { + switch (message.charAt(0)) { - ess.showError(chatStore.getUser(), e, chatStore.getLongType()); - event.setCancelled(true); - return false; + case '!': + return "shout"; + case '?': + return "question"; + //case '@': + // return "admin"; + default: + return ""; } - return true; } - protected void sendLocalChat(final PlayerChatEvent event, final ChatStore chatStore) + protected void handleLocalChat(final Map<PlayerChatEvent, String> charges, final PlayerChatEvent event) { - event.setCancelled(true); - final User sender = chatStore.getUser(); - logger.info(_("localFormat", sender.getName(), event.getMessage())); - final Location loc = sender.getLocation(); - final World world = loc.getWorld(); - - if (charge(event, chatStore) == false) - { - return; + long radius = 0; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try { + radius = settings.getData().getChat().getLocalRadius(); + } finally { + settings.unlock(); } + radius *= radius; + + final IUser user = ess.getUser(event.getPlayer()); + final String chatType = getChatType(event.getMessage()); + final StringBuilder command = new StringBuilder(); + command.append("chat"); - for (Player onlinePlayer : server.getOnlinePlayers()) + if (event.getMessage().length() > 0 && chatType.length() > 0) { - String type = _("chatTypeLocal"); - final User onlineUser = ess.getUser(onlinePlayer); - //TODO: remove reference to op - if (onlineUser.isIgnoredPlayer(sender.getName()) && !sender.isOp()) - { - continue; - } - if (!onlineUser.equals(sender)) - { - final Location playerLoc = onlineUser.getLocation(); - if (playerLoc.getWorld() != world) - { - continue; - } - final double delta = playerLoc.distanceSquared(loc); - - if (delta > chatStore.getRadius()) - { - if (onlineUser.isAuthorized("essentials.chat.spy")) - { - type = type.concat(_("chatTypeSpy")); - } - else - { - continue; - } - } - } + command.append("-").append(chatType); + final StringBuilder permission = new StringBuilder(); + permission.append("essentials.chat.").append(chatType); + + final StringBuilder format = new StringBuilder(); + format.append(chatType).append("Format"); + + final StringBuilder errorMsg = new StringBuilder(); + errorMsg.append("notAllowedTo").append(chatType.substring(0, 1).toUpperCase(Locale.ENGLISH)).append(chatType.substring(1)); - String message = String.format(event.getFormat(), type.concat(sender.getDisplayName()), event.getMessage()); - for (IEssentialsChatListener listener : listeners.values()) + if (user.isAuthorized(permission.toString())) { - message = listener.modifyMessage(event, onlinePlayer, message); + event.setMessage(event.getMessage().substring(1)); + event.setFormat(_(format.toString(), event.getFormat())); + charges.put(event, command.toString()); + return; } - onlineUser.sendMessage(message); + + user.sendMessage(_(errorMsg.toString())); + event.setCancelled(true); + return; } + + event.setCancelled(true); + final EssentialsLocalChatEvent localChat = new EssentialsLocalChatEvent(event, radius); + ess.getServer().getPluginManager().callEvent(localChat); } } |