Callbacks:RegisterServerCallback('Admin:MyAction', function(source, data, cb) local player = Fetch:Source(source) if not player then return cb(false) end -- Admin-only action if player.Permissions:IsAdmin() then -- Perform admin action cb({ success = true }) else cb(false) endend)
Some callbacks support both admin and staff with different capabilities:
Callbacks:RegisterServerCallback('Admin:GetPlayerInfo', function(source, data, cb) local player = Fetch:Source(source) if not player then return cb(false) end if player.Permissions:IsAdmin() then -- Full player data (admin) local targetPlayer = Fetch:Source(data.targetSource) local char = targetPlayer:GetData('Character') cb({ name = GetPlayerName(data.targetSource), character = char:GetData('First') .. ' ' .. char:GetData('Last'), stateId = char:GetData('SID'), jobs = char:GetData('Jobs'), cash = char:GetData('Cash'), -- Admin-only bankBalance = Banking.Balance:Get(account) -- Admin-only }) elseif player.Permissions:IsStaff() then -- Limited data (staff) cb({ name = GetPlayerName(data.targetSource), character = 'Hidden', stateId = 'Hidden' }) else cb(false) endend)
Use the Chat component’s built-in admin/staff registration:
-- Automatically checks IsAdmin()Chat:RegisterAdminCommand('mycommand', function(source, args, rawCommand) -- Only runs if player is adminend, { help = 'Description' })-- Automatically checks IsStaff()Chat:RegisterStaffCommand('mycommand', function(source, args, rawCommand) -- Only runs if player is staffend, { help = 'Description' })
AddEventHandler('myResource:server:AdminAction', function(data) local src = source local player = Fetch:Source(src) if not player or not player.Permissions:IsAdmin() then Logger:Warn('Security', 'Unauthorized admin action attempt', { console = true, file = true, discord = true }, { source = src, action = data.action }) return end -- Process admin actionend)
Admin permissions are initialized when a character spawns:
-- Registered at priority 5 on Characters:SpawningMiddleware:Add('Characters:Spawning', function(source, character) local player = Fetch:Source(source) if player.Permissions:IsStaff() or player.Permissions:IsAdmin() then -- Send permission data to client for admin panel UI TriggerClientEvent('Admin:Client:Menu:RecievePermissionData', source, permissionData) endend, 5)