//==================================================================================================== // // Name: UNLOZE Forum Integration. // Author: .George & zaCade (Original by Botox) // Description: Handles forum access ingame. // //==================================================================================================== #include #include #include #include //#define UNLOZE_APIKEY here #pragma newdecls required /* STRINGS */ char G_sGroup[MAXPLAYERS+1][64]; /* BOOLS */ bool G_bPreAdminChecked[MAXPLAYERS+1]; bool G_bResponseFailed[MAXPLAYERS+1]; bool G_bResponsePassed[MAXPLAYERS+1]; bool g_bLateLoad = false; Database g_hDatabase = null; //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { CreateNative("AsyncHasSteamIDReservedSlot", Native_AsyncHasSteamIDReservedSlot); RegPluginLibrary("UNLOZE_ForumIntegration"); g_bLateLoad = late; return APLRes_Success; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public Plugin myinfo = { name = "UNLOZE Forum Integration", author = ".George & zaCade (Original by Botox)", description = "Handles forum access ingame", version = "1.2.1" }; //---------------------------------------------------------------------------------------------------- // Purpose: Late load //---------------------------------------------------------------------------------------------------- public void OnPluginStart() { EstablishConnection(); } public void EstablishConnection() { if (SQL_CheckConfig("xenforo")) Database.Connect(ConnectionCallback, "xenforo"); else SetFailState("'xenforo' not found in 'sourcemod/configs/databases.cfg'"); } public void ConnectionCallback(Database db, const char[] error, any data) { if (db == null) { SetFailState("Failed to connect to the database, will attempt to reconnect on map change"); return; } g_hDatabase = db; if (g_bLateLoad) { /* Late load */ for(int client = 1; client <= MaxClients; client++) { if(IsClientConnected(client)) OnClientConnected(client); if(IsClientAuthorized(client) && !IsFakeClient(client)) { char sSteamID32[32]; if(GetClientAuthId(client, AuthId_Steam2, sSteamID32, sizeof(sSteamID32))) OnClientAuthorized(client, sSteamID32); } } } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnRebuildAdminCache(AdminCachePart part) { if (part != AdminCache_Admins) return; 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]) ApplyGroupFlags(client); } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnClientConnected(int client) { G_bPreAdminChecked[client] = false; G_bResponseFailed[client] = false; G_bResponsePassed[client] = false; G_sGroup[client][0] = 0; } //---------------------------------------------------------------------------------------------------- // 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 sSteamID64[32]; SteamID32toSteamID64(sSteamID32, sSteamID64, sizeof(sSteamID64)); char sRequest[256]; Format(sRequest, sizeof(sRequest), "select * from unloze_forum.xf_user_external_auth ka inner JOIN unloze_forum.xf_user_upgrade_active kak on ka.user_id = kak.user_id where provider_key = '%s'", sSteamID64); g_hDatabase.Query(SQL_FUCKYOU, sRequest, GetClientSerial(client)); /*FormatEx(sRequest, sizeof(sRequest), "https://unloze.com/api/private_api.php?api_key=%s&steam_id=%s", UNLOZE_APIKEY, sSteamID64); int iSerial = GetClientSerial(client); Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodGET, sRequest); if (!hRequest || !SteamWorks_SetHTTPCallbacks(hRequest, OnClientAuthorized_OnTransferComplete) || !SteamWorks_SetHTTPRequestContextValue(hRequest, iSerial) || !SteamWorks_SendHTTPRequest(hRequest)) { delete hRequest; }*/ } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void SQL_FUCKYOU(Database db, DBResultSet results, const char[] error, int data) { int client; if ((client = GetClientFromSerial(data)) == 0) return; if (results.RowCount && results.FetchRow()) { OnClientAuthorized_OnTransferResponse("Game-Donator", data); } else { char sSID[32]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); char sSteamID64[32]; SteamID32toSteamID64(sSID, sSteamID64, sizeof(sSteamID64)); char sRequest[256]; Format(sRequest, sizeof(sRequest), "select * from unloze_forum.xf_user xfu inner join unloze_forum.xf_user_external_auth xuea ON xfu.user_id = xuea.user_id where find_in_set('6',secondary_group_ids) <> 0 and provider_key = '%s'", sSteamID64); g_hDatabase.Query(SQL_FUCKYOU_mapper, sRequest, GetClientSerial(client)); } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void SQL_FUCKYOU_mapper(Database db, DBResultSet results, const char[] error, int data) { int client; if ((client = GetClientFromSerial(data)) == 0) return; if (results.RowCount && results.FetchRow()) { OnClientAuthorized_OnTransferResponse("Game-Donator", data); } else { char sSID[32]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); char sSteamID64[32]; SteamID32toSteamID64(sSID, sSteamID64, sizeof(sSteamID64)); char sRequest[256]; Format(sRequest, sizeof(sRequest), "select * from unloze_forum.xf_user xfu inner join unloze_forum.xf_user_external_auth xuea ON xfu.user_id = xuea.user_id where find_in_set('21',secondary_group_ids) <> 0 and provider_key = '%s'", sSteamID64); g_hDatabase.Query(SQL_FUCKYOU_retired, sRequest, GetClientSerial(client)); } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void SQL_FUCKYOU_retired(Database db, DBResultSet results, const char[] error, int data) { if (results.RowCount && results.FetchRow()) { OnClientAuthorized_OnTransferResponse("Game-Donator", data); } else { OnClientAuthorized_OnTransferResponse("NOGROUP", data); } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public int OnClientAuthorized_OnTransferResponse(char[] sData, int iSerial) { int client = GetClientFromSerial(iSerial); if (!client) //Player disconnected. return; TrimString(sData); StripQuotes(sData); //LogMessage("reached sData with status 200: %s", sData); strcopy(G_sGroup[client], sizeof(G_sGroup[]), sData); 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: //---------------------------------------------------------------------------------------------------- stock void ApplyGroupFlags(int client) { if (!G_bResponsePassed[client]) return; 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(G_sGroup[client])) != INVALID_GROUP_ID) { if (AdminInheritGroup(AdmID, GrpID)) { LogMessage("%L added to group %s", client, G_sGroup[client]); } } else { LogMessage("%L group not found %s", client, G_sGroup[client]); } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public int Native_AsyncHasSteamIDReservedSlot(Handle plugin, int numParams) { char sSteamID32[32]; GetNativeString(1, sSteamID32, sizeof(sSteamID32)); AsyncHasSteamIDReservedSlotCallbackFunc callback; callback = GetNativeCell(2); any data; data = GetNativeCell(3); char sSteamID64[32]; SteamID32toSteamID64(sSteamID32, sSteamID64, sizeof(sSteamID64)); char sRequest[256]; Format(sRequest, sizeof(sRequest), "select * from unloze_forum.xf_user_external_auth ka inner JOIN unloze_forum.xf_user_upgrade_active kak on ka.user_id = kak.user_id where provider_key = '%s'", sSteamID64); DataPack hDataPack = new DataPack(); hDataPack.WriteString(sSteamID32); hDataPack.WriteFunction(callback); hDataPack.WriteCell(plugin); hDataPack.WriteCell(data); g_hDatabase.Query(SQL_FUCKYOU2, sRequest, hDataPack); } public void SQL_FUCKYOU2(Database db, DBResultSet results, const char[] error, DataPack fuck) { if (results.RowCount && results.FetchRow()) { Native_AsyncHasSteamIDReservedSlot_OnTransferResponse("Game-Donator", fuck); } else { char sSID[32]; ResetPack(fuck); fuck.ReadString(sSID, sizeof(sSID)); char sSteamID64[32]; SteamID32toSteamID64(sSID, sSteamID64, sizeof(sSteamID64)); char sRequest[256]; Format(sRequest, sizeof(sRequest), "select * from unloze_forum.xf_user xfu inner join unloze_forum.xf_user_external_auth xuea ON xfu.user_id = xuea.user_id where find_in_set('6',secondary_group_ids) <> 0 and provider_key = '%s'", sSteamID64); g_hDatabase.Query(SQL_FUCKYOU_mapper2, sRequest, fuck); } } public void SQL_FUCKYOU_mapper2(Database db, DBResultSet results, const char[] error, DataPack fuck) { if (results.RowCount && results.FetchRow()) { Native_AsyncHasSteamIDReservedSlot_OnTransferResponse("Game-Donator", fuck); } else { char sSID[32]; ResetPack(fuck); fuck.ReadString(sSID, sizeof(sSID)); char sSteamID64[32]; SteamID32toSteamID64(sSID, sSteamID64, sizeof(sSteamID64)); char sRequest[256]; Format(sRequest, sizeof(sRequest), "select * from unloze_forum.xf_user xfu inner join unloze_forum.xf_user_external_auth xuea ON xfu.user_id = xuea.user_id where find_in_set('21',secondary_group_ids) <> 0 and provider_key = '%s'", sSteamID64); g_hDatabase.Query(SQL_FUCKYOU_retired2, sRequest, fuck); } } public void SQL_FUCKYOU_retired2(Database db, DBResultSet results, const char[] error, DataPack fuck) { if (results.RowCount && results.FetchRow()) { Native_AsyncHasSteamIDReservedSlot_OnTransferResponse("Game-Donator", fuck); } else { Native_AsyncHasSteamIDReservedSlot_OnTransferResponse("NOGROUP", fuck); } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- /*public int Native_AsyncHasSteamIDReservedSlot_OnTransferComplete(Handle hRequest, bool bFailure, bool bSuccessful, EHTTPStatusCode eStatusCode, DataPack hDataPack) { if (bFailure || !bSuccessful || eStatusCode != k_EHTTPStatusCode200OK) { char sData[32] = "NOGROUP"; Native_AsyncHasSteamIDReservedSlot_OnTransferResponse(sData, hDataPack); delete hRequest; return; } SteamWorks_GetHTTPResponseBodyCallback(hRequest, Native_AsyncHasSteamIDReservedSlot_OnTransferResponse, hDataPack); }*/ //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public int Native_AsyncHasSteamIDReservedSlot_OnTransferResponse(char[] sData, DataPack hDataPack) { hDataPack.Reset(); char sSteamID32[32]; hDataPack.ReadString(sSteamID32, sizeof(sSteamID32)); AsyncHasSteamIDReservedSlotCallbackFunc callback; callback = view_as(hDataPack.ReadFunction()); Handle plugin; plugin = hDataPack.ReadCell(); any data; data = hDataPack.ReadCell(); TrimString(sData); StripQuotes(sData); int result; if (StrEqual(sData, "Game-Donator", false)) result = 1; else result = 0; Call_StartFunction(plugin, callback); Call_PushString(sSteamID32); Call_PushCell(result); Call_PushCell(data); Call_Finish(); delete hDataPack; return; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- stock bool SteamID32toSteamID64(const char[] sSteamID32, char[] sSteamID64, int iSize) { if (strlen(sSteamID32) < 11 || strncmp(sSteamID32[0], "STEAM_", 6)) { sSteamID64[0] = 0; return false; } int iUpper = 765611979; int isSteam64ID = StringToInt(sSteamID32[10]) * 2 + 60265728 + sSteamID32[8] - 48; int iDiv = isSteam64ID / 100000000; int iIdx = 9 - (iDiv ? (iDiv / 10 + 1) : 0); iUpper += iDiv; IntToString(isSteam64ID, sSteamID64[iIdx], iSize - iIdx); iIdx = sSteamID64[9]; IntToString(iUpper, sSteamID64, iSize); sSteamID64[9] = iIdx; return true; } stock void PrintToMe(char[] sText, any:...) { char steamid[64]; for (int i = 1; i < MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(client) && GetUserFlagBits(i) & ADMFLAG_RCON) { GetClientAuthId(i, AuthId_SteamID64, steamid, sizeof steamid); if(StrEqual(steamid, "76561198018661517")) { PrintToChat(i, sText); } } } }