Luxu Admin API — Exports

All available exports and customization options for the luxu_admin resource.


Client Exports

hasPermission(permission, checkDuty)

Returns true or false for the given permission.

checkDuty — if true, returns false when the staff member is not on duty.

Find the full permission list in config/permissions.json.

local hasPerm = exports.luxu_admin:hasPermission("self.noclip", true)

hidePanel()

Hides the main admin panel.

exports.luxu_admin:hidePanel()

Alternative event:

TriggerEvent("luxu_admin:client:Visibility:hidePanel")

hideMenu()

Hides the quick menu.

exports.luxu_admin:hideMenu()

Alternative event:

TriggerEvent("luxu_admin:client:Visibility:hideMenu")

Server Exports

registerHook(name, callback)

Registers a server hook listener from a JavaScript/TypeScript resource. Returns an unregister function.

Parameters:

  • name (string) — Hook name (e.g. player_banned, report_created)
  • callback (function) — Called with the normalized hook payload

Returns: () => void — Call to remove the listener

See Server Hooks for available hook names, payloads, and Lua examples. Queue hooks (queue_player_admitted, queue_player_removed) are documented on Connection Queue.

const unregister = exports.luxu_admin.registerHook('player_banned', (data) => {
  console.log(`Ban #${data.banId}: ${data.playerName} — ${data.reason}`);
});

// unregister();

hasPermission(serverId, permission, checkDuty)

Returns true or false for the given player and permission.

checkDuty — if true, returns false when the staff member is not on duty.

local hasPerm = exports.luxu_admin:hasPermission(source, "self.noclip", true)

Connection Queue

Server-side exports for the built-in connection queue (config.json → queue). Reserved-slot rules, snapshot fields, hooks, and the ban preflight: Connection Queue.

registerQueuePriorityProvider(provider)

Registers a callback that assigns a queue priority (0..1000) to a connecting player. Providers run in parallel during preflight (2000 ms timeout each). The highest priority wins. Returns an unregister function. Providers are removed automatically when the registering resource stops.

local unregister = exports.luxu_admin:registerQueuePriorityProvider(function(identifiers, name)
    return { priority = 100, label = "VIP" }
end)

unregisterQueuePriorityProvider(provider)

Removes a provider previously passed to registerQueuePriorityProvider. Equivalent to calling the returned unregister function.

Returns: boolean — true if the provider was registered.


getQueueSnapshot()

Returns the current queue state (enabled, maxClients, players, reserved, reservedSlots, regularCapacity, updatedAt, entries). Safe to call when the queue is disabled.

local snapshot = exports.luxu_admin:getQueueSnapshot()

Staff Management

getPlayerStaffGroup(source)

Returns the staff group of a player.

Parameters:

  • source (number) — Player's server ID

Returns: string | false

local group = exports.luxu_admin:getPlayerStaffGroup(source)
if group then
    print("Player's staff group:", group)
else
    print("Player is not staff")
end

getPlayerStaffDutyState(source)

Returns the duty state of a staff member.

Parameters:

  • source (number) — Player's server ID

Returns: boolean

local state = exports.luxu_admin:getPlayerStaffDutyState(source)
if state then
    print("Staff member is on duty")
else
    print("Staff member is off duty")
end

getStaffGroups()

Returns all existing staff groups.

Returns: StaffGroup[] | false

---@class StaffGroup
---@field name string
---@field label string
---@field hierarchy number
---@field permissions string[]
---@type StaffGroup[]
local staffGroups = exports.luxu_admin:getStaffGroups()

if staffGroups then
    for _, group in ipairs(staffGroups) do
        print(string.format("Group: %s (%s)", group.name, group.label))
        print("Hierarchy:", group.hierarchy)
    end
end

getOnlineStaff(filterDuty)

Returns a list of all online staff members.

Parameters:

  • filterDuty (boolean, optional) — If true, only returns staff members currently on duty. Defaults to false.

Returns: OnlineStaff[]

---@class OnlineStaff
---@field source number
---@field duty boolean
---@field group string
---@field staffId number
---@field nickname string
---@field avatar string
local allStaff = exports.luxu_admin:getOnlineStaff(false)
local onDutyStaff = exports.luxu_admin:getOnlineStaff(true)

