diff --git a/StatGroups/scripting/StatGroups.sp b/StatGroups/scripting/StatGroups.sp new file mode 100644 index 00000000..1cc67d76 --- /dev/null +++ b/StatGroups/scripting/StatGroups.sp @@ -0,0 +1,221 @@ +#pragma newdecls required + +#include + +#define GAMEID "csgo-ze" + +/* BOOLS */ +bool G_bPreAdminChecked[MAXPLAYERS+1]; +bool G_bResponseFailed[MAXPLAYERS+1]; +bool G_bResponsePassed[MAXPLAYERS+1]; + +/* INTERGERS */ +int iRank[MAXPLAYERS+1] = {-1, ...}; + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Plugin myinfo = +{ + name = "StatGroups", + author = "zaCade (Original by Jenz)", + description = "Grant sourcemod groups based on HLStats ranks", + version = "1.2" +}; + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnRebuildAdminCache(AdminCachePart part) +{ + if (part == AdminCache_Overrides) + return; + + if (part == AdminCache_Groups) + { + CreateAdminGroup("Ranking-Top10"); + CreateAdminGroup("Ranking-Top20"); + CreateAdminGroup("Ranking-Top40"); + } + + CreateTimer(1.0, OnRebuildAdminCachePost, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action OnRebuildAdminCachePost(Handle hTimer) +{ + for (int client = 1; client <= MaxClients; client++) + { + if (!G_bResponsePassed[client] || !G_bPreAdminChecked[client]) + continue; + + if (iRank[client] <= 10) ApplyAdminGroup(client, "Ranking-Top10"); + if (iRank[client] <= 20) ApplyAdminGroup(client, "Ranking-Top20"); + if (iRank[client] <= 40) ApplyAdminGroup(client, "Ranking-Top40"); + } +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnClientConnected(int client) +{ + G_bPreAdminChecked[client] = false; + G_bResponseFailed[client] = false; + G_bResponsePassed[client] = false; + + iRank[client] = -1; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnClientDisconnect(int client) +{ + G_bPreAdminChecked[client] = false; + G_bResponseFailed[client] = false; + G_bResponsePassed[client] = false; + + iRank[client] = -1; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnClientAuthorized(int client, const char[] sAuthID) +{ + if ((iRank[client] = RetrieveStatRank(client)) != -1) + G_bResponsePassed[client] = true; + else + G_bResponseFailed[client] = true; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action OnClientPreAdminCheck(int client) +{ + G_bPreAdminChecked[client] = true; + + if (G_bResponsePassed[client] || G_bResponseFailed[client]) + return Plugin_Continue; + + RunAdminCacheChecks(client); + return Plugin_Handled; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnClientPostAdminFilter(int client) +{ + if (!G_bResponsePassed[client]) + return; + + if (iRank[client] <= 10) ApplyAdminGroup(client, "Ranking-Top10"); + if (iRank[client] <= 20) ApplyAdminGroup(client, "Ranking-Top20"); + if (iRank[client] <= 40) ApplyAdminGroup(client, "Ranking-Top40"); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +stock void CreateAdminGroup(const char[] group) +{ + GroupId GrpID; + + if ((GrpID = FindAdmGroup(group)) == INVALID_GROUP_ID) + { + LogMessage("Creating new admin group %s", group); + + GrpID = CreateAdmGroup(group); + GrpID.ImmunityLevel = 0; + } +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +stock void ApplyAdminGroup(int client, const char[] group) +{ + AdminId AdmID; + GroupId GrpID; + + if ((AdmID = GetUserAdmin(client)) == INVALID_ADMIN_ID) + { + LogMessage("Creating new admin for %L", client); + + AdmID = CreateAdmin(); + SetUserAdmin(client, AdmID, true); + } + + if ((GrpID = FindAdmGroup(group)) != INVALID_GROUP_ID) + { + if (AdminInheritGroup(AdmID, GrpID)) + { + LogMessage("%L added to group %s", client, group); + } + } + else + { + LogMessage("%L group not found %s", client, group); + } +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +stock int RetrieveStatRank(int client) +{ + char sError[512]; + char sQuery[512]; + + if (!SQL_CheckConfig("stats")) + { + LogError("Could not find database config \"stats\"."); + return -1; + } + + Database database; + if ((database = SQL_Connect("stats", true, sError, sizeof(sError))) == null) + { + LogError("Connection error: \"%s\".", sError); + delete database; + return -1; + } + + char sSteamID[32]; + if (GetClientAuthId(client, AuthId_Steam2, sSteamID, sizeof(sSteamID))) + strcopy(sSteamID, sizeof(sSteamID), sSteamID[8]); + + SQL_FormatQuery(database, sQuery, sizeof(sQuery), "SELECT COUNT(*) AS rank FROM hlstats_Players WHERE hlstats_Players.game = '%s' AND hideranking = 0 AND skill > (SELECT skill FROM hlstats_Players JOIN hlstats_PlayerUniqueIds ON hlstats_Players.playerId = hlstats_PlayerUniqueIds.playerId WHERE hlstats_PlayerUniqueIds.game = '%s' AND uniqueId = '%s')", GAMEID, GAMEID, sSteamID); + + DBResultSet results; + if ((results = SQL_Query(database, sQuery)) == null) + { + delete database; + delete results; + return -1; + } + + if (!results.FetchRow()) + { + delete database; + delete results; + return -1; + } + + int rank; + if ((rank = results.FetchInt(0)) == 0) + { + delete database; + delete results; + return -1; + } + + delete database; + delete results; + return rank; +} \ No newline at end of file