Elite NetworkElite SaaS · Docsv0.1
GitHubPainel

Events hooks — empurrar eventos custom

Como hooks customizados alimentam o Live Feed do painel.

Onde adicionar hooks

O arquivo server/events_buffer.lua já hookeia playerConnecting, playerJoining e playerDropped. Para qualquer evento custom (economia, gangs, craft, missões…) basta chamar EliteSaaSEvents.push() de qualquer parte do seu servidor.

O resource não precisa ser dependência
O global EliteSaaSEvents fica disponível assim que o resource sobe. Em outros resources, basta um check if EliteSaaSEvents then ... end antes do push pra evitar crash quando o resource não está carregado.

push() — assinatura completa

lua
EliteSaaSEvents.push({
  type     = "string",    -- categoria (connect, ban, economy, gang, ...)
  title    = "string",    -- linha principal mostrada no painel
  detail   = "string",    -- subtítulo opcional
  severity = "info",      -- "info" | "warn" | "danger"
  actor    = "@lucas",    -- quem disparou (staff, sistema, automação)
  target   = "Carlos",    -- alvo humano-legível
  userId   = 9012,        -- userId interno se aplicável (vira link no painel)
  serverId = 7,           -- source do FX se aplicável
  meta     = { ... }      -- payload livre (não renderizado direto, vai no JSON)
})

Helpers prontos

lua
-- Punições (chame depois de aplicar a ação)
EliteSaaSEvents.punishment("perm_ban", "Carlos", 9012, "cheating", "@lucas")

-- Economia
EliteSaaSEvents.economy("Maria", 12450, "salário")

-- Inventário (delta positivo = ganhou, negativo = perdeu)
EliteSaaSEvents.inventoryChange("@staff", "ak47", 1)

Hook nativo de exemplo — sistema de gangs

Imagine seu resource elite_gangs dispara "elite_gangs:territoryClaimed" quando uma gang toma território. Capture e empurre:

elite_gangs/server.lua·lua
AddEventHandler("elite_gangs:territoryClaimed", function(gangName, zoneLabel, contestedFrom)
  if EliteSaaSEvents then
    EliteSaaSEvents.push({
      type     = "gang",
      title    = ("%s tomou %s"):format(gangName, zoneLabel),
      detail   = contestedFrom and ("Disputado de "..contestedFrom) or "Sem oposição",
      severity = "warn",
      actor    = gangName,
      target   = zoneLabel
    })
  end
end)

Como o painel renderiza

  • O type escolhe ícone + cor (lista completa em components/dashboard/live-feed.tsx: TYPE_VISUAL).
  • severity influencia o destaque (danger = vermelho, warn = âmbar).
  • Se houver userId, a linha vira link clicável para o perfil do jogador.

Quanto é demais?

O buffer tem capacidade de 500 eventos. Em servidores muito ativos eventos antigos somem rápido. Boas práticas:

  • Não empurre transação de cada compra de loja (ruido); agregue por minuto.
  • Para auditoria de longo prazo, persista em DB própria — o buffer é live feed, não histórico.
  • Para subir a capacidade, edite CAPACITY em server/events_buffer.lua.
Elite Network — Command Center