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")
endgetPlayerStaffDutyState(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")
endgetStaffGroups()
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
endgetOnlineStaff(filterDuty)
Returns a list of all online staff members.
Parameters:
filterDuty(boolean, optional) — Iftrue, only returns staff members currently on duty. Defaults tofalse.
Returns: OnlineStaff[]
---@class OnlineStaff
---@field source number
---@field duty boolean
---@field group string
---@field staffId number
---@field nickname string
---@field avatar stringlocal 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
endBan 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 -- millisecondsReturns: 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")
endban(source, expiration, reason, label)
Bans an online player.
Parameters:
source(number | string) — Player's server IDexpiration(number) — Expiration time in millisecondsreason(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)
endremoveBan(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 IDreason(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 0Returns: 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")
endunjail(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")
endCustom 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 numberRegisterZoneHandler("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
falsewhen operations fail or no data is found