From 3b98f19a7c03c26fb7ea087ace6a14e010f64f4b Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Wed, 3 Jul 2024 19:18:25 +0200 Subject: [PATCH] 1.4.9a - Plugin save all players ips to database, when player banned then all used ips are banned too (for ban evading) - Minor changes --- CS2-SimpleAdmin.cs | 6 +- Commands/basebans.cs | 12 +- Commands/basecommands.cs | 6 +- Commands/basecomms.cs | 24 +-- Commands/funcommands.cs | 7 +- Commands/playercommands.cs | 37 +++-- .../Migrations/009_BanAllUsedIpAddress.sql | 8 + Events.cs | 15 ++ Managers/BanManager.cs | 148 ++++++++++-------- Managers/MuteManager.cs | 15 +- VERSION | 2 +- 11 files changed, 162 insertions(+), 118 deletions(-) create mode 100644 Database/Migrations/009_BanAllUsedIpAddress.sql diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index c2f51b5..5fc54c8 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -39,7 +39,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)"); public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.4.8b"; + public override string ModuleVersion => "1.4.9a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -112,9 +112,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -121,7 +121,7 @@ namespace CS2_SimpleAdmin } if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -207,7 +207,7 @@ namespace CS2_SimpleAdmin } if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -228,7 +228,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -321,7 +321,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -341,7 +341,7 @@ namespace CS2_SimpleAdmin } if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index 042751b..f5c5fee 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -521,7 +521,7 @@ namespace CS2_SimpleAdmin playersToTarget.ForEach(player => { - if (player == null || !player.IsValid) + if (!player.IsValid) return; if (caller!.CanTarget(player)) @@ -549,7 +549,7 @@ namespace CS2_SimpleAdmin if (player != null && !player.IsBot) using (new WithTemporaryCulture(player.GetLanguage())) { - player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]); + player.PrintToCenter(_localizer!["sa_player_kick_message", reason, callerName]); } if (player != null && player.UserId.HasValue) AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason), @@ -563,7 +563,7 @@ namespace CS2_SimpleAdmin } if (caller != null && (caller.UserId == null || SilentPlayers.Contains(caller.Slot))) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) diff --git a/Commands/basecomms.cs b/Commands/basecomms.cs index bebe553..b9d40a3 100644 --- a/Commands/basecomms.cs +++ b/Commands/basecomms.cs @@ -87,7 +87,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -110,7 +110,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -187,7 +187,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -208,7 +208,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -424,7 +424,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -444,7 +444,7 @@ namespace CS2_SimpleAdmin } if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -524,7 +524,7 @@ namespace CS2_SimpleAdmin } if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -544,7 +544,7 @@ namespace CS2_SimpleAdmin } if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -746,7 +746,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -769,7 +769,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -850,7 +850,7 @@ namespace CS2_SimpleAdmin } if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -870,7 +870,7 @@ namespace CS2_SimpleAdmin } if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { diff --git a/Commands/funcommands.cs b/Commands/funcommands.cs index f114b2f..1cbe24b 100644 --- a/Commands/funcommands.cs +++ b/Commands/funcommands.cs @@ -19,7 +19,6 @@ namespace CS2_SimpleAdmin var targets = GetTarget(command); if (targets == null) return; var playersToTarget = targets.Players.Where(player => - player is not null && player.IsValid && player is { PawnIsAlive: true, IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected }).ToList(); @@ -42,7 +41,7 @@ namespace CS2_SimpleAdmin Helper.LogCommand(caller, $"css_noclip {player.PlayerName}"); if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -88,7 +87,7 @@ namespace CS2_SimpleAdmin AddTimer(time, () => player?.Pawn.Value!.Unfreeze(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -129,7 +128,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { diff --git a/Commands/playercommands.cs b/Commands/playercommands.cs index 5b580c1..11ccede 100644 --- a/Commands/playercommands.cs +++ b/Commands/playercommands.cs @@ -45,7 +45,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -126,7 +126,7 @@ namespace CS2_SimpleAdmin callerName ??= caller == null ? "Console" : caller.PlayerName; if (caller != null && (SilentPlayers.Contains(caller.Slot))) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -173,7 +173,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -221,7 +221,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -270,7 +270,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -321,7 +321,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -370,7 +370,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -425,7 +425,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -473,15 +473,20 @@ namespace CS2_SimpleAdmin if (command != null) { Helper.LogCommand(caller, command); - Helper.SendDiscordLogMessage(caller, command, DiscordWebhookClientLog, _localizer); + if (_localizer != null) + Helper.SendDiscordLogMessage(caller, command, DiscordWebhookClientLog, _localizer); } + if (_localizer == null) + return; + if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { - StringBuilder sb = new(_localizer!["sa_prefix"]); + StringBuilder sb = new(_localizer["sa_prefix"]); sb.Append(_localizer["sa_admin_slap_message", callerName, player.PlayerName]); controller.PrintToChat(sb.ToString()); } @@ -569,7 +574,7 @@ namespace CS2_SimpleAdmin if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -611,7 +616,7 @@ namespace CS2_SimpleAdmin if (!caller!.CanTarget(player)) return; if (caller == null || !SilentPlayers.Contains(caller.Slot)) { - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -667,7 +672,7 @@ namespace CS2_SimpleAdmin } if (caller != null && SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -712,7 +717,7 @@ namespace CS2_SimpleAdmin }); if (SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { @@ -757,7 +762,7 @@ namespace CS2_SimpleAdmin }); if (SilentPlayers.Contains(caller.Slot)) return; - foreach (var controller in Helper.GetValidPlayers()) + foreach (var controller in Helper.GetValidPlayers().Where(controller => controller is { IsValid: true, IsBot: false })) { using (new WithTemporaryCulture(controller.GetLanguage())) { diff --git a/Database/Migrations/009_BanAllUsedIpAddress.sql b/Database/Migrations/009_BanAllUsedIpAddress.sql new file mode 100644 index 0000000..2fa6688 --- /dev/null +++ b/Database/Migrations/009_BanAllUsedIpAddress.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS `sa_players_ips` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `steamid` bigint(20) NOT NULL, + `address` varchar(64) NOT NULL, + `used_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `steamid` (`steamid`,`address`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; diff --git a/Events.cs b/Events.cs index ed307ef..70853d8 100644 --- a/Events.cs +++ b/Events.cs @@ -182,6 +182,21 @@ public partial class CS2_SimpleAdmin BanManager banManager = new(_database, Config); MuteManager muteManager = new(_database); + try + { + await using var connection = await _database.GetConnectionAsync(); + + const string query = @"INSERT IGNORE INTO `sa_players_ips` (steamid, address) + VALUES (@SteamID, @IPAddress)"; + + await connection.ExecuteAsync(query, new + { + SteamID = playerInfo.SteamId, + IPAddress = playerInfo.IpAddress, + }); + } + catch { } + try { // Check if the player is banned diff --git a/Managers/BanManager.cs b/Managers/BanManager.cs index 073b768..bfb43cd 100644 --- a/Managers/BanManager.cs +++ b/Managers/BanManager.cs @@ -1,9 +1,8 @@ -using System.Text; -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using Dapper; using Microsoft.Extensions.Logging; using MySqlConnector; -using Serilog.Core; +using System.Text; namespace CS2_SimpleAdmin; @@ -151,6 +150,25 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf }; banCount = await connection.ExecuteScalarAsync(sql, parameters); + + if (config.BanType == 1 && banCount == 0) + { + sql = """ + SELECT + COUNT(*) + FROM + sa_bans + JOIN sa_players_ips ON sa_bans.player_steamid = sa_players_ips.steamid + WHERE + sa_bans.status = 'ACTIVE' + AND sa_players_ips.address = @PlayerIP; + """; + + banCount = await connection.ExecuteScalarAsync(sql, new + { + PlayerIP = player.IpAddress + }); + } } catch (Exception) { @@ -215,9 +233,9 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf var sqlRetrieveBans = config.MultiServerMode ? "SELECT id FROM sa_bans WHERE (player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern) AND status = 'ACTIVE'" : "SELECT id FROM sa_bans WHERE (player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern) AND status = 'ACTIVE' AND server_id = @serverid"; - + var bans = await connection.QueryAsync(sqlRetrieveBans, new { pattern = playerPattern, serverid = CS2_SimpleAdmin.ServerId }); - + var bansList = bans as dynamic[] ?? bans.ToArray(); if (bansList.Length == 0) return; @@ -298,73 +316,73 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf catch { } } */ - + public async Task CheckOnlinePlayers(List<(string? IpAddress, ulong SteamID, int? UserId, int Slot)> players) { - try - { - await using var connection = await database.GetConnectionAsync(); - bool checkIpBans = config.BanType > 0; + try + { + await using var connection = await database.GetConnectionAsync(); + bool checkIpBans = config.BanType > 0; - var filteredPlayers = players.Where(p => p.UserId.HasValue).ToList(); - - var steamIds = filteredPlayers.Select(p => p.SteamID).Distinct().ToList(); - var ipAddresses = filteredPlayers - .Where(p => !string.IsNullOrEmpty(p.IpAddress)) - .Select(p => p.IpAddress) - .Distinct() - .ToList(); + var filteredPlayers = players.Where(p => p.UserId.HasValue).ToList(); - var sql = new StringBuilder(); - sql.Append("SELECT `player_steamid`, `player_ip` FROM `sa_bans` WHERE `status` = 'ACTIVE' "); - - if (config.MultiServerMode) - { - sql.Append("AND (player_steamid IN @SteamIDs "); - if (checkIpBans && ipAddresses.Count != 0) - { - sql.Append("OR player_ip IN @IpAddresses"); - } - sql.Append(')'); - } - else - { - sql.Append("AND server_id = @ServerId AND (player_steamid IN @SteamIDs "); - if (checkIpBans && ipAddresses.Count != 0) - { - sql.Append("OR player_ip IN @IpAddresses"); - } - sql.Append(')'); - } + var steamIds = filteredPlayers.Select(p => p.SteamID).Distinct().ToList(); + var ipAddresses = filteredPlayers + .Where(p => !string.IsNullOrEmpty(p.IpAddress)) + .Select(p => p.IpAddress) + .Distinct() + .ToList(); - var bannedPlayers = await connection.QueryAsync<(ulong PlayerSteamID, string PlayerIP)>( - sql.ToString(), - new - { - SteamIDs = steamIds, - IpAddresses = checkIpBans ? ipAddresses : [], - ServerId = CS2_SimpleAdmin.ServerId - }); + var sql = new StringBuilder(); + sql.Append("SELECT `player_steamid`, `player_ip` FROM `sa_bans` WHERE `status` = 'ACTIVE' "); - var valueTuples = bannedPlayers.ToList(); - var bannedSteamIds = valueTuples.Select(b => b.PlayerSteamID).ToHashSet(); - var bannedIps = valueTuples.Select(b => b.PlayerIP).ToHashSet(); + if (config.MultiServerMode) + { + sql.Append("AND (player_steamid IN @SteamIDs "); + if (checkIpBans && ipAddresses.Count != 0) + { + sql.Append("OR player_ip IN @IpAddresses"); + } + sql.Append(')'); + } + else + { + sql.Append("AND server_id = @ServerId AND (player_steamid IN @SteamIDs "); + if (checkIpBans && ipAddresses.Count != 0) + { + sql.Append("OR player_ip IN @IpAddresses"); + } + sql.Append(')'); + } - foreach (var player in filteredPlayers.Where(player => bannedSteamIds.Contains(player.SteamID) || - (checkIpBans && bannedIps.Contains(player.IpAddress ?? "")))) - { - if (!player.UserId.HasValue) continue; - - await Server.NextFrameAsync(() => - { - Helper.KickPlayer(player.UserId.Value, "Banned"); - }); - } - } - catch (Exception ex) - { - CS2_SimpleAdmin._logger?.LogError($"Error checking online players: {ex.Message}"); - } + var bannedPlayers = await connection.QueryAsync<(ulong PlayerSteamID, string PlayerIP)>( + sql.ToString(), + new + { + SteamIDs = steamIds, + IpAddresses = checkIpBans ? ipAddresses : [], + ServerId = CS2_SimpleAdmin.ServerId + }); + + var valueTuples = bannedPlayers.ToList(); + var bannedSteamIds = valueTuples.Select(b => b.PlayerSteamID).ToHashSet(); + var bannedIps = valueTuples.Select(b => b.PlayerIP).ToHashSet(); + + foreach (var player in filteredPlayers.Where(player => bannedSteamIds.Contains(player.SteamID) || + (checkIpBans && bannedIps.Contains(player.IpAddress ?? "")))) + { + if (!player.UserId.HasValue) continue; + + await Server.NextFrameAsync(() => + { + Helper.KickPlayer(player.UserId.Value, "Banned"); + }); + } + } + catch (Exception ex) + { + CS2_SimpleAdmin._logger?.LogError($"Error checking online players: {ex.Message}"); + } } public async Task ExpireOldBans() diff --git a/Managers/MuteManager.cs b/Managers/MuteManager.cs index 411f105..b718785 100644 --- a/Managers/MuteManager.cs +++ b/Managers/MuteManager.cs @@ -1,5 +1,4 @@ -using CounterStrikeSharp.API.Core; -using Dapper; +using Dapper; using Microsoft.Extensions.Logging; namespace CS2_SimpleAdmin; @@ -98,7 +97,7 @@ internal class MuteManager(Database.Database database) await using var connection = await database.GetConnectionAsync(); var currentTime = DateTime.UtcNow.ToLocalTime(); var sql = ""; - + if (CS2_SimpleAdmin.Instance.Config.MultiServerMode) { sql = CS2_SimpleAdmin.Instance.Config.TimeMode == 1 @@ -141,7 +140,7 @@ internal class MuteManager(Database.Database database) return 0; } } - + public async Task CheckOnlineModeMutes(List<(string? IpAddress, ulong SteamID, int? UserId, int Slot)> players) { try @@ -158,7 +157,7 @@ internal class MuteManager(Database.Database database) await connection.ExecuteAsync(sql, new { PlayerSteamID = SteamID, serverid = CS2_SimpleAdmin.ServerId }); }*/ - + for (var i = 0; i < players.Count; i += batchSize) { var batch = players.Skip(i).Take(batchSize); @@ -171,7 +170,7 @@ internal class MuteManager(Database.Database database) await connection.ExecuteAsync(sql, parametersList); } - + sql = CS2_SimpleAdmin.Instance.Config.MultiServerMode ? "SELECT * FROM `sa_mutes` WHERE player_steamid = @PlayerSteamID AND passed >= duration AND duration > 0 AND status = 'ACTIVE'" : "SELECT * FROM `sa_mutes` WHERE player_steamid = @PlayerSteamID AND passed >= duration AND duration > 0 AND status = 'ACTIVE' AND server_id = @serverid"; @@ -180,7 +179,7 @@ internal class MuteManager(Database.Database database) foreach (var (IpAddress, SteamID, UserId, Slot) in players) { var muteRecords = await connection.QueryAsync(sql, new { PlayerSteamID = SteamID, serverid = CS2_SimpleAdmin.ServerId }); - + foreach (var muteRecord in muteRecords) { DateTime endDateTime = muteRecord.ends; @@ -268,7 +267,7 @@ internal class MuteManager(Database.Database database) { await using var connection = await database.GetConnectionAsync(); var sql = ""; - + if (CS2_SimpleAdmin.Instance.Config.MultiServerMode) { sql = CS2_SimpleAdmin.Instance.Config.TimeMode == 1 diff --git a/VERSION b/VERSION index 618c21e..125ddaa 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.8b \ No newline at end of file +1.4.9a \ No newline at end of file