diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39f323b..220bc48 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,6 +16,8 @@ env: PROJECT_NAME_CS2_SIMPLEADMIN: "CS2-SimpleAdmin" PROJECT_PATH_CS2_SIMPLEADMINAPI: "CS2-SimpleAdminApi/CS2-SimpleAdminApi.csproj" PROJECT_NAME_CS2_SIMPLEADMINAPI: "CS2-SimpleAdminApi" + PROJECT_PATH_FUNCOMMANDSMODULE: "Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.csproj" + PROJECT_NAME_FUNCOMMANDSMODULE: "CS2-SimpleAdmin_FunCommands" PROJECT_PATH_STEALTHMODULE: "Modules/CS2-SimpleAdmin_StealthModule/CS2-SimpleAdmin_StealthModule.csproj" PROJECT_NAME_STEALTHMODULE: "CS2-SimpleAdmin_StealthModule" OUTPUT_PATH: "./counterstrikesharp" @@ -45,16 +47,20 @@ jobs: dotnet build ${{ env.PROJECT_PATH_CS2_SIMPLEADMIN }} -c Release -o ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_CS2_SIMPLEADMIN }} dotnet restore ${{ env.PROJECT_PATH_CS2_SIMPLEADMINAPI }} dotnet build ${{ env.PROJECT_PATH_CS2_SIMPLEADMINAPI }} -c Release -o ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_CS2_SIMPLEADMINAPI }} + dotnet restore ${{ env.PROJECT_PATH_FUNCOMMANDSMODULE }} + dotnet build ${{ env.PROJECT_PATH_FUNCOMMANDSMODULE }} -c Release -o ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_FUNCOMMANDSMODULE }} dotnet restore ${{ env.PROJECT_PATH_STEALTHMODULE }} dotnet build ${{ env.PROJECT_PATH_STEALTHMODULE }} -c Release -o ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_STEALTHMODULE }} - name: Combine projects run: | mkdir -p ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin + mkdir -p ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin_FunCommands mkdir -p ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin_StealthModule mkdir -p ${{ env.OUTPUT_PATH }}/shared/CS2-SimpleAdminApi cp -r ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_CS2_SIMPLEADMIN }}/* ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin/ + cp -r ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_FUNCOMMANDSMODULE }}/* ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin_FunCommands cp -r ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_STEALTHMODULE }}/* ${{ env.OUTPUT_PATH }}/plugins/CS2-SimpleAdmin_StealthModule cp -r ${{ env.TMP_PATH }}/${{ env.PROJECT_NAME_CS2_SIMPLEADMINAPI }}/* ${{ env.OUTPUT_PATH }}/shared/CS2-SimpleAdminApi/ diff --git a/CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs b/CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs index 95c27db..5c6edef 100644 --- a/CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs +++ b/CS2-SimpleAdmin/Api/CS2_SimpleAdminApi.cs @@ -206,9 +206,9 @@ public class CS2_SimpleAdminApi : ICS2_SimpleAdminApi } public void RegisterMenu(string categoryId, string menuId, string menuName, - Func menuFactory, string? permission = null) + Func menuFactory, string? permission = null, string? commandName = null) { - Menus.MenuManager.Instance.RegisterMenu(categoryId, menuId, menuName, BuilderFactory, permission); + Menus.MenuManager.Instance.RegisterMenu(categoryId, menuId, menuName, BuilderFactory, permission, commandName); return; MenuBuilder BuilderFactory(CCSPlayerController player) diff --git a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs index 825eb09..b70953c 100644 --- a/CS2-SimpleAdmin/CS2-SimpleAdmin.cs +++ b/CS2-SimpleAdmin/CS2-SimpleAdmin.cs @@ -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 & Dliix66"; - public override string ModuleVersion => "1.7.8-beta-1"; + public override string ModuleVersion => "1.7.8-beta-2"; public override void Load(bool hotReload) { diff --git a/CS2-SimpleAdmin/Commands/playercommands.cs b/CS2-SimpleAdmin/Commands/playercommands.cs index 25385b5..62270b7 100644 --- a/CS2-SimpleAdmin/Commands/playercommands.cs +++ b/CS2-SimpleAdmin/Commands/playercommands.cs @@ -120,6 +120,7 @@ public partial class CS2_SimpleAdmin // Apply slap damage to the player player.Pawn.Value?.Slap(damage); + player.EmitSound("BaseGrenade.JumpThrowM"); // Log the command if (command == null) diff --git a/CS2-SimpleAdmin/Database/Migrations/Sqlite/009_BanAllUsedIpAddress.sql b/CS2-SimpleAdmin/Database/Migrations/Sqlite/009_BanAllUsedIpAddress.sql index 7a141c5..33e57f2 100644 --- a/CS2-SimpleAdmin/Database/Migrations/Sqlite/009_BanAllUsedIpAddress.sql +++ b/CS2-SimpleAdmin/Database/Migrations/Sqlite/009_BanAllUsedIpAddress.sql @@ -1,6 +1,6 @@ CREATE TABLE IF NOT EXISTS `sa_players_ips` ( `steamid` INTEGER NOT NULL, - `address` VARCHAR(64) NOT NULL, + `address` INTEGER NOT NULL `used_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`steamid`, `address`) ); \ No newline at end of file diff --git a/CS2-SimpleAdmin/Database/Migrations/Sqlite/013_AddNameColumnToSaPlayerIpsTable.sql b/CS2-SimpleAdmin/Database/Migrations/Sqlite/013_AddNameColumnToSaPlayerIpsTable.sql index 0c70054..87a80aa 100644 --- a/CS2-SimpleAdmin/Database/Migrations/Sqlite/013_AddNameColumnToSaPlayerIpsTable.sql +++ b/CS2-SimpleAdmin/Database/Migrations/Sqlite/013_AddNameColumnToSaPlayerIpsTable.sql @@ -1,9 +1,4 @@ -DELETE FROM `sa_players_ips` -WHERE `id` NOT IN ( - SELECT MIN(`id`) - FROM `sa_players_ips` - GROUP BY `steamid` -); +TRUNCATE TABLE `sa_players_ips`; ALTER TABLE `sa_players_ips` ADD `name` VARCHAR(64) NULL DEFAULT NULL; CREATE INDEX IF NOT EXISTS `idx_sa_players_ips_used_at` ON `sa_players_ips` (`used_at` DESC); \ No newline at end of file diff --git a/CS2-SimpleAdmin/Menus/MenuManager.cs b/CS2-SimpleAdmin/Menus/MenuManager.cs index a9c8a36..f1aa450 100644 --- a/CS2-SimpleAdmin/Menus/MenuManager.cs +++ b/CS2-SimpleAdmin/Menus/MenuManager.cs @@ -46,7 +46,8 @@ public class MenuManager /// Display name of the menu. /// Factory function that creates the menu for a player. /// Required permission to access this menu (optional). - public void RegisterMenu(string categoryId, string menuId, string menuName, Func menuFactory, string? permission = null) + /// Command name for permission override checking (optional, e.g., "css_god"). + public void RegisterMenu(string categoryId, string menuId, string menuName, Func menuFactory, string? permission = null, string? commandName = null) { if (!_menuCategories.ContainsKey(categoryId)) { @@ -59,6 +60,10 @@ public class MenuManager { _menuCategories[categoryId].MenuPermissions[menuId] = permission; } + if (commandName != null) + { + _menuCategories[categoryId].MenuCommandNames[menuId] = commandName; + } } /// @@ -72,6 +77,7 @@ public class MenuManager category.MenuFactories.Remove(menuId); _menuCategories[categoryId].MenuNames.Remove(menuId); _menuCategories[categoryId].MenuPermissions.Remove(menuId); + _menuCategories[categoryId].MenuCommandNames.Remove(menuId); } /// @@ -116,11 +122,39 @@ public class MenuManager var menuFactory = kvp.Value; var menuName = category.MenuNames.TryGetValue(menuId, out var name) ? name : menuId; var permission = category.MenuPermissions.TryGetValue(menuId, out var perm) ? perm : null; + var commandName = category.MenuCommandNames.TryGetValue(menuId, out var cmd) ? cmd : null; - // Check permissions - if (!string.IsNullOrEmpty(permission)) + // Check permissions with command override support + var steamId = new SteamID(player.SteamID); + + // If commandName is provided, check for permission overrides + if (!string.IsNullOrEmpty(commandName)) + { + bool hasPermission; + + // Check if command has overridden permissions + if (AdminManager.CommandIsOverriden(commandName)) + { + var overriddenPermission = AdminManager.GetPermissionOverrides(commandName); + hasPermission = AdminManager.PlayerHasPermissions(steamId, overriddenPermission); + } + else if (!string.IsNullOrEmpty(permission)) + { + // Use default permission if no override exists + hasPermission = AdminManager.PlayerHasPermissions(steamId, permission); + } + else + { + // No permission required + hasPermission = true; + } + + if (!hasPermission) + continue; + } + // Fallback to standard permission check if no commandName provided + else if (!string.IsNullOrEmpty(permission)) { - var steamId = new SteamID(player.SteamID); if (!AdminManager.PlayerHasPermissions(steamId, permission)) continue; } @@ -187,4 +221,5 @@ public class MenuCategory public Dictionary> MenuFactories { get; set; } = []; public Dictionary MenuNames { get; set; } = []; public Dictionary MenuPermissions { get; set; } = []; + public Dictionary MenuCommandNames { get; set; } = []; } diff --git a/CS2-SimpleAdmin/VERSION b/CS2-SimpleAdmin/VERSION index 1109b0c..2b32a27 100644 --- a/CS2-SimpleAdmin/VERSION +++ b/CS2-SimpleAdmin/VERSION @@ -1 +1 @@ -1.7.8-beta-1 \ No newline at end of file +1.7.8-beta-2 \ No newline at end of file diff --git a/CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs b/CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs index 9048c92..d8d4cb0 100644 --- a/CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs +++ b/CS2-SimpleAdminApi/ICS2-SimpleAdminApi.cs @@ -143,7 +143,13 @@ public interface ICS2_SimpleAdminApi /// /// Registers a menu in a category. /// - void RegisterMenu(string categoryId, string menuId, string menuName, Func menuFactory, string? permission = null); + /// The category to add this menu to. + /// Unique identifier for the menu. + /// Display name of the menu. + /// Factory function that creates the menu for a player. + /// Required permission to access this menu (optional). + /// Command name for permission override checking (optional, e.g., "css_god"). + void RegisterMenu(string categoryId, string menuId, string menuName, Func menuFactory, string? permission = null, string? commandName = null); /// /// Unregisters a menu from a category. diff --git a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdminApi.dll b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdminApi.dll index 45fa756..f3ca133 100644 Binary files a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdminApi.dll and b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdminApi.dll differ diff --git a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.cs b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.cs index d7d6238..43e9470 100644 --- a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.cs +++ b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands.cs @@ -368,60 +368,64 @@ public partial class CS2_SimpleAdmin_FunCommands : BasePlugin, IPluginConfig 0) _sharedApi.RegisterMenu("fun", "god", Localizer?["fun_menu_god"] ?? "God Mode", - CreateGodModeMenu, "@css/cheats"); + CreateGodModeMenu, "@css/cheats", "css_god"); if (Config.NoclipCommands.Count > 0) _sharedApi.RegisterMenu("fun", "noclip", Localizer?["fun_menu_noclip"] ?? "No Clip", - CreateNoClipMenu, "@css/cheats"); + CreateNoClipMenu, "@css/cheats", "css_noclip"); if (Config.RespawnCommands.Count > 0) _sharedApi.RegisterMenu("fun", "respawn", Localizer?["fun_menu_respawn"] ?? "Respawn", - CreateRespawnMenu, "@css/cheats"); + CreateRespawnMenu, "@css/cheats", "css_respawn"); if (Config.GiveCommands.Count > 0) _sharedApi.RegisterMenu("fun", "give", Localizer?["fun_menu_give"] ?? "Give Weapon", - CreateGiveWeaponMenu, "@css/cheats"); + CreateGiveWeaponMenu, "@css/cheats", "css_give"); if (Config.StripCommands.Count > 0) _sharedApi.RegisterMenu("fun", "strip", Localizer?["fun_menu_strip"] ?? "Strip Weapons", - CreateStripWeaponsMenu, "@css/slay"); + CreateStripWeaponsMenu, "@css/slay", "css_strip"); if (Config.FreezeCommands.Count > 0) _sharedApi.RegisterMenu("fun", "freeze", Localizer?["fun_menu_freeze"] ?? "Freeze", - CreateFreezeMenu, "@css/slay"); + CreateFreezeMenu, "@css/slay", "css_freeze"); if (Config.HpCommands.Count > 0) _sharedApi.RegisterMenu("fun", "hp", Localizer?["fun_menu_hp"] ?? "Set HP", - CreateSetHpMenu, "@css/slay"); + CreateSetHpMenu, "@css/slay", "css_hp"); if (Config.SpeedCommands.Count > 0) _sharedApi.RegisterMenu("fun", "speed", Localizer?["fun_menu_speed"] ?? "Set Speed", - CreateSetSpeedMenu, "@css/slay"); + CreateSetSpeedMenu, "@css/slay", "css_speed"); if (Config.GravityCommands.Count > 0) _sharedApi.RegisterMenu("fun", "gravity", Localizer?["fun_menu_gravity"] ?? "Set Gravity", - CreateSetGravityMenu, "@css/slay"); + CreateSetGravityMenu, "@css/slay", "css_gravity"); if (Config.MoneyCommands.Count > 0) _sharedApi.RegisterMenu("fun", "money", Localizer?["fun_menu_money"] ?? "Set Money", - CreateSetMoneyMenu, "@css/slay"); + CreateSetMoneyMenu, "@css/slay", "css_money"); if (Config.ResizeCommands.Count > 0) _sharedApi.RegisterMenu("fun", "resize", Localizer?["fun_menu_resize"] ?? "Resize Player", - CreateSetResizeMenu, "@css/slay"); + CreateSetResizeMenu, "@css/slay", "css_resize"); _menusRegistered = true; Logger.LogInformation("Fun menus registered successfully!"); diff --git a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/Menus.cs b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/Menus.cs index b479fe8..06cd63d 100644 --- a/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/Menus.cs +++ b/Modules/CS2-SimpleAdmin_FunCommands/CS2-SimpleAdmin_FunCommands/Menus.cs @@ -7,6 +7,26 @@ namespace CS2_SimpleAdmin_FunCommands; /// /// Menu creation methods for Fun Commands module. /// This file demonstrates different menu patterns using SimpleAdmin API. +/// +/// PERMISSION OVERRIDE SUPPORT: +/// ============================ +/// When registering menus in RegisterFunMenus(), you can pass a command name (e.g., "css_god") +/// as the last parameter. This enables automatic permission override checking via CounterStrikeSharp's +/// admin system. +/// +/// How it works: +/// 1. Server admin overrides a command's permissions (e.g., css_god requires @css/vip instead of @css/cheats) +/// 2. SimpleAdmin's menu system automatically checks for overrides when displaying menus +/// 3. If override exists, it uses the overridden permission; otherwise, uses the default permission +/// +/// Example from RegisterFunMenus(): +/// _sharedApi.RegisterMenu("fun", "god", +/// Localizer?["fun_menu_god"] ?? "God Mode", +/// CreateGodModeMenu, +/// "@css/cheats", // Default permission +/// "css_god"); // Command name for override checking +/// +/// This means developers don't need to manually check permissions in their menu factory methods! /// public partial class CS2_SimpleAdmin_FunCommands {