From 280dc0ca674afebff13e0c9a258278e0bce8261f Mon Sep 17 00:00:00 2001 From: hubdom <26039831+hubdom@users.noreply.github.com> Date: Sat, 5 Jun 2021 20:35:03 +0200 Subject: [PATCH] VIP_Reward: the code is currently absolutely garbage... Whoever re-writes this for XF2, make sure to rewrite the mysql queries asynchronous!!!!!! The forum runs on a different machine than the gameserver now, so the current synchronized queries are a terrible practice (well they have always have been a terrible practice, but when this was created like 3 years ago I didnt know any better). Otherwise the server might just freeze from time to time. --- VIP_Reward/scripting/VIP_Reward.sp | 312 +++++++++++++++++++++++++++++ 1 file changed, 312 insertions(+) create mode 100644 VIP_Reward/scripting/VIP_Reward.sp diff --git a/VIP_Reward/scripting/VIP_Reward.sp b/VIP_Reward/scripting/VIP_Reward.sp new file mode 100644 index 00000000..a62ad739 --- /dev/null +++ b/VIP_Reward/scripting/VIP_Reward.sp @@ -0,0 +1,312 @@ +#include +#include +#include +#include + +ConVar g_cvarEventIsOn = null; +char g_directory_path[128]; + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Plugin myinfo = +{ + name = "Unloze_VIP_Reward", + author = "Neon + WASD", + description = "", + version = "1.1", + url = "https://steamcommunity.com/id/n3ontm" +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnPluginStart() +{ + RegAdminCmd("sm_listwinners", Command_Winners, ADMFLAG_GENERIC); + g_cvarEventIsOn = CreateConVar("sv_event_is_on", "0", "Cvar decides whether event mode is on or not.", _); + HookEvent("round_end", Event_Round_End) + + BuildPath(Path_SM, g_directory_path, sizeof(g_directory_path), "data/events/"); + + if (!DirExists(g_directory_path, false)) { + CreateDirectory(g_directory_path, 457, false); + } +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action Command_Winners(int iClient, int iArgs) +{ + + CheckMYSQL(iClient); + return Plugin_Handled; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action Event_Round_End(Handle event, const char[] name, bool dontBroadcast) +{ + if (g_cvarEventIsOn.IntValue == 1 && GetEventInt(event, "winner") == CS_TEAM_CT) { + int t_score = GetTeamScore(CS_TEAM_T); + int ct_score = GetTeamScore(CS_TEAM_CT); + + char date[20]; + FormatTime(date, sizeof(date), "%Y%m%d"); + + char map[90]; + GetCurrentMap(map, sizeof(map)); + + char file_path[256]; + Format(file_path, sizeof(file_path), "%s%s-%s.txt", g_directory_path, date, map); + + Handle file_handle = OpenFile(file_path, "a", false); + + WriteFileLine(file_handle, "Current score: (CT) : %d - (T): %d", ct_score, t_score); + CheckMYSQL_2(file_handle); + WriteFileLine(file_handle, "\n"); + CloseHandle(file_handle); + } +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: Saves all winners into a textfile located in sourcemod/data/events/. +//---------------------------------------------------------------------------------------------------- +CheckMYSQL_2(Handle file_handle) +{ + char error[255]; + Database db; + + if (SQL_CheckConfig("xenforo")) + { + db = SQL_Connect("xenforo", true, error, sizeof(error)); + } + + if (db == null) + { + LogError("Could not connect to database: %s", error); + delete db; + return; + } + + for (int client = 1; client <= MaxClients; client++) + { + if (IsValidClient(client)) + { + if (IsPlayerAlive(client)) + { + if (GetClientTeam(client) == CS_TEAM_CT) + { + + if (!IsFakeClient(client) && !IsClientSourceTV(client)) + { + char sSID[64]; + GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); + + char sQuery[255]; + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_user_field_value WHERE field_value = '%s'", sSID); + DBResultSet rs; + + int iUserID; + + if ((rs = SQL_Query(db, sQuery)) == null) + { + delete rs; + delete db; + LogError("Database Error: %s", error); + return; + + } + + if (!(rs.RowCount > 0)) + { + char sSID64[64]; + GetClientAuthId(client, AuthId_SteamID64, sSID64, sizeof(sSID64)); + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_user_external_auth WHERE provider_key = '%s'", sSID64); + rs = SQL_Query(db, sQuery); + + if (!(rs.RowCount > 0)) + { + WriteFileLine(file_handle, "%s --- %N --- NO FORUM ACCOUNT", sSID, client); + delete rs; + continue; + } + else + { + int iField; + rs.FetchRow(); + rs.FieldNameToNum("user_id", iField); + iUserID = rs.FetchInt(iField); + + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_user WHERE user_id = '%d'", iUserID); + + rs = SQL_Query(db, sQuery); + + rs.FetchRow(); + rs.FieldNameToNum("username", iField); + + char sUsername[255]; + rs.FetchString(iField, sUsername, sizeof(sUsername)); + WriteFileLine(file_handle, "%s --- %N --- FORUM NAME: %s", sSID, client, sUsername); + delete rs; + continue; + } + + } + int iField; + rs.FetchRow(); + rs.FieldNameToNum("user_id", iField); + iUserID = rs.FetchInt(iField); + + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_user WHERE user_id = '%d'", iUserID); + + rs = SQL_Query(db, sQuery); + + rs.FetchRow(); + rs.FieldNameToNum("username", iField); + + char sUsername[255]; + rs.FetchString(iField, sUsername, sizeof(sUsername)); + + WriteFileLine(file_handle, "%s --- %N --- FORUM NAME: %s", sSID, client, sUsername); + + delete rs; + + } + + } + } + } + } + + delete db; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: Prints all winners to the caller of sm_listwinners. +//---------------------------------------------------------------------------------------------------- +CheckMYSQL(int iCaller) +{ + if (iCaller == 0) + return; + + char error[255]; + Database db; + + if (SQL_CheckConfig("xenforo")) + { + db = SQL_Connect("xenforo", true, error, sizeof(error)); + } + + if (db == null) + { + LogError("Could not connect to database: %s", error); + delete db; + return; + } + + for (int client = 1; client <= MaxClients; client++) + { + if (IsValidClient(client)) + { + if (IsPlayerAlive(client)) + { + if (GetClientTeam(client) == CS_TEAM_CT) + { + + if (!IsFakeClient(client) && !IsClientSourceTV(client)) + { + char sSID[64]; + GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); + + char sQuery[255]; + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_user_field_value WHERE field_value = '%s'", sSID); + DBResultSet rs; + + int iUserID; + + if ((rs = SQL_Query(db, sQuery)) == null) + { + delete rs; + delete db; + LogError("Database Error: %s", error); + return; + + } + + if (!(rs.RowCount > 0)) + { + char sSID64[64]; + GetClientAuthId(client, AuthId_SteamID64, sSID64, sizeof(sSID64)); + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_user_external_auth WHERE provider_key = '%s'", sSID64); + rs = SQL_Query(db, sQuery); + + if (!(rs.RowCount > 0)) + { + PrintToConsole(iCaller, "%s --- %N --- NO FORUM ACCOUNT", sSID, client); + delete rs; + continue; + } + else + { + int iField; + rs.FetchRow(); + rs.FieldNameToNum("user_id", iField); + iUserID = rs.FetchInt(iField); + + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_user WHERE user_id = '%d'", iUserID); + + rs = SQL_Query(db, sQuery); + + rs.FetchRow(); + rs.FieldNameToNum("username", iField); + + char sUsername[255]; + rs.FetchString(iField, sUsername, sizeof(sUsername)); + PrintToConsole(iCaller, "%s --- %N --- FORUM NAME: %s", sSID, client, sUsername); + delete rs; + continue; + } + + } + int iField; + rs.FetchRow(); + rs.FieldNameToNum("user_id", iField); + iUserID = rs.FetchInt(iField); + + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_user WHERE user_id = '%d'", iUserID); + + rs = SQL_Query(db, sQuery); + + rs.FetchRow(); + rs.FieldNameToNum("username", iField); + + char sUsername[255]; + rs.FetchString(iField, sUsername, sizeof(sUsername)); + + PrintToConsole(iCaller, "%s --- %N --- FORUM NAME: %s", sSID, client, sUsername); + + delete rs; + + } + + } + } + } + } + + delete db; +} +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +stock int IsValidClient(int client, bool nobots = true) +{ + if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client))) + { + return false; + } + return IsClientInGame(client); +} \ No newline at end of file