From 9fb256d39fe9ee39f9729fe46ee42acca336f8d2 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Thu, 2 May 2024 13:51:07 +0200 Subject: [PATCH] 1.4.3c - Fixed rare problems with expiring bans - More checks for `BanType` - Minor changes about validating players - Added `css_players -duplicate` to list players with same ip address --- CS2-SimpleAdmin.cs | 17 +++- Commands/basecommands.cs | 34 ++++--- Events.cs | 161 ++++++++++++++++--------------- Helper.cs | 8 +- Managers/BanManager.cs | 27 +++--- Managers/MuteManager.cs | 14 +-- Managers/PermissionManager.cs | 31 +++--- Managers/PlayerPenaltyManager.cs | 10 +- VERSION | 2 +- 9 files changed, 165 insertions(+), 139 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index 68b65fc..c994c2b 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -37,7 +37,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)"); public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.4.3b"; + public override string ModuleVersion => "1.4.3c"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -55,16 +55,25 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig(GameData.GetSignature("CBasePlayerController_SetPawn")); } + public override void Unload(bool hotReload) + { + if (hotReload) return; + + RemoveListener(OnMapStart); + RemoveCommandListener("say", OnCommandSay, HookMode.Post); + RemoveCommandListener("say_team", OnCommandTeamSay, HookMode.Post); + } + public void OnConfigParsed(CS2_SimpleAdminConfig config) { if (config.DatabaseHost.Length < 1 || config.DatabaseName.Length < 1 || config.DatabaseUser.Length < 1) { throw new Exception("[CS2-SimpleAdmin] You need to setup Database credentials in config!"); } - + Instance = this; _logger = Logger; - + MySqlConnectionStringBuilder builder = new() { Server = config.DatabaseHost, @@ -103,7 +112,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { if (string.IsNullOrEmpty(steamid) || !SteamID.TryParse(steamid, out var steamId) || - steamId == null) return; + steamId == null) return; if (PermissionManager.AdminCache.ContainsKey(steamId)) { PermissionManager.AdminCache.TryRemove(steamId, out _); @@ -307,7 +307,7 @@ namespace CS2_SimpleAdmin { var steamId = PermissionManager.AdminCache.Keys.ToList()[index]; if (!PermissionManager.AdminCache.TryRemove(steamId, out _)) continue; - + AdminManager.ClearPlayerPermissions(steamId); AdminManager.RemovePlayerAdminData(steamId); } @@ -429,8 +429,15 @@ namespace CS2_SimpleAdmin [RequiresPermissions("@css/generic")] public void OnPlayersCommand(CCSPlayerController? caller, CommandInfo command) { - var playersToTarget = Helper.GetValidPlayers(); var isJson = command.GetArg(1).ToLower().Equals("-json"); + var isDuplicate = command.GetArg(1).ToLower().Equals("-duplicate"); + + var playersToTarget = isDuplicate + ? Helper.GetValidPlayers().GroupBy(player => player.IpAddress?.Split(":")[0] ?? "Unknown") + .Where(group => group.Count() > 1) + .SelectMany(group => group) + .ToList() + : Helper.GetValidPlayers(); if (!isJson) { @@ -456,32 +463,31 @@ namespace CS2_SimpleAdmin } else { - var playersJson = JsonConvert.SerializeObject(playersToTarget.Select((CCSPlayerController player) => + var playersJson = JsonConvert.SerializeObject(playersToTarget.Select((CCSPlayerController player) => { var matchStats = player.ActionTrackingServices?.MatchStats; - return new - { + return new + { UserId = player.UserId, Name = player.PlayerName, SteamId = player.SteamID.ToString(), IpAddress = player.IpAddress?.Split(":")[0] ?? "Unknown", Ping = player.Ping, - AdminData = AdminManager.GetPlayerAdminData(player), + IsAdmin = AdminManager.PlayerHasPermissions(player, "@css/ban") || AdminManager.PlayerHasPermissions(player, "@css/generic"), Stats = new { Score = player.Score, Kills = matchStats?.Kills ?? 0, Deaths = matchStats?.Deaths ?? 0, - Assists = matchStats?.Assists, MVPs = player.MVPs - } + } }; })); - + if (caller != null) caller.PrintToConsole(playersJson); - else + else Server.PrintToConsole(playersJson); } } @@ -557,7 +563,7 @@ namespace CS2_SimpleAdmin if (caller != null && (caller.UserId == null || SilentPlayers.Contains(caller.Slot))) return; foreach (var controller in Helper.GetValidPlayers()) { - + using (new WithTemporaryCulture(controller.GetLanguage())) { StringBuilder sb = new(_localizer!["sa_prefix"]); diff --git a/Events.cs b/Events.cs index 96424eb..ba84539 100644 --- a/Events.cs +++ b/Events.cs @@ -4,7 +4,6 @@ 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.Text; @@ -31,7 +30,7 @@ public partial class CS2_SimpleAdmin Logger.LogCritical("[OnClientDisconnect] Before"); #endif - if (player == null || !player.IsValid || string.IsNullOrEmpty(player.IpAddress) || player.IsBot || player.IsHLTV) + if (player == null || !player.IsValid || string.IsNullOrEmpty(player.IpAddress) || player.IsBot) { return HookResult.Continue; } @@ -60,9 +59,9 @@ public partial class CS2_SimpleAdmin var authorizedSteamId = player.AuthorizedSteamID; if (authorizedSteamId == null || !PermissionManager.AdminCache.TryGetValue(authorizedSteamId, - out var expirationTime) - || !(expirationTime <= DateTime.Now)) return HookResult.Continue; - + out var expirationTime) + || !(expirationTime <= DateTime.UtcNow.ToLocalTime())) return HookResult.Continue; + AdminManager.ClearPlayerPermissions(authorizedSteamId); AdminManager.RemovePlayerAdminData(authorizedSteamId); @@ -81,13 +80,13 @@ public partial class CS2_SimpleAdmin CCSPlayerController? player = @event.Userid; if (player == null || string.IsNullOrEmpty(player.IpAddress) || player.IpAddress.Contains("127.0.0.1") - || player.IsBot || player.IsHLTV || !player.UserId.HasValue) + || player.IsBot || !player.UserId.HasValue) return HookResult.Continue; var 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 (Config.BanType > 0 && BannedPlayers.Contains(ipAddress) || BannedPlayers.Contains(player.SteamID.ToString())) { // Kick the player if banned if (player.UserId.HasValue) @@ -121,7 +120,7 @@ public partial class CS2_SimpleAdmin if (isBanned) { // Add player's IP and SteamID to bannedPlayers list if not already present - if (playerInfo.IpAddress != null && !BannedPlayers.Contains(playerInfo.IpAddress)) + if (Config.BanType > 0 && playerInfo.IpAddress != null && !BannedPlayers.Contains(playerInfo.IpAddress)) BannedPlayers.Add(playerInfo.IpAddress); if (playerInfo.SteamId != null && !BannedPlayers.Contains(playerInfo.SteamId)) @@ -233,7 +232,7 @@ public partial class CS2_SimpleAdmin return HookResult.Handled; if (!info.GetArg(1).StartsWith($"@")) return HookResult.Continue; - + StringBuilder sb = new(); if (AdminManager.PlayerHasPermissions(player, "@css/chat")) @@ -257,14 +256,14 @@ public partial class CS2_SimpleAdmin return HookResult.Handled; } - private void OnMapStart(string mapName) + public void OnMapStart(string mapName) { var path = Path.GetDirectoryName(ModuleDirectory); if (Directory.Exists(path + "/CS2-Tags")) { _tagsDetected = true; } - + GodPlayers.Clear(); SilentPlayers.Clear(); @@ -272,75 +271,22 @@ public partial class CS2_SimpleAdmin _database = new Database.Database(_dbConnectionString); - AddTimer(61.0f, () => - { -#if DEBUG - Logger.LogCritical("[OnMapStart] Expired check"); -#endif - - var players = Helper.GetValidPlayers(); - var onlinePlayers = players - .Where(player => player.IpAddress != null && player.SteamID.ToString().Length == 17) - .Select(player => (player.IpAddress, player.SteamID, player.UserId)) - .ToList(); - - Task.Run(async () => - { - PermissionManager 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(); - - await Server.NextFrameAsync(() => - { - try - { - foreach (var player in players.Where(player => 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)) continue; - player.VoiceFlags = VoiceFlags.Normal; - - if (_tagsDetected) - Server.ExecuteCommand($"css_tag_unmute {player.SteamID}"); - } - - PlayerPenaltyManager.RemoveExpiredPenalties(); - } - catch { } - }); - }); - }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - AddTimer(2.0f, () => { - var address = $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue()}"; + var ipAddress = ConVar.Find("ip")?.StringValue; + + if (string.IsNullOrEmpty(ipAddress)) + { + Logger.LogError("Unable to get server ip, Check that you have added the correct start parameter \"-ip \""); + } + + var address = $"{ipAddress}:{ConVar.Find("hostport")?.GetPrimitiveValue()}"; var hostname = ConVar.Find("hostname")!.StringValue; Task.Run(async () => { PermissionManager adminManager = new(_database); + try { await using var connection = await _database.GetConnectionAsync(); @@ -389,13 +335,76 @@ public partial class CS2_SimpleAdmin //await _adminManager.GiveAllGroupsFlags(); //await _adminManager.GiveAllFlags(); - - await Server.NextFrameAsync(() => { + await Server.NextFrameAsync(() => + { ReloadAdmins(null); }); + }); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + + AddTimer(61.0f, () => + { +#if DEBUG + Logger.LogCritical("[OnMapStart] Expired check"); +#endif + + var players = Helper.GetValidPlayers(); + var onlinePlayers = players + .Where(player => player.IpAddress != null && player.SteamID.ToString().Length == 17) + .Select(player => (player.IpAddress, player.SteamID, player.UserId)) + .ToList(); + + Task.Run(async () => + { + PermissionManager adminManager = new(_database); + BanManager banManager = new(_database, Config); + MuteManager muteManager = new(_database); + + await banManager.ExpireOldBans(); + await muteManager.ExpireOldMutes(); + await adminManager.DeleteOldAdmins(); + BannedPlayers.Clear(); + if (onlinePlayers.Count > 0) + { + try + { + await banManager.CheckOnlinePlayers(onlinePlayers); + } + catch { } + } + + await Server.NextFrameAsync(() => + { + try + { + foreach (var player in players.Where(player => 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)) continue; + player.VoiceFlags = VoiceFlags.Normal; + + if (_tagsDetected) + Server.ExecuteCommand($"css_tag_unmute {player.SteamID}"); + } + + PlayerPenaltyManager.RemoveExpiredPenalties(); + } + catch { } + }); + }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } [GameEventHandler] @@ -407,7 +416,7 @@ public partial class CS2_SimpleAdmin return HookResult.Continue; if (!GodPlayers.Contains(player.Slot)) return HookResult.Continue; - + player.PlayerPawn.Value.Health = player.PlayerPawn.Value.MaxHealth; player.PlayerPawn.Value.ArmorValue = 100; diff --git a/Helper.cs b/Helper.cs index 2f7b5a8..06705fe 100644 --- a/Helper.cs +++ b/Helper.cs @@ -59,16 +59,14 @@ namespace CS2_SimpleAdmin public static List GetValidPlayers() { - return Utilities.GetPlayers().FindAll(p => - p.IsValid && p.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(p.IpAddress) && p is - { Connected: PlayerConnectedState.PlayerConnected, IsBot: false, IsHLTV: false }); + return Utilities.GetPlayers().FindAll(p => p is + { IsBot: false, IsHLTV: false }); } public static IEnumerable GetValidPlayersWithBots() { return Utilities.GetPlayers().FindAll(p => - p.IsValid && p.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(p.IpAddress) && p is { Connected: PlayerConnectedState.PlayerConnected, IsBot: false, IsHLTV: false } || - p is { IsValid: true, Connected: PlayerConnectedState.PlayerConnected, IsBot: true, IsHLTV: false } + p is { IsBot: false, IsHLTV: false } or { IsBot: true, IsHLTV: false } ); } diff --git a/Managers/BanManager.cs b/Managers/BanManager.cs index 599e029..435c83a 100644 --- a/Managers/BanManager.cs +++ b/Managers/BanManager.cs @@ -10,14 +10,14 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf public async Task BanPlayer(PlayerInfo player, PlayerInfo issuer, string reason, int time = 0) { DateTime now = DateTime.UtcNow.ToLocalTime(); - DateTime futureTime = now.AddMinutes(time).ToLocalTime(); + DateTime futureTime = now.AddMinutes(time); await using MySqlConnection connection = await database.GetConnectionAsync(); try { const string 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)"; + "VALUES (@playerSteamid, @playerName, @playerIp, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @serverid)"; await connection.ExecuteAsync(sql, new { @@ -41,7 +41,7 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf if (string.IsNullOrEmpty(playerSteamId)) return; DateTime now = DateTime.UtcNow.ToLocalTime(); - DateTime futureTime = now.AddMinutes(time).ToLocalTime(); + DateTime futureTime = now.AddMinutes(time); try { @@ -70,7 +70,7 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf if (string.IsNullOrEmpty(playerIp)) return; DateTime now = DateTime.UtcNow.ToLocalTime(); - DateTime futureTime = now.AddMinutes(time).ToLocalTime(); + DateTime futureTime = now.AddMinutes(time); try { @@ -108,7 +108,7 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf int banCount; - DateTime currentTime = DateTime.Now.ToLocalTime(); + DateTime currentTime = DateTime.UtcNow.ToLocalTime(); try { @@ -172,12 +172,14 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf await using var connection = await database.GetConnectionAsync(); - if (!string.IsNullOrEmpty(player.IpAddress)) + if (config.BanType > 0 && !string.IsNullOrEmpty(player.IpAddress)) { banCount = await connection.ExecuteScalarAsync(sql, new { - PlayerSteamID = player.SteamId, PlayerIP = player.IpAddress, serverid = CS2_SimpleAdmin.ServerId + PlayerSteamID = player.SteamId, + PlayerIP = player.IpAddress, + serverid = CS2_SimpleAdmin.ServerId }); } else @@ -185,7 +187,9 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf banCount = await connection.ExecuteScalarAsync(sql, new { - PlayerSteamID = player.SteamId, PlayerIP = DBNull.Value, serverid = CS2_SimpleAdmin.ServerId + PlayerSteamID = player.SteamId, + PlayerIP = DBNull.Value, + serverid = CS2_SimpleAdmin.ServerId }); } @@ -264,6 +268,7 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf { await using var connection = await database.GetConnectionAsync(); string sql; + bool checkIpBans = config.BanType > 0; if (config.MultiServerMode) { @@ -280,7 +285,7 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf if (!UserId.HasValue) continue; var banCount = 0; - if (!string.IsNullOrEmpty(IpAddress)) + if (checkIpBans && !string.IsNullOrEmpty(IpAddress)) { banCount = await connection.ExecuteScalarAsync(sql, new { PlayerSteamID = SteamID, PlayerIP = IpAddress, serverid = CS2_SimpleAdmin.ServerId }); @@ -306,7 +311,7 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf public async Task ExpireOldBans() { var currentTime = DateTime.UtcNow.ToLocalTime(); - + await using var connection = await database.GetConnectionAsync(); try { @@ -349,7 +354,7 @@ internal class BanManager(Database.Database database, CS2_SimpleAdminConfig conf if (config.ExpireOldIpBans > 0) { - var ipBansTime = currentTime.AddDays(-config.ExpireOldIpBans).ToLocalTime(); + var ipBansTime = currentTime.AddDays(-config.ExpireOldIpBans); sql = config.MultiServerMode ? """ UPDATE sa_bans diff --git a/Managers/MuteManager.cs b/Managers/MuteManager.cs index 6adb554..dcb91ba 100644 --- a/Managers/MuteManager.cs +++ b/Managers/MuteManager.cs @@ -10,7 +10,7 @@ internal class MuteManager(Database.Database database) if (player.SteamId == null) return; var now = DateTime.UtcNow.ToLocalTime(); - var futureTime = now.AddMinutes(time).ToLocalTime(); + var futureTime = now.AddMinutes(time); var muteType = type switch { @@ -24,7 +24,7 @@ internal class MuteManager(Database.Database database) await using var connection = await database.GetConnectionAsync(); const string 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)"; + "VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @type, @serverid)"; await connection.ExecuteAsync(sql, new { @@ -49,7 +49,7 @@ internal class MuteManager(Database.Database database) var now = DateTime.UtcNow.ToLocalTime(); - var futureTime = now.AddMinutes(time).ToLocalTime(); + var futureTime = now.AddMinutes(time); var muteType = type switch { @@ -62,7 +62,7 @@ internal class MuteManager(Database.Database database) { await using var connection = await database.GetConnectionAsync(); const string 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)"; + "VALUES (@playerSteamid, @adminSteamid, @adminName, @muteReason, @duration, @ends, @created, @type, @serverid)"; await connection.ExecuteAsync(sql, new { @@ -95,7 +95,7 @@ internal class MuteManager(Database.Database database) try { await using var connection = await database.GetConnectionAsync(); - var currentTime = DateTime.Now.ToLocalTime(); + var currentTime = DateTime.UtcNow.ToLocalTime(); string sql; if (CS2_SimpleAdmin.Instance.Config.MultiServerMode) @@ -177,7 +177,7 @@ internal class MuteManager(Database.Database database) const string sqlAdmin = "SELECT id FROM sa_admins WHERE player_steamid = @adminSteamId"; var sqlInsertUnmute = "INSERT INTO sa_unmutes (mute_id, admin_id, reason) VALUES (@muteId, @adminId, @reason); SELECT LAST_INSERT_ID();"; - var sqlAdminId = await connection.ExecuteScalarAsync(sqlAdmin, new { adminSteamId }); + var sqlAdminId = await connection.ExecuteScalarAsync(sqlAdmin, new { adminSteamId }); var adminId = sqlAdminId ?? 0; foreach (var mute in mutesList) @@ -217,7 +217,7 @@ internal class MuteManager(Database.Database database) ? "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime AND server_id = @serverid" : "UPDATE sa_mutes SET status = 'EXPIRED' WHERE status = 'ACTIVE' AND `duration` > 0 AND ends <= @CurrentTime"; - await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime(), serverid = CS2_SimpleAdmin.ServerId }); + await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.UtcNow.ToLocalTime(), serverid = CS2_SimpleAdmin.ServerId }); } catch (Exception) { diff --git a/Managers/PermissionManager.cs b/Managers/PermissionManager.cs index bd8e7b1..7783cbf 100644 --- a/Managers/PermissionManager.cs +++ b/Managers/PermissionManager.cs @@ -1,11 +1,10 @@ -using CounterStrikeSharp.API.Modules.Entities; +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Modules.Entities; using Dapper; using Microsoft.Extensions.Logging; using MySqlConnector; using Newtonsoft.Json; using System.Collections.Concurrent; -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Modules.Admin; namespace CS2_SimpleAdmin; @@ -90,7 +89,7 @@ public class PermissionManager(Database.Database database) { continue; } - + if (!flagInfoDict.TryGetValue("player_steamid", out var steamIdObj) || !flagInfoDict.TryGetValue("player_name", out var playerNameObj) || !flagInfoDict.TryGetValue("flag", out var flagObj) || @@ -115,7 +114,7 @@ public class PermissionManager(Database.Database database) ends = parsedEnds; } } - + if (currentSteamId != steamId && !string.IsNullOrEmpty(currentSteamId)) { filteredFlagsWithImmunity.Add((currentSteamId, currentPlayerName, currentFlags, immunityValue, ends)); @@ -125,7 +124,7 @@ public class PermissionManager(Database.Database database) currentSteamId = steamId; currentPlayerName = playerName; currentFlags.Add(flag); - + } if (!string.IsNullOrEmpty(currentSteamId)) @@ -400,7 +399,7 @@ public class PermissionManager(Database.Database database) DateTime? futureTime; if (time != 0) - futureTime = now.ToLocalTime().AddMinutes(time); + futureTime = now.AddMinutes(time); else futureTime = null; @@ -410,7 +409,7 @@ public class PermissionManager(Database.Database database) // Insert admin into sa_admins table const string 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();"; + "VALUES (@playerSteamid, @playerName, @immunity, @ends, @created, @serverid); SELECT LAST_INSERT_ID();"; var adminId = await connection.ExecuteScalarAsync(insertAdminSql, new { @@ -442,7 +441,7 @@ public class PermissionManager(Database.Database database) } const string insertFlagsSql = "INSERT INTO `sa_admins_flags` (`admin_id`, `flag`) " + - "VALUES (@adminId, @flag)"; + "VALUES (@adminId, @flag)"; await connection.ExecuteAsync(insertFlagsSql, new { @@ -464,14 +463,14 @@ public class PermissionManager(Database.Database database) public async Task AddGroup(string groupName, List flagsList, int immunity = 0, bool globalGroup = false) { - if (string.IsNullOrEmpty(groupName) || flagsList.Count == 0) return; + if (string.IsNullOrEmpty(groupName) || flagsList.Count == 0) return; await using var connection = await database.GetConnectionAsync(); try { // Insert group into sa_groups table const string insertGroup = "INSERT INTO `sa_groups` (`name`, `immunity`) " + - "VALUES (@groupName, @immunity); SELECT LAST_INSERT_ID();"; + "VALUES (@groupName, @immunity); SELECT LAST_INSERT_ID();"; var groupId = await connection.ExecuteScalarAsync(insertGroup, new { groupName, @@ -482,7 +481,7 @@ public class PermissionManager(Database.Database database) foreach (var flag in flagsList) { const string insertFlagsSql = "INSERT INTO `sa_groups_flags` (`group_id`, `flag`) " + - "VALUES (@groupId, @flag)"; + "VALUES (@groupId, @flag)"; await connection.ExecuteAsync(insertFlagsSql, new { @@ -492,10 +491,10 @@ public class PermissionManager(Database.Database database) } const string insertGroupServer = "INSERT INTO `sa_groups_servers` (`group_id`, `server_id`) " + - "VALUES (@groupId, @server_id)"; - + "VALUES (@groupId, @server_id)"; + await connection.ExecuteAsync(insertGroupServer, new { groupId, server_id = globalGroup ? null : CS2_SimpleAdmin.ServerId }); - + await Server.NextFrameAsync(() => { CS2_SimpleAdmin.Instance.ReloadAdmins(null); @@ -531,7 +530,7 @@ public class PermissionManager(Database.Database database) await using var connection = await database.GetConnectionAsync(); const string sql = "DELETE FROM sa_admins WHERE ends IS NOT NULL AND ends <= @CurrentTime"; - await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.Now.ToLocalTime() }); + await connection.ExecuteAsync(sql, new { CurrentTime = DateTime.UtcNow.ToLocalTime() }); } catch (Exception) { diff --git a/Managers/PlayerPenaltyManager.cs b/Managers/PlayerPenaltyManager.cs index a08c684..0008342 100644 --- a/Managers/PlayerPenaltyManager.cs +++ b/Managers/PlayerPenaltyManager.cs @@ -30,11 +30,11 @@ public class PlayerPenaltyManager { if (!existingDict.TryGetValue(penaltyType, out var value)) { - value = new List<(DateTime, int)>(); - existingDict[penaltyType] = value; + value = new List<(DateTime, int)>(); + existingDict[penaltyType] = value; } - value.Add((endDateTime, durationSeconds)); + value.Add((endDateTime, durationSeconds)); return existingDict; }); } @@ -44,7 +44,7 @@ public class PlayerPenaltyManager //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)) return false; + !penaltyDict.TryGetValue(penaltyType, out var penaltiesList)) return false; //Console.WriteLine($"Found penalties for player with slot {slot} and penalty type {penaltyType}"); var now = DateTime.UtcNow.ToLocalTime(); @@ -83,7 +83,7 @@ public class PlayerPenaltyManager public static List<(DateTime EndDateTime, int Duration)> GetPlayerPenalties(int slot, PenaltyType penaltyType) { if (Penalties.TryGetValue(slot, out var penaltyDict) && - penaltyDict.TryGetValue(penaltyType, out var penaltiesList)) + penaltyDict.TryGetValue(penaltyType, out var penaltiesList)) { return penaltiesList; } diff --git a/VERSION b/VERSION index c373fb6..6686f25 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4.3b \ No newline at end of file +1.4.3c \ No newline at end of file