diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index e4260b5..5ceb7c1 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -25,13 +25,14 @@ namespace CS2_SimpleAdmin; [MinimumApiVersion(163)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + public static BasePlugin? _plugin = null; public static IStringLocalizer? _localizer; //public static ConcurrentBag mutedPlayers = new ConcurrentBag(); public static Dictionary voteAnswers = new Dictionary(); public static HashSet votePlayers = new HashSet(); public static ConcurrentBag godPlayers = new ConcurrentBag(); - public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); - public static ConcurrentBag commsPlayers = new ConcurrentBag(); + //public static ConcurrentBag gaggedPlayers = new ConcurrentBag(); + //public static ConcurrentBag commsPlayers = new ConcurrentBag(); public static ConcurrentBag silentPlayers = new ConcurrentBag(); public static ConcurrentBag bannedPlayers = new ConcurrentBag(); public static bool TagsDetected = false; @@ -54,6 +55,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && !player.IsBot && !player.IsHLTV).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); Database database = new Database(dbConnectionString); BanManager _banManager = new(database, Config); @@ -292,7 +293,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = Utilities.GetPlayers().Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected && !player.IsHLTV).ToList(); + List playersToTarget = Helper.GetValidPlayers(); if (caller != null) { @@ -397,7 +398,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) { @@ -409,8 +410,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + if (caller!.CanTarget(player)) { + if (!player.IsBot && player.SteamID.ToString().Length == 17) + return; + if (player.PawnIsAlive) { player.Pawn.Value!.Freeze(); @@ -433,7 +440,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -465,7 +472,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) { @@ -478,6 +485,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { @@ -485,14 +493,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -548,7 +555,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -590,6 +597,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -651,7 +659,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -669,10 +677,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig matches = Helper.GetPlayerFromSteamid64(pattern); @@ -705,13 +714,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig(gaggedPlayers.Where(item => item != player.Slot)); - } + playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player!.SteamID}"); + Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); found = true; } @@ -725,15 +731,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig(gaggedPlayers.Where(item => item != player.Slot)); - } + playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player!.SteamID.ToString()}"); + Server.ExecuteCommand($"css_tag_unmute {player!.SteamID.ToString()}"); - pattern = player!.AuthorizedSteamID!.SteamId64.ToString(); + pattern = player!.SteamID.ToString(); found = true; } @@ -748,7 +751,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) { @@ -759,16 +762,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - if (player != null && gaggedPlayers.Contains(player.Slot)) - { - gaggedPlayers = new ConcurrentBag(gaggedPlayers.Where(item => item != player.Slot)); - } + playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Gag); - if (player!.AuthorizedSteamID != null) - _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 0); // Unmute by type 0 (gag) + if (player!.SteamID.ToString().Length == 17) + _ = _muteManager.UnmutePlayer(player.SteamID.ToString(), 0); // Unmute by type 0 (gag) if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player!.SteamID}"); + Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); }); command.ReplyToCommand($"Ungaged player with pattern {pattern}."); @@ -790,7 +790,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) { @@ -803,6 +803,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { @@ -810,23 +811,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig @@ -834,6 +830,8 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -869,7 +867,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -912,6 +910,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -971,7 +972,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -987,11 +988,6 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) { @@ -1082,19 +1061,10 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - /* - if (mutedPlayers.Contains((int)player.Index)) - { - if (mutedPlayers.TryTake(out int removedItem) && removedItem != (int)player.Index) - { - mutedPlayers.Add(removedItem); - } - } - */ - - if (player.AuthorizedSteamID != null) - _ = _muteManager.UnmutePlayer(player.AuthorizedSteamID.SteamId64.ToString(), 1); // Unmute by type 1 (mute) + if (player.SteamID.ToString().Length == 17) + _ = _muteManager.UnmutePlayer(player.SteamID.ToString(), 1); // Unmute by type 1 (mute) + playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Mute); player.VoiceFlags = VoiceFlags.Normal; }); @@ -1105,6 +1075,321 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnSilenceCommand(CCSPlayerController? caller, CommandInfo command) + { + if (_database == null) return; + + int time = 0; + string reason = "Unknown"; + + TargetResult? targets = GetTarget(command); + if (targets == null) return; + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) + { + return; + } + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) + reason = command.GetArg(3); + + MuteManager _muteManager = new(_database); + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + + playersToTarget.ForEach(player => + { + if (caller!.CanTarget(player)) + { + PlayerInfo playerInfo = new PlayerInfo + { + SteamId = player?.SteamID.ToString(), + Name = player?.PlayerName, + IpAddress = player?.IpAddress?.Split(":")[0] + }; + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.SteamID.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + Task.Run(async () => + { + await _muteManager.MutePlayer(playerInfo, adminInfo, reason, time, 2); + }); + + if (TagsDetected) + Server.ExecuteCommand($"css_tag_mute {player!.SteamID}"); + + playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time); + + if (time == 0) + { + if (!player!.IsBot && !player.IsHLTV) + { + using (new WithTemporaryCulture(player.GetLanguage())) + { + player.PrintToCenter(_localizer!["sa_player_silence_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + } + } + + if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) + { + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) + { + using (new WithTemporaryCulture(_player.GetLanguage())) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_silence_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + _player.PrintToChat(sb.ToString()); + } + } + if (Config.DiscordWebhook.Length > 0 && _localizer != null) + { + LocalizedString localizedMessage = _localizer["sa_admin_silence_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } + } + } + else + { + if (!player!.IsBot && !player.IsHLTV) + { + using (new WithTemporaryCulture(player.GetLanguage())) + { + player!.PrintToCenter(_localizer!["sa_player_silence_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + } + } + + if (caller == null || caller != null && caller != null && !silentPlayers.Contains(caller.Slot)) + { + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) + { + using (new WithTemporaryCulture(_player.GetLanguage())) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_silence_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + _player.PrintToChat(sb.ToString()); + } + } + if (Config.DiscordWebhook.Length > 0 && _localizer != null) + { + LocalizedString localizedMessage = _localizer["sa_admin_silence_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } + } + } + } + }); + } + + [ConsoleCommand("css_addsilence")] + [RequiresPermissions("@css/chat")] + [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnAddSilenceCommand(CCSPlayerController? caller, CommandInfo command) + { + if (_database == null) return; + + if (command.ArgCount < 2) + return; + if (string.IsNullOrEmpty(command.GetArg(1))) return; + + string steamid = command.GetArg(1); + + if (!Helper.IsValidSteamID64(steamid)) + { + command.ReplyToCommand($"Invalid SteamID64."); + return; + } + + int time = 0; + string reason = "Unknown"; + + MuteManager _muteManager = new(_database); + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + + int.TryParse(command.GetArg(2), out time); + + if (command.ArgCount >= 3 && command.GetArg(3).Length > 0) + reason = command.GetArg(3); + + PlayerInfo adminInfo = new PlayerInfo + { + SteamId = caller?.SteamID.ToString(), + Name = caller?.PlayerName, + IpAddress = caller?.IpAddress?.Split(":")[0] + }; + + List matches = Helper.GetPlayerFromSteamid64(steamid); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null && player.IsValid) + { + if (!caller!.CanTarget(player)) + { + command.ReplyToCommand($"{player.PlayerName} is more powerful than you!"); + return; + } + + if (TagsDetected) + Server.ExecuteCommand($"css_tag_mute {player!.SteamID}"); + + playerPenaltyManager.AddPenalty(player!.Slot, PenaltyType.Silence, DateTime.Now.AddMinutes(time), time); + + if (time == 0) + { + if (!player.IsBot && !player.IsHLTV) + using (new WithTemporaryCulture(player.GetLanguage())) + { + player!.PrintToCenter(_localizer!["sa_player_silence_message_perm", reason, caller == null ? "Console" : caller.PlayerName]); + } + if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) + { + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) + { + using (new WithTemporaryCulture(_player.GetLanguage())) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_silence_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]); + _player.PrintToChat(sb.ToString()); + } + } + if (Config.DiscordWebhook.Length > 0 && _localizer != null) + { + LocalizedString localizedMessage = _localizer["sa_admin_silence_message_perm", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } + } + } + else + { + if (!player.IsBot && !player.IsHLTV) + using (new WithTemporaryCulture(player.GetLanguage())) + { + player!.PrintToCenter(_localizer!["sa_player_silence_message_time", reason, time, caller == null ? "Console" : caller.PlayerName]); + } + if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) + { + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) + { + using (new WithTemporaryCulture(_player.GetLanguage())) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_silence_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]); + _player.PrintToChat(sb.ToString()); + } + } + if (Config.DiscordWebhook.Length > 0 && _localizer != null) + { + LocalizedString localizedMessage = _localizer["sa_admin_silence_message_time", caller == null ? "Console" : caller.PlayerName, player.PlayerName, reason, time]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } + } + } + } + } + _ = _muteManager.AddMuteBySteamid(steamid, adminInfo, reason, time, 2); + command.ReplyToCommand($"Silenced player with steamid {steamid}."); + } + + [ConsoleCommand("css_unsilence")] + [RequiresPermissions("@css/chat")] + [CommandHelper(minArgs: 1, usage: "", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] + public void OnUnsilenceCommand(CCSPlayerController? caller, CommandInfo command) + { + if (_database == null) return; + + if (command.GetArg(1).Length <= 1) + { + command.ReplyToCommand($"Too short pattern to search."); + return; + } + + string pattern = command.GetArg(1); + bool found = false; + MuteManager _muteManager = new(_database); + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + + if (Helper.IsValidSteamID64(pattern)) + { + List matches = Helper.GetPlayerFromSteamid64(pattern); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null && player.IsValid) + { + if (TagsDetected) + Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); + + playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Silence); + player.VoiceFlags = VoiceFlags.Normal; + found = true; + } + } + } + else + { + List matches = Helper.GetPlayerFromName(pattern); + if (matches.Count == 1) + { + CCSPlayerController? player = matches.FirstOrDefault(); + if (player != null && player.IsValid) + { + if (TagsDetected) + Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); + + playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Silence); + player.VoiceFlags = VoiceFlags.Normal; + pattern = player.SteamID.ToString(); + found = true; + } + } + } + + if (found) + { + _ = _muteManager.UnmutePlayer(pattern, 2); // Unmute by type 2 (silence) + command.ReplyToCommand($"Unsilenced player with pattern {pattern}."); + return; + } + + TargetResult? targets = GetTarget(command); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); + + if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) + { + return; + } + + if (playersToTarget.Count > 1) + { + playersToTarget.ForEach(player => + { + if (player.SteamID.ToString().Length == 17) + _ = _muteManager.UnmutePlayer(player.SteamID.ToString(), 2); // Unmute by type 2 (silence) + + if (TagsDetected) + Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); + + playerPenaltyManager.RemovePenaltiesByType(player!.Slot, PenaltyType.Silence); + player.VoiceFlags = VoiceFlags.Normal; + }); + + command.ReplyToCommand($"Unsilenced player with pattern {pattern}."); + if (Config.DiscordWebhook.Length > 0 && _localizer != null) + _ = SendWebhookMessage($"Unsilenced player with pattern {pattern}."); + return; + } + } + [ConsoleCommand("css_ban")] [RequiresPermissions("@css/ban")] [CommandHelper(minArgs: 1, usage: "<#userid or name> [time in minutes/0 perm] [reason]", whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -1118,7 +1403,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); if (playersToTarget.Count > 1 && Config.DisableDangerousCommands || playersToTarget.Count == 0) { @@ -1146,14 +1431,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1205,7 +1490,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1256,7 +1541,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1311,7 +1596,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1363,7 +1648,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1422,7 +1707,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1485,15 +1770,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + player.CommitSuicide(false, true); if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { - foreach (CCSPlayerController _player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1519,7 +1807,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); + string weaponName = command.GetArg(2); @@ -1549,11 +1839,14 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + player.GiveNamedItem(weaponName); if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { - foreach (CCSPlayerController _player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1578,18 +1871,21 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { if (caller!.CanTarget(player)) { - player.RemoveWeapons(); + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + player.RemoveWeapons(); if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { - foreach (CCSPlayerController _player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1618,18 +1914,20 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { if (caller!.CanTarget(player)) { - player.SetHp(health); + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + player.SetHp(health); if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { - foreach (CCSPlayerController _player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1658,10 +1956,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + if (caller!.CanTarget(player)) { /* @@ -1673,7 +1974,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1699,10 +2000,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + if (caller!.CanTarget(player)) { if (player != null) @@ -1719,7 +2023,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1748,7 +2052,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); if (command.ArgCount >= 2) { @@ -1757,13 +2061,16 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + if (caller!.CanTarget(player)) { player!.Pawn.Value!.Slap(damage); if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { - foreach (CCSPlayerController _player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1793,7 +2100,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); switch (teamName) { @@ -1822,6 +2129,9 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + if (!teamName.Equals("swap")) { if (player.PawnIsAlive && teamNum != CsTeam.Spectator && !command.GetArg(3).ToLower().Equals("-k") && Config.TeamSwitchType == 1) @@ -1848,7 +2158,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1889,7 +2199,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) @@ -1916,7 +2226,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - foreach (CCSPlayerController _player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1933,7 +2243,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig kvp in voteAnswers) { - foreach (CCSPlayerController _player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -1991,7 +2301,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -2037,7 +2347,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -2069,7 +2379,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV && AdminManager.PlayerHasPermissions(p, "@css/chat"))) + foreach (CCSPlayerController _player in Helper.GetValidPlayers().Where(p => AdminManager.PlayerHasPermissions(p, "@css/chat"))) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -2093,7 +2403,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -2113,7 +2423,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && !player.IsHLTV).ToList(); int range = command.GetArg(0).Length + command.GetArg(1).Length + 2; string message = command.GetCommandString[range..]; @@ -2167,7 +2477,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.SteamID.ToString().Length == 17 && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { @@ -2177,7 +2487,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -2205,10 +2515,13 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + if (caller!.CanTarget(player)) { player!.Pawn.Value!.Freeze(); @@ -2218,7 +2531,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -2243,15 +2556,18 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid && player.PawnIsAlive).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && player.PawnIsAlive && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + player!.Pawn.Value!.Unfreeze(); if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) { - foreach (CCSPlayerController _player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { @@ -2269,16 +2585,63 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig ")] + [RequiresPermissions("@css/kick")] + public void OnRenameCommand(CCSPlayerController? caller, CommandInfo command) + { + string? newName = command.GetArg(2); + + if (string.IsNullOrEmpty(newName)) + return; + + TargetResult? targets = GetTarget(command); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); + + playersToTarget.ForEach(player => + { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + + if (caller!.CanTarget(player)) + { + player.Rename(newName); + + if (caller == null || caller != null && !silentPlayers.Contains(caller.Slot)) + { + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) + { + using (new WithTemporaryCulture(_player.GetLanguage())) + { + StringBuilder sb = new(_localizer!["sa_prefix"]); + sb.Append(_localizer["sa_admin_rename_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, newName]); + _player.PrintToChat(sb.ToString()); + } + } + } + + if (Config.DiscordWebhook.Length > 0 && _localizer != null) + { + LocalizedString localizedMessage = _localizer["sa_admin_rename_message", caller == null ? "Console" : caller.PlayerName, player.PlayerName, newName]; + _ = SendWebhookMessage(localizedMessage.ToString().Replace("", "").Replace("", "")); + } + } + }); + } + [ConsoleCommand("css_respawn", "Respawn a dead player.")] [CommandHelper(1, "<#userid or name>")] [RequiresPermissions("@css/cheats")] public void OnRespawnCommand(CCSPlayerController? caller, CommandInfo command) { TargetResult? targets = GetTarget(command); - List playersToTarget = targets!.Players.Where(player => caller!.CanTarget(player) && player != null && player.IsValid).ToList(); + List playersToTarget = targets!.Players.Where(player => player != null && player.IsValid && !player.IsHLTV).ToList(); playersToTarget.ForEach(player => { + if (!player.IsBot && player.SteamID.ToString().Length != 17) + return; + if (caller!.CanTarget(player)) { if (CBasePlayerController_SetPawnFunc == null || player.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) return; @@ -2290,7 +2653,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig p != null && p.IsValid && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV)) + foreach (CCSPlayerController _player in Helper.GetValidPlayers()) { using (new WithTemporaryCulture(_player.GetLanguage())) { diff --git a/CS2-SimpleAdmin.csproj b/CS2-SimpleAdmin.csproj index 2d05889..dcf84d6 100644 --- a/CS2-SimpleAdmin.csproj +++ b/CS2-SimpleAdmin.csproj @@ -6,6 +6,7 @@ enable enable true + true diff --git a/Events.cs b/Events.cs index defe150..8627851 100644 --- a/Events.cs +++ b/Events.cs @@ -21,37 +21,24 @@ public partial class CS2_SimpleAdmin //RegisterListener(OnClientDisconnect); //RegisterEventHandler(OnPlayerFullConnect); RegisterListener(OnMapStart); + RegisterListener(OnClientVoice); //RegisterEventHandler(OnPlayerHurt); //RegisterEventHandler(OnRoundStart); AddCommandListener("say", OnCommandSay); AddCommandListener("say_team", OnCommandTeamSay); } - /*private HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info) + private void OnClientVoice(int playerSlot) { - CCSPlayerController? player = @event.Userid; + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + if (!playerPenaltyManager.IsSlotInPenalties(playerSlot)) return; - if (player is null || player.IsBot || player.IsHLTV) return HookResult.Continue; + CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + if (player is null || !player.IsValid) return; - PlayerInfo playerInfo = new PlayerInfo - { - UserId = player.UserId, - Index = (ushort)player.UserId, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), - Name = player?.PlayerName, - IpAddress = player?.IpAddress?.Split(":")[0] - }; - - Task.Run(async () => - { - Server.NextFrame(() => - { - if (player is null) return; - }); - }); - return HookResult.Continue; + if (playerPenaltyManager.IsPenalized(playerSlot, PenaltyType.Mute) || playerPenaltyManager.IsPenalized(playerSlot, PenaltyType.Silence)) + player.VoiceFlags = VoiceFlags.Muted; } - */ [GameEventHandler] private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info) @@ -67,10 +54,10 @@ public partial class CS2_SimpleAdmin { if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0) return HookResult.Continue; - if (player != null && gaggedPlayers.Contains(player.Slot)) - { + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + + if (playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) return HookResult.Handled; - } return HookResult.Continue; } @@ -79,10 +66,10 @@ public partial class CS2_SimpleAdmin { if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0) return HookResult.Continue; - if (player != null && gaggedPlayers.Contains(player.Slot)) - { + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + + if (playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence)) return HookResult.Handled; - } if (info.GetArg(1).StartsWith("@")) { @@ -173,14 +160,18 @@ public partial class CS2_SimpleAdmin if (activeMutes.Count > 0) { + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); foreach (var mute in activeMutes) { string muteType = mute.type; if (muteType == "GAG") { + /* if (playerInfo.Slot.HasValue && !gaggedPlayers.Contains(playerInfo.Slot.Value)) gaggedPlayers.Add(playerInfo.Slot.Value); + */ + playerPenaltyManager.AddPenalty(1, PenaltyType.Gag, DateTime.Parse(mute.ends), mute.duration); if (TagsDetected) { @@ -192,16 +183,16 @@ public partial class CS2_SimpleAdmin } else if (muteType == "MUTE") { - Server.NextFrame(() => - { - if (player.IsValid) - player.VoiceFlags = VoiceFlags.Muted; - }); + playerPenaltyManager.AddPenalty(1, PenaltyType.Mute, DateTime.Parse(mute.ends), mute.duration); + } else { - if (playerInfo.Slot.HasValue && !gaggedPlayers.Contains(playerInfo.Slot.Value)) + /* + * if (playerInfo.Slot.HasValue && !gaggedPlayers.Contains(playerInfo.Slot.Value)) gaggedPlayers.Add(playerInfo.Slot.Value); + */ + playerPenaltyManager.AddPenalty(1, PenaltyType.Silence, DateTime.Parse(mute.ends), mute.duration); Server.NextFrame(() => { @@ -211,10 +202,8 @@ public partial class CS2_SimpleAdmin { Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}"); } - player.VoiceFlags = VoiceFlags.Muted; } }); - } } } @@ -241,7 +230,9 @@ public partial class CS2_SimpleAdmin Logger.LogCritical("[OnClientDisconnect] After Check"); #endif - RemoveFromConcurrentBag(gaggedPlayers, player.Slot); + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + playerPenaltyManager.RemoveAllPenalties(player.Slot); + //RemoveFromConcurrentBag(gaggedPlayers, player.Slot); RemoveFromConcurrentBag(silentPlayers, player.Slot); RemoveFromConcurrentBag(godPlayers, player.Slot); @@ -253,33 +244,70 @@ public partial class CS2_SimpleAdmin } if (TagsDetected) - NativeAPI.IssueServerCommand($"css_tag_unmute {player.SteamID}"); + Server.ExecuteCommand($"css_tag_unmute {player.SteamID}"); return HookResult.Continue; } private void OnMapStart(string mapName) { - gaggedPlayers.Clear(); + Random random = new Random(); + //gaggedPlayers.Clear(); godPlayers.Clear(); silentPlayers.Clear(); + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + playerPenaltyManager.RemoveAllPenalties(); + _database = new(dbConnectionString); if (_database == null) return; - AddTimer(60.0f, bannedPlayers.Clear, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - AddTimer(130.0f, async () => + AddTimer(random.Next(60, 80), async () => { +#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(); -#if DEBUG - Logger.LogCritical("[OnMapStart] Expired check"); -#endif + + bannedPlayers.Clear(); + + Server.NextFrame(() => + { + foreach (CCSPlayerController player in Helper.GetValidPlayers()) + { + if (playerPenaltyManager.IsSlotInPenalties(player.Slot)) + { + 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 (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}"); + } + } + } + }); + + playerPenaltyManager.RemoveExpiredPenalties(); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); diff --git a/Helper.cs b/Helper.cs index 4df7b3f..84db15f 100644 --- a/Helper.cs +++ b/Helper.cs @@ -2,9 +2,12 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Entities; +using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using System.Reflection; +using System.Runtime.CompilerServices; +using System.Text; using System.Text.RegularExpressions; namespace CS2_SimpleAdmin @@ -33,6 +36,12 @@ 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); + } + + public static bool IsValidSteamID64(string input) { string pattern = @"^\d{17}$"; @@ -154,4 +163,27 @@ namespace CS2_SimpleAdmin } } } + + public class SchemaString : NativeObject where SchemaClass : NativeObject + { + public SchemaString(SchemaClass instance, string member) : base(Schema.GetSchemaValue(instance.Handle, typeof(SchemaClass).Name!, member)) + { } + + public unsafe void Set(string str) + { + byte[] bytes = this.GetStringBytes(str); + + for (int i = 0; i < bytes.Length; i++) + { + Unsafe.Write((void*)(this.Handle.ToInt64() + i), bytes[i]); + } + + Unsafe.Write((void*)(this.Handle.ToInt64() + bytes.Length), 0); + } + + private byte[] GetStringBytes(string str) + { + return Encoding.ASCII.GetBytes(str); + } + } } \ No newline at end of file diff --git a/MuteManager.cs b/MuteManager.cs index e7075cf..088be35 100644 --- a/MuteManager.cs +++ b/MuteManager.cs @@ -25,6 +25,8 @@ namespace CS2_SimpleAdmin string muteType = "GAG"; if (type == 1) muteType = "MUTE"; + 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)"; @@ -56,6 +58,8 @@ namespace CS2_SimpleAdmin string muteType = "GAG"; if (type == 1) muteType = "MUTE"; + 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)"; @@ -136,6 +140,8 @@ namespace CS2_SimpleAdmin { muteType = "MUTE"; } + 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 }); @@ -174,11 +180,6 @@ namespace CS2_SimpleAdmin if (muteType == "GAG") { - if (player.Slot.HasValue && !CS2_SimpleAdmin.gaggedPlayers.Contains(player.Slot.Value)) - { - CS2_SimpleAdmin.gaggedPlayers.Add(player.Slot.Value); - } - if (CS2_SimpleAdmin.TagsDetected) NativeAPI.IssueServerCommand($"css_tag_mute {player!.SteamId}"); diff --git a/PlayerPenaltyManager.cs b/PlayerPenaltyManager.cs new file mode 100644 index 0000000..d8cae04 --- /dev/null +++ b/PlayerPenaltyManager.cs @@ -0,0 +1,139 @@ +using System.Collections.Concurrent; + +namespace CS2_SimpleAdmin +{ + public enum PenaltyType + { + Mute, + Gag, + Silence + } + + public class PlayerPenaltyManager + { + private static ConcurrentDictionary>> penalties = + new ConcurrentDictionary>>(); + + // 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)); + } + + public bool IsPenalized(int slot, PenaltyType penaltyType) + { + //Console.WriteLine($"Checking penalties for player with slot {slot} and penalty type {penaltyType}"); + + if (penalties.TryGetValue(slot, out var penaltyDict) && penaltyDict.TryGetValue(penaltyType, out var penaltiesList)) + { + //Console.WriteLine($"Found penalties for player with slot {slot} and penalty type {penaltyType}"); + + DateTime now = DateTime.Now; + + // Check if any active penalties exist + foreach (var penalty in penaltiesList.ToList()) + { + // Check if the penalty is still active + if (penalty.Duration > 0 && now >= penalty.EndDateTime.AddSeconds(penalty.Duration)) + { + //Console.WriteLine($"Removing expired penalty for player with slot {slot} and penalty type {penaltyType}"); + penaltiesList.Remove(penalty); // Remove expired penalty + if (penaltiesList.Count == 0) + { + //Console.WriteLine($"No more penalties of type {penaltyType} for player with slot {slot}. Removing penalty type."); + penaltyDict.Remove(penaltyType); // Remove penalty type if no more penalties exist + } + } + else if (penalty.Duration == 0 || now < penalty.EndDateTime) + { + //Console.WriteLine($"Player with slot {slot} is penalized for type {penaltyType}"); + // Return true if there's an active penalty + return true; + } + } + + // Return false if no active penalties are found + //Console.WriteLine($"Player with slot {slot} is not penalized for type {penaltyType}"); + return false; + } + + // Return false if no penalties of the specified type were found for the player + //Console.WriteLine($"No penalties found for player with slot {slot} and penalty type {penaltyType}"); + return false; + } + + // 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) + { + 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)>(); + } + + public bool IsSlotInPenalties(int slot) + { + return penalties.ContainsKey(slot); + } + + // Remove all penalties for a player slot + public void RemoveAllPenalties(int slot) + { + if (penalties.ContainsKey(slot)) + { + penalties.TryRemove(slot, out _); + } + } + + // Remove all penalties + public void RemoveAllPenalties() + { + penalties.Clear(); + } + + // Remove all penalties of a selected type from a specific player + public void RemovePenaltiesByType(int slot, PenaltyType penaltyType) + { + if (penalties.TryGetValue(slot, out Dictionary>? penaltyDict) && + penaltyDict.ContainsKey(penaltyType)) + { + penaltyDict.Remove(penaltyType); + } + } + + // Remove all expired penalties for all players and penalty types + public void RemoveExpiredPenalties() + { + DateTime now = DateTime.Now; + foreach (var kvp in penalties.ToList()) // Use ToList to avoid modification while iterating + { + var playerSlot = kvp.Key; + var penaltyDict = kvp.Value; + + // Remove expired penalties for the player + foreach (var penaltiesList in penaltyDict.Values) + { + penaltiesList.RemoveAll(p => p.Duration > 0 && now >= p.EndDateTime.AddSeconds(p.Duration)); + } + + // Remove player slot if no penalties left + if (penaltyDict.Count == 0) + { + penalties.TryRemove(playerSlot, out _); + } + } + } + } +} \ No newline at end of file diff --git a/PlayerUtils.cs b/PlayerUtils.cs index d802ff0..874afed 100644 --- a/PlayerUtils.cs +++ b/PlayerUtils.cs @@ -109,6 +109,31 @@ public static class PlayerUtils } } + public static void Rename(this CCSPlayerController controller, string newName = "Unknown") + { + if (CS2_SimpleAdmin._plugin == null) + return; + + SchemaString playerName = new SchemaString(controller, "m_iszPlayerName"); + playerName.Set(newName + " "); + + CS2_SimpleAdmin._plugin.AddTimer(0.25f, () => + { + Utilities.SetStateChanged(controller, "CCSPlayerController", "m_szClan"); + Utilities.SetStateChanged(controller, "CBasePlayerController", "m_iszPlayerName"); + }); + + CS2_SimpleAdmin._plugin.AddTimer(0.3f, () => + { + playerName.Set(newName); + }); + + CS2_SimpleAdmin._plugin.AddTimer(0.4f, () => + { + Utilities.SetStateChanged(controller, "CBasePlayerController", "m_iszPlayerName"); + }); + } + private static void PerformSlap(CBasePlayerPawn pawn, int damage = 0) { if (pawn.LifeState != (int)LifeState_t.LIFE_ALIVE) diff --git a/lang/en.json b/lang/en.json index f49baed..099961d 100644 --- a/lang/en.json +++ b/lang/en.json @@ -8,6 +8,8 @@ "sa_player_gag_message_perm": "You have been gagged permanently for {lightred}{0}{default} by {lightred}{1}{default}!", "sa_player_mute_message_time": "You have been muted for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", "sa_player_mute_message_perm": "You have been muted permanently for {lightred}{0}{default} by {lightred}{1}{default}!", + "sa_player_silence_message_time": "You have been silenced for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!", + "sa_player_silence_message_perm": "You have been silenced permanently for {lightred}{0}{default} by {lightred}{1}{default}!", "sa_admin_ban_message_time": "Admin {lightred}{0}{default} banned {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} banned {lightred}{1}{default} permanently for {lightred}{2}{default}!", "sa_admin_kick_message": "Admin {lightred}{0}{default} kicked {lightred}{1}{default} for {lightred}{2}{default}!", @@ -15,6 +17,8 @@ "sa_admin_gag_message_perm": "Admin {lightred}{0}{default} gagged {lightred}{1}{default} permanently for {lightred}{2}{default}!", "sa_admin_mute_message_time": "Admin {lightred}{0}{default} muted {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} muted {lightred}{1}{default} permanently for {lightred}{2}{default}!", + "sa_admin_silence_message_time": "Admin {lightred}{0}{default} silenced {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!", + "sa_admin_silence_message_perm": "Admin {lightred}{0}{default} silenced {lightred}{1}{default} permanently for {lightred}{2}{default}!", "sa_admin_give_message": "Admin {lightred}{0}{default} gave {lightred}{1}{default} a {lightred}{2}{default}!", "sa_admin_strip_message": "Admin {lightred}{0}{default} took all of player {lightred}{1}{default} weapons!", "sa_admin_hp_message": "Admin {lightred}{0}{default} changed {lightred}{1}{default} hp amount{default}!", @@ -26,6 +30,7 @@ "sa_admin_noclip_message": "Admin {lightred}{0}{default} toggled noclip for {lightred}{1}{default}!", "sa_admin_freeze_message": "Admin {lightred}{0}{default} freezed {lightred}{1}{default}!", "sa_admin_unfreeze_message": "Admin {lightred}{0}{default} umfreezed {lightred}{1}{default}!", + "sa_admin_rename_message": "Admin {lightred}{0}{default} changed {lightred}{1}{default} nickname to {lightred}{2}{default}!", "sa_admin_respawn_message": "Admin {lightred}{0}{default} respawned {lightred}{1}{default}!", "sa_admin_team_message": "Admin {lightred}{0}{default} transfered {lightred}{1}{default} to {lightred}{2}{default}!", "sa_admin_vote_menu_title": "{lime}VOTING FOR {gold}{0}", diff --git a/lang/pl.json b/lang/pl.json index 048017c..f2823f1 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -8,6 +8,8 @@ "sa_player_gag_message_perm": "Zostałeś zakneblowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", "sa_player_mute_message_time": "Zostałeś uciszony za {lightred}{0}{default} na {lightred}{1}{default} minute przez {lightred}{2}{default}!", "sa_player_mute_message_perm": "Zostałeś uciszony na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", + "sa_player_silence_message_time": "Zostałeś wyciszony za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!", + "sa_player_silence_message_perm": "Zostałeś wyciszony na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!", "sa_admin_ban_message_time": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", "sa_admin_ban_message_perm": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", "sa_admin_kick_message": "Admin {lightred}{0}{default} wyrzucił {lightred}{1}{default} za {lightred}{2}{default}!", @@ -15,6 +17,8 @@ "sa_admin_gag_message_perm": "Admin {lightred}{0}{default} zakneblował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", "sa_admin_mute_message_time": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", "sa_admin_mute_message_perm": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", + "sa_admin_silence_message_time": "Admin {lightred}{0}{default} wyciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!", + "sa_admin_silence_message_perm": "Admin {lightred}{0}{default} wyciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!", "sa_admin_give_message": "Admin {lightred}{0}{default} dał {lightred}{1}{default} przedmiot {lightred}{2}{default}!", "sa_admin_strip_message": "Admin {lightred}{0}{default} zabrał wszystkie bronie {lightred}{1}{default}!", "sa_admin_hp_message": "Admin {lightred}{0}{default} zmienił ilość hp dla {lightred}{1}{default}!", @@ -26,6 +30,7 @@ "sa_admin_noclip_message": "Admin {lightred}{0}{default} ustawił latanie dla {lightred}{1}{default}!", "sa_admin_freeze_message": "Admin {lightred}{0}{default} zamroził {lightred}{1}{default}!", "sa_admin_unfreeze_message": "Admin {lightred}{0}{default} odmroził {lightred}{1}{default}!", + "sa_admin_rename_message": "Admin {lightred}{0}{default} zmienił nick gracza {lightred}{1}{default} na {lightred}{2}{default}!", "sa_admin_respawn_message": "Admin {lightred}{0}{default} odrodził {lightred}{1}{default}!", "sa_admin_team_message": "Admin {lightred}{0}{default} przerzucił {lightred}{1}{default} do {lightred}{2}{default}!", "sa_admin_vote_menu_title": "{lime}GŁOSOWANIE NA {gold}{0}",