From 1ed199e1ead655ad47a2b59a5cf96bfb8be02281 Mon Sep 17 00:00:00 2001 From: neon <> Date: Mon, 29 Oct 2018 16:39:02 +0100 Subject: [PATCH] UNLOZE_Donation_Alert: first version, not quite finished --- .../configs/unloze_donation_alert/data.cfg | 7 + .../scripting/UNLOZE_Donation_Alert.sp | 226 ++++++++++++++++++ 2 files changed, 233 insertions(+) create mode 100644 UNLOZE_Donation_Alert/configs/unloze_donation_alert/data.cfg create mode 100644 UNLOZE_Donation_Alert/scripting/UNLOZE_Donation_Alert.sp diff --git a/UNLOZE_Donation_Alert/configs/unloze_donation_alert/data.cfg b/UNLOZE_Donation_Alert/configs/unloze_donation_alert/data.cfg new file mode 100644 index 00000000..a73e1b7f --- /dev/null +++ b/UNLOZE_Donation_Alert/configs/unloze_donation_alert/data.cfg @@ -0,0 +1,7 @@ +"unloze_donation_alert" +{ + "last_processed_donation" + { + "id" "873" + } +} diff --git a/UNLOZE_Donation_Alert/scripting/UNLOZE_Donation_Alert.sp b/UNLOZE_Donation_Alert/scripting/UNLOZE_Donation_Alert.sp new file mode 100644 index 00000000..01583de5 --- /dev/null +++ b/UNLOZE_Donation_Alert/scripting/UNLOZE_Donation_Alert.sp @@ -0,0 +1,226 @@ +#pragma semicolon 1 + +#include +#include + +#pragma newdecls required + +/* CONVARS */ +ConVar g_cvInterval; + +/* DATABASE */ +Database g_hDatabase; + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Plugin myinfo = +{ + name = "UNLOZE_Donation_Alert", + author = "Neon", + description = "", + version = "1.0", + url = "https://steamcommunity.com/id/n3ontm" +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnPluginStart() +{ + g_cvInterval = CreateConVar("sm_unloze_donation_alert_interval", "60", "", FCVAR_NONE); + + AutoExecConfig(); + + char sError[256]; + if (SQL_CheckConfig("xenforo")) + g_hDatabase = SQL_Connect("xenforo", true, sError, sizeof(sError)); + + if (g_hDatabase == null) + LogError("Could not connect to database: %s", sError); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void OnMapStart() +{ + CreateTimer(g_cvInterval.FloatValue, CheckForNewDonations, INVALID_HANDLE, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action CheckForNewDonations(Handle timer) +{ + char sDataFile[PLATFORM_MAX_PATH]; + BuildPath(Path_SM, sDataFile, sizeof(sDataFile), "configs/unloze_donation_alert/data.cfg"); + + if(!FileExists(sDataFile)) + { + LogError("Could not find data file: \"%s\"", sDataFile); + return Plugin_Stop; + } + + KeyValues Data = new KeyValues("unloze_donation_alert"); + + if(!Data.ImportFromFile(sDataFile)) + { + LogError("Unable to load data file: \"%s\"", sDataFile); + delete Data; + return Plugin_Stop; + } + + if(!Data.JumpToKey("last_processed_donation", false)) + { + LogError("Unable to find section last_processed_donation: \"%s\"", sDataFile); + delete Data; + return Plugin_Stop; + } + + int iID; + iID = Data.GetNum("id", -1); + if (iID == -1) + { + LogError("Unable to ID of last_processed_donation: \"%s\"", sDataFile); + delete Data; + return Plugin_Stop; + } + + char sQuery[255]; + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_bdpaygate_log WHERE log_id = %d", iID + 1); + g_hDatabase.Query(TQueryCB, sQuery, iID + 1); + + delete Data; + return Plugin_Continue; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void TQueryCB(Database db, DBResultSet results, const char[] error, any data) +{ + int iID = data; + + if (results.RowCount > 0) + { + int iField; + char sLogType[64]; + char sLogDetails[4096]; + results.FetchRow(); + results.FieldNameToNum("log_type", iField); + results.FetchString(iField, sLogType, sizeof(sLogType)); + + if(!StrEqual(sLogType, "accepted")) + { + HandleDonation(iID); + char sQuery[255]; + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_bdpaygate_log WHERE log_id = %d", iID + 1); + g_hDatabase.Query(TQueryCB, sQuery, iID + 1); + return; + } + + results.FieldNameToNum("log_details", iField); + results.FetchString(iField, sLogDetails, sizeof(sLogDetails)); + static char sStrings[256][256]; + char sMessage[256]; + char sMessageWhite[256]; + int iStrings = ExplodeString(sLogDetails, "\"", sStrings, 256, 256); + + if (StrContains(sLogDetails, "user_upgrade") != -1) + { + for (int i = 0; i < iStrings; i++) + { + if (StrContains(sStrings[i], "Account Upgrade:") != -1) + { + char sBuffer[256]; + char sUpgrade[256]; + char sName[256]; + strcopy(sBuffer, sizeof(sBuffer), sStrings[i]); + + int iStart = FindCharInString(sBuffer, ':', false); + strcopy(sBuffer, sizeof(sBuffer), sBuffer[iStart + 2]); + iStart = FindCharInString(sBuffer, '(', false); + strcopy(sName, sizeof(sName), sBuffer[iStart + 1]); + int iLength = strlen(sName); + sName[iLength-1] = 0; + SplitString(sBuffer, "(", sUpgrade, sizeof(sUpgrade)); + Format(sMessage, sizeof(sMessage), "{chartreuse}[UNLOZE] {lightblue}%s {white}just bought {lightblue}%s{white}! Thank you for supporting our servers!!!", sName, sUpgrade); + Format(sMessageWhite, sizeof(sMessageWhite), "%s just bought %s! Thank you for supporting our servers!!!", sName, sUpgrade); + + } + } + } + else if (StrContains(sLogDetails, "gift_upgrade") != -1) + { + for (int i = 0; i < iStrings; i++) + { + if (StrContains(sStrings[i], "Account Upgrade:") != -1) + { + char sBuffer[256]; + char sUpgrade[256]; + char sName[256]; + strcopy(sBuffer, sizeof(sBuffer), sStrings[i]); + + int iStart = FindCharInString(sBuffer, ':', false); + strcopy(sBuffer, sizeof(sBuffer), sBuffer[iStart + 2]); + iStart = FindCharInString(sBuffer, '(', false); + strcopy(sName, sizeof(sName), sBuffer[iStart + 1]); + int iLength = strlen(sName); + sName[iLength-1] = 0; + SplitString(sBuffer, "(", sUpgrade, sizeof(sUpgrade)); + + Format(sMessage, sizeof(sMessage), "{chartreuse}[UNLOZE] {lightblue}%s {white}just recieved {lightblue}%s {white}as a gift! Thank you for supporting our servers!!!", sName, sUpgrade); + Format(sMessageWhite, sizeof(sMessageWhite), "%s just recieved %s as a gift! Thank you for supporting our servers!!!", sName, sUpgrade); + } + } + } + + CPrintToChatAll(sMessage); + for(int client = 1; client <= MaxClients; client++) + { + if(IsClientInGame(client)) + { + PrintHintText(client, sMessageWhite); + } + } + + HandleDonation(iID); + char sQuery[255]; + Format(sQuery, sizeof(sQuery), "SELECT * FROM xf_bdpaygate_log WHERE log_id = %d", iID + 1); + g_hDatabase.Query(TQueryCB, sQuery, iID + 1); + } +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void HandleDonation(int iID) +{ + char sDataFile[PLATFORM_MAX_PATH]; + BuildPath(Path_SM, sDataFile, sizeof(sDataFile), "configs/unloze_donation_alert/data.cfg"); + + if(!FileExists(sDataFile)) + { + LogError("Could not find data file: \"%s\"", sDataFile); + return; + } + + KeyValues Data = new KeyValues("unloze_donation_alert"); + + if(!Data.JumpToKey("last_processed_donation", true)) + { + LogError("Unable to create section last_processed_donation: \"%s\"", sDataFile); + delete Data; + return; + } + Data.SetNum("id", iID); + Data.Rewind(); + if(!Data.ExportToFile(sDataFile)) + { + LogError("Unable to export data file: \"%s\"", sDataFile); + delete Data; + return; + } + delete Data; +} \ No newline at end of file