From 6a9d5c9acb9a39294e384ed9789e66c3a00669d9 Mon Sep 17 00:00:00 2001 From: StevenLawson Date: Sat, 16 Aug 2014 20:33:55 -0400 Subject: [PATCH] Added functionality for client side player list. --- build.xml | 3 +- nbproject/genfiles.properties | 4 +- nbproject/project.properties | 2 +- .../BukkitTelnet/BukkitTelnet.java | 1 + .../BukkitTelnet/PlayerEventListener.java | 76 +++++++++++++++++ .../BukkitTelnet/SocketListener.java | 16 +++- .../BukkitTelnet/TelnetServer.java | 5 ++ .../BukkitTelnet/session/ClientSession.java | 82 ++++++++++++------- 8 files changed, 152 insertions(+), 37 deletions(-) create mode 100644 src/me/StevenLawson/BukkitTelnet/PlayerEventListener.java diff --git a/build.xml b/build.xml index 3d2781b..0313611 100644 --- a/build.xml +++ b/build.xml @@ -51,8 +51,7 @@ -init-macrodef-junit: defines macro for junit execution -init-macrodef-debug: defines macro for class debugging -init-macrodef-java: defines macro for class execution - -do-jar-with-manifest: JAR building (if you are using a manifest) - -do-jar-without-manifest: JAR building (if you are not using a manifest) + -do-jar: JAR building run: execution of project -javadoc-build: Javadoc generation test-report: JUnit report generation diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties index 368a38e..f01c92f 100644 --- a/nbproject/genfiles.properties +++ b/nbproject/genfiles.properties @@ -1,6 +1,6 @@ build.xml.data.CRC32=ad7c8973 -build.xml.script.CRC32=a50ca8cc -build.xml.stylesheet.CRC32=28e38971@1.56.1.46 +build.xml.script.CRC32=48b261b8 +build.xml.stylesheet.CRC32=8064a381@1.74.2.48 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=ad7c8973 diff --git a/nbproject/project.properties b/nbproject/project.properties index 718f27c..b37d8eb 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -52,7 +52,7 @@ javac.classpath=\ ${libs.Log4J-core.classpath}:\ ${libs.Log4J-api.classpath} # Space-separated list of extra javac options -javac.compilerargs=-Xlint:unchecked +javac.compilerargs=-Xlint:unchecked -Xlint:deprecation javac.deprecation=false javac.processorpath=\ ${javac.classpath} diff --git a/src/me/StevenLawson/BukkitTelnet/BukkitTelnet.java b/src/me/StevenLawson/BukkitTelnet/BukkitTelnet.java index d27b9bc..51c9a1b 100644 --- a/src/me/StevenLawson/BukkitTelnet/BukkitTelnet.java +++ b/src/me/StevenLawson/BukkitTelnet/BukkitTelnet.java @@ -31,6 +31,7 @@ public class BukkitTelnet extends JavaPlugin TelnetLogger.info(plugin.getName() + " v" + plugin.getDescription().getVersion() + " enabled"); + this.getServer().getPluginManager().registerEvents(new PlayerEventListener(), plugin); } @Override diff --git a/src/me/StevenLawson/BukkitTelnet/PlayerEventListener.java b/src/me/StevenLawson/BukkitTelnet/PlayerEventListener.java new file mode 100644 index 0000000..52e696a --- /dev/null +++ b/src/me/StevenLawson/BukkitTelnet/PlayerEventListener.java @@ -0,0 +1,76 @@ +package me.StevenLawson.BukkitTelnet; + +import java.util.HashMap; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +public class PlayerEventListener implements Listener +{ + public PlayerEventListener() + { + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerJoin(PlayerJoinEvent event) + { + triggerPlayerListUpdates(); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerKick(PlayerKickEvent event) + { + triggerPlayerListUpdates(); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerQuit(PlayerQuitEvent event) + { + triggerPlayerListUpdates(); + } + + private static void triggerPlayerListUpdates() + { + new BukkitRunnable() + { + @Override + public void run() + { + final SocketListener socketListener = TelnetServer.getInstance().getSocketListener(); + if (socketListener != null) + { + socketListener.triggerPlayerListUpdates(generatePlayerList()); + } + } + }.runTaskLater(BukkitTelnet.plugin, 20L); + } + + @SuppressWarnings("unchecked") + private static String generatePlayerList() + { + final JSONArray players = new JSONArray(); + + for (final Player player : Bukkit.getServer().getOnlinePlayers()) + { + final HashMap info = new HashMap(); + + info.put("name", player.getName()); + info.put("ip", player.getAddress().getAddress().getHostAddress()); + + players.add(info); + } + + final JSONObject response = new JSONObject(); + response.put("players", players); + + return response.toJSONString(); + } +} diff --git a/src/me/StevenLawson/BukkitTelnet/SocketListener.java b/src/me/StevenLawson/BukkitTelnet/SocketListener.java index 48e7472..0f3359c 100644 --- a/src/me/StevenLawson/BukkitTelnet/SocketListener.java +++ b/src/me/StevenLawson/BukkitTelnet/SocketListener.java @@ -50,7 +50,7 @@ public class SocketListener extends Thread while (it.hasNext()) { final ClientSession session = it.next(); - + if (!session.syncIsConnected()) { TelnetLogAppender.getInstance().removeSession(session); @@ -59,6 +59,20 @@ public class SocketListener extends Thread } } + public void triggerPlayerListUpdates(final String playerListData) + { + final Iterator it = clientSessions.iterator(); + + while (it.hasNext()) + { + final ClientSession session = it.next(); + if (session != null) + { + session.syncTriggerPlayerListUpdate(playerListData); + } + } + } + public void stopServer() { try diff --git a/src/me/StevenLawson/BukkitTelnet/TelnetServer.java b/src/me/StevenLawson/BukkitTelnet/TelnetServer.java index e9dae76..1ea6979 100644 --- a/src/me/StevenLawson/BukkitTelnet/TelnetServer.java +++ b/src/me/StevenLawson/BukkitTelnet/TelnetServer.java @@ -81,6 +81,11 @@ public class TelnetServer socketListener.stopServer(); } + public SocketListener getSocketListener() + { + return socketListener; + } + public static TelnetServer getInstance() { return TelnetServerHolder.INSTANCE; diff --git a/src/me/StevenLawson/BukkitTelnet/session/ClientSession.java b/src/me/StevenLawson/BukkitTelnet/session/ClientSession.java index 859a0aa..abfb0b4 100644 --- a/src/me/StevenLawson/BukkitTelnet/session/ClientSession.java +++ b/src/me/StevenLawson/BukkitTelnet/session/ClientSession.java @@ -37,6 +37,7 @@ public final class ClientSession extends Thread private BufferedReader reader; private String username; private boolean hasTerminated; + private boolean enhancedMode = false; public ClientSession(Socket clientSocket) { @@ -410,58 +411,77 @@ public final class ClientSession extends Thread } } - private void executeTelnetCommand(String command) + private void executeTelnetCommand(final String command) { - if (command.equalsIgnoreCase("telnet.help")) + if ("telnet.help".equalsIgnoreCase(command)) { println("--- Telnet commands ---"); println("telnet.help - See all of the telnet commands."); println("telnet.stop - Shut the server down."); println("telnet.log - Change your logging settings."); println("telnet.exit - Quit the telnet session."); - return; } - - if (command.equalsIgnoreCase("telnet.stop")) + else if ("telnet.stop".equalsIgnoreCase(command)) { println("Shutting down the server..."); TelnetLogger.warning(username + ": Shutting down the server..."); System.exit(0); - return; } - - if (command.equalsIgnoreCase("telnet.log")) + else if ("telnet.log".equalsIgnoreCase(command)) { - if (filterMode == FilterMode.FULL) + switch (filterMode) { - filterMode = FilterMode.CHAT_ONLY; - println("Showing only chat logs."); - return; + case FULL: + { + filterMode = FilterMode.CHAT_ONLY; + println("Showing only chat logs."); + break; + } + case CHAT_ONLY: + { + filterMode = FilterMode.NONCHAT_ONLY; + println("Showing only non-chat logs."); + break; + } + case NONCHAT_ONLY: + { + filterMode = FilterMode.FULL; + println("Showing all logs."); + break; + } } - - if (filterMode == FilterMode.CHAT_ONLY) - { - filterMode = FilterMode.NONCHAT_ONLY; - println("Showing only non-chat logs."); - return; - } - - if (filterMode == FilterMode.NONCHAT_ONLY) - { - filterMode = FilterMode.FULL; - println("Showing all logs."); - return; - } - return; } - - if (command.equalsIgnoreCase("telnet.exit")) + else if ("telnet.exit".equalsIgnoreCase(command)) { - println("Goodbye <3"); + println("Goodbye."); syncTerminateSession(); } + else if ("telnet.enhanced".equalsIgnoreCase(command)) + { + enhancedMode = !enhancedMode; + println((enhancedMode ? "A" : "Dea") + "ctivated enhanced mode."); + } + else + { + println("Invalid telnet command, use \"telnet.help\" to view help."); + } + } + public void syncTriggerPlayerListUpdate(String playerListData) + { + if (!enhancedMode) + { + return; + } - println("Invalid telnet command, use \"telnet.help\" to view help."); + synchronized (clientSocket) + { + if (clientSocket.isClosed()) + { + return; + } + + println("playerList~" + playerListData); + } } }