From e1650df72e2ad93d990f83dd05165c66cf3730b4 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sat, 27 Apr 2024 01:44:12 +0200 Subject: [PATCH] 1.4.1a - Full AdminManager integration --- CS2-SimpleAdmin.cs | 7 +- Commands/basecommands.cs | 15 +++- Events.cs | 10 ++- Managers/AdminSQLManager.cs | 132 +++++++++++++++++++++++++++++++++--- 4 files changed, 151 insertions(+), 13 deletions(-) diff --git a/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin.cs index c345cc0..cce991f 100644 --- a/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin.cs @@ -37,7 +37,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig "CS2-SimpleAdmin"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleAuthor => "daffyy & Dliix66"; - public override string ModuleVersion => "1.4.0b"; + public override string ModuleVersion => "1.4.1a"; public CS2_SimpleAdminConfig Config { get; set; } = new(); @@ -124,6 +124,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig + { + await _adminManager.CrateGroupsJsonFile(); + await _adminManager.CreateAdminsJsonFile(); + + AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"); + AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json"); + }); + + + //_ = _adminManager.GiveAllGroupsFlags(); + //_ = _adminManager.GiveAllFlags(); } [ConsoleCommand("css_stealth")] diff --git a/Events.cs b/Events.cs index d55efd9..23574cd 100644 --- a/Events.cs +++ b/Events.cs @@ -422,8 +422,14 @@ public partial class CS2_SimpleAdmin } } - await _adminManager.GiveAllGroupsFlags(); - await _adminManager.GiveAllFlags(); + //await _adminManager.GiveAllGroupsFlags(); + //await _adminManager.GiveAllFlags(); + + await _adminManager.CrateGroupsJsonFile(); + await _adminManager.CreateAdminsJsonFile(); + + AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"); + AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json"); }); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } diff --git a/Managers/AdminSQLManager.cs b/Managers/AdminSQLManager.cs index 6400b05..912c403 100644 --- a/Managers/AdminSQLManager.cs +++ b/Managers/AdminSQLManager.cs @@ -2,7 +2,9 @@ using Dapper; using Microsoft.Extensions.Logging; using MySqlConnector; +using Newtonsoft.Json; using System.Collections.Concurrent; +using static Dapper.SqlMapper; namespace CS2_SimpleAdmin; @@ -57,7 +59,7 @@ public class AdminSQLManager(Database database) } */ - public async Task, int, DateTime?)>> GetAllPlayersFlags() + public async Task, int, DateTime?)>> GetAllPlayersFlags() { DateTime now = DateTime.UtcNow.ToLocalTime(); @@ -66,7 +68,7 @@ public class AdminSQLManager(Database database) await using MySqlConnection connection = await _database.GetConnectionAsync(); string sql = @" - SELECT sa_admins.player_steamid, sa_admins_flags.flag, sa_admins.immunity, sa_admins.ends + SELECT sa_admins.player_steamid, sa_admins.player_name, sa_admins_flags.flag, sa_admins.immunity, sa_admins.ends FROM sa_admins_flags JOIN sa_admins ON sa_admins_flags.admin_id = sa_admins.id WHERE (sa_admins.ends IS NULL OR sa_admins.ends > @CurrentTime) @@ -80,8 +82,9 @@ public class AdminSQLManager(Database database) return []; } - List<(string, List, int, DateTime?)> filteredFlagsWithImmunity = []; + List<(string, string, List, int, DateTime?)> filteredFlagsWithImmunity = []; string currentSteamId = string.Empty; + string currentPlayerName = string.Empty; List currentFlags = []; int immunityValue = 0; DateTime? ends = null; @@ -94,6 +97,7 @@ public class AdminSQLManager(Database database) } if (!flagInfoDict.TryGetValue("player_steamid", out var steamIdObj) || + !flagInfoDict.TryGetValue("player_name", out var playerNameObj) || !flagInfoDict.TryGetValue("flag", out var flagObj) || !flagInfoDict.TryGetValue("immunity", out var immunityValueObj) || !flagInfoDict.TryGetValue("ends", out var endsObj)) @@ -102,6 +106,7 @@ public class AdminSQLManager(Database database) } if (steamIdObj is not string steamId || + playerNameObj is not string playerName || flagObj is not string flag || !int.TryParse(immunityValueObj.ToString(), out immunityValue)) { @@ -115,17 +120,18 @@ public class AdminSQLManager(Database database) if (currentSteamId != steamId && !string.IsNullOrEmpty(currentSteamId)) { - filteredFlagsWithImmunity.Add((currentSteamId, currentFlags, immunityValue, ends)); + filteredFlagsWithImmunity.Add((currentSteamId, currentPlayerName, currentFlags, immunityValue, ends)); currentFlags = []; } currentSteamId = steamId; + currentPlayerName = playerName; currentFlags.Add(flag); } if (!string.IsNullOrEmpty(currentSteamId)) { - filteredFlagsWithImmunity.Add((currentSteamId, currentFlags, immunityValue, ends)); + filteredFlagsWithImmunity.Add((currentSteamId, currentPlayerName, currentFlags, immunityValue, ends)); } return filteredFlagsWithImmunity; @@ -136,6 +142,7 @@ public class AdminSQLManager(Database database) } } + /* public async Task, List>, int>>> GetAllGroupsFlags() { try @@ -174,7 +181,7 @@ public class AdminSQLManager(Database database) } sql = @" - SELECT a.group_id, a.player_steamid, a.ends, g.immunity + SELECT a.group_id, a.player_steamid, a.ends, g.immunity, g.name FROM sa_admins a JOIN sa_groups g ON a.group_id = g.id WHERE a.group_id IN @groupIds"; @@ -198,9 +205,79 @@ public class AdminSQLManager(Database database) return []; } + */ + public async Task, int)>> GetAllGroupsData() + { + try + { + await using MySqlConnection connection = await _database.GetConnectionAsync(); + string sql = "SELECT group_id FROM sa_groups_servers WHERE server_id = @serverid"; + var groupDataSql = connection.Query(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList(); + sql = @" + SELECT g.group_id, sg.name AS group_name, sg.immunity, f.flag + FROM sa_groups_flags f + JOIN sa_groups_servers g ON f.group_id = g.group_id + JOIN sa_groups sg ON sg.id = g.group_id + WHERE g.server_id = @serverid"; + + var groupData = connection.Query(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList(); + + if (groupDataSql.Count == 0 || groupData.Count == 0) + { + return []; + } + + var groupInfoDictionary = new Dictionary, int)>(); + + foreach (var row in groupData) + { + var groupName = (string)row.group_name; + var flag = (string)row.flag; + var immunity = (int)row.immunity; + + // Check if the group name already exists in the dictionary + if (!groupInfoDictionary.TryGetValue(groupName, out (List, int) value)) + { + value = (new List(), immunity); + // If it doesn't exist, add a new entry with an empty list of flags and immunity + groupInfoDictionary[groupName] = value; + } + + value.Item1.Add(flag); + } + + return groupInfoDictionary; + } + catch { } + + return []; + } + + public async Task CrateGroupsJsonFile() + { + Dictionary, int)> groupsData = await GetAllGroupsData(); + + var jsonStructure = new Dictionary(); + + foreach (var kvp in groupsData) + { + var groupData = new Dictionary + { + ["flags"] = kvp.Value.Item1, + ["immunity"] = kvp.Value.Item2 + }; + + jsonStructure[kvp.Key] = groupData; + } + + string json = JsonConvert.SerializeObject(jsonStructure, Formatting.Indented); + File.WriteAllText(CS2_SimpleAdmin.Instance.ModuleDirectory + "/data/groups.json", json); + } + + /* public async Task GiveAllGroupsFlags() { Dictionary, List>, int>> groupFlags = await GetAllGroupsFlags(); @@ -230,10 +307,11 @@ public class AdminSQLManager(Database database) } } } - + */ + /* public async Task GiveAllFlags() { - List<(string, List, int, DateTime?)> allPlayers = await GetAllPlayersFlags(); + List<(string, string, List, int, DateTime?)> allPlayers = await GetAllPlayersFlags(); foreach (var record in allPlayers) { @@ -257,6 +335,44 @@ public class AdminSQLManager(Database database) } } } + */ + + public async Task CreateAdminsJsonFile() + { + List<(string identity, string name, List flags, int immunity, DateTime? ends)> allPlayers = await GetAllPlayersFlags(); + + var jsonData = allPlayers + .Select(player => + { + SteamID? steamId = null; + + if (!string.IsNullOrEmpty(player.identity) && SteamID.TryParse(player.identity, out var id) && id != null) + { + steamId = id; + } + + if (steamId != null && !_adminCache.ContainsKey(steamId)) + { + _adminCache.TryAdd(steamId, player.ends); + } + + return new + { + playerName = player.name, + playerData = new + { + player.identity, + player.immunity, + flags = player.flags.Where(flag => flag.StartsWith("@")).ToList(), + groups = player.flags.Where(flag => flag.StartsWith("#")).ToList() + } + }; + }) + .ToDictionary(item => item.playerName, item => item.playerData); + + string json = JsonConvert.SerializeObject(jsonData, Formatting.Indented); + File.WriteAllText(CS2_SimpleAdmin.Instance.ModuleDirectory + "/data/admins.json", json); + } public async Task DeleteAdminBySteamId(string playerSteamId, bool globalDelete = false) {