From d16b92e6942e1f60a0ee5fcd9f9a561cdd7b749e Mon Sep 17 00:00:00 2001 From: daffyyyy Date: Sun, 3 Dec 2023 21:05:38 +0100 Subject: [PATCH] IP address banning - IP address banning **Require CounterStrikeSharp v98** --- BanManager.cs | 49 +++++++++++++++++++++++++++----- CS2-SimpleAdmin.cs | 63 ++++++++++++++++++++++++++++++++++++++++-- CS2-SimpleAdmin.csproj | 6 ++-- Config.cs | 5 +++- Events.cs | 12 +++++++- Helper.cs | 15 ++++++++++ README.md | 3 +- 7 files changed, 137 insertions(+), 16 deletions(-) diff --git a/BanManager.cs b/BanManager.cs index 5d6fe3e..9f579d9 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -25,12 +25,13 @@ namespace CS2_SimpleAdmin DateTime now = DateTime.Now; DateTime futureTime = now.AddMinutes(time); - var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + - "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + + "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; _dbConnection.Execute(sql, new { playerSteamid = player.AuthorizedSteamID.SteamId64.ToString(), playerName = player.PlayerName, + playerIp = player.IpAddress!.Split(":")[0], adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), adminName = issuer == null ? "Console" : issuer.PlayerName, banReason = reason, @@ -68,16 +69,50 @@ namespace CS2_SimpleAdmin _dbConnection.Close(); } - public bool IsPlayerBanned(string steamId) + public void AddBanByIp(string playerIp, CCSPlayerController? issuer, string reason, int time = 0) + { + if (string.IsNullOrEmpty(playerIp)) return; + + _dbConnection.Open(); + + DateTime now = DateTime.Now; + DateTime futureTime = now.AddMinutes(time); + + var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + + "VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + + _dbConnection.Execute(sql, new + { + playerIp, + adminSteamid = issuer == null ? "Console" : issuer?.AuthorizedSteamID?.SteamId64.ToString(), + adminName = issuer == null ? "Console" : issuer.PlayerName, + banReason = reason, + duration = time, + ends = futureTime, + created = now + }); + + _dbConnection.Close(); + } + + public bool IsPlayerBanned(string steamId, string? ipAddress = null) { _dbConnection.Open(); DateTime now = DateTime.Now; - string sql = "SELECT COUNT(*) FROM sa_bans WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; - int banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, CurrentTime = now }); + string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; - _dbConnection.Close(); + int banCount; + + if (!string.IsNullOrEmpty(ipAddress)) + { + banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, PlayerIP = ipAddress, CurrentTime = now }); + } + else + { + banCount = _dbConnection.ExecuteScalar(sql, new { PlayerSteamID = steamId, PlayerIP = DBNull.Value, CurrentTime = now }); + } return banCount > 0; } @@ -91,7 +126,7 @@ namespace CS2_SimpleAdmin _dbConnection.Open(); - string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern AND status = 'ACTIVE'"; + string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'"; _dbConnection.Execute(sqlUnban, new { pattern = playerPattern }); _dbConnection.Close(); diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 32843e6..54b8e90 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1,5 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; @@ -11,6 +12,7 @@ using Microsoft.Extensions.Logging; using MySqlConnector; namespace CS2_SimpleAdmin; +[MinimumApiVersion(98)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public List gaggedPlayers = new List(); @@ -19,7 +21,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => ""; public override string ModuleAuthor => "daffyy"; - public override string ModuleVersion => "1.0.1"; + public override string ModuleVersion => "1.0.3"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -59,8 +61,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnBanIp(CCSPlayerController? caller, CommandInfo command) + { + if (command.ArgCount < 2) + return; + if (string.IsNullOrEmpty(command.GetArg(1))) return; + + string ipAddress = command.GetArg(1); + + if (!Helper.IsValidIP(ipAddress)) + { + command.ReplyToCommand($"Invalid IP address."); + return; + } + + int time = 0; + string reason = "Unknown"; + + BanManager _banManager = new(dbConnectionString); + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3) + reason = command.GetArg(3); + + _banManager.AddBanByIp(ipAddress, caller, reason, time); + + List matches = Helper.GetPlayerFromIp(ipAddress); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null) + { + player!.Pawn.Value!.Freeze(); + + if (time == 0) + { + player!.PrintToCenter($"{Config.Messages.PlayerBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessagePerm}".Replace("{REASON}", reason).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + else + { + player!.PrintToCenter($"{Config.Messages.PlayerBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName)); + Server.PrintToChatAll(Helper.ReplaceTags($" {Config.Prefix} {Config.Messages.AdminBanMessageTime}".Replace("{REASON}", reason).Replace("{TIME}", time.ToString()).Replace("{ADMIN}", caller?.PlayerName == null ? "Console" : caller.PlayerName).Replace("{PLAYER}", player.PlayerName))); + } + + AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId)); + } + } + command.ReplyToCommand($"Banned player with IP address {ipAddress}."); + } + [ConsoleCommand("css_unban")] [RequiresPermissions("@css/unban")] - [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnUnbanCommand(CCSPlayerController? caller, CommandInfo command) { if (command.GetArg(1).Length <= 1) diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index e0ae93f..3c9bbfc 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -9,9 +9,9 @@ - - - + + + diff --git a/Config.cs b/Config.cs index fccdaa6..4967edd 100644 --- a/Config.cs +++ b/Config.cs @@ -42,7 +42,10 @@ namespace CS2_SimpleAdmin [JsonPropertyName("AdminSayPrefix")] public string AdminSayPrefix { get; set; } = "{RED}ADMIN: {DEFAULT}"; [JsonPropertyName("AdminHelpCommand")] - public string AdminHelpCommand { get; set; } = "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_kick <#userid or name> [reason] - Kick player\n" + + public string AdminHelpCommand { get; set; } = "{GREEN}[ CS2-SimpleAdmin HELP ]{DEFAULT}\n- css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player\n- css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64\n" + + "- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address\n- css_unban - Unban player\n" + + "- css_kick <#userid or name> [reason] - Kick player\n- css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player\n- css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64\n" + + "- css_unmute - Kill player\n- css_slap <#userid or name> [damage] - Slap player\n- css_map - Change map\n- css_say - Say message as admin in chat\n" + "- css_psay <#userid or name> - Sends private message to player\n- css_csay - Say message as admin in center\n- css_hsay - Say message as admin in hud\n" + "- css_noclip <#userid or name> - Toggle noclip for player\n- css_freeze <#userid or name> [duration] - Freeze player\n- css_unfreeze <#userid or name> - Unfreeze player\n" + diff --git a/Events.cs b/Events.cs index cce3bf4..10a921a 100644 --- a/Events.cs +++ b/Events.cs @@ -46,7 +46,17 @@ namespace CS2_SimpleAdmin BanManager _banManager = new(dbConnectionString); MuteManager _muteManager = new(dbConnectionString); - bool isBanned = _banManager.IsPlayerBanned(player.AuthorizedSteamID.SteamId64.ToString()); + + bool isBanned = false; + if (player.IpAddress != null) + { + isBanned = _banManager.IsPlayerBanned(player.AuthorizedSteamID.SteamId64.ToString(), player.IpAddress.Split(":")[0]); + } + else + { + isBanned = _banManager.IsPlayerBanned(player.AuthorizedSteamID.SteamId64.ToString()); + } + List activeMutes = _muteManager.IsPlayerMuted(player.AuthorizedSteamID.SteamId64.ToString()); if (activeMutes.Count > 0) diff --git a/Helper.cs b/Helper.cs index fb534bf..bf6940d 100644 --- a/Helper.cs +++ b/Helper.cs @@ -24,6 +24,14 @@ namespace CS2_SimpleAdmin ); } + public static List GetPlayerFromIp(string ipAddress) + { + return Utilities.GetPlayers().FindAll(x => + x.IpAddress != null && + x.IpAddress.Split(":")[0].Equals(ipAddress) + ); + } + public static bool IsValidSteamID64(string input) { string pattern = @"^\d{17}$"; @@ -31,6 +39,13 @@ namespace CS2_SimpleAdmin return Regex.IsMatch(input, pattern); } + public static bool IsValidIP(string input) + { + string pattern = @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; + + return Regex.IsMatch(input, pattern); + } + public static TargetResult GetTarget(string target, out CCSPlayerController? player) { player = null; diff --git a/README.md b/README.md index 2122681..4e81e1c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ It's only plugin base, I don't have much time for more extensive development, so - css_admin - Display all admin commands // @css/generic - css_ban <#userid or name> [time in minutes/0 perm] [reason] - Ban player // @css/ban - css_addban [time in minutes/0 perm] [reason] - Ban player via steamid64 // @css/ban -- css_unban - Unban player // @css/unban +- css_banip [time in minutes/0 perm] [reason] - Ban player via IP address // @css/ban +- css_unban - Unban player // @css/unban - css_kick <#userid or name> [reason] - Kick player / @css/kick - css_gag <#userid or name> [time in minutes/0 perm] [reason] - Gag player // @css/chat - css_addgag [time in minutes/0 perm] [reason] - Gag player via steamid64 // @css/chat