if onDutyStaff then
    for _, staff in ipairs(onDutyStaff) do
        print(string.format("%s (%s) is on duty", staff.nickname, staff.group))
    end
end

Ban Management

createBan(data)

Creates a ban for an offline player.

Parameters:

---@class BanData
---@field name string
---@field label string
---@field reason string
---@field identifiers string[]
---@field tokens string[]
---@field expires number -- milliseconds

Returns: number | false — Ban ID or false on failure.

---@type BanData
local banData = {
    name = "John Doe",
    label = "John the hacker",
    reason = "Cheating",
    identifiers = {"license2:123", "fivem:123", "discord:123"},
    tokens = {"hardware_id_1"},
    expires = os.time() + (10 * 24 * 60 * 60 * 1000)
}

local banId = exports.luxu_admin:createBan(banData)

if banId then
    print("Ban created. Ban ID:", banId)
else
    print("Failed to create ban")
end

ban(source, expiration, reason, label)

Bans an online player.

Parameters:

  • source (number | string) — Player's server ID
  • expiration (number) — Expiration time in milliseconds
  • reason (string)
  • label (string, optional)

Returns: number | false

local playerSource = 1
local expiration = os.time() + (7 * 24 * 60 * 60 * 1000)
local reason = "RDM"
local label = "Random Death Match"

local banId = exports.luxu_admin:ban(playerSource, expiration, reason, label)

if banId then
    print("Player banned. Ban ID:", banId)
end

removeBan(banId)

Removes a ban by ID.

Parameters:

  • banId (number)
exports.luxu_admin:removeBan(123)

Player Warnings

warnPlayer(source, reason, authorName)

Issues a warning to a player.

Parameters:

  • source (number) — Player's server ID
  • reason (string)
  • authorName (string) — Staff member's name
exports.luxu_admin:warnPlayer(source, "Spamming chat", "Admin Staff")

Jail Management

jail(data)

Jails a player by character ID. Works for online and offline players. No staff source required.

Parameters:

---@class JailData
---@field char_id string
---@field duration number -- milliseconds
---@field author_name? string -- defaults to "System"
---@field reason? string -- defaults to ""
---@field cell? string -- jail cell name; random if omitted or invalid
---@field bucket? number -- defaults to 0

Returns: boolean

---@type JailData
local jailData = {
    char_id = charId,
    duration = 30 * 60 * 1000, -- 30 minutes
    author_name = "Police MDT",
    reason = "Assault",
    cell = "Cell A",
    bucket = 0,
}

local success = exports.luxu_admin:jail(jailData)

if success then
    print("Player jailed")
else
    print("Failed to jail player")
end

unjail(charId)

Removes the active jail sentence for a character. Online players are released and returned to their last saved coords.

Parameters:

  • charId (string) — Character ID

Returns: boolean

local success = exports.luxu_admin:unjail(charId)

if success then
    print("Player unjailed")
else
    print("Failed to unjail player")
end

Custom Zones

Register custom zone handlers in luxu_admin/config/custom_functions/client.lua.

---@class Zone
---@field id string
---@field points [number, number][]
---@field rgba {r: number, g: number, b: number, a: number}
---@field debug boolean
---@field name string
---@field customHandler string
---@field metadata table
---@field height number
RegisterZoneHandler("zone_handler_unique_name", function()
    ---@param zone Zone
    local function onEnter(zone)
        print("Entered zone:", zone.name)
    end

    ---@param zone Zone
    local function onExit(zone)
        print("Exited zone:", zone.name)
    end

    ---@param zone Zone
    local function inside(zone)
        print("Inside zone:", zone.name)
    end

    return {
        onEnter = onEnter,
        onExit = onExit,
        inside = inside,
    }
end)

Tip: Return nil for unused callbacks to improve performance:

RegisterZoneHandler("minimal_handler", function()
    local function onEnter(zone)
        print("Entered zone:", zone.name)
    end

    return {
        onEnter = onEnter,
        onExit = nil,
        inside = nil,
    }
end)

Notes

  • All time values are in milliseconds
  • Staff groups are hierarchical — lower numbers indicate higher authority
  • Zone handlers can be reused across multiple zones
  • Returns false when operations fail or no data is found