From 26e5b14d6eacaa08aa105140a2e72b4a6f61c8c0 Mon Sep 17 00:00:00 2001 From: Trever Fischer Date: Mon, 12 Nov 2012 14:38:43 -0500 Subject: [PATCH] Implement periodic heartbeat events to api server, and kicking players --- src/main/java/us/camin/HeartbeatCommand.java | 37 ++++++++++++++ src/main/java/us/camin/Plugin.java | 27 ++++++++++ src/main/java/us/camin/ServerHeartbeat.java | 49 +++++++++++++++++++ .../java/us/camin/api/HeartbeatEvent.java | 45 +++++++++++++++++ src/main/java/us/camin/api/KickEvent.java | 36 ++++++++++++++ src/main/java/us/camin/api/ServerEvent.java | 2 + src/main/resources/plugin.yml | 6 +++ 7 files changed, 202 insertions(+) create mode 100644 src/main/java/us/camin/HeartbeatCommand.java create mode 100644 src/main/java/us/camin/ServerHeartbeat.java create mode 100644 src/main/java/us/camin/api/HeartbeatEvent.java create mode 100644 src/main/java/us/camin/api/KickEvent.java diff --git a/src/main/java/us/camin/HeartbeatCommand.java b/src/main/java/us/camin/HeartbeatCommand.java new file mode 100644 index 0000000..00e22f9 --- /dev/null +++ b/src/main/java/us/camin/HeartbeatCommand.java @@ -0,0 +1,37 @@ +package us.camin; + +/* + This file is part of Caminus + + Caminus is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Caminus is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Caminus. If not, see . + */ + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +public class HeartbeatCommand implements CommandExecutor { + private Plugin m_plugin; + + public HeartbeatCommand(Plugin p) { + m_plugin = p; + } + + public boolean onCommand(CommandSender sender, Command command, String label, String[] split) { + if (sender.hasPermission("caminus.heartbeat")) { + m_plugin.sendHeartbeat(); + } + return true; + } +} diff --git a/src/main/java/us/camin/Plugin.java b/src/main/java/us/camin/Plugin.java index 0bbac48..094d73b 100644 --- a/src/main/java/us/camin/Plugin.java +++ b/src/main/java/us/camin/Plugin.java @@ -58,6 +58,8 @@ import us.camin.api.PlayerMessageEvent; import us.camin.api.ClientEvent; import us.camin.api.VaultModifyEvent; import us.camin.api.PlayerVaultSlot; +import us.camin.api.HeartbeatEvent; +import us.camin.api.KickEvent; import org.json.JSONException; public class Plugin extends JavaPlugin { @@ -69,6 +71,7 @@ public class Plugin extends JavaPlugin { private VomitCommand m_vomitCommand; private VaultCommand m_vaultCommand; private ServerEventPoller m_eventPoll; + private ServerHeartbeat m_heartbeat; private ArrayList m_vaultmasters; public Server api() { @@ -78,6 +81,7 @@ public class Plugin extends JavaPlugin { public void onDisable() { log.info("[Caminus] Plugin disabled"); m_eventPoll.stop(); + m_heartbeat.stop(); m_api = null; saveVaultmasters(); for (Villager v : m_vaultmasters) { @@ -122,6 +126,13 @@ public class Plugin extends JavaPlugin { return null; } }); + } else if (e instanceof KickEvent) { + final KickEvent evt = (KickEvent)(e); + log.info("Got kick event for "+evt.player+": "+evt.message); + Player p = getServer().getPlayer(evt.player); + if (p != null) { + p.kickPlayer(evt.message); + } } try { m_api.notifyEventHandled(e); @@ -183,6 +194,18 @@ public class Plugin extends JavaPlugin { saveConfig(); } + public void sendHeartbeat() { + HeartbeatEvent evt = new HeartbeatEvent(); + evt.port = getServer().getPort(); + evt.name = getServer().getName(); + HashMap times = new HashMap(); + for (World w : getServer().getWorlds()) { + times.put(w.getName(), w.getTime()); + } + evt.worldTimes = times; + sendEvent(evt); + } + public void onEnable() { m_vaultmasters = new ArrayList(); m_vaultInventories = new HashMap(); @@ -204,6 +227,7 @@ public class Plugin extends JavaPlugin { pm.registerEvents(m_listener, this); m_eventPoll = new ServerEventPoller(this); + m_heartbeat = new ServerHeartbeat(this); m_motdCommand = new MOTDCommand(this); getCommand("motd").setExecutor(m_motdCommand); @@ -213,6 +237,8 @@ public class Plugin extends JavaPlugin { m_vaultCommand = new VaultCommand(this); getCommand("vaultmaster").setExecutor(m_vaultCommand); + getCommand("heartbeat").setExecutor(new HeartbeatCommand(this)); + CommandExecutor economyCommand = new EconomyCommand(this); getCommand("balance").setExecutor(economyCommand); @@ -225,6 +251,7 @@ public class Plugin extends JavaPlugin { log.info("[Caminus] Plugin enabled"); getServer().getScheduler().scheduleAsyncDelayedTask(this, m_eventPoll); + getServer().getScheduler().scheduleAsyncDelayedTask(this, m_heartbeat); } public void checkFreeHalfDoorDay(Player sender) { diff --git a/src/main/java/us/camin/ServerHeartbeat.java b/src/main/java/us/camin/ServerHeartbeat.java new file mode 100644 index 0000000..a9bf083 --- /dev/null +++ b/src/main/java/us/camin/ServerHeartbeat.java @@ -0,0 +1,49 @@ +package us.camin; + +/* + This file is part of Caminus + + Caminus is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Caminus is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Caminus. If not, see . + */ + +import java.lang.Runnable; +import java.io.IOException; +import java.util.logging.Logger; +import org.bukkit.scheduler.BukkitScheduler; + +public class ServerHeartbeat implements Runnable { + private Plugin m_plugin; + private boolean m_running; + private int m_taskid; + Logger log = Logger.getLogger("CaminusHeartbeat"); + + public ServerHeartbeat(Plugin plugin) { + m_plugin = plugin; + m_running = true; + } + + public void run() { + if (m_running) { + m_plugin.sendHeartbeat(); + final BukkitScheduler scheduler = m_plugin.getServer().getScheduler(); + m_taskid = scheduler.scheduleAsyncDelayedTask(m_plugin, this, 100); + } + } + + public void stop() { + BukkitScheduler scheduler = m_plugin.getServer().getScheduler(); + scheduler.cancelTask(m_taskid); + m_running = false; + } +} diff --git a/src/main/java/us/camin/api/HeartbeatEvent.java b/src/main/java/us/camin/api/HeartbeatEvent.java new file mode 100644 index 0000000..b2c40a6 --- /dev/null +++ b/src/main/java/us/camin/api/HeartbeatEvent.java @@ -0,0 +1,45 @@ +package us.camin.api; + +/* + This file is part of Caminus + + Caminus is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Caminus is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Caminus. If not, see . + */ + +import org.json.JSONWriter; +import org.json.JSONException; +import java.util.Map; + +public class HeartbeatEvent extends ClientEvent { + public Map worldTimes; + public int port; + public String name; + + public JSONWriter toJSON(JSONWriter writer) throws JSONException { + writer.key("port").value(port); + writer.key("name").value(name); + writer.key("worlds").object(); + for (String world : worldTimes.keySet()) { + writer.key(world).object(); + writer.key("time").value(worldTimes.get(world)); + writer.endObject(); + } + writer.endObject(); + return writer; + } + + public String jsonName() { + return "heartbeat"; + } +} diff --git a/src/main/java/us/camin/api/KickEvent.java b/src/main/java/us/camin/api/KickEvent.java new file mode 100644 index 0000000..238cda0 --- /dev/null +++ b/src/main/java/us/camin/api/KickEvent.java @@ -0,0 +1,36 @@ +package us.camin.api; + +/* + This file is part of Caminus + + Caminus is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Caminus is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Caminus. If not, see . + */ + +import org.json.JSONArray; +import org.json.JSONObject; +import org.json.JSONException; + +public class KickEvent extends ServerEvent { + public String message; + public String player; + + public static KickEvent fromJSON(JSONObject obj, int id) { + KickEvent ret = new KickEvent (); + ret.player = obj.optString("player"); + ret.message = obj.optString("message"); + ret.id = id; + return ret; + } +} + diff --git a/src/main/java/us/camin/api/ServerEvent.java b/src/main/java/us/camin/api/ServerEvent.java index c5a5a21..f35651c 100644 --- a/src/main/java/us/camin/api/ServerEvent.java +++ b/src/main/java/us/camin/api/ServerEvent.java @@ -49,6 +49,8 @@ public class ServerEvent { return PlayerMessageEvent.fromJSON(payload, id); } else if (type.equals("vault-contents")) { return VaultModifyEvent.fromJSON(payload, id); + } else if (type.equals("player-kick")) { + return KickEvent.fromJSON(payload, id); } else { log.log(Level.SEVERE, "Unhandled event type: "+type); return null; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 01851b4..27773c4 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -17,6 +17,8 @@ commands: usage: / vaultmaster: description: Create a vaultmaster NPC at your current location. + heartbeat: + description: Send a heartbeat to the caminus api server permissions: caminus.*: default: op @@ -26,6 +28,7 @@ permissions: caminus.freedoorday: true caminus.vomit: true caminus.vaultmaster: true + caminus.heartbeat: true caminus.freedoorday: default: false description: Enables free half door day @@ -38,3 +41,6 @@ permissions: caminus.vaultmaster: default: op description: Allows creation of vaultmasters, interfaces to the vault system. + caminus.heartbeat: + default: op + description: Allows use of the /heartbeat command.