| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 | 
							- /**
 
-  * [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>
 
- #pragma newdecls required
 
- #define PLUGIN_VERSION "0.2.1"
 
- 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;
 
- public void OnPluginStart() {
 
- 	RegAdminCmd("csrd_uptime", AdminCmd_GetUptime, ADMFLAG_ROOT,
 
- 			"Outputs the server's current uptime.");
 
- }
 
- /**
 
-  * Command to output current uptime.
 
-  */
 
- public Action AdminCmd_GetUptime(int client, int argc) {
 
- 	char uptime[64], limit[64];
 
- 	FormatDuration(uptime, sizeof(uptime), GetUptime());
 
- 	FormatDuration(limit, sizeof(limit), g_nMaxUptimeLimit);
 
- 	
 
- 	ReplyToCommand(client, "Uptime: %s (limit %s)", uptime, limit);
 
- 	
 
- 	return Plugin_Handled;
 
- }
 
- /**
 
-  * Pretty-prints a duration of nSeconds as hours / minutes / seconds.
 
-  */
 
- void FormatDuration(char[] buffer, int maxlen, int nSeconds) {
 
- 	Format(buffer, maxlen, "%d hours, %d minutes, %d seconds",
 
- 			nSeconds / 3600,
 
- 			(nSeconds % 3600) / 60,
 
- 			nSeconds % 60);
 
- }
 
- /**
 
-  * 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 (GetClientCount(false) - GetClientCount(true)) != 0;
 
- }
 
- /**
 
-  * 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);
 
- }
 
 
  |