504 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			504 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| public void EstablishConnection()
 | |
| {
 | |
| 	if (SQL_CheckConfig("ctimer"))
 | |
| 		Database.Connect(ConnectionCallback, "ctimer");
 | |
| 	else
 | |
| 		SetFailState("'ctimer' not found in 'sourcemod/configs/databases.cfg'");
 | |
| }
 | |
| 
 | |
| public void ConnectionCallback(Database db, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Failed to connect to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	g_hDatabase = db;
 | |
| 	
 | |
| 	LoadMapInfo();
 | |
| }
 | |
| 
 | |
| public void GetPlayerInfo(client)
 | |
| {
 | |
| 	int steamid = GetTimerSteamId(client);
 | |
| 	char query[512], username[65], ip[16];
 | |
| 	
 | |
| 	GetClientName(client, username, sizeof(username));
 | |
| 	g_hDatabase.Escape(username, username, sizeof(username));
 | |
| 	GetClientIP(client, ip, sizeof(ip));
 | |
| 	
 | |
| 	Format(query, sizeof(query), "INSERT INTO ctimer_users (userid, name, ip, lastconnected) values ('%i', '%s', INET_ATON('%s'), CURRENT_TIMESTAMP) ON DUPLICATE KEY UPDATE name = VALUES(name), ip = VALUES(ip), lastconnected = CURRENT_TIMESTAMP;", steamid, username, ip);
 | |
| 	g_hDatabase.Query(SQL_InsertUser, query, DBPrio_High);
 | |
| 	
 | |
| 	if (g_iMapID == -1)
 | |
| 	{
 | |
| 		LogError("Error, map ID is invalid, can't load players time %N<%i>", client, client);
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	int userid = GetClientUserId(client);
 | |
| 	Format(query, sizeof(query), "SELECT time FROM ctimer_times WHERE mapid = %i AND userid = %i;", g_iMapID, GetTimerSteamId(client));
 | |
| 	g_hDatabase.Query(SQL_GetUserTime, query, userid);
 | |
| }
 | |
| 
 | |
| public void SQL_InsertUser(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on inserting user: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void SQL_GetUserTime(Database db, DBResultSet results, const char[] error, int userid)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on getting user time: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	int client = GetClientOfUserId(userid);
 | |
| 	
 | |
| 	if (!isValidClient(client))
 | |
| 		return;
 | |
| 	
 | |
| 	if (results.RowCount == 0)
 | |
| 	{
 | |
| 		g_fMapTime[client] = 0.0;
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results.RowCount > 1)
 | |
| 	{
 | |
| 		LogError("Unexpected amount of rows: %i", results.RowCount);		
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	results.FetchRow();
 | |
| 	g_fMapTime[client] = results.FetchFloat(0);
 | |
| 	
 | |
| }
 | |
| 
 | |
| public void LoadMapInfo()
 | |
| {
 | |
| 	char query[512];
 | |
| 	Format(query, sizeof(query), "INSERT INTO ctimer_maps (mapname, lastplayed) values ('%s', CURRENT_TIMESTAMP) ON DUPLICATE KEY UPDATE lastplayed = CURRENT_TIMESTAMP", g_sMapName);
 | |
| 	g_hDatabase.Query(SQL_InsertMap, query, DBPrio_High); ///Insert map or update lastplayed
 | |
| 	Format(query, sizeof(query), "SELECT mapid, tier, enabled FROM ctimer_maps WHERE mapname = '%s'", g_sMapName);
 | |
| 	g_hDatabase.Query(SQL_GetMapInfo, query);
 | |
| }
 | |
| 
 | |
| public void SQL_InsertMap(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on inserting map: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| }
 | |
| 
 | |
| public void SQL_GetMapInfo(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on inserting map: %s", error);		
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results.RowCount == 0)
 | |
| 	{
 | |
| 		LogError("Map not found");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results.RowCount > 1)
 | |
| 	{
 | |
| 		LogError("Unexpected amount of rows: %i", results.RowCount);		
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	results.FetchRow();
 | |
| 	g_iMapID = results.FetchInt(0);
 | |
| 	g_iTier = results.FetchInt(1);
 | |
| 	g_bActive = view_as<bool>(results.FetchInt(2));
 | |
| 	
 | |
| 	LoadZones();
 | |
| 	GetWRInfo();
 | |
| 	
 | |
| 	if (g_bLateLoad)
 | |
| 	{
 | |
| 		for (int i = 1; i <= MaxClients; i++) 
 | |
| 		{
 | |
| 			if (IsClientConnected(i) && IsClientInGame(i)) 
 | |
| 			{
 | |
| 				OnClientPostAdminCheck(i);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void GetWRInfo()
 | |
| {
 | |
| 	if (g_iMapID == -1)
 | |
| 	{
 | |
| 		LogError("Error, map ID is invalid");
 | |
| 		return;
 | |
| 	}
 | |
| 	char query[512];
 | |
| 	Format(query, sizeof(query), "SELECT u.name , wr.time FROM ctimer_users u, ctimer_times wr WHERE u.userid = wr.userid AND wr.mapid = %i AND u.userid = getWrUserId(%i);", g_iMapID, g_iMapID);
 | |
| 	g_hDatabase.Query(SQL_GetWRInfo, query);
 | |
| }
 | |
| 
 | |
| public void SQL_GetWRInfo(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on getting map WR info: %s", error);		
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results.RowCount == 0)
 | |
| 	{	
 | |
| 		g_fWrTime = 0.0;
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results.RowCount > 2)
 | |
| 	{
 | |
| 		LogError("Unexpected amount of rows: %i", results.RowCount);		
 | |
| 		return;
 | |
| 	}
 | |
| 	results.FetchRow();
 | |
| 	results.FetchString(0, g_sWrHolder, sizeof(g_sWrHolder));
 | |
| 	g_fWrTime = results.FetchFloat(1);
 | |
| }
 | |
| 	
 | |
| 
 | |
| public void SaveZones(int client)
 | |
| {
 | |
| 	if (g_iMapID == -1)
 | |
| 	{
 | |
| 		LogError("Error, map ID is invalid");
 | |
| 		return;
 | |
| 	}
 | |
| 	char query[512], startcord[42], endcord[42];
 | |
| 	for (int i = 0; i <= 1; i++)
 | |
| 	{
 | |
| 		VectorToString(startcord, sizeof(startcord), g_fStartOrigins[i]);
 | |
| 		VectorToString(endcord, sizeof(endcord), g_fEndOrigins[i]);
 | |
| 		Format(query, sizeof(query), "INSERT INTO ctimer_zones(mapid, zonetype, startcord, endcord) VALUES (%i, %i, '%s', '%s') ON DUPLICATE KEY UPDATE startcord = values(startcord), endcord = values(endcord)", g_iMapID, i, startcord, endcord);
 | |
| 		g_hDatabase.Query(SQL_SaveZones, query);
 | |
| 	}
 | |
| 	PrintToChat(client, "Zones Saved");
 | |
| }
 | |
| 
 | |
| public void SQL_SaveZones(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on saving zones: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void LoadZones()
 | |
| {
 | |
| 	if (g_iMapID == -1)
 | |
| 	{
 | |
| 		LogError("Error, map ID is invalid");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	char query[512];
 | |
| 	Format(query, sizeof(query), "SELECT zonetype, startcord, endcord from ctimer_zones where mapid = %i ORDER BY zonetype", g_iMapID);
 | |
| 	g_hDatabase.Query(SQL_LoadZones, query);
 | |
| 	
 | |
| }
 | |
| 
 | |
| public void SQL_LoadZones(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on inserting map: %s", error);		
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results.RowCount == 0)
 | |
| 	{	
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results.RowCount > 2)
 | |
| 	{
 | |
| 		LogError("Unexpected amount of rows: %i", results.RowCount);		
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	int zonetype;
 | |
| 	char startcord[42], endcord[42];
 | |
| 	float vec[3];
 | |
| 	
 | |
| 	while (results.FetchRow())
 | |
| 	{
 | |
| 		zonetype = results.FetchInt(0);
 | |
| 		results.FetchString(1, startcord, sizeof(startcord));
 | |
| 		results.FetchString(2, endcord, sizeof(endcord));
 | |
| 		StringToVector(vec, startcord);
 | |
| 		g_fStartOrigins[zonetype] = vec;
 | |
| 		StringToVector(vec, endcord);
 | |
| 		g_fEndOrigins[zonetype] = vec;
 | |
| 		CreateTrigger(zonetype);
 | |
| 		//CreateTimer(1.0, Timer_CreateTrigger, zonetype);
 | |
| 	}
 | |
| 	//CS_TerminateRound(0.0, CSRoundEnd_Draw, true);
 | |
| }
 | |
| 
 | |
| public void SetMapTier(int tier)
 | |
| {
 | |
| 	if (g_iMapID == -1)
 | |
| 	{
 | |
| 		LogError("Error, map ID is invalid");
 | |
| 		return;
 | |
| 	}
 | |
| 	char query[512];
 | |
| 	Format(query, sizeof(query), "UPDATE ctimer_maps SET tier = %i WHERE mapname = '%s'", tier, g_sMapName);
 | |
| 	g_hDatabase.Query(SQL_SetMapTier, query);
 | |
| }
 | |
| 	
 | |
| public void SQL_SetMapTier(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on setting map tier: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void SetMapState(int state)
 | |
| {
 | |
| 	if (g_iMapID == -1)
 | |
| 	{
 | |
| 		LogError("Error, map ID is invalid");
 | |
| 		return;
 | |
| 	}
 | |
| 	char query[512];
 | |
| 	Format(query, sizeof(query), "UPDATE ctimer_maps SET enabled = %i WHERE mapname = '%s'", state, g_sMapName);
 | |
| 	g_hDatabase.Query(SQL_SetMapState, query);
 | |
| }
 | |
| 	
 | |
| public void SQL_SetMapState(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on setting map active state: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void UpdateTime(int client)
 | |
| {
 | |
| 	if (g_iMapID == -1)
 | |
| 	{
 | |
| 		LogError("Error, map ID is invalid");
 | |
| 		return;
 | |
| 	}
 | |
| 	char query[512];
 | |
| 	int userid = GetClientUserId(client);
 | |
| 	Format(query, sizeof(query), "SELECT updateTime(%i, %i, %f), getTimeRank(%i, %i), getTimeComps(%i);", g_iMapID, GetTimerSteamId(client), g_fMapTime[client], g_iMapID, GetTimerSteamId(client), g_iMapID);
 | |
| 	g_hDatabase.Query(SQL_UpdateTime, query, userid);
 | |
| }
 | |
| 	
 | |
| public void SQL_UpdateTime(Database db, DBResultSet results, const char[] error, int userid)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on updating time: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	int client = GetClientOfUserId(userid);
 | |
| 	
 | |
| 	if (!isValidClient(client))
 | |
| 		return;
 | |
| 	
 | |
| 	results.FetchRow();
 | |
| 	int rank = results.FetchInt(1);
 | |
| 	int total = results.FetchInt(2);
 | |
| 	
 | |
| 	ProcessRankMessage(client, rank, total);
 | |
| }
 | |
| 
 | |
| public void AddCompletion(int client)
 | |
| {
 | |
| 	if (g_iMapID == -1)
 | |
| 	{
 | |
| 		LogError("Error, map ID is invalid");
 | |
| 		return;
 | |
| 	}
 | |
| 	char query[512];
 | |
| 	Format(query, sizeof(query), "UPDATE ctimer_times SET timescompleted = timescompleted + 1 where mapid = %i AND userid = %i", g_iMapID, GetTimerSteamId(client));
 | |
| 	g_hDatabase.Query(SQL_AddCompletion, query);
 | |
| }
 | |
| 
 | |
| public void SQL_AddCompletion(Database db, DBResultSet results, const char[] error, any data)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	if (results == null)
 | |
| 	{
 | |
| 		LogError("Error on setting map active state: %s", error);
 | |
| 		return;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void RequestTop(int userid, char[] mapname, int limit)
 | |
| {
 | |
| 	Transaction transaction = new Transaction();
 | |
| 	char query[512];
 | |
| 	Format(query, sizeof(query), "SELECT mapname FROM ctimer_maps WHERE enabled = 1 AND mapname LIKE '%%%s%%' ORDER BY mapname LIMIT 1", mapname);
 | |
| 	transaction.AddQuery(query);
 | |
| 	Format(query, sizeof(query), "SELECT u.name , times.time, times.timescompleted FROM ctimer_users u, ctimer_times times, ctimer_maps maps WHERE u.userid = times.userid AND times.mapid = maps.mapid AND maps.mapid = (SELECT mapid FROM ctimer_maps WHERE enabled = 1 AND mapname LIKE '%%%s%%' ORDER BY mapname LIMIT 1) ORDER BY time, runid LIMIT %i;", mapname, limit);
 | |
| 	transaction.AddQuery(query);
 | |
| 	g_hDatabase.Execute(transaction, SQL_RequestTop, SQL_RequestTopError, userid);
 | |
| }
 | |
| 
 | |
| public void SQL_RequestTopError(Database db, int userid, int numQueries, const char[] error, int failIndex, any[] queryData)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	LogError("Error on requesting top time records on query %i: %s", failIndex, error);
 | |
| }
 | |
| 
 | |
| public void RequestWR(int userid, char[] mapname)
 | |
| {
 | |
| 	Transaction transaction = new Transaction();
 | |
| 	char query[512];
 | |
| 	Format(query, sizeof(query), "SELECT mapname FROM ctimer_maps WHERE enabled = 1 AND mapname LIKE '%%%s%%' ORDER BY mapname LIMIT 1", mapname);
 | |
| 	transaction.AddQuery(query);
 | |
| 	Format(query, sizeof(query), "SELECT name, time FROM ctimer_times times INNER JOIN ctimer_users u ON  u.userid = times.userid WHERE mapid=(SELECT mapid FROM ctimer_maps WHERE enabled = 1 AND mapname LIKE '%%%s%%' ORDER BY mapname LIMIT 1) ORDER BY time, runid LIMIT 1;", mapname);
 | |
| 	transaction.AddQuery(query);
 | |
| 	g_hDatabase.Execute(transaction, SQL_RequestWR, SQL_RequestWRError, userid);
 | |
| }
 | |
| 
 | |
| public void SQL_RequestWRError(Database db, int userid, int numQueries, const char[] error, int failIndex, any[] queryData)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	LogError("Error on requesting world record time on query %i: %s", failIndex, error);
 | |
| }
 | |
| 
 | |
| public void SQL_RequestWR(Database db, int userid, int numQueries, DBResultSet[] results, any[] queryData)
 | |
| {
 | |
| 	if (db == null)
 | |
| 	{
 | |
| 		SetFailState("Lost connection to the database, will attempt to reconnect on map change");
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	int client = GetClientOfUserId(userid);
 | |
| 	
 | |
| 	if (!isValidClient(client))
 | |
| 		return;
 | |
| 	
 | |
| 	if (results[0].RowCount == 0)
 | |
| 	{	
 | |
| 		TimerPrintToChat(client, false, "%T", "MapNotFound", LANG_SERVER);
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	char cMap[64];
 | |
| 	results[0].FetchRow();
 | |
| 	results[0].FetchString(0, cMap, sizeof(cMap));
 | |
| 	
 | |
| 	if (results[1].RowCount == 0)
 | |
| 	{	
 | |
| 		TimerPrintToChat(client, false, "%T", "TimesNotFound", LANG_SERVER, cMap);
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	char cTime[16], cName[64];
 | |
| 	float fTime;
 | |
| 	
 | |
| 	results[1].FetchRow();
 | |
| 	results[1].FetchString(0, cName, sizeof(cName));
 | |
| 	fTime = results[1].FetchFloat(1);
 | |
| 	
 | |
| 	TimerFormat(fTime, cTime, sizeof(cTime), true, false);
 | |
| 	
 | |
| 	TimerPrintToChat(client, false, "%T", "WR", LANG_SERVER, cName, cMap, cTime);
 | |
| } |