/**
* Clientprefs Cleaner (Cookies Purge) by Root
*
* Description:
* Removes old cookies from clientprefs database.
*
* Version 1.0
* Changelog & more info at http://goo.gl/4nKhJ
*/
#pragma semicolon 1
#pragma newdecls required
#include <clientprefs>
// ====[ CONSTANTS ]===========================================================
#define PLUGIN_NAME "Clientprefs Cleaner (Cookies Purge)"
#define PLUGIN_VERSION "1.0"
// ====[ PLUGIN ]==============================================================
Database db = null;
ConVar purge_days;
public Plugin myinfo =
{
name = PLUGIN_NAME,
author = "Root",
description = "Removes old cookies from clientprefs database",
version = PLUGIN_VERSION,
url = "http://dodsplugins.com/"
}
/* OnPluginStart()
*
* When the plugin starts up.
* ---------------------------------------------------------------------------- */
public void OnPluginStart()
{
// Connect to a clientprefs database, which is already defined in databases config
if(SQL_CheckConfig("clientprefs"))
{
Database.Connect(OnDatabaseConnected, "clientprefs");
}
// If clientprefs library or database is not available...
else
{
// ...disable a plugin and log the actual error
SetFailState("Couldn't find \"clientprefs\" section in databases.cfg");
}
// Create plugin ConVars
CreateConVar("sm_clientprefs_cleaner", PLUGIN_VERSION, PLUGIN_NAME, FCVAR_NOTIFY|FCVAR_DONTRECORD);
purge_days = CreateConVar("sm_cookies_removedays", "30", "Removes cookies which hasn't updated for X days", FCVAR_NOTIFY, true, 0.0);
}
/* OnMapStart()
*
* When the map starts.
* ---------------------------------------------------------------------------- */
public void OnMapStart()
{
if (db != null && purge_days.IntValue > 0)
{
// Prepare and execute a purging query with current timestamp
char query[512];
Format(query, sizeof(query), "DELETE FROM sm_cookie_cache WHERE timestamp <= %i; VACUUM", GetTime() - (purge_days.IntValue * 86400));
SQL_TQuery(db, CP_PurgeCallback, query);
}
}
void OnDatabaseConnected(Database DataBase, const char[] error, any data)
{
if(DataBase == null)
{
SetFailState("Couldn't connect to the database \"clientprefs\"");
}
else
{
db = DataBase;
PrintToServer("[clientprefs] Database connected");
}
}
/* OnClientCookiesCached()
*
* Called once a client's saved cookies have been loaded from the database.
* ---------------------------------------------------------------------------- */
public void OnClientCookiesCached(int client)
{
char client_steamid[MAX_NAME_LENGTH];
// Make sure client is authorized, or in worst case invalid steam id may be passed in query
if (GetClientAuthId(client, AuthId_Steam2, client_steamid, sizeof(client_steamid)))
{
// Prepare query and make SQL safer by removing bad characters from player's steamid
char query[512], safe_steamid[(MAX_NAME_LENGTH * 2) + 1];
db.Escape(client_steamid, safe_steamid, sizeof(safe_steamid));
// Refresh timestamp because its wont manually update to newest when client cookies just cached
// It's requred because by default timestamp updates when client actually changed cookie value - not just connects
Format(query, sizeof(query), "UPDATE sm_cookie_cache SET timestamp = %i WHERE player = '%s'", GetTime(), safe_steamid);
SQL_TQuery(db, CP_CheckErrors, query);
}
}
/* CP_CheckErrors()
*
* Executes a query.
* ---------------------------------------------------------------------------- */
void CP_CheckErrors(Handle owner, Handle hndl, const char[] error, any data)
{
if (error[0])
{
LogError(error);
}
}
/* CP_PurgeCallback()
*
* Threaded query callback (database purge).
* ---------------------------------------------------------------------------- */
void CP_PurgeCallback(Handle owner, Handle hndl, const char[] error, any data)
{
// If any row were affected by purging query - clientprefs database was purged!
if (SQL_GetAffectedRows(owner))
{
// Log information how many cookies were pruged
LogMessage("Clientprefs purged: cookies of %i players was removed due of inactivity.", SQL_GetAffectedRows(owner));
}
}