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.

This commit is contained in:
hubdom 2021-06-05 20:35:03 +02:00
parent 5e8be5eace
commit 280dc0ca67

View File

@ -0,0 +1,312 @@
#include <sourcemod>
#include <zombiereloaded>
#include <cstrike>
#include <sdktools>
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);
}