Browse Source

Initial plugin commit

Minor internal plugin, but it does have some sort of utility.

Aside from some commentary on `GetUptime()`, the plugin was committed
as-is.  I like comments.
nosoop 7 years ago
parent
commit
1a3710e384
1 changed files with 68 additions and 0 deletions
  1. 68 0
      scripting/csrd_uptime_limiter.sp

+ 68 - 0
scripting/csrd_uptime_limiter.sp

@@ -0,0 +1,68 @@
+/**
+ * [CSRD] Uptime Limiter
+ * 
+ * There seems to be a memory leak somewhere in the server.  Definitely not a handle leak.
+ * Supposedly, it's caused by SourceTV.
+ * 
+ * Because I can't be bothered to figure out the full cause at the moment, I'll just let the
+ * server restart itself every day to avoid it filling up swap and getting OOM killed.
+ * 
+ * Disconnecting an actively connected user would be rude, so we'll wait until the server is
+ * empty.
+ */
+#pragma semicolon 1
+#include <sourcemod>
+
+#include <stocksoup/log_server>
+
+#pragma newdecls required
+
+#define PLUGIN_VERSION "0.0.3"
+public Plugin myinfo = {
+    name = "[CSRD] Uptime Limiter",
+    author = "nosoop",
+    description = "Forces a server to auto-restart after a certain uptime when empty.",
+    version = PLUGIN_VERSION,
+    url = "https://git.csrd.science/"
+}
+
+int g_nMaxUptimeLimit = 60 * 60 * 12;
+
+/**
+ * Called when the Waiting for Players round state begins.
+ * At least one client, human or bot, must be connected for this forward to be called.
+ * 
+ * Considering the server runs bots, we can use this forward to check if any human players are
+ * connected to the server, and if not, we can restart the server when desirable.
+ */
+public void TF2_OnWaitingForPlayersStart() {
+	if (GetUptime() > g_nMaxUptimeLimit) {
+		if (!IsHumanConnected()) {
+			LogMessage("Server has reached an uptime of %d seconds and is currently empty.  "
+					... "Restarting...", GetUptime());
+			ServerCommand("quit");
+		}
+	}
+}
+
+/**
+ * Checks if a human player is connected to the server.
+ * This always returns false between the OnMapEnd and OnMapStart / OnConfigsExecuted callbacks.
+ */
+bool IsHumanConnected() {
+	for (int i = 1; i < MaxClients; i++) {
+		if (IsClientConnected(i) && !IsFakeClient(i)) {
+			return true;
+		}
+	}
+	return false;
+}
+
+/**
+ * Engine time is effectively the amount of time since server startup, as far as I'm
+ * concerned.
+ */
+int GetUptime() {
+	float flEngineTime = GetEngineTime();
+	return RoundToFloor(flEngineTime);
+}