diff --git a/AdminSQLManager.cs b/AdminSQLManager.cs index a5f6aa6..628495c 100644 --- a/AdminSQLManager.cs +++ b/AdminSQLManager.cs @@ -1,4 +1,6 @@ -using Dapper; +using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Entities; +using Dapper; using MySqlConnector; namespace CS2_SimpleAdmin @@ -8,6 +10,8 @@ namespace CS2_SimpleAdmin private readonly MySqlConnection _dbConnection; // Unused for now //public static readonly ConcurrentDictionary> _adminCache = new ConcurrentDictionary>(); + public static readonly HashSet _adminCacheSet = new HashSet(); + public static readonly Dictionary _adminCacheTimestamps = new Dictionary(); public AdminSQLManager(string connectionString) { @@ -148,6 +152,93 @@ namespace CS2_SimpleAdmin //return filteredFlags.Cast().ToList(); } + public async Task, int, DateTime?)>> GetAllPlayersFlags() + { + DateTime now = DateTime.Now; + + await using var connection = _dbConnection; + await connection.OpenAsync(); + + 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(); + + if (activeFlags == null) + { + return new List<(string, List, int, DateTime?)>(); + } + + List<(string, List, int, DateTime?)> filteredFlagsWithImmunity = new List<(string, List, int, DateTime?)>(); + + foreach (dynamic flags in activeFlags) + { + if (flags is not IDictionary flagsDict) + { + 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)) + { + //Console.WriteLine("One or more required keys are missing."); + continue; + } + + DateTime? ends = null; + + if (endsObj != null) // Check if "ends" is not null + { + if (!DateTime.TryParse(endsObj.ToString(), out var parsedEnds)) + { + //Console.WriteLine("Failed to parse 'ends' value."); + continue; + } + + ends = parsedEnds; + } + + if (!(steamIdObj is string steamId) || + !(flagsValueObj is string flagsValue) || + !int.TryParse(immunityValueObj.ToString(), out var immunityValue)) + { + //Console.WriteLine("Failed to parse one or more values."); + continue; + } + + filteredFlagsWithImmunity.Add((steamId, flagsValue.Split(',').ToList(), immunityValue, ends)); + } + + return filteredFlagsWithImmunity; + } + + public async Task GiveAllFlags() + { + List<(string, List, int, DateTime?)> allPlayers = await GetAllPlayersFlags(); + + foreach (var record in allPlayers) + { + string steamIdStr = record.Item1; + List flags = record.Item2; + int immunity = record.Item3; + + DateTime? ends = record.Item4; + + if (!string.IsNullOrEmpty(steamIdStr) && SteamID.TryParse(steamIdStr, out var steamId) && steamId != null) + { + if (!_adminCacheSet.Contains(steamId)) + { + _adminCacheSet.Add(steamId); + _adminCacheTimestamps.Add(steamId, ends); + } + + Helper.GivePlayerFlags(steamId, flags, (uint)immunity); + // Often need to call 2 times + Helper.GivePlayerFlags(steamId, flags, (uint)immunity); + } + } + } + public async Task DeleteAdminBySteamId(string playerSteamId) { if (string.IsNullOrEmpty(playerSteamId)) return; @@ -159,6 +250,18 @@ namespace CS2_SimpleAdmin string sql = "DELETE FROM sa_admins WHERE player_steamid = @PlayerSteamID"; await connection.ExecuteAsync(sql, new { PlayerSteamID = playerSteamId }); + + if (!string.IsNullOrEmpty(playerSteamId) && SteamID.TryParse(playerSteamId, out var steamId) && steamId != null) + { + if (_adminCacheSet.Contains(steamId)) + { + _adminCacheSet.Remove(steamId); + _adminCacheTimestamps.Remove(steamId); + } + + AdminManager.ClearPlayerPermissions(steamId); + AdminManager.RemovePlayerAdminData(steamId); + } } public async Task AddAdminBySteamId(string playerSteamId, string playerName, string flags, int immunity = 0, int time = 0) @@ -190,6 +293,8 @@ namespace CS2_SimpleAdmin created = now, serverid = CS2_SimpleAdmin.ServerId }); + + _ = GiveAllFlags(); } public async Task DeleteOldAdmins() diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 313931b..bb80876 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -34,7 +34,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"; - public override string ModuleVersion => "1.2.6c"; + public override string ModuleVersion => "1.2.6d"; public CS2_SimpleAdminConfig Config { get; set; } = new(); diff --git a/Events.cs b/Events.cs index eaa3089..307e163 100644 --- a/Events.cs +++ b/Events.cs @@ -190,10 +190,11 @@ public partial class CS2_SimpleAdmin if (isBanned) { Helper.KickPlayer((ushort)player.UserId!, "Banned"); - Console.WriteLine("Authorized banned"); return; } + //Helper.GivePlayerFlags(player, activeFlags); + if (activeMutes.Count > 0) { foreach (var mute in activeMutes) @@ -276,8 +277,6 @@ public partial class CS2_SimpleAdmin } } - AddTimer(6, () => Helper.GivePlayerFlags(player, activeFlags)); - /* if (_adminManager._adminCache != null && _adminManager._adminCache.Count > 0) @@ -347,12 +346,13 @@ public partial class CS2_SimpleAdmin if (loadedPlayers.Contains((int)player.Index)) loadedPlayers.Remove((int)player.Index); - if (player.AuthorizedSteamID != null) + if (player.AuthorizedSteamID != null && AdminSQLManager._adminCacheSet.Contains(player.AuthorizedSteamID)) { - //string steamIdString = player.AuthorizedSteamID.SteamId64.ToString(); - - //AdminSQLManager._adminCache.TryRemove(steamIdString, out _); - AdminManager.RemovePlayerPermissions(player); + if (AdminSQLManager._adminCacheTimestamps != null && AdminSQLManager._adminCacheTimestamps.TryGetValue(player.AuthorizedSteamID, out DateTime? expirationTime) && expirationTime.HasValue && expirationTime.Value <= DateTime.Now) + { + AdminManager.ClearPlayerPermissions(player.AuthorizedSteamID); + AdminManager.RemovePlayerAdminData(player.AuthorizedSteamID); + } } if (TagsDetected) @@ -361,13 +361,14 @@ public partial class CS2_SimpleAdmin private void OnMapStart(string mapName) { + AdminSQLManager _adminManager = new(dbConnectionString); + AddTimer(120.0f, () => { BanManager _banManager = new(dbConnectionString); - _ = _banManager.ExpireOldBans(); MuteManager _muteManager = new(dbConnectionString); + _ = _banManager.ExpireOldBans(); _ = _muteManager.ExpireOldMutes(); - AdminSQLManager _adminManager = new(dbConnectionString); _ = _adminManager.DeleteOldAdmins(); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); @@ -394,6 +395,8 @@ public partial class CS2_SimpleAdmin connection.Close(); } + + _ = _adminManager.GiveAllFlags(); } private HookResult OnPlayerHurt(EventPlayerHurt @event, GameEventInfo info) diff --git a/Helper.cs b/Helper.cs index 3e4876e..194835d 100644 --- a/Helper.cs +++ b/Helper.cs @@ -1,6 +1,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; using System.Reflection; @@ -47,32 +48,49 @@ namespace CS2_SimpleAdmin return Regex.IsMatch(input, pattern); } - public static void GivePlayerFlags(CCSPlayerController player, List<(List, int)> flagsWithImmunity) + public static void GivePlayerFlags(SteamID? steamid, List? flags = null, uint immunity = 0) { - if (player == null) return; - - foreach (var (flags, immunity) in flagsWithImmunity) + try { - AdminManager.SetPlayerImmunity(player, (uint)immunity); - - foreach (var flag in flags) + if (steamid == null || (flags == null && immunity == 0)) { - if (!string.IsNullOrEmpty(flag)) + //Console.WriteLine("Invalid input: steamid is null or both flags and immunity are not provided."); + return; + } + + //Console.WriteLine($"Setting immunity for SteamID {steamid} to {immunity}"); + AdminManager.SetPlayerImmunity(steamid, (uint)immunity); + + if (flags != null) + { + //Console.WriteLine($"Applying flags to SteamID {steamid}:"); + + foreach (var flag in flags) { - if (flag.StartsWith("@")) + if (!string.IsNullOrEmpty(flag)) { - AdminManager.AddPlayerPermissions(player, flag); - } - else if (flag.StartsWith("#")) - { - AdminManager.AddPlayerToGroup(player, flag); + if (flag.StartsWith("@")) + { + //Console.WriteLine($"Adding permission {flag} to SteamID {steamid}"); + AdminManager.AddPlayerPermissions(steamid, flag); + } + else if (flag.StartsWith("#")) + { + //Console.WriteLine($"Adding SteamID {steamid} to group {flag}"); + AdminManager.AddPlayerToGroup(steamid, flag); + } } } } } - + catch (Exception) + { + return; + //Console.WriteLine($"An error occurred: {ex}"); + } } + /* public static TargetResult GetTarget(string target, out CCSPlayerController? player) {