diff --git a/BanManager.cs b/BanManager.cs index eb2f77a..1eb7662 100644 --- a/BanManager.cs +++ b/BanManager.cs @@ -1,7 +1,9 @@ using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Entities; using Dapper; using MySqlConnector; using System.Data; +using System.Xml.Linq; namespace CS2_SimpleAdmin { @@ -40,6 +42,31 @@ namespace CS2_SimpleAdmin _dbConnection.Close(); } + public void AddBanBySteamid(string playerSteamId, CCSPlayerController? issuer, string reason, int time = 0) + { + if (string.IsNullOrEmpty(playerSteamId)) return; + + _dbConnection.Open(); + + DateTime now = DateTime.Now; + DateTime futureTime = now.AddMinutes(time); + + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`) " + + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created)"; + _dbConnection.Execute(sql, new + { + playerSteamid = playerSteamId, + 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) { _dbConnection.Open(); @@ -54,6 +81,21 @@ namespace CS2_SimpleAdmin return banCount > 0; } + public void UnbanPlayer(string playerPattern) + { + if (playerPattern == null || playerPattern.Length <= 1) + { + return; + } + + _dbConnection.Open(); + + string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern"; + _dbConnection.Execute(sqlUnban, new { pattern = playerPattern }); + + _dbConnection.Close(); + } + public void ExpireOldBans() { _dbConnection.Open(); diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 962f116..002c1fd 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -8,7 +8,6 @@ using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Logging; using MySqlConnector; -using static System.Net.Mime.MediaTypeNames; namespace CS2_SimpleAdmin; public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig @@ -58,7 +57,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig Helper.KickPlayer(player!.UserId)); + } + [ConsoleCommand("css_addban")] + [RequiresPermissions("@css/ban")] + [CommandHelper(minArgs: 1, usage: " [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnAddBanCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.ArgCount < 2) + return; + if (string.IsNullOrEmpty(command.GetArg(1))) return; + + string steamid = command.GetArg(1); + + if (!Helper.IsValidSteamID64(steamid)) + { + command.ReplyToCommand($"Invalid SteamID64."); + 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.AddBanBySteamid(steamid, caller, reason, time); + + List matches = Helper.GetPlayerFromSteamid64(steamid); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null) + { + 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(10.0f, () => Helper.KickPlayer(player.UserId)); + } + } + command.ReplyToCommand($"Banned player with steamid {steamid}."); + } + + [ConsoleCommand("css_unban")] + [RequiresPermissions("@css/unban")] + [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnUnbanCommand(CCSPlayerController? caller, CommandInfo command) + { + if (command.GetArg(1).Length <= 1) + { + command.ReplyToCommand($"Too short pattern to search."); + return; + } + + string pattern = command.GetArg(1); + BanManager _banManager = new(dbConnectionString); + + _banManager.UnbanPlayer(pattern); + + command.ReplyToCommand($"Unbanned player with pattern {pattern}."); } [ConsoleCommand("css_slay")] diff --git a/Helper.cs b/Helper.cs index bd5eceb..7868106 100644 --- a/Helper.cs +++ b/Helper.cs @@ -3,6 +3,7 @@ using CounterStrikeSharp.API; using MySqlConnector; using CounterStrikeSharp.API.Modules.Utils; using System.Reflection; +using System.Text.RegularExpressions; namespace CS2_SimpleAdmin { @@ -15,6 +16,18 @@ namespace CS2_SimpleAdmin return Utilities.GetPlayers().FindAll(x => x.PlayerName.Contains(name, StringComparison.OrdinalIgnoreCase)); } + public static List GetPlayerFromSteamid64(string steamid) + { + return Utilities.GetPlayers().FindAll(x => x.AuthorizedSteamID!.SteamId64.ToString().Equals(steamid)); + } + + public static bool IsValidSteamID64(string input) + { + string pattern = @"^\d{17}$"; + + 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 78a726c..87a9044 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ It's only plugin base, I don't have much time for more extensive development, so ### Commands - 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_kick <#userid or name> [reason] - Kick player / @css/kick - css_slay <#userid or name> - Kill player // @css/slay - css_slap <#userid or name> [damage] - Slap player // @css/slay