SwiftlyS2
Development

Permissions

SwiftlyS2 provides a plugin-scoped permission service for checking access, granting and revoking permissions, and building permission hierarchies.

Accessing Permission Service

Permissions are available through Core.Permission.

public override void Load(bool hotReload)
{
    var permission = Core.Permission;
}

All permission checks and mutations use a SteamID64 (ulong) as the player identifier.

Checking Permissions

Single Permission

Use PlayerHasPermission when checking one permission key.

ulong steamId = player.SteamID;

if (Core.Permission.PlayerHasPermission(steamId, "myplugin.admin"))
{
    player.PrintToChat("You have admin access.");
}

Multiple Permissions

Use PlayerHasPermissions to require all permissions in a set.

bool canUseRestrictedAction = Core.Permission.PlayerHasPermissions(
    player.SteamID,
    [
        "myplugin.admin.kick",
        "myplugin.admin.ban"
    ]
);

Wildcard Permissions

Wildcard keys are supported (for example, myplugin.admin.*).

Core.Permission.AddPermission(player.SteamID, "myplugin.admin.*");

bool canKick = Core.Permission.PlayerHasPermission(player.SteamID, "myplugin.admin.kick");
bool canBan = Core.Permission.PlayerHasPermission(player.SteamID, "myplugin.admin.ban");

Granting and Revoking Permissions

Grant permissions with AddPermission and revoke with RemovePermission.

Core.Permission.AddPermission(player.SteamID, "myplugin.vip");

if (!Core.Permission.PlayerHasPermission(player.SteamID, "myplugin.vip"))
{
    player.PrintToChat("VIP permission is missing.");
}

Core.Permission.RemovePermission(player.SteamID, "myplugin.vip");

You can clear all direct permissions for a player with ClearPermission.

Core.Permission.ClearPermission(player.SteamID);

Sub-Permissions (Hierarchy)

Sub-permissions let one permission key imply other keys.

Core.Permission.AddSubPermission("myplugin.admin", "myplugin.moderator");
Core.Permission.AddSubPermission("myplugin.moderator", "myplugin.helper");

Core.Permission.AddPermission(player.SteamID, "myplugin.admin");

bool isModerator = Core.Permission.PlayerHasPermission(player.SteamID, "myplugin.moderator");
bool isHelper = Core.Permission.PlayerHasPermission(player.SteamID, "myplugin.helper");

Remove an inherited edge with RemoveSubPermission.

Core.Permission.RemoveSubPermission("myplugin.admin", "myplugin.moderator");

Permission Groups in Configuration

Permission groups are configured in permissions.jsonc and assigned to players by SteamID64.

{
    "Permissions": {
        "Players": {
            "76561198135539332": [
                "admins"
            ],
            "76561198012345678": [
                "admins",
                "moderators"
            ]
        },
        "PermissionGroups": {
            "__default": [
                "myplugin.help"
            ],
            "admins": [
                "myplugin.admin.*"
            ],
            "moderators": [
                "myplugin.moderator.*"
            ]
        }
    }
}

__default is applied to all players. Group members inherit permissions listed in their assigned groups.

Permission Naming Convention

A consistent naming scheme makes wildcard and hierarchy usage easier.

plugin.scope.action

Example keys:

  • myplugin.admin.kick
  • myplugin.admin.ban
  • myplugin.vip.access
  • myplugin.commands.reload

Reference

See IPermissionManager for method details.

On this page