diff --git a/RaceTimer/scripting/unloze_racetimer_redux.sp b/RaceTimer/scripting/unloze_racetimer_redux.sp index 76038633..1925c592 100644 --- a/RaceTimer/scripting/unloze_racetimer_redux.sp +++ b/RaceTimer/scripting/unloze_racetimer_redux.sp @@ -42,10 +42,6 @@ public Plugin myinfo = url = "www.unloze.com" }; -public void OnConfigsExecuted() -{ - Database.Connect(SQL_OnDatabaseConnect, "racetimercss"); -} //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- @@ -107,15 +103,20 @@ public void SQL_OnConnectFinished(Database db, DBResultSet results, const char[] OnClientPostAdminCheck(i); } -public void SQL_OnQueryCompleted(Database db, DBResultSet results, const char[] error, any data) +public void SQL_OnQueryCompleted(Database db, DBResultSet results, const char[] error, DataPack data) { + ResetPack(data); + int client_serial = data.ReadCell(); if (!db || strlen(error)) - { - LogError("Query error: %s", error); + { + char sQuery[g_dLength]; + data.ReadString(sQuery, sizeof(sQuery)); + LogError("Query error 1: %s", error); + LogError("actual query: %s", sQuery); return; - } + } int client; - if ((client = GetClientFromSerial(data)) == 0) + if ((client = GetClientFromSerial(client_serial)) == 0) return; if (results.RowCount && results.FetchRow()) results.FetchString(0, g_csTime_record[client], sizeof(g_csTime_record)); @@ -127,70 +128,39 @@ public void MYSQLCheckMapEntry() int l_iZoneCount = unloze_zoneCount(); char sQuery[g_dLength]; char l_cZoneIndexName[g_dIndex][g_dLength]; - if (l_iZoneCount < 2) - { - Format(sQuery, sizeof(sQuery), "SELECT `%s` FROM `zetimer_table` LIMIT 1", g_cMapname); - g_dDatabase.Query(SQL_OnQueryCompleted1, sQuery, _); - } - else - for (int iterator = 0; iterator <= l_iZoneCount; iterator++) - { - if (IsCorrectZone(iterator, l_cZoneIndexName[iterator][g_dLength -1], "ZONE_PREFIX_RACE")) - { - l_iRaceCount++; - Format(sQuery, sizeof(sQuery), "SELECT `%sS%i` FROM `zetimer_table` LIMIT 1", g_cMapname, l_iRaceCount); - g_dDatabase.Query(SQL_OnQueryCompleted1, sQuery, _); - } - } -} - -public void SQL_OnQueryCompleted1(Database db, DBResultSet results, const char[] error, any data) -{ - if (!db) - { - LogError("Query error: %s", error); - return; - } - int l_iRaceCount; - int l_iZoneCount = unloze_zoneCount(); - char sQuery[g_dLength]; - char l_cZoneIndexName[g_dIndex][g_dLength]; - if (results == null) - { - if (l_iZoneCount == 1) - { - Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table` ADD COLUMN `%s` VARCHAR(256) DEFAULT '0.000' NOT NULL", g_cMapname); - g_dDatabase.Query(SQL_FinishedQuery_mute_error, sQuery, _, DBPrio_High); - } - else - { - //this might seem repetitive but one null check adds all required coloumns - for (int iterator = 0; iterator <= l_iZoneCount; iterator++) - { - if (IsCorrectZone(iterator, l_cZoneIndexName[iterator][g_dLength -1], "ZONE_PREFIX_RACE")) - { - l_iRaceCount++; - Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table` ADD COLUMN `%sS%i` VARCHAR(256) DEFAULT '0.000' NOT NULL", g_cMapname, l_iRaceCount); - g_dDatabase.Query(SQL_FinishedQuery_mute_error, sQuery, _, DBPrio_High); - } - } - } - } -} - -public void SQL_FinishedQuery(Database db, DBResultSet results, const char[] error, any data) -{ - if (!db || strlen(error)) + if (l_iZoneCount == 1) { - LogError("Query error: %s", error); - return; + Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table` ADD COLUMN IF NOT EXISTS `%s` VARCHAR(256) DEFAULT '0.000' NOT NULL", g_cMapname); + DataPack hDataPack = new DataPack(); + hDataPack.WriteString(sQuery); + g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_High); + } + else + { + for (int iterator = 0; iterator <= l_iZoneCount; iterator++) + { + if (IsCorrectZone(iterator, l_cZoneIndexName[iterator][g_dLength -1], "ZONE_PREFIX_RACE")) + { + l_iRaceCount++; + Format(sQuery, sizeof(sQuery), "ALTER TABLE `zetimer_table` ADD COLUMN IF NOT EXISTS `%sS%i` VARCHAR(256) DEFAULT '0.000' NOT NULL", g_cMapname, l_iRaceCount); + DataPack hDataPack = new DataPack(); + hDataPack.WriteString(sQuery); + g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_High); + } + } } } -public void SQL_FinishedQuery_mute_error(Database db, DBResultSet results, const char[] error, any data) +public void SQL_FinishedQuery(Database db, DBResultSet results, const char[] error, DataPack data) { - if (!db) - return; + if (!db || strlen(error)) + { + char sQuery[g_dLength]; + ResetPack(data); + data.ReadString(sQuery, sizeof(sQuery)); + LogError("Query error 3: %s", error); + LogError("actual query: %s", sQuery); + } } public void OnMapStart() @@ -204,7 +174,7 @@ public void OnMapStart() GetConVarString(hHostName, line, sizeof(line)); if (StrContains(line, "EVENT", false) > -1) g_bEventBool = true; - AutoExecConfig(); + Database.Connect(SQL_OnDatabaseConnect, "racetimercss"); } //---------------------------------------------------------------------------------------------------- @@ -264,6 +234,7 @@ public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast public void OnClientPostAdminCheck(int client) { resetClient(client); + insertPlayerMYSQL(client); } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -307,7 +278,6 @@ public void OnPlayerRunCmdPost(int client, int buttons, int impulse, const float g_bHumansAllowedTime[client] = false; return; } - if (g_bHumansAllowedTime[client] && (GetClientTeam(client) == CS_TEAM_CT) && IsPlayerAlive(client)) { int frameCap = 11; @@ -539,28 +509,50 @@ public int RetrieveZoneIndex(char[] zone) //---------------------------------------------------------------------------------------------------- public void FinishedStageRaceZone(int client) { + char sSID[g_dIndex]; + char sName[MAX_NAME_LENGTH]; + GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); + GetClientName(client, sName, sizeof(sName)); + int size2 = 2 * strlen(sName) + 1; + char[] sEscapedName = new char[size2 + 1]; + + g_dDatabase.Escape(sName, sEscapedName, size2 + 1); + + if (StrEqual(sSID, "STEAM_ID_STOP_IGNORING_RETVALS") || StrEqual(sSID, "STEAM_ID_PENDING")) + { + PrintToChat(client, "Your steam ID is not working, not updating timer"); + return; + } + int l_iZoneCount = unloze_zoneCount(); char record_client[32]; Format(record_client, sizeof(record_client), g_csTime_record[client]); float client_time = client_current_race_time(client); char sTime[32]; FormatPlayerTime(client_time, sTime, sizeof(sTime), false, 1); - float old_record = StringToFloat(record_client); - float new_time = StringToFloat(sTime); - if (l_iZoneCount > 1) CPrintToChat(client, "{green}[UNLOZE] Stage: %i", player_stage[client]); CPrintToChat(client, "{green}[UNLOZE] Client: %N Time: %s", client, sTime); + int stage = player_stage[client]; + char sQuery[g_dLength]; + if (l_iZoneCount < 2) + Format(sQuery, sizeof(sQuery), "UPDATE `zetimer_table` SET `%s` = %s, name = '%s' WHERE steam_auth = '%s' and LENGTH(`%s`) >= LENGTH(%s) and STRCMP(`%s`, %s) > 0", g_cMapname, sTime, sEscapedName, sSID, g_cMapname, sTime, g_cMapname, sTime); + else + Format(sQuery, sizeof(sQuery), "UPDATE `zetimer_table` SET `%sS%i` = %s, name = '%s' WHERE steam_auth = '%s' and LENGTH(`%sS%i`) >= LENGTH(%s) and STRCMP(`%sS%i`, %s) > 0", g_cMapname, stage, sTime, sEscapedName, sSID, g_cMapname, stage, sTime, g_cMapname, stage, sTime); - if (old_record == 0.0) + if (StrEqual(record_client, "0.000")) { CPrintToChat(client, "Your record: None yet\nCommand: !toptime !mytime !stages"); - sendMYSQL(client, sTime, player_stage[client]); - return; + if (l_iZoneCount < 2) + Format(sQuery, sizeof(sQuery), "UPDATE `zetimer_table` SET `%s` = %s, name = '%s' WHERE steam_auth = '%s'", g_cMapname, sTime, sEscapedName, sSID); + else + Format(sQuery, sizeof(sQuery), "UPDATE `zetimer_table` SET `%sS%i` = %s, name = '%s' WHERE steam_auth = '%s'", g_cMapname, stage, sTime, sEscapedName, sSID); } - CPrintToChat(client, "Your record: %s\nCommand: !toptime !mytime !stages", record_client); - if (new_time < old_record) - sendMYSQL(client, sTime, player_stage[client]); + else + CPrintToChat(client, "Your record: %s\nCommand: !toptime !mytime !stages", record_client); + DataPack hDataPack = new DataPack(); + hDataPack.WriteString(sQuery); + g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_High); } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -574,7 +566,10 @@ public void mysql_get_player_time(int client, int stage) Format(query, sizeof(query), "SELECT `%s` FROM `zetimer_table` where steam_auth = '%s'", g_cMapname, steam_auth); else Format(query, sizeof(query), "SELECT `%sS%i` FROM `zetimer_table` where steam_auth = '%s'", g_cMapname, stage, steam_auth); - g_dDatabase.Query(SQL_OnQueryCompleted, query, GetClientSerial(client)); + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(GetClientSerial(client)); + hDataPack.WriteString(query); + g_dDatabase.Query(SQL_OnQueryCompleted, query, hDataPack); } //---------------------------------------------------------------------------------------------------- @@ -596,34 +591,27 @@ public int GetTotalRaceZones() //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public void sendMYSQL(int client, char[] sTime, int stage) +public void insertPlayerMYSQL(int client) { - int l_iZoneCount = unloze_zoneCount(); - char sSID[g_dIndex]; - char sQuery[g_dLength]; - char sName[MAX_NAME_LENGTH]; - GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); - GetClientName(client, sName, sizeof(sName)); - int size2 = 2 * strlen(sName) + 1; - char[] sEscapedName = new char[size2 + 1]; - - g_dDatabase.Escape(sName, sEscapedName, size2 + 1); - - if (StrEqual(sSID, "STEAM_ID_STOP_IGNORING_RETVALS") || StrEqual(sSID, "STEAM_ID_PENDING")) - { - PrintToChat(client, "Your steam ID is not working, not updating timer"); + if (!IsValidClient(client)) return; - } - if (l_iZoneCount < 2) - { - Format(sQuery, sizeof(sQuery), "INSERT INTO `zetimer_table` (`steam_auth`, `name`, `%s`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `name` = '%s', `%s` = '%s'", g_cMapname, sSID, sEscapedName, sTime, sEscapedName, g_cMapname, sTime); - } - else - { - Format(sQuery, sizeof(sQuery), "INSERT INTO `zetimer_table` (`steam_auth`, `name`, `%sS%i`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `name` = '%s', `%sS%i` = '%s'", g_cMapname, stage, sSID, sEscapedName, sTime, sEscapedName, g_cMapname, stage, sTime); - } - g_dDatabase.Query(SQL_FinishedQuery, sQuery, _, DBPrio_High); - CPrintToChat(client, "Updated timer"); + char sSID[g_dIndex]; + char sQuery[g_dLength]; + char sName[MAX_NAME_LENGTH]; + GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); + GetClientName(client, sName, sizeof(sName)); + int size2 = 2 * strlen(sName) + 1; + char[] sEscapedName = new char[size2 + 1]; + g_dDatabase.Escape(sName, sEscapedName, size2 + 1); + if (StrEqual(sSID, "STEAM_ID_STOP_IGNORING_RETVALS") || StrEqual(sSID, "STEAM_ID_PENDING")) + { + PrintToChat(client, "Your steam ID is not working, not updating timer"); + return; + } + Format(sQuery, sizeof(sQuery), "INSERT INTO `zetimer_table` (`steam_auth`, `name`) VALUES ('%s', '%s') ON DUPLICATE KEY UPDATE `name` = '%s'", sSID, sEscapedName, sEscapedName); + DataPack hDataPack = new DataPack(); + hDataPack.WriteString(sQuery); + g_dDatabase.Query(SQL_FinishedQuery, sQuery, hDataPack, DBPrio_High); } //---------------------------------------------------------------------------------------------------- @@ -657,18 +645,27 @@ public void CheckTop(int client, int index, int autismstate) Format(sQuery, sizeof(sQuery), "SELECT name, `%s` FROM `zetimer_table` WHERE `%s` != 0.000 ORDER BY LENGTH(`%s`) ASC, `%s` ASC LIMIT 10", g_cMapname, g_cMapname, g_cMapname, g_cMapname); else Format(sQuery, sizeof(sQuery), "SELECT name, `%sS%i` FROM `zetimer_table` WHERE `%sS%i` != 0.000 ORDER BY LENGTH(`%sS%i`) ASC, `%sS%i` ASC LIMIT 10", g_cMapname, index, g_cMapname, index, g_cMapname, index, g_cMapname, index); - g_dDatabase.Query(SQL_Select_Top_Callback, sQuery, GetClientSerial(client)); + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(GetClientSerial(client)); + hDataPack.WriteString(sQuery); + g_dDatabase.Query(SQL_Select_Top_Callback, sQuery, hDataPack); } -public void SQL_Select_Top_Callback(Database db, DBResultSet results, const char[] error, any data) +public void SQL_Select_Top_Callback(Database db, DBResultSet results, const char[] error, DataPack data) { - if(!db || strlen(error)) + ResetPack(data); + int client_serial = data.ReadCell(); + if (!db || strlen(error)) { - LogError("Database error: %s", error); - return; + char sQuery[g_dLength]; + data.ReadString(sQuery, sizeof(sQuery)); + LogError("Query error 2: %s", error); + LogError("actual query: %s", sQuery); + return; } + int iclient; - if ((iclient = GetClientFromSerial(data)) == 0) + if ((iclient = GetClientFromSerial(client_serial)) == 0) return; int l_iPosition; char sTime[g_dLength]; @@ -832,17 +829,14 @@ public Action cmd_timerCheckSelf(int client, int args) public void deleteClientTime(char[] steam2, int stage) { char l_cQuery[g_dLength]; - if (stage > 1) - { + int l_iZoneCount = unloze_zoneCount(); + if (l_iZoneCount > 1) Format(l_cQuery, sizeof(l_cQuery), "UPDATE `zetimer_table` SET `%sS%i` = '0.000' WHERE steam_auth = '%s'", g_cMapname, stage, steam2); - } else - { Format(l_cQuery, sizeof(l_cQuery), "UPDATE `zetimer_table` SET `%s` = '0.000' WHERE steam_auth = '%s'", g_cMapname, steam2); - g_dDatabase.Query(SQL_FinishedQuery, l_cQuery, _, DBPrio_High); - Format(l_cQuery, sizeof(l_cQuery), "UPDATE `zetimer_table` SET `%sS1` = '0.000' WHERE steam_auth = '%s'", g_cMapname, steam2); - } - g_dDatabase.Query(SQL_FinishedQuery_mute_error, l_cQuery, _, DBPrio_High); + DataPack hDataPack = new DataPack(); + hDataPack.WriteString(l_cQuery); + g_dDatabase.Query(SQL_FinishedQuery, l_cQuery, hDataPack, DBPrio_High); } //---------------------------------------------------------------------------------------------------- // Purpose: @@ -861,7 +855,10 @@ public void Checkself(int client) if (l_iZoneCount < 2) { Format(l_cQuery, sizeof(l_cQuery), "SELECT name, `%s` FROM `zetimer_table` WHERE steam_auth = '%s'", g_cMapname, l_cSID); - g_dDatabase.Query(SQL_CheckSelf, l_cQuery, GetClientSerial(client)); + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(GetClientSerial(client)); + hDataPack.WriteString(l_cQuery); + g_dDatabase.Query(SQL_CheckSelf, l_cQuery, hDataPack); } else CheckStagesOnMap(client, 1); @@ -875,24 +872,32 @@ public void CheckStageSelf(int client, int selection) char l_cSID[g_dIndex]; GetClientAuthId(client, AuthId_Steam2, l_cSID, sizeof(l_cSID)); Format(l_cQuery, sizeof(l_cQuery), "SELECT name, `%sS%i` FROM `zetimer_table` WHERE steam_auth = '%s'", g_cMapname, selection, l_cSID); - g_dDatabase.Query(SQL_CheckSelf, l_cQuery, GetClientSerial(client)); + DataPack hDataPack = new DataPack(); + hDataPack.WriteCell(GetClientSerial(client)); + hDataPack.WriteString(l_cQuery); + g_dDatabase.Query(SQL_CheckSelf, l_cQuery, hDataPack); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public void SQL_CheckSelf(Database db, DBResultSet results, const char[] error, any data) +public void SQL_CheckSelf(Database db, DBResultSet results, const char[] error, DataPack data) { - if(!db || strlen(error)) + ResetPack(data); + int client_serial = data.ReadCell(); + if (!db || strlen(error)) { - LogError("Database error: %s", error); + char sQuery[g_dLength]; + data.ReadString(sQuery, sizeof(sQuery)); + LogError("Query error 4: %s", error); + LogError("actual query: %s", sQuery); return; } char sTime[g_dLength]; char l_cMessageContent[g_dLength]; char[] l_cPlayerName = new char[MAX_NAME_LENGTH]; int iclient; - if ((iclient = GetClientFromSerial(data)) == 0) + if ((iclient = GetClientFromSerial(client_serial)) == 0) return; if (results.RowCount && results.FetchRow()) {