From a8904f2d8aa7bbfd9ce7f2c96e36ca227cb4a98b Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 23 Mar 2024 23:41:17 +0100 Subject: [PATCH 01/16] 1.3.6d - IMPORTANT - Fixed pool size - Fixed `css_rename` - Updated CounterStrikeSharp - Minor changes --- CS2-SimpleAdmin.cs | 12 +- CS2-SimpleAdmin.csproj | 6 +- Commands/basecommands.cs | 7 +- Commands/playercommands.cs | 4 +- Database/database_setup.sql | 2 +- Events.cs | 188 ++++++++++++++++++------------- Extensions/PlayerExtensions.cs | 2 +- Helper.cs | 4 +- Managers/PlayerPenaltyManager.cs | 27 +++-- 9 files changed, 147 insertions(+), 105 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index a25f03d..2a159d6 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1,4 +1,5 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; @@ -12,7 +13,7 @@ using System.Collections.Concurrent; namespace CS2_SimpleAdmin; -[MinimumApiVersion(191)] +[MinimumApiVersion(198)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static CS2_SimpleAdmin Instance { get; private set; } = new(); @@ -38,7 +39,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.3.6c"; + public override string ModuleVersion => "1.3.6d"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -71,7 +72,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 21 ? 640 : 210), + ConnectionIdleTimeout = 30 }; dbConnectionString = builder.ConnectionString; diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index dc0a740..57b9de1 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -10,10 +10,10 @@ - + - - + + diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index ff564a6..22331a0 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -33,7 +33,12 @@ namespace CS2_SimpleAdmin commandSql.CommandText = commandText; await commandSql.ExecuteNonQueryAsync(); - command.ReplyToCommand("Successfully updated the database"); + commandText = "ALTER TABLE `sa_servers` MODIFY COLUMN `hostname` varchar(128);"; + using var commandSql1 = connection.CreateCommand(); + commandSql1.CommandText = commandText; + await commandSql1.ExecuteNonQueryAsync(); + + command.ReplyToCommand($"Successfully updated the database - {ModuleVersion}"); } catch (Exception ex) { diff --git a/Commands/playercommands.cs b/Commands/playercommands.cs index 089e84d..a148d6f 100644 --- a/Commands/playercommands.cs +++ b/Commands/playercommands.cs @@ -662,7 +662,6 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - player.Rename(newName); if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -676,6 +675,8 @@ namespace CS2_SimpleAdmin } } } + + player.Rename(newName); } }); } @@ -815,6 +816,7 @@ namespace CS2_SimpleAdmin _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); } + Helper.LogCommand(caller, command); playersToTarget.ForEach(player => diff --git a/Database/database_setup.sql b/Database/database_setup.sql index 44622a4..de7e1b4 100644 --- a/Database/database_setup.sql +++ b/Database/database_setup.sql @@ -44,7 +44,7 @@ CREATE TABLE IF NOT EXISTS `sa_admins` ( CREATE TABLE IF NOT EXISTS `sa_servers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `address` varchar(64) NOT NULL, - `hostname` varchar(64) NOT NULL, + `hostname` varchar(128) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `address` (`address`) ) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; \ No newline at end of file diff --git a/Events.cs b/Events.cs index e22b946..2ede139 100644 --- a/Events.cs +++ b/Events.cs @@ -32,70 +32,84 @@ public partial class CS2_SimpleAdmin CCSPlayerController? player = @event.Userid; #if DEBUG - Logger.LogCritical("[OnClientDisconnect] Before"); + Logger.LogCritical("[OnClientDisconnect] Before"); #endif - if (player is null || !player.IsValid || string.IsNullOrEmpty(player.IpAddress) || player.IsBot || player.IsHLTV) return HookResult.Continue; - if (!loadedPlayers.Contains(player.Slot)) return HookResult.Continue; + if (player == null || !player.IsValid || string.IsNullOrEmpty(player.IpAddress) || player.IsBot || player.IsHLTV) + { + return HookResult.Continue; + } + + if (!loadedPlayers.Contains(player.Slot)) + { + return HookResult.Continue; + } #if DEBUG - Logger.LogCritical("[OnClientDisconnect] After Check"); + Logger.LogCritical("[OnClientDisconnect] After Check"); #endif - - PlayerPenaltyManager playerPenaltyManager = new(); - playerPenaltyManager.RemoveAllPenalties(player.Slot); - - if (TagsDetected) - Server.ExecuteCommand($"css_tag_unmute {player.SteamID}"); - - if (silentPlayers.Contains(player.Slot)) - RemoveFromConcurrentBag(silentPlayers, player.Slot); - if (godPlayers.Contains(player.Slot)) - RemoveFromConcurrentBag(godPlayers, player.Slot); - - loadedPlayers.Remove(player.Slot); - - SteamID? authorizedSteamID = player.AuthorizedSteamID; - - if (authorizedSteamID == null) return HookResult.Continue; - - Task.Run(() => + try { - if (AdminSQLManager._adminCache.TryGetValue(authorizedSteamID, out DateTime? expirationTime) + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + playerPenaltyManager.RemoveAllPenalties(player.Slot); + + if (TagsDetected) + { + Server.ExecuteCommand($"css_tag_unmute {player.SteamID}"); + } + + if (silentPlayers.Contains(player.Slot)) + { + RemoveFromConcurrentBag(silentPlayers, player.Slot); + } + + if (godPlayers.Contains(player.Slot)) + { + RemoveFromConcurrentBag(godPlayers, player.Slot); + } + + SteamID? authorizedSteamID = player.AuthorizedSteamID; + if (authorizedSteamID != null && AdminSQLManager._adminCache.TryGetValue(authorizedSteamID, out DateTime? expirationTime) && expirationTime <= DateTime.Now) { AdminManager.ClearPlayerPermissions(authorizedSteamID); AdminManager.RemovePlayerAdminData(authorizedSteamID); } - }); - return HookResult.Continue; + loadedPlayers.Remove(player.Slot); + + return HookResult.Continue; + } + catch (Exception ex) + { + Logger.LogError($"An error occurred in OnClientDisconnect: {ex.Message}"); + return HookResult.Continue; + } } + + [GameEventHandler] public HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info) { CCSPlayerController? player = @event.Userid; -#if DEBUG - Logger.LogCritical($"[OnPlayerConnect] Before check {player.PlayerName} : {player.IpAddress}"); -#endif - if (player is null - || string.IsNullOrEmpty(player.IpAddress) || player.IpAddress.Contains("127.0.0.1") - || player.IsBot || player.IsHLTV || !player.UserId.HasValue) return HookResult.Continue; -#if DEBUG - Logger.LogCritical("[OnPlayerConnect] After Check"); -#endif + if (player == null || string.IsNullOrEmpty(player.IpAddress) || player.IpAddress.Contains("127.0.0.1") + || player.IsBot || player.IsHLTV || !player.UserId.HasValue) + return HookResult.Continue; + string ipAddress = player.IpAddress.Split(":")[0]; + // Check if the player's IP or SteamID is in the bannedPlayers list if (bannedPlayers.Contains(ipAddress) || bannedPlayers.Contains(player.SteamID.ToString())) { - if (!player.UserId.HasValue) return HookResult.Continue; - Helper.KickPlayer(player.UserId.Value, "Banned"); + // Kick the player if banned + if (player.UserId.HasValue) + Helper.KickPlayer(player.UserId.Value, "Banned"); + return HookResult.Continue; } - if (_database == null || !player.UserId.HasValue || player.UserId == null) - return HookResult.Continue; + if (_database == null) return HookResult.Continue; PlayerInfo playerInfo = new PlayerInfo { @@ -107,12 +121,13 @@ public partial class CS2_SimpleAdmin IpAddress = ipAddress }; - BanManager _banManager = new(_database, Config); - MuteManager _muteManager = new(_database); - PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); - Task.Run(async () => { + // Initialize BanManager, MuteManager, and PlayerPenaltyManager within the async delegate + BanManager _banManager = new(_database, Config); + MuteManager _muteManager = new(_database); + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + if (await _banManager.IsPlayerBanned(playerInfo)) { if (playerInfo.IpAddress != null && !bannedPlayers.Contains(playerInfo.IpAddress)) @@ -178,6 +193,7 @@ public partial class CS2_SimpleAdmin } }); + // Add player to loadedPlayers if (!loadedPlayers.Contains(player.Slot)) loadedPlayers.Add(player.Slot); @@ -197,7 +213,9 @@ public partial class CS2_SimpleAdmin public HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) { - if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0) return HookResult.Continue; + if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0 || info.GetArg(1).StartsWith("/") + || info.GetArg(1).StartsWith("!") && info.GetArg(1).Length >= 12) + return HookResult.Continue; PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); @@ -209,7 +227,9 @@ public partial class CS2_SimpleAdmin public HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info) { - if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0) return HookResult.Continue; + if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0 || info.GetArg(1).StartsWith("/") + || info.GetArg(1).StartsWith("!") && info.GetArg(1).Length >= 12) + return HookResult.Continue; PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); @@ -262,63 +282,68 @@ public partial class CS2_SimpleAdmin if (_database == null) return; - AddTimer(61.0f, async () => + AddTimer(61.0f, () => { + #if DEBUG Logger.LogCritical("[OnMapStart] Expired check"); #endif - AdminSQLManager _adminManager = new(_database); - BanManager _banManager = new(_database, Config); - MuteManager _muteManager = new(_database); - await _banManager.ExpireOldBans(); - await _muteManager.ExpireOldMutes(); - await _adminManager.DeleteOldAdmins(); - bannedPlayers.Clear(); - - Server.NextFrame(() => + Task.Run(async () => { - try + AdminSQLManager _adminManager = new AdminSQLManager(_database); + BanManager _banManager = new BanManager(_database, Config); + MuteManager _muteManager = new MuteManager(_database); + await _banManager.ExpireOldBans(); + await _muteManager.ExpireOldMutes(); + await _adminManager.DeleteOldAdmins(); + + bannedPlayers.Clear(); + + Server.NextFrame(() => { - foreach (CCSPlayerController player in Helper.GetValidPlayers()) + try { - if (playerPenaltyManager.IsSlotInPenalties(player.Slot)) + foreach (CCSPlayerController player in Helper.GetValidPlayers()) { - if (!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) - player.VoiceFlags = VoiceFlags.Normal; - - if (!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) && !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) + if (playerPenaltyManager.IsSlotInPenalties(player.Slot)) { - if (TagsDetected) - Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); - } + if (!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) + player.VoiceFlags = VoiceFlags.Normal; - if ( - !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence) && - !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && - !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) - ) - { - player.VoiceFlags = VoiceFlags.Normal; + if (!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) && !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) + { + if (TagsDetected) + Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); + } - if (TagsDetected) - Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); + if ( + !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence) && + !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && + !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) + ) + { + player.VoiceFlags = VoiceFlags.Normal; + + if (TagsDetected) + Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); + } } } - } - } - catch (Exception) { } - }); - playerPenaltyManager.RemoveExpiredPenalties(); + playerPenaltyManager.RemoveExpiredPenalties(); + } + catch (Exception) { } + }); + }); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - AddTimer(2.0f, async () => + AddTimer(2.5f, () => { string? address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}"; string? hostname = ConVar.Find("hostname")!.StringValue; - await Task.Run(async () => + Task.Run(async () => { AdminSQLManager _adminManager = new(_database); try @@ -354,6 +379,7 @@ public partial class CS2_SimpleAdmin await _adminManager.GiveAllFlags(); }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(3.0f, () => diff --git a/Extensions/PlayerExtensions.cs b/Extensions/PlayerExtensions.cs index eb67428..0c2f6c5 100644 --- a/Extensions/PlayerExtensions.cs +++ b/Extensions/PlayerExtensions.cs @@ -121,7 +121,7 @@ public static class PlayerExtensions if (CS2_SimpleAdmin.Instance == null) return; - newName = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + newName = newName ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; SchemaString playerName = new SchemaString(controller, "m_iszPlayerName"); playerName.Set(newName + " "); diff --git a/Helper.cs b/Helper.cs index 51e7548..7a38528 100644 --- a/Helper.cs +++ b/Helper.cs @@ -45,13 +45,13 @@ namespace CS2_SimpleAdmin public static List GetValidPlayers() { - return Utilities.GetPlayers().FindAll(p => p != null && p.IsValid && p.SteamID.ToString().Length == 17 && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV); + return Utilities.GetPlayers().FindAll(p => p != null && p.IsValid && p.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(p.IpAddress) && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV); } public static List GetValidPlayersWithBots() { return Utilities.GetPlayers().FindAll(p => - p != null && p.IsValid && p.SteamID.ToString().Length == 17 && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV || + p != null && p.IsValid && p.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(p.IpAddress) && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV || p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && p.IsBot && !p.IsHLTV ); } diff --git a/Managers/PlayerPenaltyManager.cs b/Managers/PlayerPenaltyManager.cs index f50cba9..64333f7 100644 --- a/Managers/PlayerPenaltyManager.cs +++ b/Managers/PlayerPenaltyManager.cs @@ -17,17 +17,22 @@ public class PlayerPenaltyManager // Add a penalty for a player public void AddPenalty(int slot, PenaltyType penaltyType, DateTime endDateTime, int durationSeconds) { - if (!penalties.ContainsKey(slot)) - { - penalties[slot] = new Dictionary>(); - } - - if (!penalties[slot].ContainsKey(penaltyType)) - { - penalties[slot][penaltyType] = new List<(DateTime, int)>(); - } - - penalties[slot][penaltyType].Add((endDateTime, durationSeconds)); + penalties.AddOrUpdate(slot, + (_) => + { + var dict = new Dictionary>(); + dict[penaltyType] = new List<(DateTime, int)>() { (endDateTime, durationSeconds) }; + return dict; + }, + (_, existingDict) => + { + if (!existingDict.ContainsKey(penaltyType)) + { + existingDict[penaltyType] = new List<(DateTime, int)>(); + } + existingDict[penaltyType].Add((endDateTime, durationSeconds)); + return existingDict; + }); } public bool IsPenalized(int slot, PenaltyType penaltyType) From 143dc138f0dd63e66feadf466e60c16a63762d7f Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sun, 24 Mar 2024 07:13:20 +0100 Subject: [PATCH 02/16] 1.3.6.d - fix --- CS2-SimpleAdmin.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 2a159d6..e2dcd52 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -1,5 +1,4 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; @@ -74,7 +73,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig 21 ? 640 : 210), + MaximumPoolSize = 640, ConnectionIdleTimeout = 30 }; From 3a977f688cdd6baaefbdd5f63ae4c73177216578 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 30 Mar 2024 10:49:06 +0100 Subject: [PATCH 03/16] 1.3.7a - Throwing more informations - Updated CounterStrikeSharp - Fixed problem with expiring bans via `css_addban` - Added metrics - Minor changes --- CS2-SimpleAdmin.cs | 17 ++--- CS2-SimpleAdmin.csproj | 4 +- Commands/basecommands.cs | 5 ++ Config.cs | 5 +- Database/database_setup.sql | 4 +- Events.cs | 128 ++++++++++++++++++++++-------------- Managers/AdminSQLManager.cs | 11 ++-- Managers/BanManager.cs | 19 +++--- Managers/MuteManager.cs | 13 ++-- README.md | 8 ++- 10 files changed, 129 insertions(+), 85 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index e2dcd52..2875f68 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -12,16 +12,16 @@ using System.Collections.Concurrent; namespace CS2_SimpleAdmin; -[MinimumApiVersion(198)] +[MinimumApiVersion(201)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static CS2_SimpleAdmin Instance { get; private set; } = new(); public static IStringLocalizer? _localizer; - public static Dictionary voteAnswers = new Dictionary(); - public static ConcurrentBag godPlayers = new ConcurrentBag(); - public static ConcurrentBag silentPlayers = new ConcurrentBag(); - public static ConcurrentBag bannedPlayers = new ConcurrentBag(); + public static Dictionary voteAnswers = []; + public static ConcurrentBag godPlayers = []; + public static ConcurrentBag silentPlayers = []; + public static ConcurrentBag bannedPlayers = []; public static bool TagsDetected = false; public static bool voteInProgress = false; public static int? ServerId = null; @@ -38,7 +38,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.3.6d"; + public override string ModuleVersion => "1.3.7a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -74,7 +74,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - net7.0 + net8.0 CS2_SimpleAdmin enable enable @@ -10,7 +10,7 @@ - + diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index 22331a0..b3f5f66 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -38,6 +38,11 @@ namespace CS2_SimpleAdmin commandSql1.CommandText = commandText; await commandSql1.ExecuteNonQueryAsync(); + commandText = "ALTER TABLE `sa_bans` MODIFY `ends` TIMESTAMP NULL DEFAULT NULL;"; + using var commandSql2 = connection.CreateCommand(); + commandSql2.CommandText = commandText; + await commandSql2.ExecuteNonQueryAsync(); + command.ReplyToCommand($"Successfully updated the database - {ModuleVersion}"); } catch (Exception ex) diff --git a/Config.cs b/Config.cs index 5b83208..20fa8db 100644 --- a/Config.cs +++ b/Config.cs @@ -26,7 +26,7 @@ namespace CS2_SimpleAdmin public class CS2_SimpleAdminConfig : BasePluginConfig { - [JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 8; + [JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 9; [JsonPropertyName("DatabaseHost")] public string DatabaseHost { get; set; } = ""; @@ -43,6 +43,9 @@ namespace CS2_SimpleAdmin [JsonPropertyName("DatabaseName")] public string DatabaseName { get; set; } = ""; + [JsonPropertyName("EnableMetrics")] + public bool EnableMetrics { get; set; } = true; + [JsonPropertyName("UseChatMenu")] public bool UseChatMenu { get; set; } = false; diff --git a/Database/database_setup.sql b/Database/database_setup.sql index de7e1b4..8bda5f7 100644 --- a/Database/database_setup.sql +++ b/Database/database_setup.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS `sa_bans` ( `admin_name` VARCHAR(128) NOT NULL, `reason` VARCHAR(255) NOT NULL, `duration` INT NOT NULL, - `ends` TIMESTAMP NOT NULL, + `ends` TIMESTAMP NULL, `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `server_id` INT NULL, `status` ENUM('ACTIVE', 'UNBANNED', 'EXPIRED', '') NOT NULL DEFAULT 'ACTIVE' @@ -21,7 +21,7 @@ CREATE TABLE IF NOT EXISTS `sa_mutes` ( `admin_name` varchar(128) NOT NULL, `reason` varchar(255) NOT NULL, `duration` int(11) NOT NULL, - `ends` timestamp NOT NULL, + `ends` timestamp NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `type` enum('GAG','MUTE','SILENCE','') NOT NULL DEFAULT 'GAG', `server_id` INT NULL, diff --git a/Events.cs b/Events.cs index 2ede139..efcb0ab 100644 --- a/Events.cs +++ b/Events.cs @@ -121,76 +121,89 @@ public partial class CS2_SimpleAdmin IpAddress = ipAddress }; + // Perform asynchronous database operations within a single method Task.Run(async () => { - // Initialize BanManager, MuteManager, and PlayerPenaltyManager within the async delegate + // Initialize managers BanManager _banManager = new(_database, Config); MuteManager _muteManager = new(_database); PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); - if (await _banManager.IsPlayerBanned(playerInfo)) + try { - if (playerInfo.IpAddress != null && !bannedPlayers.Contains(playerInfo.IpAddress)) - bannedPlayers.Add(playerInfo.IpAddress); - - if (playerInfo.SteamId != null && !bannedPlayers.Contains(playerInfo.SteamId)) - bannedPlayers.Add(playerInfo.SteamId); - - Server.NextFrame(() => + // Check if the player is banned + bool isBanned = await _banManager.IsPlayerBanned(playerInfo); + if (isBanned) { - var victim = Utilities.GetPlayerFromUserid(playerInfo.UserId); - if (victim != null && victim.UserId.HasValue) + // Add player's IP and SteamID to bannedPlayers list if not already present + if (playerInfo.IpAddress != null && !bannedPlayers.Contains(playerInfo.IpAddress)) + bannedPlayers.Add(playerInfo.IpAddress); + + if (playerInfo.SteamId != null && !bannedPlayers.Contains(playerInfo.SteamId)) + bannedPlayers.Add(playerInfo.SteamId); + + // Kick the player if banned + Server.NextFrame(() => { - Helper.KickPlayer(victim.UserId.Value, "Banned"); - } - }); + var victim = Utilities.GetPlayerFromUserid(playerInfo.UserId); + if (victim != null && victim.UserId.HasValue) + { + Helper.KickPlayer(victim.UserId.Value, "Banned"); + } + }); - return; - } + return; + } - List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId); - - if (activeMutes.Count > 0) - { - foreach (dynamic mute in activeMutes) + // Check if the player is muted + List activeMutes = await _muteManager.IsPlayerMuted(playerInfo.SteamId); + if (activeMutes.Count > 0) { - string muteType = mute.type; - DateTime ends = mute.ends; - int duration = mute.duration; + foreach (dynamic mute in activeMutes) + { + string muteType = mute.type; + DateTime ends = mute.ends; + int duration = mute.duration; - if (muteType == "GAG") - { - playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Gag, ends, duration); - Server.NextFrame(() => + // Apply mute penalty based on mute type + if (muteType == "GAG") { - if (TagsDetected) + playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Gag, ends, duration); + Server.NextFrame(() => { - Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}"); - } - }); - } - else if (muteType == "MUTE") - { - playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Mute, ends, duration); - Server.NextFrame(() => + if (TagsDetected) + { + Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}"); + } + }); + } + else if (muteType == "MUTE") { - player.VoiceFlags = VoiceFlags.Muted; - }); - } - else - { - playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Silence, ends, duration); - Server.NextFrame(() => - { - player.VoiceFlags = VoiceFlags.Muted; - if (TagsDetected) + playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Mute, ends, duration); + Server.NextFrame(() => { - Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}"); - } - }); + player.VoiceFlags = VoiceFlags.Muted; + }); + } + else + { + playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Silence, ends, duration); + Server.NextFrame(() => + { + player.VoiceFlags = VoiceFlags.Muted; + if (TagsDetected) + { + Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}"); + } + }); + } } } } + catch (Exception ex) + { + Logger.LogError($"Error processing player connection: {ex}"); + } }); // Add player to loadedPlayers @@ -377,6 +390,21 @@ public partial class CS2_SimpleAdmin _logger?.LogCritical("Unable to create or get server_id" + ex.Message); } + if (Config.EnableMetrics) + { + string queryString = $"?address={address}&hostname={hostname}"; + using HttpClient client = new(); + + try + { + HttpResponseMessage response = await client.GetAsync($"https://api.daffyy.love/index.php{queryString}"); + } + catch (HttpRequestException ex) + { + Logger.LogWarning($"Unable to make metrics call: {ex.Message}"); + } + } + await _adminManager.GiveAllFlags(); }); diff --git a/Managers/AdminSQLManager.cs b/Managers/AdminSQLManager.cs index 871f54f..65e873a 100644 --- a/Managers/AdminSQLManager.cs +++ b/Managers/AdminSQLManager.cs @@ -1,6 +1,7 @@ using CounterStrikeSharp.API.Modules.Entities; using Dapper; using Microsoft.Extensions.Logging; +using MySqlConnector; using System.Collections.Concurrent; namespace CS2_SimpleAdmin; @@ -24,7 +25,7 @@ public class AdminSQLManager { DateTime now = DateTime.UtcNow.ToLocalTime(); - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); string sql = "SELECT flags, immunity, ends FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime) AND (server_id IS NULL OR server_id = @serverid)"; List? activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now, serverid = CS2_SimpleAdmin.ServerId }))?.ToList(); @@ -67,7 +68,7 @@ public class AdminSQLManager try { - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); string sql = "SELECT player_steamid, flags, immunity, ends FROM sa_admins WHERE (ends IS NULL OR ends > @CurrentTime) AND (server_id IS NULL OR server_id = @serverid)"; List? activeFlags = (await connection.QueryAsync(sql, new { CurrentTime = now, serverid = CS2_SimpleAdmin.ServerId }))?.ToList(); @@ -160,7 +161,7 @@ public class AdminSQLManager //_adminCache.TryRemove(playerSteamId, out _); - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); string sql = ""; @@ -189,7 +190,7 @@ public class AdminSQLManager else futureTime = null; - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); var sql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `flags`, `immunity`, `ends`, `created`, `server_id`) " + "VALUES (@playerSteamid, @playerName, @flags, @immunity, @ends, @created, @serverid)"; @@ -212,7 +213,7 @@ public class AdminSQLManager { try { - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); string sql = "DELETE FROM sa_admins WHERE ends IS NOT NULL AND ends <= @CurrentTime"; await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime() }); diff --git a/Managers/BanManager.cs b/Managers/BanManager.cs index 208aed8..bd8fbe8 100644 --- a/Managers/BanManager.cs +++ b/Managers/BanManager.cs @@ -1,5 +1,6 @@ using Dapper; using Microsoft.Extensions.Logging; +using MySqlConnector; namespace CS2_SimpleAdmin; @@ -19,7 +20,7 @@ internal class BanManager DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; @@ -46,7 +47,7 @@ internal class BanManager DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; @@ -71,7 +72,7 @@ internal class BanManager DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + "VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; @@ -91,7 +92,7 @@ internal class BanManager public async Task IsPlayerBanned(PlayerInfo player) { - if (player.SteamId == null && player.IpAddress == null) + if (player.SteamId == null || player.IpAddress == null) { return false; } @@ -120,7 +121,7 @@ internal class BanManager AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime);"; - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); var parameters = new { @@ -145,7 +146,7 @@ internal class BanManager string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)"; int banCount; - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); if (!string.IsNullOrEmpty(player.IpAddress)) { @@ -166,7 +167,7 @@ internal class BanManager return; } - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'"; await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern }); @@ -178,11 +179,11 @@ internal class BanManager { DateTime currentTime = DateTime.UtcNow.ToLocalTime(); - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); /* string sql = ""; - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); sql = "UPDATE sa_bans SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.UtcNow.ToLocalTime() }); diff --git a/Managers/MuteManager.cs b/Managers/MuteManager.cs index da693ea..cb27c41 100644 --- a/Managers/MuteManager.cs +++ b/Managers/MuteManager.cs @@ -1,5 +1,6 @@ using Dapper; using Microsoft.Extensions.Logging; +using MySqlConnector; namespace CS2_SimpleAdmin; @@ -16,7 +17,7 @@ internal class MuteManager { if (player == null || player.SteamId == null) return; - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); @@ -49,7 +50,7 @@ internal class MuteManager { if (string.IsNullOrEmpty(playerSteamId)) return; - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); @@ -91,7 +92,7 @@ internal class MuteManager try { - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); DateTime currentTime = DateTime.Now.ToLocalTime(); string sql = "SELECT * FROM sa_mutes WHERE player_steamid = @PlayerSteamID AND status = 'ACTIVE' AND (duration = 0 OR ends > @CurrentTime)"; @@ -107,7 +108,7 @@ internal class MuteManager public async Task GetPlayerMutes(string steamId) { - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); int muteCount; string sql = "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID"; @@ -124,7 +125,7 @@ internal class MuteManager return; } - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); if (type == 2) { @@ -150,7 +151,7 @@ internal class MuteManager { try { - await using var connection = await _database.GetConnectionAsync(); + await using MySqlConnection connection = await _database.GetConnectionAsync(); string sql = "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime() }); diff --git a/README.md b/README.md index 4dc8bbd..4ccabcd 100644 --- a/README.md +++ b/README.md @@ -61,14 +61,18 @@ Manage your Counter-Strike 2 server by simple commands :) - team_chat @Message - Say message to all admins // @css/chat ``` -### Requirments -- [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v168** +### Requirements +- [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp/) **tested on v201** - MySQL **tested on MySQL (MariaDB) Server version: 10.11.4-MariaDB-1~deb12u1 Debian 12** ### Configuration After first launch, u need to configure plugin in addons/counterstrikesharp/configs/plugins/CS2-SimpleAdmin/CS2-SimpleAdmin.json +### Metrics +From version 1.3.7a, CS2-SimpleAdmin now initiates metrics data collection. This includes gathering essential information such as the `server name` and `server address`. +You can disable metrics by set `EnableMetrics` to false in plugin configuration. + ### Colors ``` public static char Default = '\x01'; From 9d513a92a14a5cd673daa05b19df6eb2d1bc7fe1 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 30 Mar 2024 10:56:25 +0100 Subject: [PATCH 04/16] Fix css_sa_upgrade --- Commands/basecommands.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index b3f5f66..e9aa7a9 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -43,7 +43,10 @@ namespace CS2_SimpleAdmin commandSql2.CommandText = commandText; await commandSql2.ExecuteNonQueryAsync(); - command.ReplyToCommand($"Successfully updated the database - {ModuleVersion}"); + Server.NextFrame(() => + { + command.ReplyToCommand($"Successfully updated the database - {ModuleVersion}"); + }); } catch (Exception ex) { From 5609748d19459255b1b591febe9db07ce5ccedcb Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 30 Mar 2024 10:57:25 +0100 Subject: [PATCH 05/16] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ccabcd..ef83c9d 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Manage your Counter-Strike 2 server by simple commands :) After first launch, u need to configure plugin in addons/counterstrikesharp/configs/plugins/CS2-SimpleAdmin/CS2-SimpleAdmin.json ### Metrics -From version 1.3.7a, CS2-SimpleAdmin now initiates metrics data collection. This includes gathering essential information such as the `server name` and `server address`. +From version 1.3.7a, CS2-SimpleAdmin now initiates metrics data collection. This includes gathering essential information such as the `server name`, `server address` and `country`. You can disable metrics by set `EnableMetrics` to false in plugin configuration. ### Colors From b2c56d3fa19dfa21e67bbe831d6a2fbbd2cb6892 Mon Sep 17 00:00:00 2001 From: Dollan Date: Sat, 30 Mar 2024 22:41:27 +0100 Subject: [PATCH 06/16] feat: add helper function to send logs to discord webhook --- Helper.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Helper.cs b/Helper.cs index 7a38528..d2d9641 100644 --- a/Helper.cs +++ b/Helper.cs @@ -7,6 +7,8 @@ using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Menu; using Discord; +using Discord.Webhook; +using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; using System.Reflection; using System.Runtime.CompilerServices; @@ -196,6 +198,16 @@ namespace CS2_SimpleAdmin return new List { embed.Build() }; } + public static void SendDiscordLogMessage(CCSPlayerController? caller, CommandInfo command, DiscordWebhookClient? discordWebhookClientLog, IStringLocalizer? localizer) + { + if (discordWebhookClientLog != null && localizer != null) + { + string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; + string callerName = caller != null ? caller.PlayerName : "Console"; + discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); + } + } + public static string GenerateMessageDiscord(string message) { string? hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; From d8e30e02e90f50f5460b2f57140ffc94015fd9c3 Mon Sep 17 00:00:00 2001 From: Dollan Date: Sat, 30 Mar 2024 22:50:16 +0100 Subject: [PATCH 07/16] fix: remove repetitive webhook snippet and replace it with helper function --- Commands/basebans.cs | 24 ++--------- Commands/basechat.cs | 24 ++--------- Commands/basecommands.cs | 36 +++------------- Commands/basecomms.cs | 54 ++++-------------------- Commands/basevotes.cs | 6 +-- Commands/funcommands.cs | 18 ++------ Commands/playercommands.cs | 84 +++++++------------------------------- 7 files changed, 41 insertions(+), 205 deletions(-) diff --git a/Commands/basebans.cs b/Commands/basebans.cs index 20b411b..c8015a5 100644 --- a/Commands/basebans.cs +++ b/Commands/basebans.cs @@ -31,11 +31,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Database database = new Database(dbConnectionString); @@ -158,11 +154,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; @@ -273,11 +265,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; @@ -379,11 +367,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); diff --git a/Commands/basechat.cs b/Commands/basechat.cs index 6cee028..b4f8fd2 100644 --- a/Commands/basechat.cs +++ b/Commands/basechat.cs @@ -21,11 +21,7 @@ namespace CS2_SimpleAdmin if (caller == null || !caller.IsValid || command.GetCommandString[command.GetCommandString.IndexOf(' ')..].Length == 0) return; string callerName = caller == null ? "Console" : caller.PlayerName; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -54,11 +50,7 @@ namespace CS2_SimpleAdmin byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]); string utf8String = Encoding.UTF8.GetString(utf8BytesString); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -109,11 +101,7 @@ namespace CS2_SimpleAdmin byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]); string utf8String = Encoding.UTF8.GetString(utf8BytesString); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -129,11 +117,7 @@ namespace CS2_SimpleAdmin byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]); string utf8String = Encoding.UTF8.GetString(utf8BytesString); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index e9aa7a9..e6fc2db 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -122,11 +122,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); string steamid = command.GetArg(1); string name = command.GetArg(2); @@ -171,11 +167,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); string steamid = command.GetArg(1); bool globalDelete = command.GetArg(2).ToLower().Equals("-g"); @@ -285,11 +277,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); @@ -397,11 +385,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); if (command.ArgCount >= 2 && command.GetArg(2).Length > 0) reason = command.GetArg(2); @@ -614,11 +598,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -637,11 +617,7 @@ namespace CS2_SimpleAdmin { string callerName = caller == null ? "Console" : caller.PlayerName; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); diff --git a/Commands/basecomms.cs b/Commands/basecomms.cs index 1a56e49..1bc65fb 100644 --- a/Commands/basecomms.cs +++ b/Commands/basecomms.cs @@ -32,11 +32,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); int.TryParse(command.GetArg(2), out time); @@ -157,11 +153,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); int time = 0; string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; @@ -269,11 +261,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -387,11 +375,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); int.TryParse(command.GetArg(2), out time); @@ -505,11 +489,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -612,11 +592,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -716,11 +692,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); int.TryParse(command.GetArg(2), out time); @@ -842,11 +814,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -951,11 +919,7 @@ namespace CS2_SimpleAdmin return; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); diff --git a/Commands/basevotes.cs b/Commands/basevotes.cs index 03965c1..2349e7b 100644 --- a/Commands/basevotes.cs +++ b/Commands/basevotes.cs @@ -20,11 +20,7 @@ namespace CS2_SimpleAdmin if (command.GetArg(1) == null || command.GetArg(1).Length < 0 || command.ArgCount < 2) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); diff --git a/Commands/funcommands.cs b/Commands/funcommands.cs index 9f82bf4..eb44aad 100644 --- a/Commands/funcommands.cs +++ b/Commands/funcommands.cs @@ -21,11 +21,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && player.PawnIsAlive && !player.IsHLTV).ToList(); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); playersToTarget.ForEach(player => { @@ -68,11 +64,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); playersToTarget.ForEach(player => { @@ -121,11 +113,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); playersToTarget.ForEach(player => { diff --git a/Commands/playercommands.cs b/Commands/playercommands.cs index a148d6f..d4d9c37 100644 --- a/Commands/playercommands.cs +++ b/Commands/playercommands.cs @@ -23,11 +23,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); @@ -98,11 +94,7 @@ namespace CS2_SimpleAdmin } } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); playersToTarget.ForEach(player => { @@ -156,11 +148,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); @@ -210,11 +198,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); @@ -264,11 +248,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); @@ -318,11 +298,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); @@ -372,11 +348,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); @@ -423,11 +395,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); @@ -486,11 +454,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); @@ -545,11 +509,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); @@ -647,11 +607,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -691,11 +647,7 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); playersToTarget.ForEach(player => { @@ -754,11 +706,7 @@ namespace CS2_SimpleAdmin List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); @@ -810,11 +758,7 @@ namespace CS2_SimpleAdmin List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", command.GetCommandString])); - } + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); From 8df1e70d5a1b6cc5e5f0e20e8de09af6e187cf41 Mon Sep 17 00:00:00 2001 From: Dollan Date: Sun, 31 Mar 2024 01:06:42 +0100 Subject: [PATCH 08/16] feat: add penalty embed helper function --- Helper.cs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/Helper.cs b/Helper.cs index d2d9641..fd67e3b 100644 --- a/Helper.cs +++ b/Helper.cs @@ -208,6 +208,68 @@ namespace CS2_SimpleAdmin } } + public enum PenaltyType + { + Ban, + Mute, + Gag, + Silence, + } + + + public static string ConvertMinutesToTime(int minutes) + { + TimeSpan time = TimeSpan.FromMinutes(minutes); + + return time.Days > 0 ? $"{time.Days}d {time.Hours}h {time.Minutes}m" : time.Hours > 0 ? $"{time.Hours}h {time.Minutes}m" : $"{time.Minutes}m"; + } + + public static void SendDiscordPenaltyMessage(CCSPlayerController? caller, CCSPlayerController? target, string reason, int duration, PenaltyType penalty, DiscordWebhookClient? discordWebhookClientPenalty, IStringLocalizer? localizer) + { + if (discordWebhookClientPenalty != null && localizer != null) + { + string callercommunityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; + string targetcommunityUrl = target != null ? "<" + new SteamID(target.SteamID).ToCommunityUrl().ToString() + ">" : ""; + string callerName = caller != null ? caller.PlayerName : "Console"; + string targetName = target != null ? target.PlayerName : "Unknown"; + string targetSteamId = target != null ? new SteamID(target.SteamID).SteamId2.ToString() : "Unknown"; + + string[] fieldNames = ["Player:", "SteamID:", "Duration:", "Reason:", "Admin:"]; + string[] fieldValues = [$"[{targetName}]({targetcommunityUrl})", targetSteamId, ConvertMinutesToTime(duration), reason, $"[{callerName}]({callercommunityUrl})"]; + bool[] inlineFlags = [true, true, true, false, false]; + + var embed = new EmbedBuilder + { + Title = penalty switch + { + PenaltyType.Ban => "Ban registrered", + PenaltyType.Mute => "Mute registrered", + PenaltyType.Gag => "Gag registrered", + PenaltyType.Silence => "Silence registrered", + _ => "Unknown penalty registrered", + }, + + Color = penalty switch + { + PenaltyType.Ban => Color.Red, + PenaltyType.Mute => Color.Blue, + PenaltyType.Gag => Color.Gold, + PenaltyType.Silence => Color.Green, + _ => Color.Default, + }, + + Timestamp = DateTimeOffset.UtcNow + }; + + for (int i = 0; i < fieldNames.Length; i++) + { + embed.AddField(fieldNames[i], fieldValues[i], inlineFlags[i]); + } + + discordWebhookClientPenalty.SendMessageAsync(embeds: [embed.Build()]); + } + } + public static string GenerateMessageDiscord(string message) { string? hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; From a377871951605f6ee75b1cb83ee59a557a3eb1f0 Mon Sep 17 00:00:00 2001 From: Dollan Date: Sun, 31 Mar 2024 01:23:15 +0100 Subject: [PATCH 09/16] fix: if punishment is 0 ie permanent show permanent --- Helper.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Helper.cs b/Helper.cs index fd67e3b..1810194 100644 --- a/Helper.cs +++ b/Helper.cs @@ -234,8 +234,10 @@ namespace CS2_SimpleAdmin string targetName = target != null ? target.PlayerName : "Unknown"; string targetSteamId = target != null ? new SteamID(target.SteamID).SteamId2.ToString() : "Unknown"; + string time = duration != 0 ? ConvertMinutesToTime(duration) : "Permanent"; + string[] fieldNames = ["Player:", "SteamID:", "Duration:", "Reason:", "Admin:"]; - string[] fieldValues = [$"[{targetName}]({targetcommunityUrl})", targetSteamId, ConvertMinutesToTime(duration), reason, $"[{callerName}]({callercommunityUrl})"]; + string[] fieldValues = [$"[{targetName}]({targetcommunityUrl})", targetSteamId, time, reason, $"[{callerName}]({callercommunityUrl})"]; bool[] inlineFlags = [true, true, true, false, false]; var embed = new EmbedBuilder From 8f80e1310084ffe4600fce0bbfa628f6c6462443 Mon Sep 17 00:00:00 2001 From: Dollan Date: Sun, 31 Mar 2024 01:23:35 +0100 Subject: [PATCH 10/16] feat: implement penaltylog on gag --- Commands/basecomms.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Commands/basecomms.cs b/Commands/basecomms.cs index 1bc65fb..834e0be 100644 --- a/Commands/basecomms.cs +++ b/Commands/basecomms.cs @@ -34,6 +34,8 @@ namespace CS2_SimpleAdmin Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + + int.TryParse(command.GetArg(2), out time); if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) @@ -47,6 +49,7 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { Gag(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager); + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _discordWebhookClientPenalty, _localizer); } }); } From ba2bf90340be041b3b2f797c171856d07f260ffe Mon Sep 17 00:00:00 2001 From: Dollan Date: Mon, 1 Apr 2024 18:30:03 +0200 Subject: [PATCH 11/16] fix: add hostname as embed description --- Helper.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Helper.cs b/Helper.cs index 1810194..efae9ed 100644 --- a/Helper.cs +++ b/Helper.cs @@ -240,6 +240,8 @@ namespace CS2_SimpleAdmin string[] fieldValues = [$"[{targetName}]({targetcommunityUrl})", targetSteamId, time, reason, $"[{callerName}]({callercommunityUrl})"]; bool[] inlineFlags = [true, true, true, false, false]; + string? hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + var embed = new EmbedBuilder { Title = penalty switch @@ -260,6 +262,8 @@ namespace CS2_SimpleAdmin _ => Color.Default, }, + Description = $"{hostname}", + Timestamp = DateTimeOffset.UtcNow }; From 052cea5ce325bd0fd00bbb85aec425a72b605557 Mon Sep 17 00:00:00 2001 From: Dollan Date: Mon, 1 Apr 2024 18:30:45 +0200 Subject: [PATCH 12/16] feat: embed is now integrated with all penalties --- Commands/basebans.cs | 11 ++++++++++- Commands/basecomms.cs | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Commands/basebans.cs b/Commands/basebans.cs index c8015a5..cecb9eb 100644 --- a/Commands/basebans.cs +++ b/Commands/basebans.cs @@ -133,6 +133,7 @@ namespace CS2_SimpleAdmin } } } + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); } [ConsoleCommand("css_addban")] @@ -234,6 +235,7 @@ namespace CS2_SimpleAdmin } } } + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); } Task.Run(async () => @@ -340,8 +342,15 @@ namespace CS2_SimpleAdmin } if (player.UserId.HasValue) - AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, "Banned"), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + { + AddTimer(Config.KickTime, () => + { + Helper.KickPlayer(player.UserId.Value, "Banned"); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + + } } + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); } Task.Run(async () => diff --git a/Commands/basecomms.cs b/Commands/basecomms.cs index 834e0be..d42355d 100644 --- a/Commands/basecomms.cs +++ b/Commands/basecomms.cs @@ -86,7 +86,6 @@ namespace CS2_SimpleAdmin Server.ExecuteCommand($"css_tag_mute {player!.SteamID}"); playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Gag, DateTime.Now.AddMinutes(time), time); - if (time == 0) { if (!player!.IsBot && !player.IsHLTV) @@ -393,6 +392,7 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { Mute(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager); + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Mute, _discordWebhookClientPenalty, _localizer); } }); } @@ -709,6 +709,7 @@ namespace CS2_SimpleAdmin { if (caller!.CanTarget(player)) { + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Silence, _discordWebhookClientPenalty, _localizer); Silence(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager); } }); From 89d27e1bd388e1702f06d26a5efd34ac40acf635 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Tue, 2 Apr 2024 19:42:16 +0200 Subject: [PATCH 13/16] Added translation - Minor changes - Version bump - Added translation --- CS2-SimpleAdmin.cs | 2 +- Commands/basebans.cs | 61 +++++++++------- Commands/basechat.cs | 7 +- Commands/basecommands.cs | 82 +++++++++++---------- Commands/basecomms.cs | 105 ++++++++++++++------------ Commands/basevotes.cs | 2 - Commands/funcommands.cs | 13 ++-- Commands/playercommands.cs | 146 +++++++++++++++++++++---------------- Events.cs | 13 ++-- Helper.cs | 26 ++++--- lang/ar.json | 13 ++++ lang/en.json | 13 ++++ lang/es.json | 13 ++++ lang/fa.json | 13 ++++ lang/fr.json | 13 ++++ lang/lv.json | 13 ++++ lang/pl.json | 13 ++++ lang/pt-BR.json | 13 ++++ lang/ru.json | 13 ++++ lang/tr.json | 13 ++++ lang/zh-Hans.json | 13 ++++ 21 files changed, 392 insertions(+), 208 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 2875f68..402517d 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -38,7 +38,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.3.7a"; + public override string ModuleVersion => "1.3.8a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); diff --git a/Commands/basebans.cs b/Commands/basebans.cs index cecb9eb..5b236fb 100644 --- a/Commands/basebans.cs +++ b/Commands/basebans.cs @@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core.Translations; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; -using CounterStrikeSharp.API.Modules.Entities; using System.Text; namespace CS2_SimpleAdmin @@ -20,7 +19,7 @@ namespace CS2_SimpleAdmin if (command.ArgCount < 2) return; - string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + string reason = _localizer?["sa_unknown"] ?? "Unknown"; TargetResult? targets = GetTarget(command); if (targets == null) return; @@ -31,10 +30,7 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - - Database database = new Database(dbConnectionString); - + Database database = new(dbConnectionString); BanManager _banManager = new(database, Config); int.TryParse(command.GetArg(2), out int time); @@ -46,12 +42,12 @@ namespace CS2_SimpleAdmin { if (caller!.CanTarget(player)) { - Ban(caller, player, time, reason, callerName, _banManager); + Ban(caller, player, time, reason, callerName, _banManager, command); } }); } - internal void Ban(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, BanManager? banManager = null) + internal void Ban(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, BanManager? banManager = null, CommandInfo? command = null) { if (_database == null) return; @@ -76,8 +72,6 @@ namespace CS2_SimpleAdmin IpAddress = caller?.IpAddress?.Split(":")[0] }; - Helper.LogCommand(caller, $"css_ban {player.SteamID} {time} {reason}"); - Task.Run(async () => { banManager ??= new BanManager(_database, Config); @@ -133,6 +127,12 @@ namespace CS2_SimpleAdmin } } } + + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); } @@ -155,12 +155,9 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - - string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; - - Database database = new Database(dbConnectionString); + string reason = _localizer?["sa_unknown"] ?? "Unknown"; + Database database = new(dbConnectionString); BanManager _banManager = new(database, Config); int.TryParse(command.GetArg(2), out int time); @@ -175,8 +172,6 @@ namespace CS2_SimpleAdmin IpAddress = caller?.IpAddress?.Split(":")[0] }; - Helper.LogCommand(caller, command); - List matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) { @@ -235,6 +230,7 @@ namespace CS2_SimpleAdmin } } } + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); } @@ -244,7 +240,14 @@ namespace CS2_SimpleAdmin await _banManager.AddBanBySteamid(steamid, adminInfo, reason, time); }); - command.ReplyToCommand($"Banned player with steamid {steamid}."); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } + //Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); + + command?.ReplyToCommand($"Banned player with steamid {steamid}."); } [ConsoleCommand("css_banip")] @@ -269,7 +272,7 @@ namespace CS2_SimpleAdmin Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + string reason = _localizer?["sa_unknown"] ?? "Unknown"; PlayerInfo adminInfo = new PlayerInfo { @@ -278,8 +281,6 @@ namespace CS2_SimpleAdmin IpAddress = caller?.IpAddress?.Split(":")[0] }; - Helper.LogCommand(caller, command); - int.TryParse(command.GetArg(2), out int time); if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) @@ -347,7 +348,6 @@ namespace CS2_SimpleAdmin { Helper.KickPlayer(player.UserId.Value, "Banned"); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } } Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Ban, _discordWebhookClientPenalty, _localizer); @@ -359,7 +359,13 @@ namespace CS2_SimpleAdmin await _banManager.AddBanByIp(ipAddress, adminInfo, reason, time); }); - command.ReplyToCommand($"Banned player with IP address {ipAddress}."); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } + + command?.ReplyToCommand($"Banned player with IP address {ipAddress}."); } [ConsoleCommand("css_unban")] @@ -376,15 +382,14 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - - Helper.LogCommand(caller, command); - string pattern = command.GetArg(1); - BanManager _banManager = new BanManager(_database, Config); + BanManager _banManager = new(_database, Config); Task.Run(async () => await _banManager.UnbanPlayer(pattern)); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); + command.ReplyToCommand($"Unbanned player with pattern {pattern}."); } } diff --git a/Commands/basechat.cs b/Commands/basechat.cs index b4f8fd2..b347df9 100644 --- a/Commands/basechat.cs +++ b/Commands/basechat.cs @@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core.Translations; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; -using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using System.Text; @@ -22,7 +21,6 @@ namespace CS2_SimpleAdmin string callerName = caller == null ? "Console" : caller.PlayerName; Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); byte[] utf8BytesString = Encoding.UTF8.GetBytes(command.GetCommandString[command.GetCommandString.IndexOf(' ')..]); @@ -51,7 +49,6 @@ namespace CS2_SimpleAdmin string utf8String = Encoding.UTF8.GetString(utf8BytesString); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); foreach (CCSPlayerController _player in Helper.GetValidPlayers()) @@ -76,7 +73,7 @@ namespace CS2_SimpleAdmin if (targets == null) return; List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); - Helper.LogCommand(caller, command); + //Helper.LogCommand(caller, command); int range = command.GetArg(0).Length + command.GetArg(1).Length + 2; string message = command.GetCommandString[range..]; @@ -102,7 +99,6 @@ namespace CS2_SimpleAdmin string utf8String = Encoding.UTF8.GetString(utf8BytesString); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); Helper.PrintToCenterAll(StringExtensions.ReplaceColorTags(utf8String)); @@ -118,7 +114,6 @@ namespace CS2_SimpleAdmin string utf8String = Encoding.UTF8.GetString(utf8BytesString); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); VirtualFunctions.ClientPrintAll( diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index e6fc2db..e8e6aa8 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -122,8 +122,6 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - string steamid = command.GetArg(1); string name = command.GetArg(2); string flags = command.GetArg(3); @@ -133,7 +131,7 @@ namespace CS2_SimpleAdmin int time = 0; int.TryParse(command.GetArg(5), out time); - AddAdmin(caller, steamid, name, flags, immunity, time, globalAdmin); + AddAdmin(caller, steamid, name, flags, immunity, time, globalAdmin, command); } public void AddAdmin(CCSPlayerController? caller, string steamid, string name, string flags, int immunity, int time = 0, bool globalAdmin = false, CommandInfo? command = null) @@ -142,6 +140,8 @@ namespace CS2_SimpleAdmin AdminSQLManager _adminManager = new(_database); _ = _adminManager.AddAdminBySteamId(steamid, name, flags, immunity, time, globalAdmin); + if (command != null) + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, $"css_addadmin {steamid} {name} {flags} {immunity} {time}"); string msg = $"Added '{flags}' flags to '{name}' ({steamid})"; @@ -167,12 +167,10 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - string steamid = command.GetArg(1); bool globalDelete = command.GetArg(2).ToLower().Equals("-g"); - RemoveAdmin(caller, steamid, globalDelete); + RemoveAdmin(caller, steamid, globalDelete, command); } public void RemoveAdmin(CCSPlayerController? caller, string steamid, bool globalDelete = false, CommandInfo? command = null) @@ -195,6 +193,8 @@ namespace CS2_SimpleAdmin } }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + if (command != null) + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, $"css_deladmin {steamid}"); string msg = $"Removed flags from '{steamid}'"; @@ -277,7 +277,8 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); + //Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); @@ -371,7 +372,7 @@ namespace CS2_SimpleAdmin public void OnKickCommand(CCSPlayerController? caller, CommandInfo command) { string callerName = caller == null ? "Console" : caller.PlayerName; - string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + string reason = _localizer?["sa_unknown"] ?? "Unknown"; TargetResult? targets = GetTarget(command); @@ -385,8 +386,6 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - if (command.ArgCount >= 2 && command.GetArg(2).Length > 0) reason = command.GetArg(2); @@ -397,12 +396,12 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - Kick(caller, player, reason, callerName); + Kick(caller, player, reason, callerName, command); } }); } - public void Kick(CCSPlayerController? caller, CCSPlayerController player, string reason = "Unknown", string? callerName = null) + public void Kick(CCSPlayerController? caller, CCSPlayerController player, string reason = "Unknown", string? callerName = null, CommandInfo? command = null) { callerName ??= caller == null ? "Console" : caller.PlayerName; if (player.PawnIsAlive) @@ -410,8 +409,10 @@ namespace CS2_SimpleAdmin player.Pawn.Value!.Freeze(); } - reason = reason ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + reason = reason ?? _localizer?["sa_unknown"] ?? "Unknown"; + if (command != null) + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, $"css_kick {player.PlayerName} {reason}"); if (string.IsNullOrEmpty(reason) == false) @@ -472,16 +473,14 @@ namespace CS2_SimpleAdmin _command = $"ds_workshop_changelevel {map.Replace("ws:", "")}"; } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - string commandName = command?.GetCommandString ?? "css_changemap"; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandName])); - } - if (command is not null) - Helper.LogCommand(caller, command); + //if (_discordWebhookClientLog != null && _localizer != null) + //{ + // string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; + // string commandName = command?.GetCommandString ?? "css_changemap"; + // _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandName])); + //} - AddTimer(2.0f, () => + AddTimer(3.0f, () => { Server.ExecuteCommand(_command); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); @@ -499,6 +498,11 @@ namespace CS2_SimpleAdmin Server.PrintToConsole(msg); return; } + + AddTimer(3.0f, () => + { + Server.ExecuteCommand($"changelevel {map}"); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) @@ -514,12 +518,10 @@ namespace CS2_SimpleAdmin } } - if (!map.StartsWith("ws:")) + if (command != null) { - AddTimer(2.0f, () => - { - Server.ExecuteCommand($"changelevel {map}"); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); } } @@ -563,19 +565,25 @@ namespace CS2_SimpleAdmin } } - if (_discordWebhookClientLog != null && _localizer != null) - { - string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - string commandName = command?.GetCommandString ?? "css_changewsmap"; - _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandName])); - } - if (command is not null) - Helper.LogCommand(caller, command); + //if (_discordWebhookClientLog != null && _localizer != null) + //{ + // string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; + // string commandName = command?.GetCommandString ?? "css_changewsmap"; + // _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandName])); + //} + //if (command is not null) + // Helper.LogCommand(caller, command); - AddTimer(2.0f, () => + AddTimer(3.0f, () => { Server.ExecuteCommand(_command); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + + if (command != null) + { + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); + } } [ConsoleCommand("css_cvar", "Change a cvar.")] @@ -599,7 +607,6 @@ namespace CS2_SimpleAdmin } Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); var value = command.GetArg(2); @@ -618,7 +625,6 @@ namespace CS2_SimpleAdmin string callerName = caller == null ? "Console" : caller.PlayerName; Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); Server.ExecuteCommand(command.ArgString); diff --git a/Commands/basecomms.cs b/Commands/basecomms.cs index d42355d..173b1db 100644 --- a/Commands/basecomms.cs +++ b/Commands/basecomms.cs @@ -5,7 +5,6 @@ using CounterStrikeSharp.API.Core.Translations; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; -using CounterStrikeSharp.API.Modules.Entities; using System.Text; namespace CS2_SimpleAdmin @@ -21,7 +20,7 @@ namespace CS2_SimpleAdmin string callerName = caller == null ? "Console" : caller.PlayerName; int time = 0; - string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + string reason = _localizer?["sa_unknown"] ?? "Unknown"; TargetResult? targets = GetTarget(command); if (targets == null) return; @@ -32,10 +31,6 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - - - int.TryParse(command.GetArg(2), out time); if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) @@ -48,13 +43,12 @@ namespace CS2_SimpleAdmin { if (caller!.CanTarget(player)) { - Gag(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager); - Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _discordWebhookClientPenalty, _localizer); + Gag(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager, command); } }); } - internal void Gag(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null) + internal void Gag(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null) { if (_database == null) return; callerName ??= caller == null ? "Console" : caller.PlayerName; @@ -75,8 +69,6 @@ namespace CS2_SimpleAdmin IpAddress = caller?.IpAddress?.Split(":")[0] }; - Helper.LogCommand(caller, $"css_gag {player?.SteamID} {time} {reason}"); - Task.Run(async () => { await muteManager.MutePlayer(playerInfo, adminInfo, reason, time); @@ -132,6 +124,13 @@ namespace CS2_SimpleAdmin } } } + + if (command != null) + { + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _discordWebhookClientPenalty, _localizer); + Helper.LogCommand(caller, command); + } } [ConsoleCommand("css_addgag")] @@ -155,10 +154,8 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - int time = 0; - string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + string reason = _localizer?["sa_unknown"] ?? "Unknown"; MuteManager _muteManager = new(_database); PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); @@ -175,8 +172,6 @@ namespace CS2_SimpleAdmin IpAddress = caller?.IpAddress?.Split(":")[0] }; - Helper.LogCommand(caller, command); - List matches = Helper.GetPlayerFromSteamid64(steamid); if (matches.Count == 1) { @@ -237,6 +232,8 @@ namespace CS2_SimpleAdmin playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Gag, DateTime.Now.AddMinutes(time), time); } + + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _discordWebhookClientPenalty, _localizer); } Task.Run(async () => @@ -244,7 +241,13 @@ namespace CS2_SimpleAdmin await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 0); }); - command.ReplyToCommand($"Gagged player with steamid {steamid}."); + if (command != null) + { + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); + } + + command?.ReplyToCommand($"Gagged player with steamid {steamid}."); } [ConsoleCommand("css_ungag")] @@ -264,7 +267,6 @@ namespace CS2_SimpleAdmin } Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); bool found = false; @@ -366,7 +368,7 @@ namespace CS2_SimpleAdmin string callerName = caller == null ? "Console" : caller.PlayerName; int time = 0; - string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + string reason = _localizer?["sa_unknown"] ?? "Unknown"; TargetResult? targets = GetTarget(command); if (targets == null) return; @@ -377,8 +379,6 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - int.TryParse(command.GetArg(2), out time); if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) @@ -391,13 +391,12 @@ namespace CS2_SimpleAdmin { if (caller!.CanTarget(player)) { - Mute(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager); - Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Mute, _discordWebhookClientPenalty, _localizer); + Mute(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager, command); } }); } - internal void Mute(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null) + internal void Mute(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null) { if (_database == null) return; callerName ??= caller == null ? "Console" : caller.PlayerName; @@ -418,8 +417,6 @@ namespace CS2_SimpleAdmin IpAddress = caller?.IpAddress?.Split(":")[0] }; - Helper.LogCommand(caller, $"css_mute {player?.SteamID} {time} {reason}"); - player!.VoiceFlags = VoiceFlags.Muted; Task.Run(async () => @@ -470,6 +467,13 @@ namespace CS2_SimpleAdmin } } } + + if (command != null) + { + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Mute, _discordWebhookClientPenalty, _localizer); + Helper.LogCommand(caller, command); + } } [ConsoleCommand("css_addmute")] @@ -492,12 +496,8 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - - Helper.LogCommand(caller, command); - int time = 0; - string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + string reason = _localizer?["sa_unknown"] ?? "Unknown"; MuteManager _muteManager = new(_database); PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); @@ -569,6 +569,8 @@ namespace CS2_SimpleAdmin } } } + + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Mute, _discordWebhookClientPenalty, _localizer); } Task.Run(async () => @@ -576,7 +578,13 @@ namespace CS2_SimpleAdmin await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 1); }); - command.ReplyToCommand($"Muted player with steamid {steamid}."); + if (command != null) + { + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); + } + + command?.ReplyToCommand($"Muted player with steamid {steamid}."); } [ConsoleCommand("css_unmute")] @@ -596,7 +604,6 @@ namespace CS2_SimpleAdmin } Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); string pattern = command.GetArg(1); @@ -695,8 +702,6 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - int.TryParse(command.GetArg(2), out time); if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) @@ -709,13 +714,12 @@ namespace CS2_SimpleAdmin { if (caller!.CanTarget(player)) { - Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Silence, _discordWebhookClientPenalty, _localizer); - Silence(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager); + Silence(caller, player, time, reason, callerName, _muteManager, playerPenaltyManager, command); } }); } - internal void Silence(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null) + internal void Silence(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, MuteManager? muteManager = null, PlayerPenaltyManager? playerPenaltyManager = null, CommandInfo? command = null) { if (_database == null) return; callerName ??= caller == null ? "Console" : caller.PlayerName; @@ -736,8 +740,6 @@ namespace CS2_SimpleAdmin IpAddress = caller?.IpAddress?.Split(":")[0] }; - Helper.LogCommand(caller, $"css_silence {player?.SteamID} {time} {reason}"); - Task.Run(async () => { await muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 2); @@ -747,7 +749,6 @@ namespace CS2_SimpleAdmin Server.ExecuteCommand($"css_tag_mute {player!.SteamID}"); player!.VoiceFlags = VoiceFlags.Muted; - playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time); if (time == 0) @@ -796,6 +797,13 @@ namespace CS2_SimpleAdmin } } } + + if (command != null) + { + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Mute, _discordWebhookClientPenalty, _localizer); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); + } } [ConsoleCommand("css_addsilence")] @@ -818,10 +826,6 @@ namespace CS2_SimpleAdmin return; } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - - Helper.LogCommand(caller, command); - int time = 0; string reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; @@ -897,6 +901,8 @@ namespace CS2_SimpleAdmin } } } + + Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Mute, _discordWebhookClientPenalty, _localizer); } } Task.Run(async () => @@ -904,7 +910,13 @@ namespace CS2_SimpleAdmin await _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 2); }); - command.ReplyToCommand($"Silenced player with steamid {steamid}."); + if (command != null) + { + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); + } + + command?.ReplyToCommand($"Silenced player with steamid {steamid}."); } [ConsoleCommand("css_unsilence")] @@ -924,7 +936,6 @@ namespace CS2_SimpleAdmin } Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); string pattern = command.GetArg(1); diff --git a/Commands/basevotes.cs b/Commands/basevotes.cs index 2349e7b..088ada6 100644 --- a/Commands/basevotes.cs +++ b/Commands/basevotes.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Core.Translations; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; -using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Menu; using System.Text; @@ -21,7 +20,6 @@ namespace CS2_SimpleAdmin return; Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); voteAnswers.Clear(); diff --git a/Commands/funcommands.cs b/Commands/funcommands.cs index eb44aad..26ec5e6 100644 --- a/Commands/funcommands.cs +++ b/Commands/funcommands.cs @@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core.Translations; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; -using CounterStrikeSharp.API.Modules.Entities; using System.Text; namespace CS2_SimpleAdmin @@ -113,24 +112,26 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - playersToTarget.ForEach(player => { if (!player.IsBot && player.SteamID.ToString().Length != 17) return; - Unfreeze(caller, player, callerName); + Unfreeze(caller, player, callerName, command); }); } - public void Unfreeze(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null) + public void Unfreeze(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) { callerName ??= caller == null ? "Console" : caller.PlayerName; player!.Pawn.Value!.Unfreeze(); - Helper.LogCommand(caller, $"css_unfreeze {player.PlayerName}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { diff --git a/Commands/playercommands.cs b/Commands/playercommands.cs index d4d9c37..0a30fce 100644 --- a/Commands/playercommands.cs +++ b/Commands/playercommands.cs @@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core.Translations; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; -using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; @@ -23,17 +22,15 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { - Slay(caller, player, callerName); + Slay(caller, player, callerName, command); }); } - public void Slay(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null) + public void Slay(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) { if (!player.IsBot && player.SteamID.ToString().Length != 17) return; @@ -42,7 +39,11 @@ namespace CS2_SimpleAdmin player.CommitSuicide(false, true); - Helper.LogCommand(caller, $"css_slay {player.PlayerName}"); + if (command != null) + { + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + Helper.LogCommand(caller, command); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -94,14 +95,12 @@ namespace CS2_SimpleAdmin } } - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - playersToTarget.ForEach(player => { if (!player.IsBot && player.SteamID.ToString().Length != 17) return; - GiveWeapon(caller, player, weaponName, callerName); + GiveWeapon(caller, player, weaponName, callerName, command); }); } @@ -113,9 +112,13 @@ namespace CS2_SimpleAdmin SubGiveWeapon(caller, player!, weapon.ToString(), callerName); } - public void GiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null) + public void GiveWeapon(CCSPlayerController? caller, CCSPlayerController player, string weaponName, string? callerName = null, CommandInfo? command = null) { - Helper.LogCommand(caller, $"css_give {player?.PlayerName} {weaponName}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } player?.GiveNamedItem(weaponName); SubGiveWeapon(caller, player!, weaponName, callerName); @@ -148,20 +151,18 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { if (caller!.CanTarget(player)) { - StripWeapons(caller, player, callerName); + StripWeapons(caller, player, callerName, command); } }); } - public void StripWeapons(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null) + public void StripWeapons(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) { callerName ??= caller == null ? "Console" : caller.PlayerName; @@ -170,7 +171,11 @@ namespace CS2_SimpleAdmin player.RemoveWeapons(); - Helper.LogCommand(caller, $"css_strip {player.PlayerName}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -198,20 +203,18 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { if (caller!.CanTarget(player)) { - SetHp(caller, player, health, callerName); + SetHp(caller, player, health, callerName, command); } }); } - public void SetHp(CCSPlayerController? caller, CCSPlayerController player, int health, string? callerName = null) + public void SetHp(CCSPlayerController? caller, CCSPlayerController player, int health, string? callerName = null, CommandInfo? command = null) { if (!player.IsBot && player.SteamID.ToString().Length != 17) return; @@ -220,7 +223,11 @@ namespace CS2_SimpleAdmin player.SetHp(health); - Helper.LogCommand(caller, $"css_hp {player.PlayerName} {health}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -248,8 +255,6 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => @@ -259,18 +264,22 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - SetSpeed(caller, player, speed, callerName); + SetSpeed(caller, player, speed, callerName, command); } }); } - public void SetSpeed(CCSPlayerController? caller, CCSPlayerController player, double speed, string? callerName = null) + public void SetSpeed(CCSPlayerController? caller, CCSPlayerController player, double speed, string? callerName = null, CommandInfo? command = null) { callerName ??= caller == null ? "Console" : caller.PlayerName; player.SetSpeed((float)speed); - Helper.LogCommand(caller, $"css_speed {player?.PlayerName} {speed}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -309,18 +318,22 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - SetGravity(caller, player, gravity, callerName); + SetGravity(caller, player, gravity, callerName, command); } }); } - public void SetGravity(CCSPlayerController? caller, CCSPlayerController player, double gravity, string? callerName = null) + public void SetGravity(CCSPlayerController? caller, CCSPlayerController player, double gravity, string? callerName = null, CommandInfo? command = null) { callerName ??= caller == null ? "Console" : caller.PlayerName; player.SetGravity((float)gravity); - Helper.LogCommand(caller, $"css_gravity {player?.PlayerName} {gravity}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -348,8 +361,6 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => @@ -359,18 +370,22 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - SetMoney(caller, player, money, callerName); + SetMoney(caller, player, money, callerName, command); } }); } - public void SetMoney(CCSPlayerController? caller, CCSPlayerController player, int money, string? callerName = null) + public void SetMoney(CCSPlayerController? caller, CCSPlayerController player, int money, string? callerName = null, CommandInfo? command = null) { callerName ??= caller == null ? "Console" : caller.PlayerName; player.SetMoney(money); - Helper.LogCommand(caller, $"css_money {player?.PlayerName} {money}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -395,8 +410,6 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => @@ -406,18 +419,22 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - God(caller, player, callerName); + God(caller, player, callerName, command); } }); } - public void God(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null) + public void God(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) { callerName ??= caller == null ? "Console" : caller.PlayerName; if (player != null) { - Helper.LogCommand(caller, $"css_god {player.PlayerName}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (!godPlayers.Contains(player.Slot)) { @@ -454,8 +471,6 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); if (command.ArgCount >= 2) @@ -470,17 +485,21 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - Slap(caller, player, damage); + Slap(caller, player, damage, command); } }); } - public void Slap(CCSPlayerController? caller, CCSPlayerController player, int damage, string? callerName = null) + public void Slap(CCSPlayerController? caller, CCSPlayerController player, int damage, CommandInfo? command = null) { - callerName ??= caller == null ? "Console" : caller.PlayerName; + string callerName = caller == null ? "Console" : caller.PlayerName; player!.Pawn.Value!.Slap(damage); - Helper.LogCommand(caller, $"css_slap {player.PlayerName} {damage}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -509,8 +528,6 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); if (targets == null) return; - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); switch (teamName) @@ -540,15 +557,13 @@ namespace CS2_SimpleAdmin bool kill = command.GetArg(3).ToLower().Equals("-k"); - Helper.LogCommand(caller, command); - playersToTarget.ForEach(player => { - ChangeTeam(caller, player, _teamName, teamNum, kill, callerName); + ChangeTeam(caller, player, _teamName, teamNum, kill, callerName, command); }); } - public void ChangeTeam(CCSPlayerController? caller, CCSPlayerController player, string teamName, CsTeam teamNum, bool kill, string? callerName = null) + public void ChangeTeam(CCSPlayerController? caller, CCSPlayerController player, string teamName, CsTeam teamNum, bool kill, string? callerName = null, CommandInfo? command = null) { if (!player.IsBot && player.SteamID.ToString().Length != 17) return; @@ -591,6 +606,12 @@ namespace CS2_SimpleAdmin } } } + + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } } [ConsoleCommand("css_rename", "Rename a player.")] @@ -607,9 +628,8 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); playersToTarget.ForEach(player => { @@ -618,7 +638,6 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { foreach (CCSPlayerController _player in Helper.GetValidPlayers()) @@ -647,8 +666,6 @@ namespace CS2_SimpleAdmin TargetResult? targets = GetTarget(command); List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - playersToTarget.ForEach(player => { if (!player.IsBot && player.SteamID.ToString().Length != 17) @@ -656,12 +673,12 @@ namespace CS2_SimpleAdmin if (caller!.CanTarget(player)) { - Respawn(caller, player, callerName); + Respawn(caller, player, callerName, command); } }); } - public void Respawn(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null) + public void Respawn(CCSPlayerController? caller, CCSPlayerController player, string? callerName = null, CommandInfo? command = null) { callerName ??= caller == null ? "Console" : caller.PlayerName; @@ -672,7 +689,11 @@ namespace CS2_SimpleAdmin VirtualFunction.CreateVoid(player.Handle, GameData.GetOffset("CCSPlayerController_Respawn"))(player); - Helper.LogCommand(caller, $"css_respawn {player.PlayerName}"); + if (command != null) + { + Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); + } if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { @@ -706,9 +727,8 @@ namespace CS2_SimpleAdmin List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); playersToTarget.ForEach(player => { @@ -758,10 +778,8 @@ namespace CS2_SimpleAdmin List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); - Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); - - Helper.LogCommand(caller, command); + Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); playersToTarget.ForEach(player => { diff --git a/Events.cs b/Events.cs index efcb0ab..7c5ea63 100644 --- a/Events.cs +++ b/Events.cs @@ -87,7 +87,6 @@ public partial class CS2_SimpleAdmin } } - [GameEventHandler] public HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info) { @@ -226,10 +225,13 @@ public partial class CS2_SimpleAdmin public HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) { - if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0 || info.GetArg(1).StartsWith("/") + if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).StartsWith("/") || info.GetArg(1).StartsWith("!") && info.GetArg(1).Length >= 12) return HookResult.Continue; + if (info.GetArg(1).Length == 0) + return HookResult.Handled; + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); if (playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) @@ -240,10 +242,13 @@ public partial class CS2_SimpleAdmin public HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info) { - if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0 || info.GetArg(1).StartsWith("/") + if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).StartsWith("/") || info.GetArg(1).StartsWith("!") && info.GetArg(1).Length >= 12) return HookResult.Continue; + if (info.GetArg(1).Length == 0) + return HookResult.Handled; + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); if (playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) @@ -297,7 +302,6 @@ public partial class CS2_SimpleAdmin AddTimer(61.0f, () => { - #if DEBUG Logger.LogCritical("[OnMapStart] Expired check"); #endif @@ -407,7 +411,6 @@ public partial class CS2_SimpleAdmin await _adminManager.GiveAllFlags(); }); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(3.0f, () => diff --git a/Helper.cs b/Helper.cs index efae9ed..522ca5b 100644 --- a/Helper.cs +++ b/Helper.cs @@ -216,7 +216,6 @@ namespace CS2_SimpleAdmin Silence, } - public static string ConvertMinutesToTime(int minutes) { TimeSpan time = TimeSpan.FromMinutes(minutes); @@ -231,26 +230,31 @@ namespace CS2_SimpleAdmin string callercommunityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; string targetcommunityUrl = target != null ? "<" + new SteamID(target.SteamID).ToCommunityUrl().ToString() + ">" : ""; string callerName = caller != null ? caller.PlayerName : "Console"; - string targetName = target != null ? target.PlayerName : "Unknown"; - string targetSteamId = target != null ? new SteamID(target.SteamID).SteamId2.ToString() : "Unknown"; + string targetName = target != null ? target.PlayerName : localizer?["sa_unknown"] ?? "Unknown"; + string targetSteamId = target != null ? new SteamID(target.SteamID).SteamId2.ToString() : localizer?["sa_unknown"] ?? "Unknown"; - string time = duration != 0 ? ConvertMinutesToTime(duration) : "Permanent"; + string time = duration != 0 ? ConvertMinutesToTime(duration) : localizer?["sa_permanent"] ?? "Permanent"; - string[] fieldNames = ["Player:", "SteamID:", "Duration:", "Reason:", "Admin:"]; + string[] fieldNames = [ + localizer?["sa_player"] ?? "Player:", + localizer?["sa_steamid"] ?? "SteamID:", + localizer?["sa_duration"] ?? "Duration:", + localizer?["sa_reason"] ?? "Reason:", + localizer?["sa_admin"] ?? "Admin:"]; string[] fieldValues = [$"[{targetName}]({targetcommunityUrl})", targetSteamId, time, reason, $"[{callerName}]({callercommunityUrl})"]; bool[] inlineFlags = [true, true, true, false, false]; - string? hostname = ConVar.Find("hostname")!.StringValue ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + string? hostname = ConVar.Find("hostname")!.StringValue ?? localizer?["sa_unknown"] ?? "Unknown"; var embed = new EmbedBuilder { Title = penalty switch { - PenaltyType.Ban => "Ban registrered", - PenaltyType.Mute => "Mute registrered", - PenaltyType.Gag => "Gag registrered", - PenaltyType.Silence => "Silence registrered", - _ => "Unknown penalty registrered", + PenaltyType.Ban => localizer?["sa_discord_penalty_ban"] ?? "Ban registrered", + PenaltyType.Mute => localizer?["sa_discord_penalty_mute"] ?? "Mute registrered", + PenaltyType.Gag => localizer?["sa_discord_penalty_gag"] ?? "Gag registrered", + PenaltyType.Silence => localizer?["sa_discord_penalty_silence"] ?? "Silence registrered", + _ => localizer?["sa_discord_penalty_unknown"] ?? "Unknown registrered", }, Color = penalty switch diff --git a/lang/ar.json b/lang/ar.json index 2564212..02e81ce 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "مجهول", + "sa_player": "اللاعب", + "sa_steamid": "معرف البخار", + "sa_duration": "المدة", + "sa_reason": "السبب", + "sa_admin": "المشرف", + "sa_permanent": "دائم", + + "sa_discord_penalty_ban": "الحظر مسجل", + "sa_discord_penalty_mute": "الكتم مسجل", + "sa_discord_penalty_gag": "الصمت مسجل", + "sa_discord_penalty_silence": "الصمت مسجل", + "sa_discord_penalty_unknown": "غير معروف مسجل", + "sa_player_ban_message_time": "تم حظرك لمدة {lightred}{0}{default} لمدة {lightred}{1}{default} دقيقة من قبل {lightred}{2}{default}!", "sa_player_ban_message_perm": "تم حظرك بشكل دائم لمدة {lightred}{0}{default} من قبل {lightred}{1}{default}!", "sa_player_kick_message": "تم طردك لمدة {lightred}{0}{default} من قبل {lightred}{1}{default}!", diff --git a/lang/en.json b/lang/en.json index f4666b0..88cf250 100644 --- a/lang/en.json +++ b/lang/en.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "Unknown", + "sa_player": "Player", + "sa_steamid": "SteamID", + "sa_duration": "Duration", + "sa_reason": "Reason", + "sa_admin": "Admin", + "sa_permanent": "Permanent", + + "sa_discord_penalty_ban": "Ban registrered", + "sa_discord_penalty_mute": "Mute registrered", + "sa_discord_penalty_gag": "Gag registrered", + "sa_discord_penalty_silence": "Silence registrered", + "sa_discord_penalty_unknown": "Unknown registrered", + "sa_player_ban_message_time": "You have been banned for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", "sa_player_ban_message_perm": "You have been banned permanently for {lightred}{0}{default} by {lightred}{1}{default}!", "sa_player_kick_message": "You have been kicked for {lightred}{0}{default} by {lightred}{1}{default}!", diff --git a/lang/es.json b/lang/es.json index 4c8cc39..cd1c49c 100644 --- a/lang/es.json +++ b/lang/es.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "Desconocido", + "sa_player": "Jugador", + "sa_steamid": "ID de Steam", + "sa_duration": "Duración", + "sa_reason": "Motivo", + "sa_admin": "Admin", + "sa_permanent": "Permanente", + + "sa_discord_penalty_ban": "Ban registrado", + "sa_discord_penalty_mute": "Silencio registrado", + "sa_discord_penalty_gag": "Mordaza registrada", + "sa_discord_penalty_silence": "Silencio registrado", + "sa_discord_penalty_unknown": "Registro desconocido", + "sa_player_ban_message_time": "Has sido baneado por {lightred}{0}{default} durante {lightred}{1}{default} minutos por {lightred}{2}{default}!", "sa_player_ban_message_perm": "Has sido baneado permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!", "sa_player_kick_message": "Has sido expulsado por {lightred}{0}{default} durante {lightred}{1}{default}!", diff --git a/lang/fa.json b/lang/fa.json index 5c200bc..1c057ba 100644 --- a/lang/fa.json +++ b/lang/fa.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "ناشناخته", + "sa_player": "بازیکن", + "sa_steamid": "شناسه استیم", + "sa_duration": "مدت زمان", + "sa_reason": "دلیل", + "sa_admin": "مدیر", + "sa_permanent": "دائمی", + + "sa_discord_penalty_ban": "بن انجام شده", + "sa_discord_penalty_mute": "سکوت انجام شده", + "sa_discord_penalty_gag": "بند زدن انجام شده", + "sa_discord_penalty_silence": "سکوت انجام شده", + "sa_discord_penalty_unknown": "ناشناخته انجام شده", + "sa_player_ban_message_time": "شما توسط {lightred}{2}{default} برای {lightred}{1}{default} دقیقه به دلیل {lightred}{0}{default} مسدود شده‌اید!", "sa_player_ban_message_perm": "شما توسط {lightred}{1}{default} به دلیل {lightred}{0}{default} برای همیشه مسدود شده‌اید!", "sa_player_kick_message": "شما توسط {lightred}{1}{default} به دلیل {lightred}{0}{default} اخراج شده‌اید!", diff --git a/lang/fr.json b/lang/fr.json index c4c0ff2..27797e7 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "Inconnu", + "sa_player": "Joueur", + "sa_steamid": "ID Steam", + "sa_duration": "Durée", + "sa_reason": "Raison", + "sa_admin": "Admin", + "sa_permanent": "Permanent", + + "sa_discord_penalty_ban": "Bannissement enregistré", + "sa_discord_penalty_mute": "Mute enregistré", + "sa_discord_penalty_gag": "Gag enregistré", + "sa_discord_penalty_silence": "Silence enregistré", + "sa_discord_penalty_unknown": "Inconnu enregistré", + "sa_player_ban_message_time": "Vous avez été banni pour {lightred}{0}{default} pendant {lightred}{1}{default} minutes par {lightred}{2}{default}!", "sa_player_ban_message_perm": "Vous avez été banni définitivement pour {lightred}{0}{default} par {lightred}{1}{default}!", "sa_player_kick_message": "Vous avez été expulsé pour {lightred}{0}{default} par {lightred}{1}{default}!", diff --git a/lang/lv.json b/lang/lv.json index fe09668..f8e2ea1 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "Nezināms", + "sa_player": "Spēlētājs", + "sa_steamid": "Steam ID", + "sa_duration": "Ilgums", + "sa_reason": "Iemesls", + "sa_admin": "Admins", + "sa_permanent": "Pastāvīgs", + + "sa_discord_penalty_ban": "Bans reģistrēts", + "sa_discord_penalty_mute": "Mute reģistrēts", + "sa_discord_penalty_gag": "Gag reģistrēts", + "sa_discord_penalty_silence": "Klusums reģistrēts", + "sa_discord_penalty_unknown": "Nezināms reģistrēts", + "sa_player_ban_message_time": "Tu esi nobanots uz {lightred}{0}{default} uz {lightred}{1}{default} minūtēm, iemesls: {lightred}{2}{default}!", "sa_player_ban_message_perm": "Tevis bans ir uz mūžu, iemesls: {lightred}{0}{default}, Admins: {lightred}{1}{default}!", "sa_player_kick_message": "Tu esi izmests, iemesls: {lightred}{0}{default}, Admins: {lightred}{1}{default}!", diff --git a/lang/pl.json b/lang/pl.json index 1746cb8..2ddddd7 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "Brak", + "sa_player": "Gracz", + "sa_steamid": "SteamID", + "sa_duration": "Czas trwania", + "sa_reason": "Powód", + "sa_admin": "Administrator", + "sa_permanent": "Na zawsze", + + "sa_discord_penalty_ban": "Nowy ban", + "sa_discord_penalty_mute": "Nowe wyciszenie", + "sa_discord_penalty_gag": "Nowe zakneblowanie", + "sa_discord_penalty_silence": "Nowe uciszenie", + "sa_discord_penalty_unknown": "Nowa nieznana blokada", + "sa_player_ban_message_time": "Zostałeś zbanowany za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", "sa_player_ban_message_perm": "Zostałeś zbanowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", "sa_player_kick_message": "Zostałeś wyrzucony za {lightred}{0}{default} przez {lightred}{1}{default}!", diff --git a/lang/pt-BR.json b/lang/pt-BR.json index 36518a2..b8a987d 100644 --- a/lang/pt-BR.json +++ b/lang/pt-BR.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "Desconhecido", + "sa_player": "Jogador", + "sa_steamid": "SteamID", + "sa_duration": "Duração", + "sa_reason": "Motivo", + "sa_admin": "Admin", + "sa_permanent": "Permanente", + + "sa_discord_penalty_ban": "Banimento registrado", + "sa_discord_penalty_mute": "Mute registrado", + "sa_discord_penalty_gag": "Gag registrado", + "sa_discord_penalty_silence": "Silêncio registrado", + "sa_discord_penalty_unknown": "Desconhecido registrado", + "sa_player_ban_message_time": "Você foi banido por {lightred}{0}{default} por {lightred}{1}{default} minutos por {lightred}{2}{default}!", "sa_player_ban_message_perm": "Você foi banido permanentemente por {lightred}{0}{default} por {lightred}{1}{default}!", "sa_player_kick_message": "Você foi expulso por {lightred}{0}{default} por {lightred}{1}{default}!", diff --git a/lang/ru.json b/lang/ru.json index 46a49ee..6b30dd0 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "Неизвестный", + "sa_player": "Игрок", + "sa_steamid": "SteamID", + "sa_duration": "Продолжительность", + "sa_reason": "Причина", + "sa_admin": "Администратор", + "sa_permanent": "Постоянный", + + "sa_discord_penalty_ban": "Бан зарегистрирован", + "sa_discord_penalty_mute": "Мут зарегистрирован", + "sa_discord_penalty_gag": "Запрет зарегистрирован", + "sa_discord_penalty_silence": "Молчание зарегистрировано", + "sa_discord_penalty_unknown": "Неизвестно зарегистрировано", + "sa_player_ban_message_time": "Вы были забанены по причине {lightred}{0}{default} на {lightred}{1}{default} минут(ы) администратором {lightred}{2}{default}!", "sa_player_ban_message_perm": "Вас забанили навсегда по причине {lightred}{0}{default} администратором {lightred}{1}{default}!", "sa_player_kick_message": "Вы были выгнаны {lightred}{0}{default} администратором {lightred}{1}{default}!", diff --git a/lang/tr.json b/lang/tr.json index a4df1ea..b337b6d 100644 --- a/lang/tr.json +++ b/lang/tr.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "Bilinmeyen", + "sa_player": "Oyuncu", + "sa_steamid": "SteamID", + "sa_duration": "Süre", + "sa_reason": "Neden", + "sa_admin": "Yönetici", + "sa_permanent": "Kalıcı", + + "sa_discord_penalty_ban": "Yasak kaydedildi", + "sa_discord_penalty_mute": "Susturma kaydedildi", + "sa_discord_penalty_gag": "Susturma kaydedildi", + "sa_discord_penalty_silence": "Sessizlik kaydedildi", + "sa_discord_penalty_unknown": "Bilinmeyen kaydedildi", + "sa_player_ban_message_time": "Senaryo nedeniyle {lightred}{0}{default} dakika boyunca {lightred}{1}{default} tarafından yasaklandınız!", "sa_player_ban_message_perm": "Senaryo nedeniyle kalıcı olarak {lightred}{0}{default} tarafından yasaklandınız!", "sa_player_kick_message": "Senaryo nedeniyle {lightred}{0}{default} tarafından atıldınız!", diff --git a/lang/zh-Hans.json b/lang/zh-Hans.json index a8dc380..895c242 100644 --- a/lang/zh-Hans.json +++ b/lang/zh-Hans.json @@ -2,6 +2,19 @@ "sa_prefix": "{lightred}[SA] {default}", "sa_unknown": "未知", + "sa_player": "玩家", + "sa_steamid": "SteamID", + "sa_duration": "持续时间", + "sa_reason": "原因", + "sa_admin": "管理员", + "sa_permanent": "永久", + + "sa_discord_penalty_ban": "封禁已记录", + "sa_discord_penalty_mute": "禁言已记录", + "sa_discord_penalty_gag": "禁言已记录", + "sa_discord_penalty_silence": "禁声已记录", + "sa_discord_penalty_unknown": "未知已记录", + "sa_player_ban_message_time": "你因为{lightred}{0}{default}的原因被{lightred}{1}{default}禁止{lightred}{2}{default}分钟!", "sa_player_ban_message_perm": "你因为{lightred}{0}{default}的原因被{lightred}{1}{default}永久禁止!", "sa_player_kick_message": "你因为{lightred}{0}{default}的原因被{lightred}{1}{default}踢出!", From 3abf246f9b9da5c0a790dc3de23dff3af7a8aee5 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Tue, 2 Apr 2024 19:55:48 +0200 Subject: [PATCH 14/16] fixed reloadadmins --- Commands/basecommands.cs | 20 ++------------------ Menus/ManageAdminsMenu.cs | 4 ++-- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index e8e6aa8..89adf98 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -213,12 +213,12 @@ namespace CS2_SimpleAdmin { if (_database == null) return; - ReloadAdmins(); + ReloadAdmins(caller); command.ReplyToCommand("Reloaded sql admins"); } - public void ReloadAdmins() + public void ReloadAdmins(CCSPlayerController? caller) { if (_database == null) return; @@ -473,13 +473,6 @@ namespace CS2_SimpleAdmin _command = $"ds_workshop_changelevel {map.Replace("ws:", "")}"; } - //if (_discordWebhookClientLog != null && _localizer != null) - //{ - // string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - // string commandName = command?.GetCommandString ?? "css_changemap"; - // _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandName])); - //} - AddTimer(3.0f, () => { Server.ExecuteCommand(_command); @@ -565,15 +558,6 @@ namespace CS2_SimpleAdmin } } - //if (_discordWebhookClientLog != null && _localizer != null) - //{ - // string communityUrl = caller != null ? "<" + new SteamID(caller.SteamID).ToCommunityUrl().ToString() + ">" : ""; - // string commandName = command?.GetCommandString ?? "css_changewsmap"; - // _discordWebhookClientLog.SendMessageAsync(Helper.GenerateMessageDiscord(_localizer["sa_discord_log_command", $"[{callerName}]({communityUrl})", commandName])); - //} - //if (command is not null) - // Helper.LogCommand(caller, command); - AddTimer(3.0f, () => { Server.ExecuteCommand(_command); diff --git a/Menus/ManageAdminsMenu.cs b/Menus/ManageAdminsMenu.cs index c7cfbff..7f7b6fa 100644 --- a/Menus/ManageAdminsMenu.cs +++ b/Menus/ManageAdminsMenu.cs @@ -77,9 +77,9 @@ namespace CS2_SimpleAdmin.Menus CS2_SimpleAdmin.Instance.RemoveAdmin(admin, player.SteamID.ToString()); } - private static void ReloadAdmins() + private static void ReloadAdmins(CCSPlayerController admin) { - CS2_SimpleAdmin.Instance.ReloadAdmins(); + CS2_SimpleAdmin.Instance.ReloadAdmins(admin); } } } \ No newline at end of file From 7a8fd066f7ee042e5e3c15d6d1a3b60733e16778 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Tue, 16 Apr 2024 22:08:44 +0200 Subject: [PATCH 15/16] 1.3.8b - Plugin checks every minute if a player is banned - Minor changes - Removed bot_quota warning - NET8 --- .github/workflows/build.yml | 4 +- CS2-SimpleAdmin.cs | 2 +- Commands/basebans.cs | 9 +- Commands/basecommands.cs | 8 +- Events.cs | 30 +++--- Helper.cs | 4 +- Managers/AdminSQLManager.cs | 2 +- Managers/BanManager.cs | 196 ++++++++++++++++++++++-------------- Menus/ManagePlayersMenu.cs | 121 ++++++++++++++-------- 9 files changed, 232 insertions(+), 144 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c93c496..6a20dea 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Restore run: dotnet restore - name: Build @@ -42,7 +42,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v3 with: - dotnet-version: 7.0.x + dotnet-version: 8.0.x - name: Restore run: dotnet restore - name: Build diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 402517d..fa62329 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -38,7 +38,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.3.8a"; + public override string ModuleVersion => "1.3.8b"; public CS2_SimpleAdminConfig Config { get; set; } = new(); diff --git a/Commands/basebans.cs b/Commands/basebans.cs index c6dba6c..585e91b 100644 --- a/Commands/basebans.cs +++ b/Commands/basebans.cs @@ -49,7 +49,7 @@ namespace CS2_SimpleAdmin internal void Ban(CCSPlayerController? caller, CCSPlayerController player, int time, string reason, string? callerName = null, BanManager? banManager = null, CommandInfo? command = null) { - if (_database == null) return; + if (_database == null || player is null || !player.IsValid) return; callerName ??= caller == null ? "Console" : caller.PlayerName; @@ -58,14 +58,14 @@ namespace CS2_SimpleAdmin player.Pawn.Value!.Freeze(); } - PlayerInfo playerInfo = new PlayerInfo + PlayerInfo playerInfo = new() { SteamId = player.SteamID.ToString(), Name = player.PlayerName, IpAddress = player.IpAddress?.Split(":")[0] }; - PlayerInfo adminInfo = new PlayerInfo + PlayerInfo adminInfo = new() { SteamId = caller?.SteamID.ToString(), Name = caller?.PlayerName, @@ -79,7 +79,8 @@ namespace CS2_SimpleAdmin }); if (player.UserId.HasValue) - AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), + CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); if (playerInfo.IpAddress != null && !bannedPlayers.Contains(playerInfo.IpAddress)) bannedPlayers.Add(playerInfo.IpAddress); diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index 18a5c2c..8eb1c26 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -409,7 +409,7 @@ namespace CS2_SimpleAdmin player.Pawn.Value!.Freeze(); } - reason = reason ?? _localizer?["sa_unknown"] ?? "Unknown"; + reason ??= _localizer?["sa_unknown"] ?? "Unknown"; if (command != null) Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); @@ -423,12 +423,14 @@ namespace CS2_SimpleAdmin player.PrintToCenter(_localizer!["sa_player_kick_message", reason, caller == null ? "Console" : caller.PlayerName]); } if (player.UserId.HasValue) - AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value, reason), + CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } else { if (player.UserId.HasValue) - AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + AddTimer(Config.KickTime, () => Helper.KickPlayer(player.UserId.Value), + CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } if (caller == null || caller != null && caller.UserId != null && !silentPlayers.Contains(caller.Slot)) diff --git a/Events.cs b/Events.cs index 7c5ea63..27850e0 100644 --- a/Events.cs +++ b/Events.cs @@ -306,22 +306,34 @@ public partial class CS2_SimpleAdmin Logger.LogCritical("[OnMapStart] Expired check"); #endif + List players = Helper.GetValidPlayers(); + List<(string? IpAddress, ulong SteamID, int? UserId)> onlinePlayers = players + .Where(player => player.IpAddress != null && player.SteamID.ToString().Length == 17) + .Select(player => (player.IpAddress, player.SteamID, player.UserId)) + .ToList(); + Task.Run(async () => { - AdminSQLManager _adminManager = new AdminSQLManager(_database); - BanManager _banManager = new BanManager(_database, Config); - MuteManager _muteManager = new MuteManager(_database); + AdminSQLManager _adminManager = new(_database); + BanManager _banManager = new(_database, Config); + MuteManager _muteManager = new(_database); await _banManager.ExpireOldBans(); await _muteManager.ExpireOldMutes(); await _adminManager.DeleteOldAdmins(); + try + { + await _banManager.CheckOnlinePlayers(onlinePlayers); + } + catch { } + bannedPlayers.Clear(); Server.NextFrame(() => { try { - foreach (CCSPlayerController player in Helper.GetValidPlayers()) + foreach (CCSPlayerController player in players) { if (playerPenaltyManager.IsSlotInPenalties(player.Slot)) { @@ -412,16 +424,6 @@ public partial class CS2_SimpleAdmin await _adminManager.GiveAllFlags(); }); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - - AddTimer(3.0f, () => - { - ConVar? botQuota = ConVar.Find("bot_quota"); - - if (botQuota != null && botQuota.GetPrimitiveValue() > 0) - { - Logger.LogWarning("Due to bugs with bots (game bug), consider disabling bots by setting `bot_quota 0` in the gamemode config if your server crashes after a map change."); - } - }); } [GameEventHandler] diff --git a/Helper.cs b/Helper.cs index b6200b3..51e9e56 100644 --- a/Helper.cs +++ b/Helper.cs @@ -307,12 +307,12 @@ namespace CS2_SimpleAdmin var updatedJsonContent = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true, Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); File.WriteAllText(CfgPath, updatedJsonContent); } - + public static void TryLogCommandOnDiscord(CCSPlayerController? caller, string commandString) { if (CS2_SimpleAdmin._discordWebhookClientLog == null || CS2_SimpleAdmin._localizer == null) return; - + if (caller != null && caller.IsValid == false) caller = null; diff --git a/Managers/AdminSQLManager.cs b/Managers/AdminSQLManager.cs index 65e873a..99b3b36 100644 --- a/Managers/AdminSQLManager.cs +++ b/Managers/AdminSQLManager.cs @@ -12,7 +12,7 @@ public class AdminSQLManager // Unused for now //public static readonly ConcurrentDictionary> _adminCache = new ConcurrentDictionary>(); - public static readonly ConcurrentDictionary _adminCache = new ConcurrentDictionary(); + public static readonly ConcurrentDictionary _adminCache = new(); //public static readonly ConcurrentDictionary _adminCacheTimestamps = new ConcurrentDictionary(); diff --git a/Managers/BanManager.cs b/Managers/BanManager.cs index bd8fbe8..ee26efb 100644 --- a/Managers/BanManager.cs +++ b/Managers/BanManager.cs @@ -1,43 +1,42 @@ -using Dapper; +using CounterStrikeSharp.API; +using Dapper; using Microsoft.Extensions.Logging; using MySqlConnector; namespace CS2_SimpleAdmin; -internal class BanManager +internal class BanManager(Database database, CS2_SimpleAdminConfig config) { - private readonly Database _database; - private readonly CS2_SimpleAdminConfig _config; - - public BanManager(Database database, CS2_SimpleAdminConfig config) - { - _database = database; - _config = config; - } + private readonly Database _database = database; + private readonly CS2_SimpleAdminConfig _config = config; public async Task BanPlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0) { DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + - "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; - - await connection.ExecuteAsync(sql, new + try { - playerSteamid = player.SteamId, - playerName = player.Name, - playerIp = _config.BanType == 1 ? player.IpAddress : null, - adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, - adminName = issuer.Name == null ? "Console" : issuer.Name, - banReason = reason, - duration = time, - ends = futureTime, - created = now, - serverid = CS2_SimpleAdmin.ServerId - }); + await using MySqlConnection connection = await _database.GetConnectionAsync(); + + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `player_name`, `player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + + "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; + + await connection.ExecuteAsync(sql, new + { + playerSteamid = player.SteamId, + playerName = player.Name, + playerIp = _config.BanType == 1 ? player.IpAddress : null, + adminSteamid = issuer.SteamId ?? "Console", + adminName = issuer.Name ?? "Console", + banReason = reason, + duration = time, + ends = futureTime, + created = now, + serverid = CS2_SimpleAdmin.ServerId + }); + } + catch { } } public async Task AddBanBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0) @@ -47,22 +46,26 @@ internal class BanManager DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + - "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; - - await connection.ExecuteAsync(sql, new + try { - playerSteamid = playerSteamId, - adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, - adminName = issuer.Name == null ? "Console" : issuer.Name, - banReason = reason, - duration = time, - ends = futureTime, - created = now, - serverid = CS2_SimpleAdmin.ServerId - }); + await using MySqlConnection connection = await _database.GetConnectionAsync(); + + var sql = "INSERT INTO `sa_bans` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + + "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; + + await connection.ExecuteAsync(sql, new + { + playerSteamid = playerSteamId, + adminSteamid = issuer.SteamId ?? "Console", + adminName = issuer.Name ?? "Console", + banReason = reason, + duration = time, + ends = futureTime, + created = now, + serverid = CS2_SimpleAdmin.ServerId + }); + } + catch { } } public async Task AddBanByIp(string playerIp, PlayerInfo issuer, string reason, int time = 0) @@ -72,22 +75,26 @@ internal class BanManager DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + - "VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; - - await connection.ExecuteAsync(sql, new + try { - playerIp, - adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, - adminName = issuer.Name == null ? "Console" : issuer.Name, - banReason = reason, - duration = time, - ends = futureTime, - created = now, - serverid = CS2_SimpleAdmin.ServerId - }); + await using MySqlConnection connection = await _database.GetConnectionAsync(); + + var sql = "INSERT INTO `sa_bans` (`player_ip`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `server_id`) " + + "VALUES (@playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; + + await connection.ExecuteAsync(sql, new + { + playerIp, + adminSteamid = issuer.SteamId ?? "Console", + adminName = issuer.Name ?? "Console", + banReason = reason, + duration = time, + ends = futureTime, + created = now, + serverid = CS2_SimpleAdmin.ServerId + }); + } + catch { } } public async Task IsPlayerBanned(PlayerInfo player) @@ -143,21 +150,27 @@ internal class BanManager public async Task GetPlayerBans(PlayerInfo player) { - string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)"; - int banCount; - - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - if (!string.IsNullOrEmpty(player.IpAddress)) + try { - banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress }); - } - else - { - banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value }); - } + string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP)"; + int banCount; - return banCount; + await using MySqlConnection connection = await _database.GetConnectionAsync(); + + if (!string.IsNullOrEmpty(player.IpAddress)) + { + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress }); + } + else + { + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value }); + } + + return banCount; + } + catch { } + + return 0; } public async Task UnbanPlayer(string playerPattern) @@ -166,11 +179,48 @@ internal class BanManager { return; } + try + { + await using MySqlConnection connection = await _database.GetConnectionAsync(); - await using MySqlConnection connection = await _database.GetConnectionAsync(); + string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'"; + await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern }); - string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'"; - await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern }); + } + catch { } + } + + public async Task CheckOnlinePlayers(List<(string? IpAddress, ulong SteamID, int? UserId)> players) + { + try + { + await using MySqlConnection connection = await _database.GetConnectionAsync(); + string sql = "SELECT COUNT(*) FROM sa_bans WHERE (player_steamid = @PlayerSteamID OR player_ip = @PlayerIP) AND status = 'ACTIVE'"; + + foreach (var (IpAddress, SteamID, UserId) in players) + { + if (!UserId.HasValue) continue; + + int banCount = 0; + if (!string.IsNullOrEmpty(IpAddress)) + { + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = SteamID, PlayerIP = IpAddress }); + } + else + { + banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = SteamID, PlayerIP = DBNull.Value }); + } + + if (banCount > 0) + { + Server.NextFrame(() => + { + Helper.KickPlayer(UserId.Value, "Banned"); + }); + } + } + } + catch { } } public async Task ExpireOldBans() diff --git a/Menus/ManagePlayersMenu.cs b/Menus/ManagePlayersMenu.cs index 399080f..7825838 100644 --- a/Menus/ManagePlayersMenu.cs +++ b/Menus/ManagePlayersMenu.cs @@ -20,7 +20,7 @@ namespace CS2_SimpleAdmin.Menus } BaseMenu menu = AdminMenu.CreateMenu("Manage Players"); - List options = new(); + List options = []; // permissions bool hasSlay = AdminManager.PlayerHasPermissions(admin, "@css/slay"); @@ -71,15 +71,16 @@ namespace CS2_SimpleAdmin.Menus private static void SlapMenu(CCSPlayerController admin, CCSPlayerController player) { BaseMenu menu = AdminMenu.CreateMenu($"Slap: {player.PlayerName}"); - List options = new(); - - // options added in order - options.Add(new ChatMenuOptionData("0 hp", () => ApplySlapAndKeepMenu(admin, player, 0))); - options.Add(new ChatMenuOptionData("1 hp", () => ApplySlapAndKeepMenu(admin, player, 1))); - options.Add(new ChatMenuOptionData("5 hp", () => ApplySlapAndKeepMenu(admin, player, 5))); - options.Add(new ChatMenuOptionData("10 hp", () => ApplySlapAndKeepMenu(admin, player, 10))); - options.Add(new ChatMenuOptionData("50 hp", () => ApplySlapAndKeepMenu(admin, player, 50))); - options.Add(new ChatMenuOptionData("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100))); + List options = + [ + // options added in order + new ChatMenuOptionData("0 hp", () => ApplySlapAndKeepMenu(admin, player, 0)), + new ChatMenuOptionData("1 hp", () => ApplySlapAndKeepMenu(admin, player, 1)), + new ChatMenuOptionData("5 hp", () => ApplySlapAndKeepMenu(admin, player, 5)), + new ChatMenuOptionData("10 hp", () => ApplySlapAndKeepMenu(admin, player, 10)), + new ChatMenuOptionData("50 hp", () => ApplySlapAndKeepMenu(admin, player, 50)), + new ChatMenuOptionData("100 hp", () => ApplySlapAndKeepMenu(admin, player, 100)), + ]; foreach (ChatMenuOptionData menuOptionData in options) { @@ -92,29 +93,37 @@ namespace CS2_SimpleAdmin.Menus private static void ApplySlapAndKeepMenu(CCSPlayerController admin, CCSPlayerController player, int damage) { - CS2_SimpleAdmin.Instance.Slap(admin, player, damage); - SlapMenu(admin, player); + if (player is not null && player.IsValid) + { + CS2_SimpleAdmin.Instance.Slap(admin, player, damage); + SlapMenu(admin, player); + } } private static void Slay(CCSPlayerController admin, CCSPlayerController player) { - CS2_SimpleAdmin.Instance.Slay(admin, player); + if (player is not null && player.IsValid) + CS2_SimpleAdmin.Instance.Slay(admin, player); } private static void KickMenu(CCSPlayerController admin, CCSPlayerController player) { BaseMenu menu = AdminMenu.CreateMenu($"Kick: {player.PlayerName}"); - List options = new() - { + List options = + [ "Voice Abuse", "Chat Abuse", "Admin disrespect", "Other" - }; + ]; foreach (string option in options) { - menu.AddMenuOption(option, (_, _) => { Kick(admin, player, option); }); + menu.AddMenuOption(option, (_, _) => + { + if (player is not null && player.IsValid) + Kick(admin, player, option); + }); } AdminMenu.OpenMenu(admin, menu); @@ -122,24 +131,29 @@ namespace CS2_SimpleAdmin.Menus private static void Kick(CCSPlayerController admin, CCSPlayerController player, string reason) { - CS2_SimpleAdmin.Instance.Kick(admin, player, reason); + if (player is not null && player.IsValid) + CS2_SimpleAdmin.Instance.Kick(admin, player, reason); } private static void BanMenu(CCSPlayerController admin, CCSPlayerController player, int duration) { BaseMenu menu = AdminMenu.CreateMenu($"Ban: {player.PlayerName}"); - List options = new() - { + List options = + [ "Hacking", "Voice Abuse", "Chat Abuse", "Admin disrespect", "Other" - }; + ]; foreach (string option in options) { - menu.AddMenuOption(option, (_, _) => { Ban(admin, player, duration, option); }); + menu.AddMenuOption(option, (_, _) => + { + if (player is not null && player.IsValid) + Ban(admin, player, duration, option); + }); } AdminMenu.OpenMenu(admin, menu); @@ -147,26 +161,31 @@ namespace CS2_SimpleAdmin.Menus private static void Ban(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) { - CS2_SimpleAdmin.Instance.Ban(admin, player, duration, reason); + if (player is not null && player.IsValid) + CS2_SimpleAdmin.Instance.Ban(admin, player, duration, reason); } private static void GagMenu(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Localize and make options in config? BaseMenu menu = AdminMenu.CreateMenu($"Gag: {player.PlayerName}"); - List options = new() - { + List options = + [ "Advertising", "Spamming", "Spectator camera abuse", "Hate", "Admin disrespect", "Other" - }; + ]; foreach (string option in options) { - menu.AddMenuOption(option, (_, _) => { Gag(admin, player, duration, option); }); + menu.AddMenuOption(option, (_, _) => + { + if (player is not null && player.IsValid) + Gag(admin, player, duration, option); + }); } AdminMenu.OpenMenu(admin, menu); @@ -174,15 +193,16 @@ namespace CS2_SimpleAdmin.Menus private static void Gag(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) { - CS2_SimpleAdmin.Instance.Gag(admin, player, duration, reason); + if (player is not null && player.IsValid) + CS2_SimpleAdmin.Instance.Gag(admin, player, duration, reason); } private static void MuteMenu(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Localize and make options in config? BaseMenu menu = AdminMenu.CreateMenu($"Mute: {player.PlayerName}"); - List options = new() - { + List options = + [ "Shouting", "Playing music", "Advertising", @@ -191,11 +211,15 @@ namespace CS2_SimpleAdmin.Menus "Hate", "Admin disrespect", "Other" - }; + ]; foreach (string option in options) { - menu.AddMenuOption(option, (_, _) => { Mute(admin, player, duration, option); }); + menu.AddMenuOption(option, (_, _) => + { + if (player is not null && player.IsValid) + Mute(admin, player, duration, option); + }); } AdminMenu.OpenMenu(admin, menu); @@ -203,15 +227,16 @@ namespace CS2_SimpleAdmin.Menus private static void Mute(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) { - CS2_SimpleAdmin.Instance.Mute(admin, player, duration, reason); + if (player is not null && player.IsValid) + CS2_SimpleAdmin.Instance.Mute(admin, player, duration, reason); } private static void SilenceMenu(CCSPlayerController admin, CCSPlayerController player, int duration) { // TODO: Localize and make options in config? BaseMenu menu = AdminMenu.CreateMenu($"Silence: {player.PlayerName}"); - List options = new() - { + List options = + [ "Shouting", "Playing music", "Advertising", @@ -220,11 +245,15 @@ namespace CS2_SimpleAdmin.Menus "Hate", "Admin disrespect", "Other" - }; + ]; foreach (string option in options) { - menu.AddMenuOption(option, (_, _) => { Silence(admin, player, duration, option); }); + menu.AddMenuOption(option, (_, _) => + { + if (player is not null && player.IsValid) + Silence(admin, player, duration, option); + }); } AdminMenu.OpenMenu(admin, menu); @@ -232,18 +261,21 @@ namespace CS2_SimpleAdmin.Menus private static void Silence(CCSPlayerController admin, CCSPlayerController player, int duration, string reason) { - CS2_SimpleAdmin.Instance.Silence(admin, player, duration, reason); + if (player is not null && player.IsValid) + CS2_SimpleAdmin.Instance.Silence(admin, player, duration, reason); } private static void ForceTeamMenu(CCSPlayerController admin, CCSPlayerController player) { // TODO: Localize BaseMenu menu = AdminMenu.CreateMenu($"Force {player.PlayerName}'s Team"); - List options = new(); - options.Add(new ChatMenuOptionData("CT", () => ForceTeam(admin, player, "ct", CsTeam.CounterTerrorist))); - options.Add(new ChatMenuOptionData("T", () => ForceTeam(admin, player, "t", CsTeam.Terrorist))); - options.Add(new ChatMenuOptionData("Swap", () => ForceTeam(admin, player, "swap", CsTeam.Spectator))); - options.Add(new ChatMenuOptionData("Spectator", () => ForceTeam(admin, player, "spec", CsTeam.Spectator))); + List options = + [ + new ChatMenuOptionData("CT", () => ForceTeam(admin, player, "ct", CsTeam.CounterTerrorist)), + new ChatMenuOptionData("T", () => ForceTeam(admin, player, "t", CsTeam.Terrorist)), + new ChatMenuOptionData("Swap", () => ForceTeam(admin, player, "swap", CsTeam.Spectator)), + new ChatMenuOptionData("Spectator", () => ForceTeam(admin, player, "spec", CsTeam.Spectator)), + ]; foreach (ChatMenuOptionData menuOptionData in options) { @@ -256,7 +288,8 @@ namespace CS2_SimpleAdmin.Menus private static void ForceTeam(CCSPlayerController admin, CCSPlayerController player, string teamName, CsTeam teamNum) { - CS2_SimpleAdmin.Instance.ChangeTeam(admin, player, teamName, teamNum, true); + if (player is not null && player.IsValid) + CS2_SimpleAdmin.Instance.ChangeTeam(admin, player, teamName, teamNum, true); } } } \ No newline at end of file From 270b36fa2696d8347e1fe3f0b856a39dc6bee0fc Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 20 Apr 2024 18:56:41 +0200 Subject: [PATCH 16/16] 1.3.9a **MAJOR UPDATE** - New database schema - Added `css_admins_flags` table - Added `css_unmutes` table - Added `css_unbans` table --- CS2-SimpleAdmin.cs | 23 ++- CS2-SimpleAdmin.csproj | 4 +- Commands/basebans.cs | 9 +- Commands/basecommands.cs | 6 +- Commands/basecomms.cs | 53 +++--- Database/Database.cs | 71 +++++--- Database/Migration.cs | 64 +++++++ .../001_CreateTables.sql} | 8 +- Database/Migrations/002_CreateFlagsTable.sql | 9 + .../Migrations/003_ChangeColumnsPosition.sql | 4 + .../004_MoveOldFlagsToFlagsTable.sql | 30 ++++ Database/Migrations/005_CreateUnbansTable.sql | 29 +++ Events.cs | 33 ++-- Managers/AdminSQLManager.cs | 166 ++++++++++-------- Managers/BanManager.cs | 37 +++- Managers/MuteManager.cs | 165 ++++++++++------- Managers/PlayerPenaltyManager.cs | 24 +-- Menus/AdminMenu.cs | 4 +- Menus/ManageAdminsMenu.cs | 2 +- Menus/PlayersMenu.cs | 8 +- 20 files changed, 523 insertions(+), 226 deletions(-) create mode 100644 Database/Migration.cs rename Database/{database_setup.sql => Migrations/001_CreateTables.sql} (100%) create mode 100644 Database/Migrations/002_CreateFlagsTable.sql create mode 100644 Database/Migrations/003_ChangeColumnsPosition.sql create mode 100644 Database/Migrations/004_MoveOldFlagsToFlagsTable.sql create mode 100644 Database/Migrations/005_CreateUnbansTable.sql diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index fa62329..1e29e4c 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; -using Dapper; using Discord.Webhook; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; @@ -38,7 +37,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.3.8b"; + public override string ModuleVersion => "1.3.9a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -54,7 +53,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig _database.DatabaseMigration()); + + /* Task.Run(async () => { try @@ -109,6 +119,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig bag, int playerSlot) { - List tempList = new List(); + List tempList = []; while (!bag.IsEmpty) { if (bag.TryTake(out int item) && item != playerSlot) diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index 4a170d3..0f6119c 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -10,7 +10,7 @@ - + @@ -22,7 +22,7 @@ - + diff --git a/Commands/basebans.cs b/Commands/basebans.cs index 585e91b..c4cf433 100644 --- a/Commands/basebans.cs +++ b/Commands/basebans.cs @@ -371,12 +371,14 @@ namespace CS2_SimpleAdmin [ConsoleCommand("css_unban")] [RequiresPermissions("@css/unban")] - [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [CommandHelper(minArgs: 1, usage: " [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnUnbanCommand(CCSPlayerController? caller, CommandInfo command) { if (_database == null) return; - string callerName = caller == null ? "Console" : caller.PlayerName; + string callerName = caller?.PlayerName ?? "Console"; + string callerSteamId = caller?.SteamID.ToString() ?? "Console"; + if (command.GetArg(1).Length <= 1) { command.ReplyToCommand($"Too short pattern to search."); @@ -384,9 +386,10 @@ namespace CS2_SimpleAdmin } string pattern = command.GetArg(1); + string reason = command.GetArg(2); BanManager _banManager = new(_database, Config); - Task.Run(async () => await _banManager.UnbanPlayer(pattern)); + Task.Run(async () => await _banManager.UnbanPlayer(pattern, callerSteamId, reason)); Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); Helper.LogCommand(caller, command); diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index 8eb1c26..95e18b4 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -134,11 +134,13 @@ namespace CS2_SimpleAdmin AddAdmin(caller, steamid, name, flags, immunity, time, globalAdmin, command); } - public void AddAdmin(CCSPlayerController? caller, string steamid, string name, string flags, int immunity, int time = 0, bool globalAdmin = false, CommandInfo? command = null) + public static void AddAdmin(CCSPlayerController? caller, string steamid, string name, string flags, int immunity, int time = 0, bool globalAdmin = false, CommandInfo? command = null) { if (_database == null) return; AdminSQLManager _adminManager = new(_database); - _ = _adminManager.AddAdminBySteamId(steamid, name, flags, immunity, time, globalAdmin); + + List flagsList = flags.Split(',').Select(flag => flag.Trim()).ToList(); + _ = _adminManager.AddAdminBySteamId(steamid, name, flagsList, immunity, time, globalAdmin); if (command != null) Helper.SendDiscordLogMessage(caller, command, _discordWebhookClientLog, _localizer); diff --git a/Commands/basecomms.cs b/Commands/basecomms.cs index d66a69b..f3c3816 100644 --- a/Commands/basecomms.cs +++ b/Commands/basecomms.cs @@ -77,7 +77,7 @@ namespace CS2_SimpleAdmin if (TagsDetected) Server.ExecuteCommand($"css_tag_mute {player!.SteamID}"); - playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Gag, DateTime.Now.AddMinutes(time), time); + PlayerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Gag, DateTime.Now.AddMinutes(time), time); if (time == 0) { if (!player!.IsBot && !player.IsHLTV) @@ -230,7 +230,7 @@ namespace CS2_SimpleAdmin if (TagsDetected) Server.ExecuteCommand($"css_tag_mute {player!.SteamID}"); - playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Gag, DateTime.Now.AddMinutes(time), time); + PlayerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Gag, DateTime.Now.AddMinutes(time), time); } Helper.SendDiscordPenaltyMessage(caller, player, reason, time, Helper.PenaltyType.Gag, _discordWebhookClientPenalty, _localizer); @@ -252,13 +252,16 @@ namespace CS2_SimpleAdmin [ConsoleCommand("css_ungag")] [RequiresPermissions("@css/chat")] - [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [CommandHelper(minArgs: 1, usage: " [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnUngagCommand(CCSPlayerController? caller, CommandInfo command) { if (_database == null) return; string callerName = caller == null ? "Console" : caller.PlayerName; + string callerSteamId = caller?.SteamID.ToString() ?? "Console"; + string foundPlayerName = string.Empty; string foundPlayerSteamId64 = string.Empty; + string reason = command.GetArg(2); if (command.GetArg(1).Length <= 1) { @@ -284,7 +287,7 @@ namespace CS2_SimpleAdmin CCSPlayerController? player = matches.FirstOrDefault(); if (player != null && player.IsValid) { - playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); + PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); if (TagsDetected) Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); @@ -303,7 +306,7 @@ namespace CS2_SimpleAdmin CCSPlayerController? player = matches.FirstOrDefault(); if (player != null && player.IsValid) { - playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); + PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); if (TagsDetected) Server.ExecuteCommand($"css_tag_unmute {player!.SteamID.ToString()}"); @@ -319,12 +322,12 @@ namespace CS2_SimpleAdmin if (found) { - Task.Run(async () => { await _muteManager.UnmutePlayer(foundPlayerSteamId64, 0); }); // Unmute by type 0 (gag) + Task.Run(async () => { await _muteManager.UnmutePlayer(foundPlayerSteamId64, callerSteamId, reason, 0); }); // Unmute by type 0 (gag) command.ReplyToCommand($"Ungaged player {foundPlayerName}."); } else { - Task.Run(async () => { await _muteManager.UnmutePlayer(pattern, 0); }); // Unmute by type 0 (gag) + Task.Run(async () => { await _muteManager.UnmutePlayer(pattern, callerSteamId, reason, 0); }); // Unmute by type 0 (gag) command.ReplyToCommand($"Ungaged offline player with pattern {pattern}."); } @@ -424,7 +427,7 @@ namespace CS2_SimpleAdmin await muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 1); }); - playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Mute, DateTime.Now.AddMinutes(time), time); + PlayerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Mute, DateTime.Now.AddMinutes(time), time); if (time == 0) { @@ -526,7 +529,7 @@ namespace CS2_SimpleAdmin return; } - playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Mute, DateTime.Now.AddMinutes(time), time); + PlayerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Mute, DateTime.Now.AddMinutes(time), time); if (time == 0) { @@ -594,8 +597,11 @@ namespace CS2_SimpleAdmin { if (_database == null) return; string callerName = caller == null ? "Console" : caller.PlayerName; + string callerSteamId = caller?.SteamID.ToString() ?? "Console"; + string foundPlayerName = string.Empty; string foundPlayerSteamId64 = string.Empty; + string reason = command.GetArg(2); if (command.GetArg(1).Length <= 1) { @@ -609,7 +615,7 @@ namespace CS2_SimpleAdmin string pattern = command.GetArg(1); bool found = false; MuteManager _muteManager = new(_database); - PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + PlayerPenaltyManager playerPenaltyManager = new(); if (Helper.IsValidSteamID64(pattern)) { @@ -619,7 +625,7 @@ namespace CS2_SimpleAdmin CCSPlayerController? player = matches.FirstOrDefault(); if (player != null && player.IsValid) { - playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute); + PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute); player.VoiceFlags = VoiceFlags.Normal; found = true; foundPlayerName = player.PlayerName; @@ -635,7 +641,7 @@ namespace CS2_SimpleAdmin CCSPlayerController? player = matches.FirstOrDefault(); if (player != null && player.IsValid) { - playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute); + PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute); player.VoiceFlags = VoiceFlags.Normal; pattern = player.SteamID.ToString(); found = true; @@ -647,12 +653,12 @@ namespace CS2_SimpleAdmin if (found) { - Task.Run(async () => { await _muteManager.UnmutePlayer(foundPlayerSteamId64, 1); }); // Unmute by type 1 (mute) + Task.Run(async () => { await _muteManager.UnmutePlayer(foundPlayerSteamId64, callerSteamId, reason, 1); }); // Unmute by type 1 (mute) command.ReplyToCommand($"Unmuted player {foundPlayerName}."); } else { - Task.Run(async () => { await _muteManager.UnmutePlayer(pattern, 1); }); // Unmute by type 1 (mute) + Task.Run(async () => { await _muteManager.UnmutePlayer(pattern, callerSteamId, reason, 1); }); // Unmute by type 1 (mute) command.ReplyToCommand($"Unmuted offline player with pattern {pattern}."); } @@ -749,7 +755,7 @@ namespace CS2_SimpleAdmin Server.ExecuteCommand($"css_tag_mute {player!.SteamID}"); player!.VoiceFlags = VoiceFlags.Muted; - playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time); + PlayerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time); if (time == 0) { @@ -859,7 +865,7 @@ namespace CS2_SimpleAdmin if (TagsDetected) Server.ExecuteCommand($"css_tag_mute {player!.SteamID}"); - playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time); + PlayerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time); if (time == 0) { @@ -921,13 +927,16 @@ namespace CS2_SimpleAdmin [ConsoleCommand("css_unsilence")] [RequiresPermissions("@css/chat")] - [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + [CommandHelper(minArgs: 1, usage: " [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] public void OnUnsilenceCommand(CCSPlayerController? caller, CommandInfo command) { if (_database == null) return; string callerName = caller == null ? "Console" : caller.PlayerName; + string callerSteamId = caller?.SteamID.ToString() ?? "Console"; + string foundPlayerName = string.Empty; string foundPlayerSteamId64 = string.Empty; + string reason = command.GetArg(2); if (command.GetArg(1).Length <= 1) { @@ -941,7 +950,7 @@ namespace CS2_SimpleAdmin string pattern = command.GetArg(1); bool found = false; MuteManager _muteManager = new(_database); - PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + PlayerPenaltyManager playerPenaltyManager = new(); if (Helper.IsValidSteamID64(pattern)) { @@ -954,7 +963,7 @@ namespace CS2_SimpleAdmin if (TagsDetected) Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); - playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Silence); + PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Silence); player.VoiceFlags = VoiceFlags.Normal; found = true; foundPlayerName = player.PlayerName; @@ -973,7 +982,7 @@ namespace CS2_SimpleAdmin if (TagsDetected) Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); - playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Silence); + PlayerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Silence); player.VoiceFlags = VoiceFlags.Normal; pattern = player.SteamID.ToString(); found = true; @@ -985,13 +994,13 @@ namespace CS2_SimpleAdmin if (found) { - Task.Run(async () => { await _muteManager.UnmutePlayer(foundPlayerSteamId64, 2); }); // Unmute by type 2 (silence) + Task.Run(async () => { await _muteManager.UnmutePlayer(foundPlayerSteamId64, callerSteamId, reason, 2); }); // Unmute by type 2 (silence) command.ReplyToCommand($"Unsilenced player {foundPlayerName}."); return; } else { - Task.Run(async () => { await _muteManager.UnmutePlayer(pattern, 2); }); // Unmute by type 2 (silence) + Task.Run(async () => { await _muteManager.UnmutePlayer(pattern, callerSteamId, reason, 2); }); // Unmute by type 2 (silence) command.ReplyToCommand($"Unsilenced offline player with pattern {pattern}."); return; } diff --git a/Database/Database.cs b/Database/Database.cs index 521c8ca..3a2addd 100644 --- a/Database/Database.cs +++ b/Database/Database.cs @@ -1,31 +1,60 @@ using Microsoft.Extensions.Logging; using MySqlConnector; -namespace CS2_SimpleAdmin +namespace CS2_SimpleAdmin; + +public class Database(string dbConnectionString) { - public class Database + private readonly string _dbConnectionString = dbConnectionString; + + public MySqlConnection GetConnection() { - private readonly string _dbConnectionString; - - public Database(string dbConnectionString) + try { - _dbConnectionString = dbConnectionString; + var connection = new MySqlConnection(_dbConnectionString); + connection.Open(); + return connection; } - - public async Task GetConnectionAsync() + catch (Exception ex) { - try - { - var connection = new MySqlConnection(_dbConnectionString); - await connection.OpenAsync(); - return connection; - } - catch (Exception ex) - { - if (CS2_SimpleAdmin._logger != null) - CS2_SimpleAdmin._logger.LogCritical($"Unable to connect to database: {ex.Message}"); - throw; - } + if (CS2_SimpleAdmin._logger != null) + CS2_SimpleAdmin._logger.LogCritical($"Unable to connect to database: {ex.Message}"); + throw; } } -} \ No newline at end of file + + public async Task GetConnectionAsync() + { + try + { + var connection = new MySqlConnection(_dbConnectionString); + await connection.OpenAsync(); + return connection; + } + catch (Exception ex) + { + CS2_SimpleAdmin._logger?.LogCritical($"Unable to connect to database: {ex.Message}"); + throw; + } + } + + public void DatabaseMigration() + { + Migration migrator = new(this); + migrator.ExecuteMigrations(); + } + + public bool CheckDatabaseConnection() + { + using MySqlConnection connection = GetConnection(); + + try + { + return connection.Ping(); + } + catch + { + return false; + } + } +} diff --git a/Database/Migration.cs b/Database/Migration.cs new file mode 100644 index 0000000..80ade5a --- /dev/null +++ b/Database/Migration.cs @@ -0,0 +1,64 @@ +using Microsoft.Extensions.Logging; +using MySqlConnector; + +namespace CS2_SimpleAdmin; + +public class Migration(Database database) +{ + private readonly Database _database = database; + + public void ExecuteMigrations() + { + string migrationsDirectory = CS2_SimpleAdmin.Instance.ModuleDirectory + "/Database/Migrations"; + + var files = Directory.GetFiles(migrationsDirectory, "*.sql") + .OrderBy(f => f); + + using MySqlConnection connection = _database.GetConnection(); + + // Create sa_migrations table if not exists + using var cmd = new MySqlCommand(@" + CREATE TABLE IF NOT EXISTS `sa_migrations` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `version` VARCHAR(255) NOT NULL + );", connection); + + cmd.ExecuteNonQuery(); + + // Get the last applied migration version + var lastAppliedVersion = GetLastAppliedVersion(connection); + + foreach (var file in files) + { + var version = Path.GetFileNameWithoutExtension(file); + + // Check if the migration has already been applied + if (string.Compare(version, lastAppliedVersion, StringComparison.OrdinalIgnoreCase) > 0) + { + var sqlScript = File.ReadAllText(file); + + using var cmdMigration = new MySqlCommand(sqlScript, connection); + cmdMigration.ExecuteNonQuery(); + + // Update the last applied migration version + UpdateLastAppliedVersion(connection, version); + + CS2_SimpleAdmin._logger?.LogInformation($"Migration \"{version}\" successfully applied."); + } + } + } + + private static string GetLastAppliedVersion(MySqlConnection connection) + { + using var cmd = new MySqlCommand("SELECT `version` FROM `sa_migrations` ORDER BY `id` DESC LIMIT 1;", connection); + var result = cmd.ExecuteScalar(); + return result?.ToString() ?? string.Empty; + } + + private static void UpdateLastAppliedVersion(MySqlConnection connection, string version) + { + using var cmd = new MySqlCommand("INSERT INTO `sa_migrations` (`version`) VALUES (@Version);", connection); + cmd.Parameters.AddWithValue("@Version", version); + cmd.ExecuteNonQuery(); + } +} diff --git a/Database/database_setup.sql b/Database/Migrations/001_CreateTables.sql similarity index 100% rename from Database/database_setup.sql rename to Database/Migrations/001_CreateTables.sql index 8bda5f7..26c50b7 100644 --- a/Database/database_setup.sql +++ b/Database/Migrations/001_CreateTables.sql @@ -1,7 +1,7 @@ CREATE TABLE IF NOT EXISTS `sa_bans` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - `player_steamid` VARCHAR(64), `player_name` VARCHAR(128), + `player_steamid` VARCHAR(64), `player_ip` VARCHAR(128), `admin_steamid` VARCHAR(64) NOT NULL, `admin_name` VARCHAR(128) NOT NULL, @@ -15,8 +15,8 @@ CREATE TABLE IF NOT EXISTS `sa_bans` ( CREATE TABLE IF NOT EXISTS `sa_mutes` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `player_steamid` varchar(64) NOT NULL, `player_name` varchar(128) NULL, + `player_steamid` varchar(64) NOT NULL, `admin_steamid` varchar(64) NOT NULL, `admin_name` varchar(128) NOT NULL, `reason` varchar(255) NOT NULL, @@ -31,8 +31,8 @@ CREATE TABLE IF NOT EXISTS `sa_mutes` ( CREATE TABLE IF NOT EXISTS `sa_admins` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `player_steamid` varchar(64) NOT NULL, `player_name` varchar(128) NOT NULL, + `player_steamid` varchar(64) NOT NULL, `flags` TEXT NOT NULL, `immunity` varchar(64) NOT NULL DEFAULT '0', `server_id` INT NULL, @@ -43,8 +43,8 @@ CREATE TABLE IF NOT EXISTS `sa_admins` ( CREATE TABLE IF NOT EXISTS `sa_servers` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `address` varchar(64) NOT NULL, `hostname` varchar(128) NOT NULL, + `address` varchar(64) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `address` (`address`) ) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; \ No newline at end of file diff --git a/Database/Migrations/002_CreateFlagsTable.sql b/Database/Migrations/002_CreateFlagsTable.sql new file mode 100644 index 0000000..3c9b75b --- /dev/null +++ b/Database/Migrations/002_CreateFlagsTable.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS `sa_admins_flags` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `admin_id` int(11) NOT NULL, + `flag` varchar(64) NOT NULL, + PRIMARY KEY (`id`), + FOREIGN KEY (`admin_id`) REFERENCES `sa_admins` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +ALTER TABLE `sa_admins` CHANGE `flags` `flags` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL; diff --git a/Database/Migrations/003_ChangeColumnsPosition.sql b/Database/Migrations/003_ChangeColumnsPosition.sql new file mode 100644 index 0000000..d25915a --- /dev/null +++ b/Database/Migrations/003_ChangeColumnsPosition.sql @@ -0,0 +1,4 @@ +ALTER TABLE `sa_bans` CHANGE `player_name` `player_name` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `id`; +ALTER TABLE `sa_mutes` CHANGE `player_name` `player_name` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `id`; +ALTER TABLE `sa_admins` CHANGE `player_name` `player_name` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `id`; +ALTER TABLE `sa_servers` CHANGE `hostname` `hostname` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL AFTER `id`; \ No newline at end of file diff --git a/Database/Migrations/004_MoveOldFlagsToFlagsTable.sql b/Database/Migrations/004_MoveOldFlagsToFlagsTable.sql new file mode 100644 index 0000000..63d42c8 --- /dev/null +++ b/Database/Migrations/004_MoveOldFlagsToFlagsTable.sql @@ -0,0 +1,30 @@ +INSERT INTO sa_admins_flags (admin_id, flag) +WITH RECURSIVE numbers AS ( + SELECT 1 AS n + UNION ALL + SELECT n + 1 FROM numbers + WHERE n < (SELECT MAX(CHAR_LENGTH(flags) - CHAR_LENGTH(REPLACE(flags, ',', '')) + 1) FROM sa_admins) +) +SELECT + min_admins.admin_id, + TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(sa_admins.flags, ',', numbers.n), ',', -1)) AS flag +FROM numbers +JOIN ( + SELECT MIN(id) AS admin_id, player_steamid, server_id + FROM sa_admins + WHERE player_steamid != 'Console' + GROUP BY player_steamid, server_id +) AS min_admins ON 1=1 +JOIN sa_admins ON CHAR_LENGTH(sa_admins.flags) - CHAR_LENGTH(REPLACE(sa_admins.flags, ',', '')) >= numbers.n - 1 + AND min_admins.player_steamid = sa_admins.player_steamid + AND (min_admins.server_id = sa_admins.server_id OR (min_admins.server_id IS NULL AND sa_admins.server_id IS NULL)) + +UNION + +SELECT + (SELECT MAX(id) + 1 FROM sa_admins WHERE server_id IS NULL) AS admin_id, + TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(sa_admins.flags, ',', numbers.n), ',', -1)) AS flag +FROM numbers +JOIN sa_admins ON CHAR_LENGTH(sa_admins.flags) - CHAR_LENGTH(REPLACE(sa_admins.flags, ',', '')) >= numbers.n - 1 + AND sa_admins.server_id IS NULL +WHERE sa_admins.player_steamid != 'Console'; diff --git a/Database/Migrations/005_CreateUnbansTable.sql b/Database/Migrations/005_CreateUnbansTable.sql new file mode 100644 index 0000000..e005441 --- /dev/null +++ b/Database/Migrations/005_CreateUnbansTable.sql @@ -0,0 +1,29 @@ +CREATE TABLE IF NOT EXISTS `sa_unbans` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `ban_id` int(11) NOT NULL, + `admin_id` int(11) NOT NULL DEFAULT 0, + `reason` varchar(255) NOT NULL DEFAULT 'Unknown', + `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE TABLE IF NOT EXISTS `sa_unmutes` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `mute_id` int(11) NOT NULL, + `admin_id` int(11) NOT NULL DEFAULT 0, + `reason` varchar(255) NOT NULL DEFAULT 'Unknown', + `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +INSERT INTO `sa_admins` (`id`, `player_name`, `player_steamid`, `flags`, `immunity`, `server_id`, `ends`, `created`) +VALUES (-1, 'Console', 'Console', '', '0', NULL, NULL, '0000-00-00 00:00:00'); + +UPDATE `sa_admins` SET `id` = 0 WHERE `id` = -1; + +ALTER TABLE `sa_bans` ADD `unban_id` INT NULL AFTER `server_id`; +ALTER TABLE `sa_mutes` ADD `unmute_id` INT NULL AFTER `server_id`; +ALTER TABLE `sa_bans` ADD FOREIGN KEY (`unban_id`) REFERENCES `sa_unbans`(`id`) ON DELETE CASCADE; +ALTER TABLE `sa_mutes` ADD FOREIGN KEY (`unmute_id`) REFERENCES `sa_unmutes`(`id`) ON DELETE CASCADE; +ALTER TABLE `sa_unbans` ADD FOREIGN KEY (`admin_id`) REFERENCES `sa_admins`(`id`) ON DELETE CASCADE; +ALTER TABLE `sa_unmutes` ADD FOREIGN KEY (`admin_id`) REFERENCES `sa_admins`(`id`) ON DELETE CASCADE; diff --git a/Events.cs b/Events.cs index 27850e0..e100d6e 100644 --- a/Events.cs +++ b/Events.cs @@ -51,7 +51,7 @@ public partial class CS2_SimpleAdmin try { PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); - playerPenaltyManager.RemoveAllPenalties(player.Slot); + PlayerPenaltyManager.RemoveAllPenalties(player.Slot); if (TagsDetected) { @@ -167,7 +167,7 @@ public partial class CS2_SimpleAdmin // Apply mute penalty based on mute type if (muteType == "GAG") { - playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Gag, ends, duration); + PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Gag, ends, duration); Server.NextFrame(() => { if (TagsDetected) @@ -178,7 +178,7 @@ public partial class CS2_SimpleAdmin } else if (muteType == "MUTE") { - playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Mute, ends, duration); + PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Mute, ends, duration); Server.NextFrame(() => { player.VoiceFlags = VoiceFlags.Muted; @@ -186,7 +186,7 @@ public partial class CS2_SimpleAdmin } else { - playerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Silence, ends, duration); + PlayerPenaltyManager.AddPenalty(playerInfo.Slot, PenaltyType.Silence, ends, duration); Server.NextFrame(() => { player.VoiceFlags = VoiceFlags.Muted; @@ -234,7 +234,7 @@ public partial class CS2_SimpleAdmin PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); - if (playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) + if (PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) return HookResult.Handled; return HookResult.Continue; @@ -251,7 +251,7 @@ public partial class CS2_SimpleAdmin PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); - if (playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) + if (PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) return HookResult.Handled; if (info.GetArg(1).StartsWith("@")) @@ -294,7 +294,7 @@ public partial class CS2_SimpleAdmin silentPlayers.Clear(); PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); - playerPenaltyManager.RemoveAllPenalties(); + PlayerPenaltyManager.RemoveAllPenalties(); _database = new(dbConnectionString); @@ -317,6 +317,7 @@ public partial class CS2_SimpleAdmin AdminSQLManager _adminManager = new(_database); BanManager _banManager = new(_database, Config); MuteManager _muteManager = new(_database); + await _banManager.ExpireOldBans(); await _muteManager.ExpireOldMutes(); await _adminManager.DeleteOldAdmins(); @@ -335,21 +336,21 @@ public partial class CS2_SimpleAdmin { foreach (CCSPlayerController player in players) { - if (playerPenaltyManager.IsSlotInPenalties(player.Slot)) + if (PlayerPenaltyManager.IsSlotInPenalties(player.Slot)) { - if (!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) + if (!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) player.VoiceFlags = VoiceFlags.Normal; - if (!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) && !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) + if (!PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) && !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) { if (TagsDetected) Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); } if ( - !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence) && - !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && - !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) + !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence) && + !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && + !PlayerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) ) { player.VoiceFlags = VoiceFlags.Normal; @@ -360,14 +361,14 @@ public partial class CS2_SimpleAdmin } } - playerPenaltyManager.RemoveExpiredPenalties(); + PlayerPenaltyManager.RemoveExpiredPenalties(); } catch (Exception) { } }); }); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - AddTimer(2.5f, () => + AddTimer(2.0f, () => { string? address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}"; string? hostname = ConVar.Find("hostname")!.StringValue; @@ -391,7 +392,7 @@ public partial class CS2_SimpleAdmin else { await connection.ExecuteAsync( - "UPDATE `sa_servers` SET hostname = @hostname WHERE address = @address", + "UPDATE `sa_servers` SET `hostname` = @hostname, `id` = `id` WHERE `address` = @address", new { address, hostname }); } diff --git a/Managers/AdminSQLManager.cs b/Managers/AdminSQLManager.cs index 99b3b36..b26ee30 100644 --- a/Managers/AdminSQLManager.cs +++ b/Managers/AdminSQLManager.cs @@ -6,21 +6,15 @@ using System.Collections.Concurrent; namespace CS2_SimpleAdmin; -public class AdminSQLManager +public class AdminSQLManager(Database database) { - private readonly Database _database; + private readonly Database _database = database; // Unused for now //public static readonly ConcurrentDictionary> _adminCache = new ConcurrentDictionary>(); public static readonly ConcurrentDictionary _adminCache = new(); - //public static readonly ConcurrentDictionary _adminCacheTimestamps = new ConcurrentDictionary(); - - public AdminSQLManager(Database database) - { - _database = database; - } - + /* public async Task, int)>> GetAdminFlags(string steamId) { DateTime now = DateTime.UtcNow.ToLocalTime(); @@ -35,7 +29,7 @@ public class AdminSQLManager return new List<(List, int)>(); } - List<(List, int)> filteredFlagsWithImmunity = new List<(List, int)>(); + List<(List, int)> filteredFlagsWithImmunity = []; foreach (dynamic flags in activeFlags) { @@ -61,6 +55,7 @@ public class AdminSQLManager return filteredFlagsWithImmunity; } + */ public async Task, int, DateTime?)>> GetAllPlayersFlags() { @@ -70,61 +65,74 @@ public class AdminSQLManager { await using MySqlConnection connection = await _database.GetConnectionAsync(); - string sql = "SELECT player_steamid, flags, immunity, ends FROM sa_admins WHERE (ends IS NULL OR ends > @CurrentTime) AND (server_id IS NULL OR server_id = @serverid)"; + string sql = @" + SELECT sa_admins.player_steamid, sa_admins_flags.flag, sa_admins.immunity, sa_admins.ends + FROM sa_admins_flags + JOIN sa_admins ON sa_admins_flags.admin_id = sa_admins.id + WHERE (sa_admins.ends IS NULL OR sa_admins.ends > @CurrentTime) + AND (sa_admins.server_id IS NULL OR sa_admins.server_id = @serverid) + ORDER BY sa_admins.player_steamid"; + List? activeFlags = (await connection.QueryAsync(sql, new { CurrentTime = now, serverid = CS2_SimpleAdmin.ServerId }))?.ToList(); if (activeFlags == null) { - return new List<(string, List, int, DateTime?)>(); + return []; } - List<(string, List, int, DateTime?)> filteredFlagsWithImmunity = new List<(string, List, int, DateTime?)>(); + List<(string, List, int, DateTime?)> filteredFlagsWithImmunity = []; + string currentSteamId = string.Empty; + List currentFlags = []; + int immunityValue = 0; + DateTime? ends = null; - foreach (dynamic flags in activeFlags) + foreach (dynamic flagInfo in activeFlags) { - if (flags is not IDictionary flagsDict) + if (flagInfo is not IDictionary flagInfoDict) { continue; } - if (!flagsDict.TryGetValue("player_steamid", out var steamIdObj) || - !flagsDict.TryGetValue("flags", out var flagsValueObj) || - !flagsDict.TryGetValue("immunity", out var immunityValueObj) || - !flagsDict.TryGetValue("ends", out var endsObj)) + if (!flagInfoDict.TryGetValue("player_steamid", out var steamIdObj) || + !flagInfoDict.TryGetValue("flag", out var flagObj) || + !flagInfoDict.TryGetValue("immunity", out var immunityValueObj) || + !flagInfoDict.TryGetValue("ends", out var endsObj)) { - //Console.WriteLine("One or more required keys are missing."); continue; } - DateTime? ends = null; - - if (endsObj != null) // Check if "ends" is not null + if (steamIdObj is not string steamId || + flagObj is not string flag || + !int.TryParse(immunityValueObj.ToString(), out immunityValue)) { - if (!DateTime.TryParse(endsObj.ToString(), out var parsedEnds)) - { - //Console.WriteLine("Failed to parse 'ends' value."); - continue; - } + continue; + } + if (endsObj != null && DateTime.TryParse(endsObj.ToString(), out var parsedEnds)) + { ends = parsedEnds; } - if (!(steamIdObj is string steamId) || - !(flagsValueObj is string flagsValue) || - !int.TryParse(immunityValueObj.ToString(), out var immunityValue)) + if (currentSteamId != steamId && !string.IsNullOrEmpty(currentSteamId)) { - //Console.WriteLine("Failed to parse one or more values."); - continue; + filteredFlagsWithImmunity.Add((currentSteamId, currentFlags, immunityValue, ends)); + currentFlags = []; } - filteredFlagsWithImmunity.Add((steamId, flagsValue.Split(',').ToList(), immunityValue, ends)); + currentSteamId = steamId; + currentFlags.Add(flag); + } + + if (!string.IsNullOrEmpty(currentSteamId)) + { + filteredFlagsWithImmunity.Add((currentSteamId, currentFlags, immunityValue, ends)); } return filteredFlagsWithImmunity; } catch (Exception) { - return new List<(string, List, int, DateTime?)>(); + return []; } } @@ -161,52 +169,73 @@ public class AdminSQLManager //_adminCache.TryRemove(playerSteamId, out _); - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - string sql = ""; - - if (globalDelete) + try { - sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID"; - } - else - { - sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID AND server_id = @ServerId"; - } + await using MySqlConnection connection = await _database.GetConnectionAsync(); + string sql = ""; - await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId, ServerId = CS2_SimpleAdmin.ServerId }); + if (globalDelete) + { + sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID"; + } + else + { + sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID AND server_id = @ServerId"; + } + + await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId, CS2_SimpleAdmin.ServerId }); + } + catch { }; } - public async Task AddAdminBySteamId(string playerSteamId, string playerName, string flags, int immunity = 0, int time = 0, bool globalAdmin = false) + public async Task AddAdminBySteamId(string playerSteamId, string playerName, List flagsList, int immunity = 0, int time = 0, bool globalAdmin = false) { - if (string.IsNullOrEmpty(playerSteamId)) return; - - flags = flags.Replace(" ", ""); + if (string.IsNullOrEmpty(playerSteamId) || flagsList == null || flagsList.Count == 0) return; DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime? futureTime; + if (time != 0) futureTime = now.ToLocalTime().AddMinutes(time); else futureTime = null; - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - var sql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `flags`, `immunity`, `ends`, `created`, `server_id`) " + - "VALUES (@playerSteamid, @playerName, @flags, @immunity, @ends, @created, @serverid)"; - - int? serverId = globalAdmin ? null : CS2_SimpleAdmin.ServerId; - - await connection.ExecuteAsync(sql, new + try { - playerSteamId, - playerName, - flags, - immunity, - ends = futureTime, - created = now, - serverid = serverId - }); + await using MySqlConnection connection = await _database.GetConnectionAsync(); + + // Insert admin into sa_admins table + var insertAdminSql = "INSERT INTO `sa_admins` (`player_steamid`, `player_name`, `immunity`, `ends`, `created`, `server_id`) " + + "VALUES (@playerSteamid, @playerName, @immunity, @ends, @created, @serverid); SELECT LAST_INSERT_ID();"; + + int adminId = await connection.ExecuteScalarAsync(insertAdminSql, new + { + playerSteamId, + playerName, + immunity, + ends = futureTime, + created = now, + serverid = globalAdmin ? null : CS2_SimpleAdmin.ServerId + }); + + // Insert flags into sa_admins_flags table + foreach (var flag in flagsList) + { + Console.WriteLine(flag); + var insertFlagsSql = "INSERT INTO `sa_admins_flags` (`admin_id`, `flag`) " + + "VALUES (@adminId, @flag)"; + + await connection.ExecuteAsync(insertFlagsSql, new + { + adminId, + flag + }); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } } public async Task DeleteOldAdmins() @@ -220,8 +249,7 @@ public class AdminSQLManager } catch (Exception) { - if (CS2_SimpleAdmin._logger != null) - CS2_SimpleAdmin._logger.LogCritical("Unable to remove expired admins"); + CS2_SimpleAdmin._logger?.LogCritical("Unable to remove expired admins"); } } } \ No newline at end of file diff --git a/Managers/BanManager.cs b/Managers/BanManager.cs index ee26efb..723c393 100644 --- a/Managers/BanManager.cs +++ b/Managers/BanManager.cs @@ -173,7 +173,7 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config) return 0; } - public async Task UnbanPlayer(string playerPattern) + public async Task UnbanPlayer(string playerPattern, string adminSteamId, string reason) { if (playerPattern == null || playerPattern.Length <= 1) { @@ -183,8 +183,43 @@ internal class BanManager(Database database, CS2_SimpleAdminConfig config) { await using MySqlConnection connection = await _database.GetConnectionAsync(); + string sqlRetrieveBans = "SELECT id FROM sa_bans WHERE (player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern) AND status = 'ACTIVE'"; + var bans = await connection.QueryAsync(sqlRetrieveBans, new { pattern = playerPattern }); + + if (!bans.Any()) + return; + + string sqlAdmin = "SELECT id FROM sa_admins WHERE player_steamid = @adminSteamId"; + string sqlInsertUnban = "INSERT INTO sa_unbans (ban_id, admin_id, reason) VALUES (@banId, @adminId, @reason); SELECT LAST_INSERT_ID();"; + + int? sqlAdminId = await connection.ExecuteScalarAsync(sqlAdmin, new { adminSteamId }); + int adminId = sqlAdminId ?? 0; + + foreach (var ban in bans) + { + int banId = ban.id; + int? unbanId; + + // Insert into sa_unbans + if (reason != null) + { + unbanId = await connection.ExecuteScalarAsync(sqlInsertUnban, new { banId, adminId, reason }); + } + else + { + sqlInsertUnban = "INSERT INTO sa_unbans (ban_id, admin_id) VALUES (@banId, @adminId); SELECT LAST_INSERT_ID();"; + unbanId = await connection.ExecuteScalarAsync(sqlInsertUnban, new { banId, adminId }); + } + + // Update sa_bans to set unban_id + string sqlUpdateBan = "UPDATE sa_bans SET status = 'UNBANNED', unban_id = @unbanId WHERE id = @banId"; + await connection.ExecuteAsync(sqlUpdateBan, new { unbanId, banId }); + } + + /* string sqlUnban = "UPDATE sa_bans SET status = 'UNBANNED' WHERE player_steamid = @pattern OR player_name = @pattern OR player_ip = @pattern AND status = 'ACTIVE'"; await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern }); + */ } catch { } diff --git a/Managers/MuteManager.cs b/Managers/MuteManager.cs index cb27c41..d9d550d 100644 --- a/Managers/MuteManager.cs +++ b/Managers/MuteManager.cs @@ -4,20 +4,14 @@ using MySqlConnector; namespace CS2_SimpleAdmin; -internal class MuteManager +internal class MuteManager(Database database) { - private readonly Database _database; - - public MuteManager(Database database) - { - _database = database; - } + private readonly Database _database = database; public async Task MutePlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0, int type = 0) { if (player == null || player.SteamId == null) return; - await using MySqlConnection connection = await _database.GetConnectionAsync(); DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); @@ -28,29 +22,33 @@ internal class MuteManager else if (type == 2) muteType = "SILENCE"; - var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " + - "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type, @serverid)"; - - await connection.ExecuteAsync(sql, new + try { - playerSteamid = player.SteamId, - playerName = player.Name, - adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, - adminName = issuer.SteamId == null ? "Console" : issuer.Name, - banReason = reason, - duration = time, - ends = futureTime, - created = now, - type = muteType, - serverid = CS2_SimpleAdmin.ServerId - }); + await using MySqlConnection connection = await _database.GetConnectionAsync(); + var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " + + "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @type, @serverid)"; + + await connection.ExecuteAsync(sql, new + { + playerSteamid = player.SteamId, + playerName = player.Name, + adminSteamid = issuer.SteamId ?? "Console", + adminName = issuer.SteamId == null ? "Console" : issuer.Name, + muteReason = reason, + duration = time, + ends = futureTime, + created = now, + type = muteType, + serverid = CS2_SimpleAdmin.ServerId + }); + } + catch { }; } public async Task AddMuteBySteamid(string playerSteamId, PlayerInfo issuer, string reason, int time = 0, int type = 0) { if (string.IsNullOrEmpty(playerSteamId)) return; - await using MySqlConnection connection = await _database.GetConnectionAsync(); DateTime now = DateTime.UtcNow.ToLocalTime(); DateTime futureTime = now.AddMinutes(time).ToLocalTime(); @@ -61,28 +59,33 @@ internal class MuteManager else if (type == 2) muteType = "SILENCE"; - var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " + - "VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type, @serverid)"; - - await connection.ExecuteAsync(sql, new + try { - playerSteamid = playerSteamId, - adminSteamid = issuer.SteamId == null ? "Console" : issuer.SteamId, - adminName = issuer.Name == null ? "Console" : issuer.Name, - banReason = reason, - duration = time, - ends = futureTime, - created = now, - type = muteType, - serverid = CS2_SimpleAdmin.ServerId - }); + await using MySqlConnection connection = await _database.GetConnectionAsync(); + var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " + + "VALUES (@playerSteamid, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @type, @serverid)"; + + await connection.ExecuteAsync(sql, new + { + playerSteamid = playerSteamId, + adminSteamid = issuer.SteamId ?? "Console", + adminName = issuer.Name ?? "Console", + muteReason = reason, + duration = time, + ends = futureTime, + created = now, + type = muteType, + serverid = CS2_SimpleAdmin.ServerId + }); + } + catch { }; } public async Task> IsPlayerMuted(string steamId) { if (string.IsNullOrEmpty(steamId)) { - return new List(); + return []; } #if DEBUG @@ -102,49 +105,84 @@ internal class MuteManager } catch (Exception) { - return new List(); + return []; } } public async Task GetPlayerMutes(string steamId) { - await using MySqlConnection connection = await _database.GetConnectionAsync(); + try + { + await using MySqlConnection connection = await _database.GetConnectionAsync(); - int muteCount; - string sql = "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID"; + int muteCount; + string sql = "SELECT COUNT(*) FROM sa_mutes WHERE player_steamid = @PlayerSteamID"; - muteCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId }); - - return muteCount; + muteCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = steamId }); + return muteCount; + } + catch (Exception) + { + return 0; + } } - public async Task UnmutePlayer(string playerPattern, int type = 0) + public async Task UnmutePlayer(string playerPattern, string adminSteamId, string reason, int type = 0) { if (playerPattern == null || playerPattern.Length <= 1) { return; } - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - if (type == 2) + try { - string _unbanSql = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND status = 'ACTIVE'"; - await connection.ExecuteAsync(_unbanSql, new { pattern = playerPattern }); + await using MySqlConnection connection = await _database.GetConnectionAsync(); - return; + string muteType = "GAG"; + if (type == 1) + { + muteType = "MUTE"; + } + else if (type == 2) + muteType = "SILENCE"; + + string sqlRetrieveMutes = "SELECT id FROM sa_mutes WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'"; + var mutes = await connection.QueryAsync(sqlRetrieveMutes, new { pattern = playerPattern, muteType }); + + if (!mutes.Any()) + return; + + string sqlAdmin = "SELECT id FROM sa_admins WHERE player_steamid = @adminSteamId"; + string sqlInsertUnmute = "INSERT INTO sa_unmutes (mute_id, admin_id, reason) VALUES (@muteId, @adminId, @reason); SELECT LAST_INSERT_ID();"; + + int? sqlAdminId = await connection.ExecuteScalarAsync(sqlAdmin, new { adminSteamId }); + int adminId = sqlAdminId ?? 0; + + foreach (var mute in mutes) + { + int muteId = mute.id; + int? unmuteId; + + // Insert into sa_unmutes + if (reason != null) + { + unmuteId = await connection.ExecuteScalarAsync(sqlInsertUnmute, new { muteId, adminId, reason }); + } + else + { + sqlInsertUnmute = "INSERT INTO sa_unmutes (muteId, admin_id) VALUES (@muteId, @adminId); SELECT LAST_INSERT_ID();"; + unmuteId = await connection.ExecuteScalarAsync(sqlInsertUnmute, new { muteId, adminId }); + } + + // Update sa_mutes to set unmute_id + string sqlUpdateMute = "UPDATE sa_mutes SET status = 'UNMUTED', unmute_id = @unmuteId WHERE id = @muteId"; + await connection.ExecuteAsync(sqlUpdateMute, new { unmuteId, muteId }); + } } - - string muteType = "GAG"; - if (type == 1) + catch (Exception ex) { - muteType = "MUTE"; + Console.WriteLine(ex); } - else if (type == 2) - muteType = "SILENCE"; - - string sqlUnban = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'"; - await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern, muteType }); } public async Task ExpireOldMutes() @@ -158,8 +196,7 @@ internal class MuteManager } catch (Exception) { - if (CS2_SimpleAdmin._logger != null) - CS2_SimpleAdmin._logger.LogCritical("Unable to remove expired mutes"); + CS2_SimpleAdmin._logger?.LogCritical("Unable to remove expired mutes"); } } } \ No newline at end of file diff --git a/Managers/PlayerPenaltyManager.cs b/Managers/PlayerPenaltyManager.cs index 64333f7..5a9efb8 100644 --- a/Managers/PlayerPenaltyManager.cs +++ b/Managers/PlayerPenaltyManager.cs @@ -15,13 +15,15 @@ public class PlayerPenaltyManager new ConcurrentDictionary>>(); // Add a penalty for a player - public void AddPenalty(int slot, PenaltyType penaltyType, DateTime endDateTime, int durationSeconds) + public static void AddPenalty(int slot, PenaltyType penaltyType, DateTime endDateTime, int durationSeconds) { penalties.AddOrUpdate(slot, (_) => { - var dict = new Dictionary>(); - dict[penaltyType] = new List<(DateTime, int)>() { (endDateTime, durationSeconds) }; + var dict = new Dictionary> + { + [penaltyType] = [(endDateTime, durationSeconds)] + }; return dict; }, (_, existingDict) => @@ -35,7 +37,7 @@ public class PlayerPenaltyManager }); } - public bool IsPenalized(int slot, PenaltyType penaltyType) + public static bool IsPenalized(int slot, PenaltyType penaltyType) { //Console.WriteLine($"Checking penalties for player with slot {slot} and penalty type {penaltyType}"); @@ -78,23 +80,23 @@ public class PlayerPenaltyManager } // Get the end datetime and duration of penalties for a player and penalty type - public List<(DateTime EndDateTime, int Duration)> GetPlayerPenalties(int slot, PenaltyType penaltyType) + public static List<(DateTime EndDateTime, int Duration)> GetPlayerPenalties(int slot, PenaltyType penaltyType) { if (penalties.TryGetValue(slot, out Dictionary>? penaltyDict) && penaltyDict.TryGetValue(penaltyType, out List<(DateTime EndDateTime, int Duration)>? penaltiesList) && penaltiesList != null) { return penaltiesList; } - return new List<(DateTime EndDateTime, int Duration)>(); + return []; } - public bool IsSlotInPenalties(int slot) + public static bool IsSlotInPenalties(int slot) { return penalties.ContainsKey(slot); } // Remove all penalties for a player slot - public void RemoveAllPenalties(int slot) + public static void RemoveAllPenalties(int slot) { if (penalties.ContainsKey(slot)) { @@ -103,13 +105,13 @@ public class PlayerPenaltyManager } // Remove all penalties - public void RemoveAllPenalties() + public static void RemoveAllPenalties() { penalties.Clear(); } // Remove all penalties of a selected type from a specific player - public void RemovePenaltiesByType(int slot, PenaltyType penaltyType) + public static void RemovePenaltiesByType(int slot, PenaltyType penaltyType) { if (penalties.TryGetValue(slot, out Dictionary>? penaltyDict) && penaltyDict.ContainsKey(penaltyType)) @@ -119,7 +121,7 @@ public class PlayerPenaltyManager } // Remove all expired penalties for all players and penalty types - public void RemoveExpiredPenalties() + public static void RemoveExpiredPenalties() { DateTime now = DateTime.UtcNow.ToLocalTime(); foreach (var kvp in penalties.ToList()) // Use ToList to avoid modification while iterating diff --git a/Menus/AdminMenu.cs b/Menus/AdminMenu.cs index c3754cb..4384a53 100644 --- a/Menus/AdminMenu.cs +++ b/Menus/AdminMenu.cs @@ -8,7 +8,7 @@ namespace CS2_SimpleAdmin.Menus { public static BaseMenu CreateMenu(string title) { - return CS2_SimpleAdmin.Instance.Config.UseChatMenu ? new ChatMenu(title) : new CenterHtmlMenu(title); + return CS2_SimpleAdmin.Instance.Config.UseChatMenu ? new ChatMenu(title) : new CenterHtmlMenu(title, CS2_SimpleAdmin.Instance); } public static void OpenMenu(CCSPlayerController player, BaseMenu menu) @@ -44,7 +44,7 @@ namespace CS2_SimpleAdmin.Menus new ChatMenuOptionData("Manage Server", () => ManageServerMenu.OpenMenu(admin)), new ChatMenuOptionData("Fun actions", () => FunActionsMenu.OpenMenu(admin)), }; - + List customCommands = CS2_SimpleAdmin.Instance.Config.CustomServerCommands; if (customCommands.Count > 0) { diff --git a/Menus/ManageAdminsMenu.cs b/Menus/ManageAdminsMenu.cs index ac4127f..0fb1fd0 100644 --- a/Menus/ManageAdminsMenu.cs +++ b/Menus/ManageAdminsMenu.cs @@ -69,7 +69,7 @@ namespace CS2_SimpleAdmin.Menus private static void AddAdmin(CCSPlayerController admin, CCSPlayerController player, string flag) { // TODO: Change default immunity? - CS2_SimpleAdmin.Instance.AddAdmin(admin, player.SteamID.ToString(), player.PlayerName, flag, 10); + CS2_SimpleAdmin.AddAdmin(admin, player.SteamID.ToString(), player.PlayerName, flag, 10); } private static void RemoveAdmin(CCSPlayerController admin, CCSPlayerController player) diff --git a/Menus/PlayersMenu.cs b/Menus/PlayersMenu.cs index 7d0525f..dd7989d 100644 --- a/Menus/PlayersMenu.cs +++ b/Menus/PlayersMenu.cs @@ -1,7 +1,7 @@ -using System.Web; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Menu; +using System.Web; namespace CS2_SimpleAdmin.Menus { @@ -32,9 +32,13 @@ namespace CS2_SimpleAdmin.Menus BaseMenu menu = AdminMenu.CreateMenu(menuName); IEnumerable players = Helper.GetValidPlayersWithBots(); + string playerName = string.Empty; + foreach (CCSPlayerController player in players) { - string optionName = HttpUtility.HtmlEncode(player.PlayerName); + playerName = player.PlayerName.Length > 26 ? player.PlayerName[..26] : player.PlayerName; + + string optionName = HttpUtility.HtmlEncode(playerName); if (enableFilter != null && enableFilter(player) == false) continue;