#pragma semicolon 1 #include #include #include #pragma newdecls required /* CONVARS */ ConVar g_hCvar_BlockSpoof; ConVar g_hCvar_BlockAdmin; ConVar g_hCvar_BlockVoice; /* DATABASE */ Database g_hDatabase; //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public Plugin myinfo = { name = "NoSteamManager_Connect", author = "zaCade + Neon", description = "Manage No-Steam clients, denying admin access, ect.", version = "2.0.0" }; //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnPluginStart() { g_hCvar_BlockSpoof = CreateConVar("sm_nosteam_block_spoof", "1", "Kick nosteamers that use authenticated steamids.", FCVAR_NONE, true, 0.0, true, 1.0); 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); 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"); AutoExecConfig(); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnConfigsExecuted() { if(!g_hCvar_BlockSpoof.BoolValue) return; Database.Connect(SQL_OnDatabaseConnect, "NoSteamManager"); } //---------------------------------------------------------------------------------------------------- // 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 sAuthID[32]; GetClientAuthId(i, AuthId_Steam2, sAuthID, sizeof(sAuthID)); if(!SteamClientAuthenticated(sAuthID)) { 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 sAuthID[32]; GetClientAuthId(i, AuthId_Steam2, sAuthID, sizeof(sAuthID)); if(SteamClientAuthenticated(sAuthID)) 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 sAuthID[32]; GetClientAuthId(i, AuthId_Steam2, sAuthID, sizeof(sAuthID)); if(!SteamClientAuthenticated(sAuthID)) PushArrayCell(hClients, i); } } return true; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnClientAuthorized(int client, const char[] sAuthID) { if(!g_hCvar_BlockSpoof.BoolValue || !g_hDatabase) return; if(IsFakeClient(client) || IsClientSourceTV(client)) return; char sQuery[512]; Format(sQuery, sizeof(sQuery), "SELECT * FROM connections WHERE auth='%s'", sAuthID); g_hDatabase.Query(SQL_OnQueryCompleted, sQuery, GetClientSerial(client), DBPrio_Low); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public Action OnClientPreAdminCheck(int client) { if(!g_hCvar_BlockAdmin.BoolValue) return Plugin_Continue; if(IsFakeClient(client) || IsClientSourceTV(client)) return Plugin_Continue; char sAuthID[32]; GetClientAuthId(client, AuthId_Steam2, sAuthID, sizeof(sAuthID)); if(!SteamClientAuthenticated(sAuthID)) { LogMessage("%L was not authenticated with steam, denying admin.", client); NotifyPostAdminCheck(client); return Plugin_Handled; } else return Plugin_Continue; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnClientPostAdminCheck(int client) { if(!g_hCvar_BlockVoice.BoolValue) return; if(IsFakeClient(client) || IsClientSourceTV(client)) return; char sAuthID[32]; GetClientAuthId(client, AuthId_Steam2, sAuthID, sizeof(sAuthID)); if(!SteamClientAuthenticated(sAuthID)) { LogMessage("%L was not authenticated with steam, muting client.", client); BaseComm_SetClientMute(client, true); return; } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void SQL_OnDatabaseConnect(Database db, const char[] error, any data) { if(!db || strlen(error)) { LogError("Database error: %s", error); return; } g_hDatabase = db; char sQuery[512]; Format(sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS connections (`auth` varchar(32), `address` varchar(16), PRIMARY KEY (`auth`))"); g_hDatabase.Query(SQL_OnQueryCompleted, sQuery, _, DBPrio_High); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void SQL_OnQueryCompleted(Database db, DBResultSet results, const char[] error, any data) { if(!db || strlen(error)) { LogError("Query error: %s", error); return; } int client; if ((client = GetClientFromSerial(data)) == 0) return; char sAuthID[32]; GetClientAuthId(client, AuthId_Steam2, sAuthID, sizeof(sAuthID)); char sAddress[16]; GetClientIP(client, sAddress, sizeof(sAddress)); if(results.RowCount && results.FetchRow()) { int iFieldNum; char sResultAddress[16]; results.FieldNameToNum("address", iFieldNum); results.FetchString(iFieldNum, sResultAddress, sizeof(sResultAddress)); delete results; if(!SteamClientAuthenticated(sAuthID)) { if(StrEqual(sAddress, sResultAddress, false)) { LogMessage("%L tried to join with a legitimate steamid while not authenticated with steam. Allowing connection, IPs match. (Known: %s)", client, sAddress); } else { LogMessage("%L tried to join with a legitimate steamid while not authenticated with steam. Refusing connection, IPs dont match. (Known: %s | Current: %s)", client, sResultAddress, sAddress); KickClient(client, "Trying to join with a legitimate steamid while not authenticated with steam."); return; } } } char sQuery[512]; Format(sQuery, sizeof(sQuery), "INSERT INTO connections (auth, address) VALUES ('%s', '%s') ON DUPLICATE KEY UPDATE address='%s';", sAuthID, sAddress, sAddress); g_hDatabase.Query(SQL_OnQueryCompleted, sQuery, _, DBPrio_Low); }