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 ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
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)
{

View file

@ -39,7 +39,9 @@ public partial class CS2_SimpleAdmin
var userId = caller.UserId.Value;
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);

View file

@ -144,6 +144,20 @@ internal static class Helper
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
// staff rank wins.
private static readonly (string Group, string Tag)[] StaffRanks =

View file

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

View file

@ -219,8 +219,9 @@ public class MenuManager
// Check if command has overridden permissions
if (AdminManager.CommandIsOverriden(commandName))
{
var overriddenPermission = AdminManager.GetPermissionOverrides(commandName);
hasPermission = AdminManager.PlayerHasPermissions(steamId, overriddenPermission);
// zio: honour the override's check_type ("any" passes with one flag), as CSS does
// for the typed command, instead of requiring every flag.
hasPermission = Helper.CanRunOverriddenCommand(player, commandName);
}
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.
- `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`.
- `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`).
It rebuilds from the committed source and uploads `SimpleAdmin-<tag>.tar.gz` to git.zio.sh