sm-plugins/NoSteamManager/scripting/NoSteamManager.sp

226 lines
7.2 KiB
SourcePawn
Raw Normal View History

2018-03-24 17:20:48 +01:00
#pragma semicolon 1
#include <sourcemod>
#include <basecomm>
#include <connect>
#pragma newdecls required
2018-03-26 21:44:05 +02:00
/* CONVARS */
ConVar g_hCvar_BlockAdmin;
ConVar g_hCvar_BlockVoice;
/* DATABASE */
Database g_hDatabaseAntiSpoofing;
2018-03-24 17:20:48 +01:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Plugin myinfo =
{
name = "NoSteamManager",
author = "zaCade",
description = "Manage No-Steam clients, denying admin access, ect.",
2018-09-10 15:07:00 +02:00
version = "1.1.0"
2018-03-24 17:20:48 +01:00
};
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginStart()
{
g_hCvar_BlockAdmin = CreateConVar("sm_nosteam_block_admin", "1", "Should people marked as nosteam be blocked from admin?", FCVAR_NONE, true, 0.0, true, 1.0);
g_hCvar_BlockVoice = CreateConVar("sm_nosteam_block_voice", "1", "Should people marked as nosteam be blocked from voice?", FCVAR_NONE, true, 0.0, true, 1.0);
2018-03-26 21:44:05 +02:00
2018-03-24 17:20:48 +01:00
AddMultiTargetFilter("@steam", Filter_Steam, "Steam Players", false);
AddMultiTargetFilter("@nosteam", Filter_NoSteam, "No-Steam Players", false);
RegConsoleCmd("sm_nosteam", Command_DisplaySteamStats, "Shows the number of Steam and No-Steam players");
RegConsoleCmd("sm_steam", Command_DisplaySteamStats, "Shows the number of Steam and No-Steam players");
2018-03-26 21:44:05 +02:00
AutoExecConfig();
char sError[256];
if (SQL_CheckConfig("antispoofing"))
g_hDatabaseAntiSpoofing = SQL_Connect("antispoofing", true, sError, sizeof(sError));
if (g_hDatabaseAntiSpoofing == null)
LogError("Could not connect to database: %s", sError);
2018-03-24 17:20:48 +01:00
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginEnd()
{
RemoveMultiTargetFilter("@steam", Filter_Steam);
RemoveMultiTargetFilter("@nosteam", Filter_NoSteam);
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action Command_DisplaySteamStats(int client, int args)
{
char aBuf[1024];
char aBuf2[MAX_NAME_LENGTH];
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i))
{
char sSteamID[32];
GetClientAuthId(i, AuthId_Steam2, sSteamID, sizeof(sSteamID));
if(!SteamClientAuthenticated(sSteamID))
{
GetClientName(i, aBuf2, sizeof(aBuf2));
StrCat(aBuf, sizeof(aBuf), aBuf2);
StrCat(aBuf, sizeof(aBuf), ", ");
}
}
}
if(strlen(aBuf))
{
aBuf[strlen(aBuf) - 2] = 0;
ReplyToCommand(client, "[SM] No-Steam clients online: %s", aBuf);
}
else
ReplyToCommand(client, "[SM] No-Steam clients online: none");
return Plugin_Handled;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public bool Filter_Steam(const char[] sPattern, Handle hClients)
{
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i))
{
char sSteamID[32];
GetClientAuthId(i, AuthId_Steam2, sSteamID, sizeof(sSteamID));
if(SteamClientAuthenticated(sSteamID))
PushArrayCell(hClients, i);
}
}
return true;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public bool Filter_NoSteam(const char[] sPattern, Handle hClients)
{
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i))
{
char sSteamID[32];
GetClientAuthId(i, AuthId_Steam2, sSteamID, sizeof(sSteamID));
if(!SteamClientAuthenticated(sSteamID))
PushArrayCell(hClients, i);
}
}
return true;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action OnClientPreAdminCheck(int client)
{
if(!g_hCvar_BlockAdmin.BoolValue)
2018-03-26 21:44:05 +02:00
return Plugin_Continue;
if(IsFakeClient(client) || IsClientSourceTV(client))
2018-03-24 17:20:48 +01:00
return Plugin_Continue;
char sSteamID[32];
GetClientAuthId(client, AuthId_Steam2, sSteamID, sizeof(sSteamID));
if(!SteamClientAuthenticated(sSteamID))
{
LogMessage("%L was not authenticated with steam, denying admin.", client);
NotifyPostAdminCheck(client);
char sQuery[512];
2018-09-10 15:07:00 +02:00
Format(sQuery, sizeof(sQuery), "SELECT * from authenticated_steam_ids WHERE steam_auth = '%s'", sSteamID);
SQL_TQuery(g_hDatabaseAntiSpoofing, TQueryCB, sQuery, GetClientUserId(client));
2018-03-24 17:20:48 +01:00
return Plugin_Handled;
}
2018-09-09 19:32:22 +02:00
char sIP[32];
GetClientIP(client, sIP, sizeof(sIP));
int iTimestamp = GetTime();
char sQuery[512];
Format(sQuery, sizeof(sQuery), "INSERT INTO authenticated_steam_ids (steam_auth, last_ip, last_connect) VALUES ('%s', '%s', %d) ON DUPLICATE KEY UPDATE last_ip = '%s', last_connect = %d;", sSteamID, sIP, iTimestamp, sIP, iTimestamp);
2018-09-10 15:07:00 +02:00
SQL_FastQuery(g_hDatabaseAntiSpoofing, sQuery);
2018-03-24 17:20:48 +01:00
return Plugin_Continue;
}
2018-03-24 17:22:05 +01:00
//----------------------------------------------------------------------------------------------------
2018-03-24 17:20:48 +01:00
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnClientPostAdminCheck(int client)
{
if(!g_hCvar_BlockVoice.BoolValue)
2018-03-26 21:44:05 +02:00
return;
if(IsFakeClient(client) || IsClientSourceTV(client))
2018-03-24 17:20:48 +01:00
return;
char sSteamID[32];
GetClientAuthId(client, AuthId_Steam2, sSteamID, sizeof(sSteamID));
if(!SteamClientAuthenticated(sSteamID))
{
LogMessage("%L was not authenticated with steam, muting client.", client);
BaseComm_SetClientMute(client, true);
return;
}
}
2018-03-24 17:20:48 +01:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void TQueryCB(Handle owner, Handle rs, const char[] error, any data)
{
int client = 0;
if ((client = GetClientOfUserId(data)) == 0)
2018-03-24 17:20:48 +01:00
return;
if (SQL_GetRowCount(rs) > 0)
{
2018-09-10 15:07:00 +02:00
char sCurrentIP[32];
GetClientIP(client, sCurrentIP, sizeof(sCurrentIP));
2018-09-10 15:07:00 +02:00
char sStoredIP[32];
int iField;
2018-09-10 15:07:00 +02:00
SQL_FetchRow(rs);
SQL_FieldNameToNum(rs, "last_ip", iField);
SQL_FetchString(rs, iField, sStoredIP, sizeof(sStoredIP));
delete rs;
if (StrEqual(sCurrentIP, sStoredIP))
{
LogMessage("%L tried to join with a known authenticated SteamID while not being authentiated with steam. Allowing connection because IPs match (%s).", client, sCurrentIP);
}
else
{
LogMessage("%L tried to join with a known authenticated SteamID while not being authentiated with steam. Refusing connection because IPs do not match (Stored: %s)(Current: %s).", client, sStoredIP, sCurrentIP);
KickClient(client, "Trying to join with a known authenticated SteamID while not being authentiated with steam.");
}
}
}