192 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #include <sourcemod>
 | |
| #include <SteamWorks>
 | |
| 
 | |
| #pragma semicolon 1
 | |
| #pragma newdecls required
 | |
| 
 | |
| #include "SteamAPI.secret"
 | |
| 
 | |
| /* BOOLEANS */
 | |
| bool g_bValid[MAXPLAYERS+1]     = {false, ...};
 | |
| bool g_bValidated[MAXPLAYERS+1] = {false, ...};
 | |
| 
 | |
| /* FORWARDS */
 | |
| Handle g_hFwd_OnClientProfileValidated;
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public Plugin myinfo =
 | |
| {
 | |
| 	name        = "NoSteamDetection",
 | |
| 	author      = "zaCade",
 | |
| 	description = "Mark people as 'NoSteam' if their steam profiles are incorrect",
 | |
| 	version     = "1.0"
 | |
| };
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public APLRes AskPluginLoad2(Handle myself, bool late, char [] error, int err_max)
 | |
| {
 | |
| 	CreateNative("IsClientProfileValid",     Native_IsClientProfileValid);
 | |
| 	CreateNative("IsClientProfileValidated", Native_IsClientProfileValidated);
 | |
| 
 | |
| 	RegPluginLibrary("NoSteamDetection");
 | |
| 	return APLRes_Success;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	g_hFwd_OnClientProfileValidated = CreateGlobalForward("OnClientProfileValidated", ET_Ignore, Param_Cell, Param_Cell);
 | |
| 
 | |
| 	for(int client = 1; client <= MaxClients; client++)
 | |
| 	{
 | |
| 		if(IsValidClient(client) && IsClientAuthorized(client))
 | |
| 			OnClientAuthorized(client, "");
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnClientAuthorized(int client, const char[] auth)
 | |
| {
 | |
| 	char sSteam64ID[32];
 | |
| 	GetClientAuthId(client, AuthId_SteamID64, sSteam64ID, sizeof(sSteam64ID));
 | |
| 
 | |
| 	char sRequest[256];
 | |
| 	Format(sRequest, sizeof(sRequest), "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=%s&steamids=%s&format=vdf", STEAM_API_KEY, sSteam64ID);
 | |
| 
 | |
| 	Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodGET, sRequest);
 | |
| 	if (!hRequest ||
 | |
| 		!SteamWorks_SetHTTPCallbacks(hRequest, OnClientAuthorized_OnTransferComplete) ||
 | |
| 		!SteamWorks_SetHTTPRequestContextValue(hRequest, GetClientSerial(client)) ||
 | |
| 		!SteamWorks_SendHTTPRequest(hRequest))
 | |
| 	{
 | |
| 		delete hRequest;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public int OnClientAuthorized_OnTransferComplete(Handle hRequest, bool bFailure, bool bSuccessful, EHTTPStatusCode eStatusCode, int serial)
 | |
| {
 | |
| 	if (bFailure || !bSuccessful || eStatusCode != k_EHTTPStatusCode200OK)
 | |
| 	{
 | |
| 		delete hRequest;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	SteamWorks_GetHTTPResponseBodyCallback(hRequest, OnClientAuthorized_OnTransferResponse, serial);
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public int OnClientAuthorized_OnTransferResponse(char[] sData, int serial)
 | |
| {
 | |
| 	int client;
 | |
| 	if ((client = GetClientFromSerial(serial)) == 0)
 | |
| 		return;
 | |
| 
 | |
| 	KeyValues Response = new KeyValues("SteamAPIResponse");
 | |
| 
 | |
| 	if(!Response.ImportFromString(sData, "SteamAPIResponse"))
 | |
| 	{
 | |
| 		OnClientAuthorized_FinishCall(client, false);
 | |
| 		delete Response;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if(!Response.JumpToKey("players"))
 | |
| 	{
 | |
| 		OnClientAuthorized_FinishCall(client, false);
 | |
| 		delete Response;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if(!Response.GotoFirstSubKey())
 | |
| 	{
 | |
| 		OnClientAuthorized_FinishCall(client, false);
 | |
| 		delete Response;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if ((Response.GetNum("profilestate")) == 0)
 | |
| 	{
 | |
| 		OnClientAuthorized_FinishCall(client, false);
 | |
| 		delete Response;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	OnClientAuthorized_FinishCall(client, true);
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnClientAuthorized_FinishCall(int client, bool valid)
 | |
| {
 | |
| 	g_bValid[client]     = valid;
 | |
| 	g_bValidated[client] = true;
 | |
| 
 | |
| 	Call_StartForward(g_hFwd_OnClientProfileValidated);
 | |
| 	Call_PushCell(client);
 | |
| 	Call_PushCell(valid);
 | |
| 	Call_Finish();
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public void OnClientDisconnect(int client)
 | |
| {
 | |
| 	g_bValid[client]     = false;
 | |
| 	g_bValidated[client] = false;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public int Native_IsClientProfileValid(Handle hPlugin, int numParams)
 | |
| {
 | |
| 	int client = GetNativeCell(1);
 | |
| 
 | |
| 	if (!IsValidClient(client))
 | |
| 		return false;
 | |
| 
 | |
| 	return g_bValid[client];
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public int Native_IsClientProfileValidated(Handle hPlugin, int numParams)
 | |
| {
 | |
| 	int client = GetNativeCell(1);
 | |
| 
 | |
| 	if (!IsValidClient(client))
 | |
| 		return false;
 | |
| 
 | |
| 	return g_bValidated[client];
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose:
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| public bool IsValidClient(int client)
 | |
| {
 | |
| 	if (client < 0)
 | |
| 		return false;
 | |
| 
 | |
| 	if (client > GetMaxClients())
 | |
| 		return false;
 | |
| 
 | |
| 	return true;
 | |
| } |