diff --git a/VIP_Test/scripting/VIP_Test.sp b/VIP_Test/scripting/VIP_Test.sp index fb662bc0..d2ee9df2 100644 --- a/VIP_Test/scripting/VIP_Test.sp +++ b/VIP_Test/scripting/VIP_Test.sp @@ -1,18 +1,33 @@ +#pragma semicolon 1 + #include -char g_sAdmGroup[32] = "Game-Donator"; +#pragma newdecls required +/* STRINGS */ +char g_sAdmGroup[32] = "Game-Donator"; +char g_sGroup[MAXPLAYERS+1][64]; + +/* CONVARS */ ConVar g_cvFreeVIPDuration; +/* DATABASE */ +Database g_hDatabase; + +/* BOOLS */ +bool g_bPreAdminChecked[MAXPLAYERS+1]; +bool g_bResponseFailed[MAXPLAYERS+1]; +bool g_bResponsePassed[MAXPLAYERS+1]; + //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public Plugin myinfo = { - name = "Unloze_VIP_Test", + name = "UNLOZE_VIP_Test", author = "Neon", description = "", - version = "1.0", + version = "2.0", url = "https://steamcommunity.com/id/n3ontm" } @@ -26,18 +41,15 @@ public void OnPluginStart() RegConsoleCmd("sm_viptest", Command_VIP, "Activate free VIP period"); RegConsoleCmd("sm_testvip", Command_VIP, "Activate free VIP period"); RegConsoleCmd("sm_vip", Command_VIP, "Activate free VIP period"); -} -//---------------------------------------------------------------------------------------------------- -// Purpose: -//---------------------------------------------------------------------------------------------------- -public Action Command_VIP(int iClient, int iArgs) -{ - if (!IsValidClient(iClient)) - return Plugin_Handled; + AutoExecConfig(); - CheckMYSQL(iClient, true); - return Plugin_Handled; + char sError[256]; + if (SQL_CheckConfig("testvip")) + g_hDatabase = SQL_Connect("testvip", true, sError, sizeof(sError)); + + if (g_hDatabase == null) + LogError("Could not connect to database: %s", sError); } //---------------------------------------------------------------------------------------------------- @@ -54,120 +66,169 @@ public void OnRebuildAdminCache(AdminCachePart part) //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public void OnClientPostAdminFilter(int client) +public Action OnRebuildAdminCachePost(Handle hTimer) { - CheckMYSQL(client); + for (int client = 1; client <= MaxClients; client++) + { + if(g_bResponsePassed[client] && g_bPreAdminChecked[client]) + ApplyGroupFlags(client); + } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -bool CheckMYSQL(int client, bool add = false) +public void OnClientConnected(int client) { - if (client == 0) - return false; + g_bPreAdminChecked[client] = false; + g_bResponseFailed[client] = false; + g_bResponsePassed[client] = false; - char error[255]; - Database db; + g_sGroup[client][0] = 0; +} - if (SQL_CheckConfig("testvip")) +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnClientDisconnect(int client) +{ + g_bPreAdminChecked[client] = false; + g_bResponseFailed[client] = false; + g_bResponsePassed[client] = false; + + g_sGroup[client][0] = 0; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnClientAuthorized(int client, const char[] sSteamID32) +{ + if (IsFakeClient(client)) + return; + + char sSteamID[32]; + GetClientAuthId(client, AuthId_Steam2, sSteamID, sizeof(sSteamID)); + + char sQuery[256]; + Format(sQuery, sizeof(sQuery), "SELECT * FROM testvip_table WHERE steam_auth = '%s'", sSteamID); + SQL_TQuery(g_hDatabase, TQueryCBConnect, sQuery, GetClientUserId(client)); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void TQueryCBConnect(Handle owner, Handle rs, const char[] error, any data) +{ + int client = 0; + + if ((client = GetClientOfUserId(data)) == 0) + return; + + if (SQL_GetRowCount(rs) > 0) { - db = SQL_Connect("testvip", true, error, sizeof(error)); - } - - if (db == null) - { - LogError("Could not connect to database: %s", error); - delete db; - return false; - } - - if (!IsFakeClient(client) && !IsClientSourceTV(client)) - { - char sSID[64]; - GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); - - char sQuery[255]; - Format(sQuery, sizeof(sQuery), "SELECT * FROM testvip_table WHERE steam_auth = '%s'", sSID); - DBResultSet rs; - if ((rs = SQL_Query(db, sQuery)) == null) - { - delete db; - delete rs; - LogError("Database Error: %s", error); - return false; - } + int iField; + SQL_FetchRow(rs); + SQL_FieldNameToNum(rs, "activated", iField); + int iTimestampActivated = SQL_FetchInt(rs, iField); int iTimestamp = GetTime(); - int iTimestampActivated = GetTime(); - bool bFound = false; - - if (!(rs.RowCount > 0)) - { - if (add) - { - bool bHasVIP = false; - AdminId AdmID; - - if ((AdmID = GetUserAdmin(client)) == INVALID_ADMIN_ID) - bHasVIP = false; - else - { - for (int i = 0; i <= GetAdminGroupCount(AdmID); i++) - { - char sGroup[32]; - if ((GetAdminGroup(AdmID, i, sGroup, sizeof(sGroup)) != INVALID_GROUP_ID)) - { - if (StrEqual(sGroup, g_sAdmGroup)) - bHasVIP = true; - } - } - } - - if (!bHasVIP) - { - Format(sQuery, sizeof(sQuery), "INSERT INTO testvip_table (steam_auth, activated) VALUES ('%s', '%d')", sSID, iTimestamp); - SQL_FastQuery(db, sQuery); - - ApplyGroupFlags(client); - PrintToChat(client, "[Unloze] Your TEST VIP will expire in %d minutes!", g_cvFreeVIPDuration.IntValue - (iTimestamp - iTimestampActivated) / 60); - PrintToChat(client, "[Unloze] You have now access to !zclass, !tag and !glow."); - } - else - { - PrintToChat(client, "[Unloze] You already have VIP activated!"); - delete db; - delete rs; - return false; - } - - } - } - else - { - int iField; - rs.FetchRow(); - rs.FieldNameToNum("activated", iField); - iTimestampActivated = rs.FetchInt(iField); - bFound = true; - } delete rs; - if (bFound) + if ((iTimestamp - iTimestampActivated) < g_cvFreeVIPDuration.IntValue *60) { - if ((iTimestamp - iTimestampActivated) < g_cvFreeVIPDuration.IntValue *60) - { - ApplyGroupFlags(client); - PrintToChat(client, "[Unloze] Your TEST VIP will expire in %d minutes!", g_cvFreeVIPDuration.IntValue - (iTimestamp - iTimestampActivated) / 60); - } - else - { - if (add) - PrintToChat(client, "[Unloze] Your TEST VIP expired already!", g_cvFreeVIPDuration.IntValue - (iTimestamp - iTimestampActivated) / 60); - } + strcopy(g_sGroup[client], sizeof(g_sGroup[]), g_sAdmGroup); } } - delete db; - return true; + + g_bResponsePassed[client] = true; + if (g_bPreAdminChecked[client]) + NotifyPostAdminCheck(client); +} + +//---------------------------------------------------------------------------------------------------- +// 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) +{ + ApplyGroupFlags(client); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action Command_VIP(int client, int iArgs) +{ + if (!IsValidClient(client)) + return Plugin_Handled; + + char sSteamID[32]; + GetClientAuthId(client, AuthId_Steam2, sSteamID, sizeof(sSteamID)); + + char sQuery[255]; + Format(sQuery, sizeof(sQuery), "SELECT * FROM testvip_table WHERE steam_auth = '%s'", sSteamID); + SQL_TQuery(g_hDatabase, TQueryCBCommand, sQuery, GetClientUserId(client)); + + return Plugin_Handled; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void TQueryCBCommand(Handle owner, Handle rs, const char[] error, any data) +{ + int client = 0; + + if ((client = GetClientOfUserId(data)) == 0) + return; + + int iTimestamp = GetTime(); + + if (SQL_GetRowCount(rs) > 0) + { + int iField; + SQL_FetchRow(rs); + SQL_FieldNameToNum(rs, "activated", iField); + int iTimestampActivated = SQL_FetchInt(rs, iField); + delete rs; + + if ((iTimestamp - iTimestampActivated) < g_cvFreeVIPDuration.IntValue *60) + PrintToChat(client, "[UNLOZE] Your TEST VIP will expire in %d minutes!", g_cvFreeVIPDuration.IntValue - (iTimestamp - iTimestampActivated) / 60); + else + PrintToChat(client, "[UNLOZE] Your TEST VIP expired already!"); + } + else + { + if (IsVIP(client)) + { + PrintToChat(client, "[UNLOZE] You already have VIP activated!"); + return; + } + + char sSteamID[32]; + GetClientAuthId(client, AuthId_Steam2, sSteamID, sizeof(sSteamID)); + + char sQuery[255]; + Format(sQuery, sizeof(sQuery), "INSERT INTO testvip_table (steam_auth, activated) VALUES ('%s', '%d')", sSteamID, iTimestamp); + SQL_FastQuery(g_hDatabase, sQuery); + strcopy(g_sGroup[client], sizeof(g_sGroup[]), g_sAdmGroup); + ApplyGroupFlags(client); + PrintToChat(client, "[UNLOZE] You have now access to !zclass, !tag and !glow and other VIP-Perks."); + PrintToChat(client, "[UNLOZE] Your TEST VIP will expire in %d minutes!", g_cvFreeVIPDuration.IntValue); + } } //---------------------------------------------------------------------------------------------------- @@ -175,6 +236,9 @@ bool CheckMYSQL(int client, bool add = false) //---------------------------------------------------------------------------------------------------- stock void ApplyGroupFlags(int client) { + if (!g_bResponsePassed[client]) + return; + AdminId AdmID; GroupId GrpID; @@ -186,27 +250,13 @@ stock void ApplyGroupFlags(int client) SetUserAdmin(client, AdmID, true); } - if ((GrpID = FindAdmGroup(g_sAdmGroup)) != INVALID_GROUP_ID) + if ((GrpID = FindAdmGroup(g_sGroup[client])) != INVALID_GROUP_ID) { if (AdminInheritGroup(AdmID, GrpID)) - LogMessage("%L added to group %s", client, g_sAdmGroup); + LogMessage("%L added to group %s", client, g_sGroup[client]); } else - { - LogMessage("%L group not found %s", client, g_sAdmGroup); - } -} - -//---------------------------------------------------------------------------------------------------- -// Purpose: -//---------------------------------------------------------------------------------------------------- -public Action OnRebuildAdminCachePost(Handle hTimer) -{ - for (int client = 1; client <= MaxClients; client++) - { - if (IsValidClient(client)) - CheckMYSQL(client); - } + LogMessage("%L group not found %s", client, g_sGroup[client]); } //---------------------------------------------------------------------------------------------------- @@ -215,8 +265,31 @@ public Action OnRebuildAdminCachePost(Handle hTimer) stock int IsValidClient(int client, bool nobots = true) { if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client))) - { return false; - } + return IsClientInGame(client); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public bool IsVIP(int client) +{ + AdminId AdmID; + + if ((AdmID = GetUserAdmin(client)) == INVALID_ADMIN_ID) + return false; + else + { + for (int i = 0; i <= GetAdminGroupCount(AdmID); i++) + { + char sGroup[32]; + if ((GetAdminGroup(AdmID, i, sGroup, sizeof(sGroup)) != INVALID_GROUP_ID)) + { + if (StrEqual(sGroup, g_sAdmGroup)) + return true; + } + } + } + return false; } \ No newline at end of file