From 4fb1ddf49a1f8c47c611cfd695b8f9b8f5183083 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Sat, 21 May 2011 00:59:08 -0500 Subject: [PATCH 1/3] Fix for skins on players with nicknames - send up account name as well as display name. --- src/main/java/org/dynmap/Client.java | 4 +++- src/main/java/org/dynmap/JsonTimerTask.java | 3 ++- .../java/org/dynmap/web/handlers/ClientUpdateHandler.java | 3 ++- web/js/map.js | 5 +++-- web/js/playermarkers.js | 2 +- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/dynmap/Client.java b/src/main/java/org/dynmap/Client.java index 5ada186e..78d7de31 100644 --- a/src/main/java/org/dynmap/Client.java +++ b/src/main/java/org/dynmap/Client.java @@ -18,14 +18,16 @@ public class Client { public String world; public double x, y, z; public int health; + public String account; - public Player(String name, String world, double x, double y, double z, int health) { + public Player(String name, String world, double x, double y, double z, int health, String account) { this.name = ChatColor.stripColor(name); this.world = world; this.x = x; this.y = y; this.z = z; this.health = health; + this.account = account; } } diff --git a/src/main/java/org/dynmap/JsonTimerTask.java b/src/main/java/org/dynmap/JsonTimerTask.java index 2f4d3db7..622ab177 100644 --- a/src/main/java/org/dynmap/JsonTimerTask.java +++ b/src/main/java/org/dynmap/JsonTimerTask.java @@ -99,7 +99,8 @@ class JsonTimerTask extends TimerTask { for (int i = 0; i < players.length; i++) { Player p = players[i]; Location pl = p.getLocation(); - update.players[i] = new Client.Player(p.getDisplayName(), pl.getWorld().getName(), pl.getX(), pl.getY(), pl.getZ(), showHealth?p.getHealth():-1); + update.players[i] = new Client.Player(p.getDisplayName(), pl.getWorld().getName(), pl.getX(), pl.getY(), pl.getZ(), showHealth?p.getHealth():-1, + p.getName()); } update.updates = mapManager.getWorldUpdates(world.getName(), current - (jsonInterval + 10000)); diff --git a/src/main/java/org/dynmap/web/handlers/ClientUpdateHandler.java b/src/main/java/org/dynmap/web/handlers/ClientUpdateHandler.java index 7f15700e..b0cb2124 100644 --- a/src/main/java/org/dynmap/web/handlers/ClientUpdateHandler.java +++ b/src/main/java/org/dynmap/web/handlers/ClientUpdateHandler.java @@ -76,7 +76,8 @@ public class ClientUpdateHandler implements HttpHandler { for(int i=0;i Date: Sat, 21 May 2011 23:58:48 -0500 Subject: [PATCH 2/3] Fixes for alias/nicknames in web UI (esp handling player icons), HeroChat fixes --- src/main/java/org/dynmap/Client.java | 15 +++++++++---- .../org/dynmap/DynmapPlayerChatListener.java | 8 ++++--- src/main/java/org/dynmap/DynmapPlugin.java | 2 +- src/main/java/org/dynmap/HeroChatHandler.java | 22 ++++++++++++++++--- src/main/java/org/dynmap/web/HttpRequest.java | 2 ++ .../org/dynmap/web/HttpServerConnection.java | 4 +++- .../web/handlers/SendMessageHandler.java | 3 ++- web/js/chat.js | 3 ++- web/js/chatbox.js | 15 ++++++++++--- 9 files changed, 57 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/dynmap/Client.java b/src/main/java/org/dynmap/Client.java index 78d7de31..4a82ec08 100644 --- a/src/main/java/org/dynmap/Client.java +++ b/src/main/java/org/dynmap/Client.java @@ -40,27 +40,34 @@ public class Client { public String source; public String playerName; public String message; - - public ChatMessage(String source, String playerName, String message) { + public String account; + public String channel; + public ChatMessage(String source, String channel, String playerName, String message, String playeraccount) { this.source = source; this.playerName = ChatColor.stripColor(playerName); this.message = ChatColor.stripColor(message); + this.account = playeraccount; + this.channel = channel; } } public static class PlayerJoinMessage extends Stamped { public String type = "playerjoin"; public String playerName; - public PlayerJoinMessage(String playerName) { + public String account; + public PlayerJoinMessage(String playerName, String playeraccount) { this.playerName = ChatColor.stripColor(playerName); + this.account = playeraccount; } } public static class PlayerQuitMessage extends Stamped { public String type = "playerquit"; public String playerName; - public PlayerQuitMessage(String playerName) { + public String account; + public PlayerQuitMessage(String playerName, String playeraccount) { this.playerName = ChatColor.stripColor(playerName); + this.account = playeraccount; } } diff --git a/src/main/java/org/dynmap/DynmapPlayerChatListener.java b/src/main/java/org/dynmap/DynmapPlayerChatListener.java index 51a03d28..64d3fcb4 100644 --- a/src/main/java/org/dynmap/DynmapPlayerChatListener.java +++ b/src/main/java/org/dynmap/DynmapPlayerChatListener.java @@ -15,17 +15,19 @@ public class DynmapPlayerChatListener extends PlayerListener { @Override public void onPlayerChat(PlayerChatEvent event) { if(event.isCancelled()) return; - plugin.mapManager.pushUpdate(new Client.ChatMessage("player", event.getPlayer().getDisplayName(), event.getMessage())); + plugin.mapManager.pushUpdate(new Client.ChatMessage("player", "", + event.getPlayer().getDisplayName(), event.getMessage(), + event.getPlayer().getName())); } @Override public void onPlayerJoin(PlayerJoinEvent event) { - plugin.mapManager.pushUpdate(new Client.PlayerJoinMessage(event.getPlayer().getDisplayName())); + plugin.mapManager.pushUpdate(new Client.PlayerJoinMessage(event.getPlayer().getDisplayName(), event.getPlayer().getName())); } @Override public void onPlayerQuit(PlayerQuitEvent event) { - plugin.mapManager.pushUpdate(new Client.PlayerQuitMessage(event.getPlayer().getDisplayName())); + plugin.mapManager.pushUpdate(new Client.PlayerQuitMessage(event.getPlayer().getDisplayName(), event.getPlayer().getName())); } } diff --git a/src/main/java/org/dynmap/DynmapPlugin.java b/src/main/java/org/dynmap/DynmapPlugin.java index c95cb24f..a723de4e 100644 --- a/src/main/java/org/dynmap/DynmapPlugin.java +++ b/src/main/java/org/dynmap/DynmapPlugin.java @@ -411,7 +411,7 @@ public class DynmapPlugin extends JavaPlugin { } public void webChat(String name, String message) { - mapManager.pushUpdate(new Client.ChatMessage("web", name, message)); + mapManager.pushUpdate(new Client.ChatMessage("web", null, name, message, null)); Log.info("[WEB]" + name + ": " + message); /* Let HeroChat take a look - only broadcast to players if it doesn't handle it */ if(hchand.sendWebMessageToHeroChat(name, message) == false) diff --git a/src/main/java/org/dynmap/HeroChatHandler.java b/src/main/java/org/dynmap/HeroChatHandler.java index bd42cc85..1ca39a72 100644 --- a/src/main/java/org/dynmap/HeroChatHandler.java +++ b/src/main/java/org/dynmap/HeroChatHandler.java @@ -38,6 +38,7 @@ public class HeroChatHandler { private static Class channelchatevent; private static Method getsource; private static Method getmessage; + private static Method issentbyplayer; private static boolean isgood = false; private Event evt; @@ -48,6 +49,7 @@ public class HeroChatHandler { .forName("com.herocraftonline.dthielke.herochat.event.ChannelChatEvent"); getsource = channelchatevent.getMethod("getSource", new Class[0]); getmessage = channelchatevent.getMethod("getMessage", new Class[0]); + issentbyplayer = channelchatevent.getMethod("isSentByPlayer", new Class[0]); isgood = true; } catch (ClassNotFoundException cnfx) { } catch (NoSuchMethodException nsmx) { @@ -78,6 +80,14 @@ public class HeroChatHandler { return null; } } + + public boolean isSentByPlayer() { + try { + return (Boolean) issentbyplayer.invoke(evt); + } catch (Exception x) { + return true; + } + } } /* Reflection-based access wrapper for ChannelEvent from HeroChat */ @@ -213,9 +223,15 @@ public class HeroChatHandler { /* Match on name or nickname of channel */ if (hcchannels.contains(c.getName()) || hcchannels.contains(c.getNick())) { - plugin.mapManager.pushUpdate(new Client.ChatMessage( - "player", "[" + c.getNick() + "] " - + cce.getSource(), cce.getMessage())); + if(cce.isSentByPlayer()) { /* Player message? */ + org.bukkit.entity.Player p = plugin.getServer().getPlayer(cce.getSource()); + if(p != null) + plugin.mapManager.pushUpdate(new Client.ChatMessage("player", + c.getNick(), + p.getDisplayName(), + cce.getMessage(), + p.getName())); + } } } } diff --git a/src/main/java/org/dynmap/web/HttpRequest.java b/src/main/java/org/dynmap/web/HttpRequest.java index a2cb2746..dc8db7bb 100644 --- a/src/main/java/org/dynmap/web/HttpRequest.java +++ b/src/main/java/org/dynmap/web/HttpRequest.java @@ -3,6 +3,7 @@ package org.dynmap.web; import java.io.InputStream; import java.util.HashMap; import java.util.Map; +import java.net.InetSocketAddress; public class HttpRequest { public String method; @@ -10,4 +11,5 @@ public class HttpRequest { public String version; public Map fields = new HashMap(); public InputStream body; + public InetSocketAddress rmtaddr; } diff --git a/src/main/java/org/dynmap/web/HttpServerConnection.java b/src/main/java/org/dynmap/web/HttpServerConnection.java index e6d4eee5..0a87cb18 100644 --- a/src/main/java/org/dynmap/web/HttpServerConnection.java +++ b/src/main/java/org/dynmap/web/HttpServerConnection.java @@ -15,6 +15,7 @@ import java.util.regex.Pattern; import org.dynmap.Log; import org.dynmap.debug.Debug; +import java.net.InetSocketAddress; public class HttpServerConnection extends Thread { protected static final Logger log = Logger.getLogger("Minecraft"); @@ -120,13 +121,14 @@ public class HttpServerConnection extends Thread { if (socket == null) return; socket.setSoTimeout(5000); + InetSocketAddress rmtaddr = (InetSocketAddress)socket.getRemoteSocketAddress(); /* Get remote address */ InputStream in = socket.getInputStream(); BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream(), 40960); printOut = new PrintStream(out, false); while (true) { HttpRequest request = new HttpRequest(); - + request.rmtaddr = rmtaddr; if (!readRequestHeader(in, request)) { socket.close(); return; diff --git a/src/main/java/org/dynmap/web/handlers/SendMessageHandler.java b/src/main/java/org/dynmap/web/handlers/SendMessageHandler.java index 2f5ab721..2bf08925 100644 --- a/src/main/java/org/dynmap/web/handlers/SendMessageHandler.java +++ b/src/main/java/org/dynmap/web/handlers/SendMessageHandler.java @@ -40,7 +40,8 @@ public class SendMessageHandler implements HttpHandler { JSONObject o = (JSONObject)parser.parse(reader); final Message message = new Message(); - message.name = String.valueOf(o.get("name")); + //message.name = String.valueOf(o.get("name")); //Can't trust client....we don't need to on internal web server + message.name = request.rmtaddr.getAddress().getHostAddress(); message.message = String.valueOf(o.get("message")); final long now = System.currentTimeMillis(); diff --git a/web/js/chat.js b/web/js/chat.js index 68421ee3..8e29bc00 100644 --- a/web/js/chat.js +++ b/web/js/chat.js @@ -12,7 +12,8 @@ componentconstructors['chat'] = function(dynmap, configuration) { $(dynmap).bind('worldupdate', function(event, update) { swtch(update.type, { chat: function() { - $(dynmap).trigger('chat', [{source: update.source, name: update.playerName, text: update.message}]); + $(dynmap).trigger('chat', [{source: update.source, name: update.playerName, text: update.message, account: update.account, + channel: update.channel}]); } }); }); diff --git a/web/js/chatbox.js b/web/js/chatbox.js index 67ecdfd2..7d032533 100644 --- a/web/js/chatbox.js +++ b/web/js/chatbox.js @@ -50,20 +50,29 @@ componentconstructors['chatbox'] = function(dynmap, configuration) { $(dynmap).bind('chat', function(event, message) { var playerName = message.name; + var playerAccount = message.account; var messageRow = $('
') .addClass('messagerow'); var playerIconContainer = $('') .addClass('messageicon'); - if (message.source === 'player' && configuration.showplayerfaces) { - getMinecraftHead(playerName, 16, function(head) { + if (message.source === 'player' && configuration.showplayerfaces && + playerAccount) { + getMinecraftHead(playerAccount, 16, function(head) { messageRow.icon = $(head) .addClass('playerIcon') .appendTo(playerIconContainer); }); } + var playerChannelContainer = ''; + if (message.channel) { + playerChannelContainer = $('').addClass('messagetext') + .text('[' + message.channel + '] ') + .appendTo(messageRow); + } + if (message.source === 'player' && configuration.showworld) { var playerWorldContainer = $('') .addClass('messagetext') @@ -79,7 +88,7 @@ componentconstructors['chatbox'] = function(dynmap, configuration) { .addClass('messagetext') .text(message.text); - messageRow.append(playerIconContainer,playerNameContainer,playerMessageContainer); + messageRow.append(playerIconContainer,playerChannelContainer,playerNameContainer,playerMessageContainer); addrow(messageRow); }); }; \ No newline at end of file From de73cd4028211191dd8a67b189ab61a2c42cc9fd Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Sun, 22 May 2011 01:53:48 -0500 Subject: [PATCH 3/3] Better fix for HeroChat - still need herochatwebchannel's channel to be set to join-messages: true to allow web messages before first player message in channel. --- src/main/java/org/dynmap/HeroChatHandler.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/dynmap/HeroChatHandler.java b/src/main/java/org/dynmap/HeroChatHandler.java index 1ca39a72..e53c0abf 100644 --- a/src/main/java/org/dynmap/HeroChatHandler.java +++ b/src/main/java/org/dynmap/HeroChatHandler.java @@ -10,6 +10,7 @@ import org.bukkit.event.Event; import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.event.server.ServerListener; import org.bukkit.plugin.Plugin; +import java.lang.reflect.Field; public class HeroChatHandler { private static final String DEF_CHANNEL = "Global"; @@ -18,8 +19,8 @@ public class HeroChatHandler { private List hcchannels; private String hcwebinputchannel; - private HeroChatChannel hcwebinputchan; private DynmapPlugin plugin; + private HeroChatChannel hcwebinputchan; private class OurPluginListener extends ServerListener { @Override @@ -209,14 +210,12 @@ public class HeroChatHandler { * plugin that may not be present....) */ HeroChatChannel c = ce.getChannel(); - /* If channel name or nickname matches out web channel, remember it */ - if((c != null) && (hcwebinputchannel != null) && - ((c.getName().equals(hcwebinputchannel)) || - c.getNick().equals(hcwebinputchannel))) { - hcwebinputchan = c; - } if (ce.isCancelled()) return; + if((hcwebinputchannel != null) && ((hcwebinputchannel.equals(c.getName())) || + (hcwebinputchannel.equals(c.getNick())))) { + hcwebinputchan = c; + } if (HeroChatChannelChatEvent.isInstance(event)) { HeroChatChannelChatEvent cce = new HeroChatChannelChatEvent( event); @@ -249,9 +248,15 @@ public class HeroChatHandler { /* And get channel to send web messages */ hcwebinputchannel = cfg.getNode("web").getString( "herochatwebchannel", DEF_CHANNEL); - /* Set up to hear when HeroChat is enabled */ - server.getPluginManager().registerEvent(Event.Type.PLUGIN_ENABLE, + Plugin hc = server.getPluginManager().getPlugin("HeroChat"); + if(hc != null) { + activateHeroChat(hc); + } + else { + /* Set up to hear when HeroChat is enabled */ + server.getPluginManager().registerEvent(Event.Type.PLUGIN_ENABLE, new OurPluginListener(), Event.Priority.Normal, plugin); + } } } @@ -268,7 +273,6 @@ public class HeroChatHandler { Log.severe("Cannot load HeroChat channel event class!"); return; } - /* Register event handler */ plugin.getServer().getPluginManager().registerEvent(Event.Type.CUSTOM_EVENT, new OurEventListener(), Event.Priority.Monitor, plugin);