From 1a5f8545522f2d952dea5abeb08b63d87eafc53e Mon Sep 17 00:00:00 2001 From: StevenLawson Date: Tue, 8 Oct 2013 14:41:05 -0400 Subject: [PATCH] Implemented Essentials-based AFK Auto-Kick w/ server load based trigger threshold. --- appinfo.properties | 6 ++-- buildnumber.properties | 4 +-- src/config.yml | 7 ++++ .../TotalFreedomMod/TFM_ConfigEntry.java | 3 ++ .../TotalFreedomMod/TFM_EssentialsBridge.java | 34 +++++++++++++++++++ .../TotalFreedomMod/TFM_Heartbeat.java | 18 +++++++++- 6 files changed, 66 insertions(+), 6 deletions(-) diff --git a/appinfo.properties b/appinfo.properties index 1afa4914..c47ceabb 100644 --- a/appinfo.properties +++ b/appinfo.properties @@ -1,5 +1,5 @@ -#Fri, 27 Sep 2013 10:59:36 -0400 +#Tue, 08 Oct 2013 13:58:56 -0400 program.VERSION=3.2 -program.BUILDNUM=615 -program.BUILDDATE=09/27/2013 10\:59 AM +program.BUILDNUM=616 +program.BUILDDATE=10/08/2013 01\:58 PM diff --git a/buildnumber.properties b/buildnumber.properties index 1dbecd55..8efb7796 100644 --- a/buildnumber.properties +++ b/buildnumber.properties @@ -1,3 +1,3 @@ #Build Number for ANT. Do not edit! -#Fri Sep 27 10:59:36 EDT 2013 -build.number=616 +#Tue Oct 08 13:58:56 EDT 2013 +build.number=617 diff --git a/src/config.yml b/src/config.yml index e9e97e6a..1255558b 100644 --- a/src/config.yml +++ b/src/config.yml @@ -184,3 +184,10 @@ service_checker_url: http://status.mojang.com/check httpd_enabled: true httpd_public_folder: ./public_html httpd_port: 28966 + +# Inactivity Auto-Kick (Requires Essentials) +autokick_enabled: true +# autokick_threshold - Percentage of server player capacity used at which players will be automatically kicked for being inactive. Range: 0.0 - 1.0 +autokick_threshold: 0.9 +# autokick_time - Time, in seconds, after which a player should be kicked when inactive +autokick_time: 120 diff --git a/src/me/StevenLawson/TotalFreedomMod/TFM_ConfigEntry.java b/src/me/StevenLawson/TotalFreedomMod/TFM_ConfigEntry.java index 762ca6e4..cf219b69 100644 --- a/src/me/StevenLawson/TotalFreedomMod/TFM_ConfigEntry.java +++ b/src/me/StevenLawson/TotalFreedomMod/TFM_ConfigEntry.java @@ -32,16 +32,19 @@ public enum TFM_ConfigEntry TOSSMOB_ENABLED(Boolean.class, "tossmob_enabled"), TWITTERBOT_ENABLED(Boolean.class, "twitterbot_enabled"), HTTPD_ENABLED(Boolean.class, "httpd_enabled"), + AUTOKICK_ENABLED(Boolean.class, "autokick_enabled"), // AUTO_PROTECT_RADIUS(Double.class, "auto_protect_radius"), EXPLOSIVE_RADIUS(Double.class, "explosive_radius"), NUKE_MONITOR_RANGE(Double.class, "nuke_monitor_range"), + AUTOKICK_THRESHOLD(Double.class, "autokick_threshold"), // FREECAM_TRIGGER_COUNT(Integer.class, "freecam_trigger_count"), MOB_LIMITER_MAX(Integer.class, "mob_limiter_max"), NUKE_MONITOR_COUNT_BREAK(Integer.class, "nuke_monitor_count_break"), NUKE_MONITOR_COUNT_PLACE(Integer.class, "nuke_monitor_count_place"), HTTPD_PORT(Integer.class, "httpd_port"), + AUTOKICK_TIME(Integer.class, "autokick_time"), // FLATLANDS_GENERATION_PARAMS(String.class, "flatlands_generation_params"), LOGS_REGISTER_PASSWORD(String.class, "logs_register_password"), diff --git a/src/me/StevenLawson/TotalFreedomMod/TFM_EssentialsBridge.java b/src/me/StevenLawson/TotalFreedomMod/TFM_EssentialsBridge.java index c5bf8eb7..16443feb 100644 --- a/src/me/StevenLawson/TotalFreedomMod/TFM_EssentialsBridge.java +++ b/src/me/StevenLawson/TotalFreedomMod/TFM_EssentialsBridge.java @@ -70,6 +70,40 @@ public class TFM_EssentialsBridge } } + public long getLastActivity(String username) + { + try + { + final User user = getEssentialsUser(username); + if (user != null) + { + return TFM_Util.getField(user, "lastActivity"); + } + } + catch (Exception ex) + { + TFM_Log.severe(ex); + } + return 0L; + } + + public boolean isEssentialsEnabled() + { + try + { + final Essentials essentials = getEssentialsPlugin(); + if (essentials != null) + { + return essentials.isEnabled(); + } + } + catch (Exception ex) + { + TFM_Log.severe(ex); + } + return false; + } + public static TFM_EssentialsBridge getInstance() { return TFM_EssentialsBridgeHolder.INSTANCE; diff --git a/src/me/StevenLawson/TotalFreedomMod/TFM_Heartbeat.java b/src/me/StevenLawson/TotalFreedomMod/TFM_Heartbeat.java index adef71a1..1d506c83 100644 --- a/src/me/StevenLawson/TotalFreedomMod/TFM_Heartbeat.java +++ b/src/me/StevenLawson/TotalFreedomMod/TFM_Heartbeat.java @@ -7,6 +7,7 @@ import org.bukkit.scheduler.BukkitRunnable; public class TFM_Heartbeat extends BukkitRunnable { + private static final long AUTO_KICK_TIME = (long) TFM_ConfigEntry.AUTOKICK_TIME.getInteger() * 1000L; private final TotalFreedomMod plugin; private final Server server; private static Long lastRan = null; @@ -27,12 +28,27 @@ public class TFM_Heartbeat extends BukkitRunnable { lastRan = System.currentTimeMillis(); + final TFM_EssentialsBridge essentialsBridge = TFM_EssentialsBridge.getInstance(); + final boolean doAwayKickCheck = + TFM_ConfigEntry.AUTOKICK_ENABLED.getBoolean() + && essentialsBridge.isEssentialsEnabled() + && ((server.getOnlinePlayers().length / server.getMaxPlayers()) > TFM_ConfigEntry.AUTOKICK_THRESHOLD.getDouble()); + for (Player player : server.getOnlinePlayers()) { - TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player); + final TFM_PlayerData playerdata = TFM_PlayerData.getPlayerData(player); playerdata.resetMsgCount(); playerdata.resetBlockDestroyCount(); playerdata.resetBlockPlaceCount(); + + if (doAwayKickCheck) + { + final long lastActivity = essentialsBridge.getLastActivity(player.getName()); + if (lastActivity > 0 && lastActivity + AUTO_KICK_TIME < System.currentTimeMillis()) + { + player.kickPlayer("Automatically kicked by server for inactivity."); + } + } } if (TFM_ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())