SDK FiveM (Lua)
El SDK de FiveM es un resource para FiveM/RedM escrito en Lua. Se instala en tu carpeta resources/ y expone exports que puedes usar desde cualquier otro resource de tu servidor.
Instalación
Sección titulada «Instalación»Opción 1 — Descarga directa (recomendada)
Sección titulada «Opción 1 — Descarga directa (recomendada)»- Descarga el último release desde GitHub.
- Extrae la carpeta en
resources/fivehub/. - Añade
ensure fivehuben tuserver.cfg.
Opción 2 — Clonar el repositorio
Sección titulada «Opción 2 — Clonar el repositorio»cd resources/git clone https://github.com/FiveHubPRO/fivehub-fivem fivehub-repocp -r fivehub-repo/packages/sdk-fivem fivehubConfiguración
Sección titulada «Configuración»Añade estas líneas en tu server.cfg antes de ensure fivehub:
set fivehub:apiKey "TU_API_KEY"set fivehub:baseUrl "https://fivehub.pro"# Opcional — solo si usas claves de usuario con varias organizacionesset fivehub:organizationId ""Nunca pongas tu API Key directamente en
config.lua. Usa siempre convars para mantener la clave fuera del código.
Exports — Assets
Sección titulada «Exports — Assets»Todos los exports son asíncronos y usan callbacks con la firma function(err, data). Si err no es nil, la operación falló.
ListAssets(options, callback)
Sección titulada «ListAssets(options, callback)»Lista los assets con paginación y filtro de carpeta opcionales.
-- Todos los assets (sin filtro de carpeta)exports.fivehub:ListAssets({ limit = 10, offset = 0 }, function(err, data) if err then print("Error:", err) return end for _, asset in ipairs(data.assets) do print(asset.name, asset.publicUrl) endend)
-- Solo assets en el nivel raízexports.fivehub:ListAssets({ folderId = "" }, function(err, data) print("Assets en raíz:", data.total)end)
-- Assets dentro de una carpetaexports.fivehub:ListAssets({ folderId = "folder_abc123" }, function(err, data) print("Assets en carpeta:", data.total)end)
-- Sin opciones (también válido)exports.fivehub:ListAssets(function(err, data) print("Total:", data.total)end)| Opción | Tipo | Descripción |
|---|---|---|
limit | number | Máx. 100, default 50. |
offset | number | Paginación. Default 0. |
folderId | string | ""=raíz, "id"=carpeta, omitir=todos. |
GetAsset(assetId, callback)
Sección titulada «GetAsset(assetId, callback)»Obtiene los metadatos de un asset por su ID.
exports.fivehub:GetAsset("asset_abc123", function(err, asset) if err then print("Error:", err) return end print("Nombre:", asset.name) print("Carpeta:", asset.folderId or "raíz") print("URL:", asset.publicUrl)end)GetAssetUrl(assetId, expiresIn, callback)
Sección titulada «GetAssetUrl(assetId, expiresIn, callback)»Genera una URL firmada temporal. expiresIn es en segundos (default 3600).
-- URL que expira en 2 horasexports.fivehub:GetAssetUrl("asset_abc123", 7200, function(err, data) if err then print("Error:", err) return end print("URL firmada:", data.url) TriggerClientEvent("mi-resource:setUrl", source, data.url)end)
-- Omitir expiresIn usa el default (3600s)exports.fivehub:GetAssetUrl("asset_abc123", function(err, data) print(data.url)end)DeleteAsset(assetId, callback)
Sección titulada «DeleteAsset(assetId, callback)»Elimina un asset permanentemente.
exports.fivehub:DeleteAsset("asset_abc123", function(err) if err then print("Error al eliminar:", err) return end print("Asset eliminado correctamente")end)Exports — Carpetas
Sección titulada «Exports — Carpetas»ListFolders(options, callback)
Sección titulada «ListFolders(options, callback)»Lista las carpetas de tu organización. Omitir parentId para obtener las carpetas raíz.
-- Carpetas en el nivel raízexports.fivehub:ListFolders(function(err, data) if err then print("Error:", err) return end for _, folder in ipairs(data.folders) do print(folder.id, folder.name) endend)
-- Subcarpetas de una carpetaexports.fivehub:ListFolders({ parentId = "folder_abc123" }, function(err, data) print("Subcarpetas:", #data.folders)end)CreateFolder(name, options, callback)
Sección titulada «CreateFolder(name, options, callback)»Crea una carpeta. Pasa options.parentId para crearla dentro de otra carpeta.
-- Carpeta en raízexports.fivehub:CreateFolder("Scripts", function(err, folder) if err then print("Error:", err) return end print("Carpeta creada:", folder.id, folder.name)end)
-- Subcarpetaexports.fivehub:CreateFolder("v2", { parentId = "folder_abc123" }, function(err, folder) print("Subcarpeta creada:", folder.id)end)DeleteFolder(folderId, callback)
Sección titulada «DeleteFolder(folderId, callback)»Elimina una carpeta. Sus subcarpetas también se eliminan. Los assets dentro no se borran — su folderId se vuelve nil.
exports.fivehub:DeleteFolder("folder_abc123", function(err) if err then print("Error:", err) return end print("Carpeta eliminada")end)Estructura del objeto Asset
Sección titulada «Estructura del objeto Asset»{ id = "asset_abc123", organizationId = "org_xyz", folderId = "folder_abc123", -- nil si está en raíz key = "org_xyz/1700000000-abc-archivo.zip", name = "archivo.zip", mimeType = "application/zip", size = 5242880, publicUrl = "https://cdn.fivehub.pro/...", createdAt = "2025-01-15T10:30:00.000Z",}Estructura del objeto Folder
Sección titulada «Estructura del objeto Folder»{ id = "folder_abc123", organizationId = "org_xyz", parentId = nil, -- nil si es carpeta raíz name = "Scripts", createdAt = "2025-01-15T10:30:00.000Z",}Ejemplo de uso en un resource
Sección titulada «Ejemplo de uso en un resource»-- server.lua de tu resource "mi-tienda"-- Carga los assets de una carpeta específica al arrancar
AddEventHandler("onResourceStart", function(resourceName) if resourceName ~= GetCurrentResourceName() then return end
-- Listar carpetas para encontrar "Tienda" exports.fivehub:ListFolders(function(err, data) if err then print("[mi-tienda] Error listando carpetas:", err) return end
local tiendaFolder = nil for _, folder in ipairs(data.folders) do if folder.name == "Tienda" then tiendaFolder = folder break end end
if not tiendaFolder then print("[mi-tienda] Carpeta 'Tienda' no encontrada") return end
-- Cargar assets de esa carpeta exports.fivehub:ListAssets({ folderId = tiendaFolder.id }, function(aerr, adata) if aerr then print("[mi-tienda] Error cargando assets:", aerr) return end print("[mi-tienda] Assets cargados:", adata.total) end) end)end)Archivo fxmanifest.lua
Sección titulada «Archivo fxmanifest.lua»fx_version "cerulean"game "gta5"
name "fivehub"description "FiveHub.pro API client for FiveM"version "1.1.0"
server_scripts { "config.lua", "server.lua",}