zio fork 1.8.2b-zio9: admin menu honours command overrides, @zio/penalties

Every player and server entry in the admin menu names its command, and an overridden entry is
checked with the override's check_type ("any" passes with one flag), the way CSS checks the typed
command; upstream required every flag. css_penalties for someone else needs @zio/penalties or
@css/root instead of @css/kick.
This commit is contained in:
Astra 2026-09-29 12:44:15 +01:00
parent 65a413fa52
commit 6b188267c6
6 changed files with 38 additions and 15 deletions

View file

@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
public override string ModuleName => "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)"); public override string ModuleName => "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)");
public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
public override string ModuleAuthor => "daffyy"; public override string ModuleAuthor => "daffyy";
public override string ModuleVersion => "1.8.2b-zio8"; public override string ModuleVersion => "1.8.2b-zio9";
public override void Load(bool hotReload) public override void Load(bool hotReload)
{ {

View file

@ -39,7 +39,9 @@ public partial class CS2_SimpleAdmin
var userId = caller.UserId.Value; var userId = caller.UserId.Value;
var steamId = caller.SteamID; var steamId = caller.SteamID;
if (!string.IsNullOrEmpty(command.GetArg(1)) && AdminManager.PlayerHasPermissions(new SteamID(caller.SteamID), "@css/kick")) // zio: other players' penalties need @zio/penalties (or root), not @css/kick.
if (!string.IsNullOrEmpty(command.GetArg(1)) && (AdminManager.PlayerHasPermissions(new SteamID(caller.SteamID), "@zio/penalties")
|| AdminManager.PlayerHasPermissions(new SteamID(caller.SteamID), "@css/root")))
{ {
var targets = GetTarget(command); var targets = GetTarget(command);

View file

@ -144,6 +144,20 @@ internal static class Helper
return string.Join(" ", parts); return string.Join(" ", parts);
} }
// zio: whether an admin_overrides.json override lets the player run the command, checked the way
// CSS checks a typed command: "all" needs every flag, anything else ("any") needs one of them.
internal static bool CanRunOverriddenCommand(CCSPlayerController player, string commandName)
{
var data = AdminManager.GetCommandOverrideData(commandName);
if (data == null) return false;
var flags = data.Flags.ToArray();
BaseRequiresPermissions check = data.CheckType == "all"
? new RequiresPermissions(flags)
: new RequiresPermissionsOr(flags);
check.Command = commandName;
return check.CanExecuteCommand(player);
}
// zio: rank groups, highest first, and their chat abbreviations. Guardian (VIP) is last, so a // zio: rank groups, highest first, and their chat abbreviations. Guardian (VIP) is last, so a
// staff rank wins. // staff rank wins.
private static readonly (string Group, string Tag)[] StaffRanks = private static readonly (string Group, string Tag)[] StaffRanks =

View file

@ -20,20 +20,21 @@ public abstract class BasicMenu
var manager = MenuManager.Instance; var manager = MenuManager.Instance;
// Players category menus - using translation keys // Players category menus - using translation keys
manager.RegisterMenu("players", "slap", "sa_slap", CreateSlapMenu, "@css/slay"); // zio: each entry names its command, so admin_overrides.json applies to the menu too.
manager.RegisterMenu("players", "slay", "sa_slay", CreateSlayMenu, "@css/slay"); manager.RegisterMenu("players", "slap", "sa_slap", CreateSlapMenu, "@css/slay", "css_slap");
manager.RegisterMenu("players", "kick", "sa_kick", CreateKickMenu, "@css/kick"); manager.RegisterMenu("players", "slay", "sa_slay", CreateSlayMenu, "@css/slay", "css_slay");
manager.RegisterMenu("players", "warn", "sa_warn", CreateWarnMenu, "@css/kick"); manager.RegisterMenu("players", "kick", "sa_kick", CreateKickMenu, "@css/kick", "css_kick");
manager.RegisterMenu("players", "ban", "sa_ban", CreateBanMenu, "@css/ban"); manager.RegisterMenu("players", "warn", "sa_warn", CreateWarnMenu, "@css/kick", "css_warn");
manager.RegisterMenu("players", "gag", "sa_gag", CreateGagMenu, "@css/chat"); manager.RegisterMenu("players", "ban", "sa_ban", CreateBanMenu, "@css/ban", "css_ban");
manager.RegisterMenu("players", "mute", "sa_mute", CreateMuteMenu, "@css/chat"); manager.RegisterMenu("players", "gag", "sa_gag", CreateGagMenu, "@css/chat", "css_gag");
manager.RegisterMenu("players", "silence", "sa_silence", CreateSilenceMenu, "@css/chat"); manager.RegisterMenu("players", "mute", "sa_mute", CreateMuteMenu, "@css/chat", "css_mute");
manager.RegisterMenu("players", "team", "sa_team_force", CreateForceTeamMenu, "@css/kick"); manager.RegisterMenu("players", "silence", "sa_silence", CreateSilenceMenu, "@css/chat", "css_silence");
manager.RegisterMenu("players", "team", "sa_team_force", CreateForceTeamMenu, "@css/kick", "css_team");
// Server category menus - using translation keys // Server category menus - using translation keys
manager.RegisterMenu("server", "plugins", "sa_menu_pluginsmanager_title", CreatePluginsMenu, "@css/root"); manager.RegisterMenu("server", "plugins", "sa_menu_pluginsmanager_title", CreatePluginsMenu, "@css/root");
manager.RegisterMenu("server", "changemap", "sa_changemap", CreateChangeMapMenu, "@css/changemap"); manager.RegisterMenu("server", "changemap", "sa_changemap", CreateChangeMapMenu, "@css/changemap", "css_map");
manager.RegisterMenu("server", "restart", "sa_restart_game", CreateRestartGameMenu, "@css/generic"); manager.RegisterMenu("server", "restart", "sa_restart_game", CreateRestartGameMenu, "@css/generic", "css_rr");
manager.RegisterMenu("server", "custom", "sa_menu_custom_commands", CreateCustomCommandsMenu, "@css/generic"); manager.RegisterMenu("server", "custom", "sa_menu_custom_commands", CreateCustomCommandsMenu, "@css/generic");
// Admin category menus - using translation keys // Admin category menus - using translation keys

View file

@ -219,8 +219,9 @@ public class MenuManager
// Check if command has overridden permissions // Check if command has overridden permissions
if (AdminManager.CommandIsOverriden(commandName)) if (AdminManager.CommandIsOverriden(commandName))
{ {
var overriddenPermission = AdminManager.GetPermissionOverrides(commandName); // zio: honour the override's check_type ("any" passes with one flag), as CSS does
hasPermission = AdminManager.PlayerHasPermissions(steamId, overriddenPermission); // for the typed command, instead of requiring every flag.
hasPermission = Helper.CanRunOverriddenCommand(player, commandName);
} }
else if (!string.IsNullOrEmpty(permission)) else if (!string.IsNullOrEmpty(permission))
{ {

View file

@ -24,6 +24,11 @@ from the `build-1.8.2b` tag). Changes, all marked `zio:` in the code:
`sa_staffchat_template_player`, in `lang/en.json` only. `sa_staffchat_template_player`, in `lang/en.json` only.
- `css_psay` from a player reads `(PM) [RANK] name: message` (`(PM) name: message` without a rank - `css_psay` from a player reads `(PM) [RANK] name: message` (`(PM) name: message` without a rank
group); console's is unchanged. Lang keys `sa_psay_template` and `sa_psay_template_norank`. group); console's is unchanged. Lang keys `sa_psay_template` and `sa_psay_template_norank`.
- `admin_overrides.json` reaches the admin menu too: every player and server entry names its command,
and an overridden entry is checked with the override's `check_type` (`any` passes with one flag),
as CSS checks the typed command. Upstream required every flag in the override.
- `css_penalties <player>` (someone else's penalties) needs `@zio/penalties` or `@css/root`
instead of `@css/kick`.
Publish with `FORGEJO_TOKEN=... ./release.sh v<ModuleVersion>` (ModuleVersion is `1.8.2b-zioN`). Publish with `FORGEJO_TOKEN=... ./release.sh v<ModuleVersion>` (ModuleVersion is `1.8.2b-zioN`).
It rebuilds from the committed source and uploads `SimpleAdmin-<tag>.tar.gz` to git.zio.sh It rebuilds from the committed source and uploads `SimpleAdmin-<tag>.tar.gz` to git.zio.sh