diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4cd8128..5da1972 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,7 +35,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.x + dotnet-version: 10.0.x - name: Get Version id: get_version @@ -67,19 +67,19 @@ jobs: - name: Zip Main Build Output run: zip -r CS2-SimpleAdmin-${{ steps.get_version.outputs.VERSION }}.zip ${{ env.OUTPUT_PATH }} - - name: Extract & Zip StatusBlocker Linux - run: | - mkdir -p statusblocker-linux && - tar -xzf Modules/CS2-SimpleAdmin_StealthModule/METAMOD\ PLUGIN/StatusBlocker*linux.tar.gz -C statusblocker-linux && - cd statusblocker-linux && - zip -r ../StatusBlocker-linux-${{ steps.get_version.outputs.VERSION }}.zip ./* + # - name: Extract & Zip StatusBlocker Linux + # run: | + # mkdir -p statusblocker-linux && + # tar -xzf Modules/CS2-SimpleAdmin_StealthModule/METAMOD\ PLUGIN/StatusBlocker*linux.tar.gz -C statusblocker-linux && + # cd statusblocker-linux && + # zip -r ../StatusBlocker-linux-${{ steps.get_version.outputs.VERSION }}.zip ./* - - name: Extract & Zip StatusBlocker Windows - run: | - mkdir -p statusblocker-windows && - tar -xzf Modules/CS2-SimpleAdmin_StealthModule/METAMOD\ PLUGIN/StatusBlocker*windows.tar.gz -C statusblocker-windows && - cd statusblocker-windows && - zip -r ../StatusBlocker-windows-${{ steps.get_version.outputs.VERSION }}.zip ./* + # - name: Extract & Zip StatusBlocker Windows + # run: | + # mkdir -p statusblocker-windows && + # tar -xzf Modules/CS2-SimpleAdmin_StealthModule/METAMOD\ PLUGIN/StatusBlocker*windows.tar.gz -C statusblocker-windows && + # cd statusblocker-windows && + # zip -r ../StatusBlocker-windows-${{ steps.get_version.outputs.VERSION }}.zip ./* - name: Upload all artifacts uses: actions/upload-artifact@v4 @@ -87,8 +87,8 @@ jobs: name: CS2-SimpleAdmin-Build-Artifacts path: | CS2-SimpleAdmin-${{ steps.get_version.outputs.VERSION }}.zip - StatusBlocker-linux-${{ steps.get_version.outputs.VERSION }}.zip - StatusBlocker-windows-${{ steps.get_version.outputs.VERSION }}.zip +# StatusBlocker-linux-${{ steps.get_version.outputs.VERSION }}.zip +# StatusBlocker-windows-${{ steps.get_version.outputs.VERSION }}.zip publish: needs: build @@ -109,8 +109,8 @@ jobs: with: artifacts: | CS2-SimpleAdmin-${{ needs.build.outputs.build_version }}.zip - StatusBlocker-linux-${{ needs.build.outputs.build_version }}.zip - StatusBlocker-windows-${{ needs.build.outputs.build_version }}.zip +# StatusBlocker-linux-${{ needs.build.outputs.build_version }}.zip +# StatusBlocker-windows-${{ needs.build.outputs.build_version }}.zip name: "CS2-SimpleAdmin-${{ needs.build.outputs.build_version }}" tag: "build-${{ needs.build.outputs.build_version }}" body: | @@ -121,9 +121,9 @@ jobs: After the first launch, configure the plugin using the JSON config file at: addons/counterstrikesharp/configs/plugins/CS2-SimpleAdmin/CS2-SimpleAdmin.json - - StatusBlocker: - Extract the ZIP to your server root directory. - The archive already contains the correct addons/ folder structure (addons/metamod/ and addons/status_blocker/). - This plugin is a Metamod module required by the StealthModule. +# - StatusBlocker: +# Extract the ZIP to your server root directory. +# The archive already contains the correct addons/ folder structure (addons/metamod/ and addons/status_blocker/). +# This plugin is a Metamod module required by the StealthModule. Remember to restart or reload your game server after installing and configuring the plugins. diff --git a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs index de3dffc..83d5856 100644 --- a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs @@ -14,7 +14,7 @@ using MySqlConnector; namespace CS2_SimpleAdmin; -[MinimumApiVersion(300)] +[MinimumApiVersion(369)] public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { internal static CS2_SimpleAdmin Instance { get; private set; } = new(); @@ -22,7 +22,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"; - public override string ModuleVersion => "1.8.0a"; + public override string ModuleVersion => "1.8.1a"; public override void Load(bool hotReload) { @@ -55,14 +55,12 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig(GameData.GetSignature("CBasePlayerController_SetPawn")); SimpleAdminApi = new Api.CS2_SimpleAdminApi(); Capabilities.RegisterPluginCapability(ICS2_SimpleAdminApi.PluginCapability, () => SimpleAdminApi); - + PlayersTimer?.Kill(); PlayersTimer = null; PlayerManager.CheckPlayersTimer(); @@ -95,20 +93,11 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig { - await PermissionManager.CrateGroupsJsonFile(); + await PermissionManager.CreateGroupsJsonFile(); await PermissionManager.CreateAdminsJsonFile(); var adminsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/admins.json"); diff --git a/CS2-SimpleAdmin/Helper.cs b/CS2-SimpleAdmin/Helper.cs index 75f1fd4..aff807d 100644 --- a/CS2-SimpleAdmin/Helper.cs +++ b/CS2-SimpleAdmin/Helper.cs @@ -1011,6 +1011,10 @@ public static class PluginInfo Console.WriteLine("|_______||___| |_| |_||___| |_______||_______||__| |__||______| |_| |_||___| |_| |__|"); Console.WriteLine(" >> Version: " + moduleVersion); Console.WriteLine(" >> GitHub: https://github.com/daffyyyy/CS2-SimpleAdmin"); + var _m1 = new List { 70,117,99,107,32,121,111,117,32,114,97,118,105,100,44,32,119,104,121,32,121,111,117,32,108,121,105,110,103,32,97,98,111,117,116,32,110,111,32,99,111,110,116,97,99,116,32,119,105,116,104,32,109,101,63,32,74,117,115,116,32,116,101,108,108,32,116,114,117,116,104,44,32,110,105,99,101,32,116,114,121,32,116,111,32,112,114,111,106,101,99,116,32,116,97,107,101,111,118,101,114 }; + var _m2 = new List { 32,32,58,68,32,40,97,108,108,32,119,104,111,32,116,114,105,101,100,32,116,111,32,99,111,110,116,97,99,116,32,119,105,116,104,32,109,101,44,32,106,117,115,116,32,119,114,105,116,101,32,109,101,115,115,97,103,101,32,116,111,32,109,101,32,120,68,41 }; + Console.WriteLine(" >> " + new string(_m1.Select(c => (char)c).ToArray())); + Console.WriteLine(" >> " + new string(_m2.Select(c => (char)c).ToArray())); Console.WriteLine(" "); } } diff --git a/CS2-SimpleAdmin/Managers/CacheManager.cs b/CS2-SimpleAdmin/Managers/CacheManager.cs index fd0bd04..27bc518 100644 --- a/CS2-SimpleAdmin/Managers/CacheManager.cs +++ b/CS2-SimpleAdmin/Managers/CacheManager.cs @@ -272,12 +272,12 @@ internal class CacheManager: IDisposable if (string.IsNullOrWhiteSpace(ban.PlayerIp) || !IpHelper.TryConvertIpToUint(ban.PlayerIp, out var ipUInt) || - !_ipIndex.TryGetValue(ipUInt, out var ipBans)) continue; - { - ipBans.RemoveAll(b => b.Id == id); - if (ipBans.Count == 0) - _ipIndex.TryRemove(ipUInt, out _); - } + !_ipIndex.TryGetValue(ipUInt, out var ipBans)) + continue; + + ipBans.RemoveAll(b => b.Id == id); + if (ipBans.Count == 0) + _ipIndex.TryRemove(ipUInt, out _); } } diff --git a/CS2-SimpleAdmin/Managers/PermissionManager.cs b/CS2-SimpleAdmin/Managers/PermissionManager.cs index c9f2b41..5826e74 100644 --- a/CS2-SimpleAdmin/Managers/PermissionManager.cs +++ b/CS2-SimpleAdmin/Managers/PermissionManager.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Modules.Entities; using Dapper; using Microsoft.Extensions.Logging; @@ -12,54 +12,8 @@ namespace CS2_SimpleAdmin.Managers; public class PermissionManager(IDatabaseProvider? databaseProvider) { - // Unused for now - //public static readonly ConcurrentDictionary> _adminCache = new ConcurrentDictionary>(); - // public static readonly ConcurrentDictionary AdminCache = new(); public static readonly ConcurrentDictionary Flags)> AdminCache = new(); - /* - public async Task, int)>> GetAdminFlags(string steamId) - { - DateTime now = Time.ActualDateTime(); - - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - string sql = "SELECT flags, immunity, ends FROM sa_admins WHERE player_steamid = @PlayerSteamID AND (ends IS NULL OR ends > @CurrentTime) AND (server_id IS NULL OR server_id = @serverid)"; - List? activeFlags = (await connection.QueryAsync(sql, new { PlayerSteamID = steamId, CurrentTime = now, serverid = CS2_SimpleAdmin.ServerId }))?.ToList(); - - if (activeFlags == null) - { - return new List<(List, int)>(); - } - - List<(List, int)> filteredFlagsWithImmunity = []; - - foreach (dynamic flags in activeFlags) - { - if (flags is not IDictionary flagsDict) - { - continue; - } - - if (!flagsDict.TryGetValue("flags", out var flagsValueObj) || !flagsDict.TryGetValue("immunity", out var immunityValueObj)) - { - continue; - } - - if (!(flagsValueObj is string flagsValue) || !int.TryParse(immunityValueObj.ToString(), out var immunityValue)) - { - continue; - } - - //Console.WriteLine($"Flags: {flagsValue}, Immunity: {immunityValue}"); - - filteredFlagsWithImmunity.Add((flagsValue.Split(',').ToList(), immunityValue)); - } - - return filteredFlagsWithImmunity; - } - */ - /// /// Retrieves all players' flags and associated data asynchronously. /// @@ -100,7 +54,7 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) string playerName = g.Key.playerName as string ?? string.Empty; - // tutaj zakładamy, że Dapper zwraca już string (nie dynamic) + // Dapper returns string here, not dynamic var flags = g.Select(r => r.flag as string ?? string.Empty) .Distinct() .ToList(); @@ -118,72 +72,6 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) } } - - /* - public async Task, List>, int>>> GetAllGroupsFlags() - { - try - { - await using MySqlConnection connection = await _database.GetConnectionAsync(); - - string sql = "SELECT group_id FROM sa_groups_servers WHERE server_id = @serverid"; - var groupIds = connection.Query(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList(); - - sql = @" - SELECT g.group_id, f.flag - FROM sa_groups_flags f - JOIN sa_groups_servers g ON f.group_id = g.group_id - WHERE g.server_id = @serverid"; - - var groupFlagData = connection.Query(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList(); - - if (groupIds.Count == 0 || groupFlagData.Count == 0) - { - return []; - } - - var groupInfoDictionary = new Dictionary, List>, int>>(); - - foreach (var groupId in groupIds) - { - groupInfoDictionary[groupId] = new Tuple, List>, int>([], [], 0); - } - - foreach (var row in groupFlagData) - { - var groupId = (int)row.group_id; - var flag = (string)row.flag; - - groupInfoDictionary[groupId].Item1.Add(flag); - } - - sql = @" - 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"; - - var playerData = (await connection.QueryAsync(sql, new { groupIds })).ToList(); - - foreach (var row in playerData) - { - var groupId = (int)row.group_id; - var playerSteamid = (string)row.player_steamid; - var ends = row.ends as DateTime?; - var immunity = (int)row.immunity; - - groupInfoDictionary[groupId].Item2.Add(new Tuple(playerSteamid, ends)); - groupInfoDictionary[groupId] = new Tuple, List>, int>(groupInfoDictionary[groupId].Item1, groupInfoDictionary[groupId].Item2, immunity); - } - - return groupInfoDictionary; - } - catch { } - - return []; - } - */ - /// /// Retrieves all groups' data including flags and immunity asynchronously. /// @@ -192,13 +80,9 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) { if (databaseProvider == null) return []; - await using var connection = await databaseProvider.CreateConnectionAsync(); - ; try { - // var sql = "SELECT group_id FROM sa_groups_servers WHERE (server_id = @serverid OR server_id IS NULL)"; - // var groupDataSql = connection.Query(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList(); - + await using var connection = await databaseProvider.CreateConnectionAsync(); var sql = databaseProvider.GetGroupsQuery(); var groupData = connection.Query(sql, new { serverid = CS2_SimpleAdmin.ServerId }).ToList(); if (groupData.Count == 0) @@ -213,11 +97,9 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) 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 = ([], immunity); - // If it doesn't exist, add a new entry with an empty list of flags and immunity groupInfoDictionary[groupName] = value; } @@ -238,7 +120,7 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) /// Creates a JSON file containing groups data asynchronously. /// [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "")] - public async Task CrateGroupsJsonFile() + public async Task CreateGroupsJsonFile() { var groupsData = await GetAllGroupsData(); var jsonData = new Dictionary(); @@ -257,7 +139,7 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) var options = new JsonSerializerOptions { WriteIndented = true, - PropertyNamingPolicy = JsonNamingPolicy.CamelCase + PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; var json = JsonSerializer.Serialize(jsonData, options); @@ -265,66 +147,6 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) await File.WriteAllTextAsync(filePath, json); } - /* - public async Task GiveAllGroupsFlags() - { - Dictionary, List>, int>> groupFlags = await GetAllGroupsFlags(); - - foreach (var kvp in groupFlags) - { - var flags = kvp.Value.Item1; - var players = kvp.Value.Item2; - int immunity = kvp.Value.Item3; - - foreach (var playerTuple in players) - { - var steamIdStr = playerTuple.Item1; - var ends = playerTuple.Item2; - - if (!string.IsNullOrEmpty(steamIdStr) && SteamID.TryParse(steamIdStr, out var steamId) && steamId != null) - { - if (!_adminCache.ContainsKey(steamId)) - { - _adminCache.TryAdd(steamId, ends); - } - - Helper.GivePlayerFlags(steamId, flags, (uint)immunity); - // Often need to call 2 times - Helper.GivePlayerFlags(steamId, flags, (uint)immunity); - } - } - } - } - */ - /* - public async Task GiveAllFlags() - { - List<(string, 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 (!_adminCache.ContainsKey(steamId)) - { - _adminCache.TryAdd(steamId, ends); - //_adminCacheTimestamps.Add(steamId, ends); - } - - Helper.GivePlayerFlags(steamId, flags, (uint)immunity); - // Often need to call 2 times - Helper.GivePlayerFlags(steamId, flags, (uint)immunity); - } - } - } - */ - /// /// Creates a JSON file containing admins data asynchronously. /// @@ -336,25 +158,12 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) .Where(player => SteamID.TryParse(player.identity.ToString(), out _)) .ToList(); - // foreach (var player in allPlayers) - // { - // var (steamId, name, flags, immunity, ends) = player; - // - // Console.WriteLine($"Player SteamID: {steamId}"); - // Console.WriteLine($"Player Name: {name}"); - // Console.WriteLine($"Flags: {string.Join(", ", flags)}"); - // Console.WriteLine($"Immunity: {immunity}"); - // Console.WriteLine($"Ends: {(ends.HasValue ? ends.Value.ToString("yyyy-MM-dd HH:mm:ss") : "Never")}"); - // Console.WriteLine(); - // } - var jsonData = validPlayers - .GroupBy(player => player.name) // Group by player name + .GroupBy(player => player.name) .ToDictionary( - group => group.Key, // Use the player name as key + group => group.Key, object (group) => { - // Consolidate data for players with same name var consolidatedData = group.Aggregate( new { @@ -365,16 +174,13 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) }, (acc, player) => { - // Merge identities if (string.IsNullOrEmpty(acc.identity) && !string.IsNullOrEmpty(player.identity.ToString())) { acc = acc with { identity = player.identity.ToString() }; } - // Combine immunities by maximum value acc = acc with { immunity = Math.Max(acc.immunity, player.immunity) }; - // Combine flags and groups acc = acc with { flags = acc.flags.Concat(player.flags.Where(flag => flag.StartsWith($"@"))).Distinct().ToList(), @@ -383,12 +189,12 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) return acc; }); - + Server.NextWorldUpdate(() => { var keysToRemove = new List(); - foreach (var steamId in AdminCache.Keys.ToList()) + foreach (var steamId in AdminCache.Keys.ToList()) { var data = AdminManager.GetPlayerAdminData(steamId); if (data != null) @@ -422,40 +228,9 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) } }); - // Server.NextFrameAsync(() => - // { - // for (var index = 0; index < AdminCache.Keys.ToList().Count; index++) - // { - // var steamId = AdminCache.Keys.ToList()[index]; - // - // var data = AdminManager.GetPlayerAdminData(steamId); - // if (data != null) - // { - // AdminManager.RemovePlayerPermissions(steamId, AdminCache[steamId].Flags.ToArray()); - // AdminManager.RemovePlayerFromGroup(steamId, true, AdminCache[steamId].Flags.ToArray()); - // } - // - // if (!AdminCache.TryRemove(steamId, out _)) continue; - // - // if (data == null) continue; - // if (data.Flags.ToList().Count != 0 && data.Groups.ToList().Count != 0) - // continue; - // - // AdminManager.ClearPlayerPermissions(steamId); - // AdminManager.RemovePlayerAdminData(steamId); - // } - // - // foreach (var player in group) - // { - // SteamID.TryParse(player.identity, out var steamId); - // if (steamId == null) continue; - // AdminCache.TryAdd(steamId, (player.ends, player.flags)); - // } - // }); - return consolidatedData; }); - + var options = new JsonSerializerOptions { WriteIndented = true, @@ -464,10 +239,7 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) var json = JsonSerializer.Serialize(jsonData, options); var filePath = Path.Combine(CS2_SimpleAdmin.Instance.ModuleDirectory, "data", "admins.json"); - await File.WriteAllTextAsync(filePath, json); - - //await File.WriteAllTextAsync(CS2_SimpleAdmin.Instance.ModuleDirectory + "/data/admins.json", json); } /// @@ -480,8 +252,6 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) if (databaseProvider == null) return; if (string.IsNullOrEmpty(playerSteamId)) return; - //_adminCache.TryRemove(playerSteamId, out _); - try { await using var connection = await databaseProvider.CreateConnectionAsync(); @@ -510,18 +280,12 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) if (string.IsNullOrEmpty(playerSteamId) || flagsList.Count == 0) return; var now = Time.ActualDateTime(); - DateTime? futureTime; - - if (time != 0) - futureTime = now.AddMinutes(time); - else - futureTime = null; + DateTime? futureTime = time != 0 ? now.AddMinutes(time) : null; try { await using var connection = await databaseProvider.CreateConnectionAsync(); - // Insert admin into sa_admins table var insertAdminSql = databaseProvider.GetAddAdminQuery(); var adminId = await connection.ExecuteScalarAsync(insertAdminSql, new { @@ -533,28 +297,8 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) serverid = globalAdmin ? null : CS2_SimpleAdmin.ServerId }); - // Insert flags into sa_admins_flags table foreach (var flag in flagsList) { - // if (flag.StartsWith($"#")) - // { - // // const string sql = "SELECT id FROM `sa_groups` WHERE name = @groupName"; - // // var groupId = await connection.QuerySingleOrDefaultAsync(sql, new { groupName = flag }); - // - // var sql = databaseProvider.GetGroupIdByNameQuery(); - // var groupId = await connection.QuerySingleOrDefaultAsync(sql, new { groupName = flag, CS2_SimpleAdmin.ServerId }); - // - // if (groupId != null) - // { - // var updateAdminGroup = "UPDATE `sa_admins` SET group_id = @groupId WHERE id = @adminId"; - // await connection.ExecuteAsync(updateAdminGroup, new - // { - // groupId, - // adminId - // }); - // } - // } - var insertFlagsSql = databaseProvider.GetAddAdminFlagsQuery(); await connection.ExecuteAsync(insertFlagsSql, new { @@ -587,10 +331,10 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) if (string.IsNullOrEmpty(groupName) || flagsList.Count == 0) return; - await using var connection = await databaseProvider.CreateConnectionAsync(); try { - // Insert group into sa_groups table + await using var connection = await databaseProvider.CreateConnectionAsync(); + var insertGroup = databaseProvider.GetAddGroupQuery(); var groupId = await connection.ExecuteScalarAsync(insertGroup, new { @@ -598,11 +342,9 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) immunity }); - // Insert flags into sa_groups_flags table foreach (var flag in flagsList) { var insertFlagsSql = databaseProvider.GetAddGroupFlagsQuery(); - await connection.ExecuteAsync(insertFlagsSql, new { groupId, @@ -616,7 +358,6 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) { CS2_SimpleAdmin.Instance.ReloadAdmins(null); }); - } catch (Exception ex) { @@ -634,9 +375,9 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) if (string.IsNullOrEmpty(groupName)) return; - await using var connection = await databaseProvider.CreateConnectionAsync(); try { + await using var connection = await databaseProvider.CreateConnectionAsync(); var sql = databaseProvider.GetDeleteGroupQuery(); await connection.ExecuteAsync(sql, new { groupName }); } @@ -665,4 +406,4 @@ public class PermissionManager(IDatabaseProvider? databaseProvider) CS2_SimpleAdmin._logger?.LogCritical("Unable to remove expired admins"); } } -} \ No newline at end of file +} diff --git a/CS2-SimpleAdmin/VERSION b/CS2-SimpleAdmin/VERSION index e60c9ec..e86c1d6 100644 --- a/CS2-SimpleAdmin/VERSION +++ b/CS2-SimpleAdmin/VERSION @@ -1 +1 @@ -1.8.0a \ No newline at end of file +1.8.1a \ No newline at end of file