diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index f3de1b6..a25f03d 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -12,7 +12,7 @@ using System.Collections.Concurrent; namespace CS2_SimpleAdmin; -[MinimumApiVersion(178)] +[MinimumApiVersion(191)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { public static CS2_SimpleAdmin Instance { get; private set; } = new(); @@ -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.6a"; + public override string ModuleVersion => "1.3.6c"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -81,24 +81,22 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig - + diff --git a/Commands/basecommands.cs b/Commands/basecommands.cs index 6882c44..ff564a6 100644 --- a/Commands/basecommands.cs +++ b/Commands/basecommands.cs @@ -413,7 +413,7 @@ namespace CS2_SimpleAdmin player.Pawn.Value!.Freeze(); } - reason = CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; + reason = reason ?? CS2_SimpleAdmin._localizer?["sa_unknown"] ?? "Unknown"; Helper.LogCommand(caller, $"css_kick {player.PlayerName} {reason}"); @@ -462,6 +462,8 @@ namespace CS2_SimpleAdmin string callerName = caller == null ? "Console" : caller.PlayerName; string _command = string.Empty; + map = map.ToLower(); + if (map.StartsWith("ws:")) { if (long.TryParse(map.Replace("ws:", ""), out long mapId)) @@ -540,6 +542,8 @@ namespace CS2_SimpleAdmin string callerName = caller == null ? "Console" : caller.PlayerName; string _command = string.Empty; + map = map.ToLower(); + if (long.TryParse(map, out long mapId)) { _command = $"host_workshop_map {mapId}"; diff --git a/Commands/basecomms.cs b/Commands/basecomms.cs index 87be2f3..1a56e49 100644 --- a/Commands/basecomms.cs +++ b/Commands/basecomms.cs @@ -358,7 +358,6 @@ namespace CS2_SimpleAdmin await _muteManager.UnmutePlayer(player.SteamID.ToString(), 0); // Unmute by type 0 (gag) }); - if (TagsDetected) Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}"); }); @@ -695,7 +694,6 @@ namespace CS2_SimpleAdmin player.VoiceFlags = VoiceFlags.Normal; }); */ - } [ConsoleCommand("css_silence")] diff --git a/Config.cs b/Config.cs index 3faf684..5b83208 100644 --- a/Config.cs +++ b/Config.cs @@ -16,8 +16,10 @@ namespace CS2_SimpleAdmin { [JsonPropertyName("Flag")] public string Flag { get; set; } = "@css/generic"; + [JsonPropertyName("DisplayName")] public string DisplayName { get; set; } = ""; + [JsonPropertyName("Command")] public string Command { get; set; } = ""; } diff --git a/Events.cs b/Events.cs index d3d980f..e22b946 100644 --- a/Events.cs +++ b/Events.cs @@ -4,6 +4,7 @@ using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Cvars; +using CounterStrikeSharp.API.Modules.Entities; using Dapper; using Microsoft.Extensions.Logging; using System.Data; @@ -14,24 +15,28 @@ namespace CS2_SimpleAdmin; public partial class CS2_SimpleAdmin { + public static HashSet loadedPlayers = new HashSet(); + private void RegisterEvents() { RegisterListener(OnMapStart); - RegisterListener(OnClientConnected); - RegisterListener(OnClientDisconnectPost); + //RegisterListener(OnClientConnected); + //RegisterListener(OnClientDisconnect); AddCommandListener("say", OnCommandSay); AddCommandListener("say_team", OnCommandTeamSay); } - private void OnClientDisconnectPost(int playerSlot) + [GameEventHandler] + public HookResult OnClientDisconnect(EventPlayerDisconnect @event, GameEventInfo info) { - CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + CCSPlayerController? player = @event.Userid; #if DEBUG Logger.LogCritical("[OnClientDisconnect] Before"); #endif - if (player is null || player.IsBot || player.IsHLTV || player.SteamID.ToString().Length != 17) return; + 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 DEBUG Logger.LogCritical("[OnClientDisconnect] After Check"); @@ -39,6 +44,7 @@ public partial class CS2_SimpleAdmin PlayerPenaltyManager playerPenaltyManager = new(); playerPenaltyManager.RemoveAllPenalties(player.Slot); + if (TagsDetected) Server.ExecuteCommand($"css_tag_unmute {player.SteamID}"); @@ -47,23 +53,35 @@ public partial class CS2_SimpleAdmin if (godPlayers.Contains(player.Slot)) RemoveFromConcurrentBag(godPlayers, player.Slot); - if (player.AuthorizedSteamID == null) return; + loadedPlayers.Remove(player.Slot); - if (AdminSQLManager._adminCache.TryGetValue(player.AuthorizedSteamID, out DateTime? expirationTime) - && expirationTime <= DateTime.Now) + SteamID? authorizedSteamID = player.AuthorizedSteamID; + + if (authorizedSteamID == null) return HookResult.Continue; + + Task.Run(() => { - AdminManager.ClearPlayerPermissions(player.AuthorizedSteamID); - AdminManager.RemovePlayerAdminData(player.AuthorizedSteamID); - } - } + if (AdminSQLManager._adminCache.TryGetValue(authorizedSteamID, out DateTime? expirationTime) + && expirationTime <= DateTime.Now) + { + AdminManager.ClearPlayerPermissions(authorizedSteamID); + AdminManager.RemovePlayerAdminData(authorizedSteamID); + } + }); - private void OnClientConnected(int playerSlot) + return HookResult.Continue; + } + [GameEventHandler] + public HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info) { - CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); + CCSPlayerController? player = @event.Userid; #if DEBUG Logger.LogCritical($"[OnPlayerConnect] Before check {player.PlayerName} : {player.IpAddress}"); #endif - if (player is null || player.IsBot || player.IsHLTV || player.SteamID.ToString().Length != 17 || string.IsNullOrEmpty(player.IpAddress)) return; + 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 @@ -71,13 +89,13 @@ public partial class CS2_SimpleAdmin if (bannedPlayers.Contains(ipAddress) || bannedPlayers.Contains(player.SteamID.ToString())) { - if (!player.UserId.HasValue) return; + if (!player.UserId.HasValue) return HookResult.Continue; Helper.KickPlayer(player.UserId.Value, "Banned"); - return; + return HookResult.Continue; } if (_database == null || !player.UserId.HasValue || player.UserId == null) - return; + return HookResult.Continue; PlayerInfo playerInfo = new PlayerInfo { @@ -89,12 +107,12 @@ public partial class CS2_SimpleAdmin IpAddress = ipAddress }; + BanManager _banManager = new(_database, Config); + MuteManager _muteManager = new(_database); + PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager(); + Task.Run(async () => { - 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)) @@ -159,19 +177,25 @@ public partial class CS2_SimpleAdmin } } }); + + if (!loadedPlayers.Contains(player.Slot)) + loadedPlayers.Add(player.Slot); + + return HookResult.Continue; } [GameEventHandler] - private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info) + public HookResult OnRoundEnd(EventRoundStart @event, GameEventInfo info) { #if DEBUG Logger.LogCritical("[OnRoundEnd]"); #endif + godPlayers.Clear(); return HookResult.Continue; } - private HookResult OnCommandSay(CCSPlayerController? player, CommandInfo info) + 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; @@ -183,7 +207,7 @@ public partial class CS2_SimpleAdmin return HookResult.Continue; } - private HookResult OnCommandTeamSay(CCSPlayerController? player, CommandInfo info) + 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; @@ -220,23 +244,6 @@ public partial class CS2_SimpleAdmin return HookResult.Continue; } - /* - [GameEventHandler] - public HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info) - { - - - return HookResult.Continue; - } - - [GameEventHandler] - public HookResult OnPlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info) - { - - return HookResult.Continue; - } - */ - private void OnMapStart(string mapName) { string? path = Path.GetDirectoryName(ModuleDirectory); @@ -255,7 +262,7 @@ public partial class CS2_SimpleAdmin if (_database == null) return; - AddTimer(60.0f, async () => + AddTimer(61.0f, async () => { #if DEBUG Logger.LogCritical("[OnMapStart] Expired check"); @@ -273,7 +280,6 @@ public partial class CS2_SimpleAdmin { try { - foreach (CCSPlayerController player in Helper.GetValidPlayers()) { if (playerPenaltyManager.IsSlotInPenalties(player.Slot)) @@ -307,7 +313,7 @@ public partial class CS2_SimpleAdmin playerPenaltyManager.RemoveExpiredPenalties(); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - AddTimer(3.0f, async () => + AddTimer(2.0f, async () => { string? address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}"; string? hostname = ConVar.Find("hostname")!.StringValue; @@ -341,9 +347,9 @@ public partial class CS2_SimpleAdmin ServerId = serverId; } - catch (Exception) + catch (Exception ex) { - _logger?.LogCritical("Unable to create or get server_id"); + _logger?.LogCritical("Unable to create or get server_id" + ex.Message); } await _adminManager.GiveAllFlags(); @@ -366,8 +372,7 @@ public partial class CS2_SimpleAdmin { CCSPlayerController? player = @event.Userid; - if (player is null || @event.Attacker is null || (LifeState_t)player.LifeState != LifeState_t.LIFE_ALIVE || player.PlayerPawn.Value == null - || player.Connected != PlayerConnectedState.PlayerConnected) + if (player is null || @event.Attacker is null || !player.PawnIsAlive || player.PlayerPawn.Value == null) return HookResult.Continue; if (godPlayers.Contains(player.Slot)) diff --git a/Managers/AdminSQLManager.cs b/Managers/AdminSQLManager.cs index 1ba6550..871f54f 100644 --- a/Managers/AdminSQLManager.cs +++ b/Managers/AdminSQLManager.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging; using System.Collections.Concurrent; namespace CS2_SimpleAdmin; + public class AdminSQLManager { private readonly Database _database; @@ -222,4 +223,4 @@ public class AdminSQLManager 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 44752e3..208aed8 100644 --- a/Managers/BanManager.cs +++ b/Managers/BanManager.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging; namespace CS2_SimpleAdmin; + internal class BanManager { private readonly Database _database; @@ -188,14 +189,14 @@ internal class BanManager */ string sql = @" - UPDATE sa_bans - SET + UPDATE sa_bans + SET status = 'EXPIRED' - WHERE - status = 'ACTIVE' - AND - `duration` > 0 - AND + WHERE + status = 'ACTIVE' + AND + `duration` > 0 + AND ends <= @currentTime"; await connection.ExecuteAsync(sql, new { currentTime }); @@ -205,21 +206,20 @@ internal class BanManager DateTime ipBansTime = currentTime.AddDays(-_config.ExpireOldIpBans).ToLocalTime(); sql = @" - UPDATE sa_bans - SET + UPDATE sa_bans + SET player_ip = NULL - WHERE - status = 'ACTIVE' - AND + WHERE + status = 'ACTIVE' + AND ends <= @ipBansTime"; await connection.ExecuteAsync(sql, new { ipBansTime }); } - } catch (Exception) { CS2_SimpleAdmin._logger?.LogCritical("Unable to remove expired bans"); } } -} +} \ No newline at end of file diff --git a/Managers/MuteManager.cs b/Managers/MuteManager.cs index 7ab82dc..da693ea 100644 --- a/Managers/MuteManager.cs +++ b/Managers/MuteManager.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging; namespace CS2_SimpleAdmin; + internal class MuteManager { private readonly Database _database; @@ -160,5 +161,4 @@ internal class MuteManager 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 85ae3fe..f50cba9 100644 --- a/Managers/PlayerPenaltyManager.cs +++ b/Managers/PlayerPenaltyManager.cs @@ -1,6 +1,7 @@ using System.Collections.Concurrent; namespace CS2_SimpleAdmin; + public enum PenaltyType { Mute, @@ -134,4 +135,4 @@ public class PlayerPenaltyManager } } } -} +} \ No newline at end of file diff --git a/lang/pl.json b/lang/pl.json index 5620864..1746cb8 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -47,5 +47,4 @@ "sa_adminchat_template_player": "{SILVER}(GRACZ) {lightred}{0}{default}: {lightred}{1}{default}", "sa_discord_log_command": "**{0}** użył komendy `{1}` na serwerze `HOSTNAME`" - } \ No newline at end of file