> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fivenetwork.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# five_logs

> Sistema de logs server-side. Recebe eventos de qualquer recurso por um único export (AddLog), processa-os numa fila interna com retry e os entrega a um painel web externo, identificado por token.

O **core\_logs** é um recurso **standalone e exclusivamente server-side** (sem NUI, sem client). Centraliza o registro de ações importantes do servidor (entradas/saídas, ações admin, banco, inventário, prisões, roubos, empregos, etc.) e encaminha para um painel web externo. A integração com os outros recursos é por **um único ponto**: o export `AddLog`.

## Funcionalidades

<CardGroup cols={2}>
  <Card title="Ponto único de log" icon="plug">
    Toda a integração é feita por um só export: `AddLog`.
  </Card>

  <Card title="Fila com retry" icon="list-check">
    Processa os eventos numa fila interna com tentativas de reenvio.
  </Card>

  <Card title="Painel web externo" icon="window">
    Entrega os logs a um painel externo identificado por token.
  </Card>

  <Card title="Filtros automáticos" icon="filter">
    Chaves especiais (`adminId`, `playerId`, etc.) viram filtros no painel.
  </Card>
</CardGroup>

<Note>
  Os arquivos `server/core.lua` e `server/queue.lua` são distribuídos **ofuscados**: a lógica de fila/retry/transporte não é editável. A personalização é via `config/config.lua` (token) e pela forma como cada recurso chama o export.
</Note>

***

## Dependências

<Info>
  Nenhuma declarada. Quem **consome** usa a guarda:

  ```lua theme={null}
  if GetResourceState("five_logs") == "started" then
      exports["five_logs"]:AddLog(category, data)
  end
  ```
</Info>

***

## Configuração

<AccordionGroup>
  <Accordion title="config/config.lua — Token do painel" icon="key">
    ```lua theme={null}
    CoreLogs = {}
    CoreLogs.Token = "SEU-TOKEN"   -- token que vincula o servidor ao painel web (troque pelo real)
    ```
  </Accordion>
</AccordionGroup>

***

## Comandos

Não registra nenhum comando de chat. Toda a interação é feita pelo export `AddLog` (server-side).

***

## Localizações

Não possui pontos no mapa. É um recurso standalone, exclusivamente server-side (sem NUI nem client), portanto não usa peds, blips, lojas, garagens nem zonas.

***

## Exports

### `AddLog(category, data)`

Registra um evento. **Fire-and-forget** (não bloqueia, não precisa de pcall). Só existe no server.

```lua theme={null}
exports["five_logs"]:AddLog(category, data)
```

| Parâmetro  | Tipo   | Descrição                                                                                    |
| ---------- | ------ | -------------------------------------------------------------------------------------------- |
| `category` | string | Tipo do evento. Convenção: MAIÚSCULAS, sem espaços/acentos (ex.: `BAN`, `PRISAO`, `ENTROU`). |
| `data`     | table  | Dados do log. 5 chaves têm tratamento especial (viram filtros no painel).                    |

**Chaves especiais de `data`:** `message` (frase principal, já montada com nomes/IDs reais), `adminName`, `adminId` (number), `playerName`, `playerId` (number). Qualquer outra chave é exibida como "dado extra".

Exemplo real:

```lua theme={null}
exports["five_logs"]:AddLog("PRISAO", {
    message = vRP.FullName(Officer).." #"..Officer.." prendeu "..vRP.FullName(Passport).." #"..Passport,
    playerName = vRP.FullName(Passport),
    playerId = parseInt(Passport),
    Policial = vRP.FullName(Officer),
    Pena = Services.." minutos",
})
```

Padrão de wrapper local usado em vários recursos:

```lua theme={null}
local function CoreLog(category, data)
    if GetResourceState("five_logs") == "started" then
        exports["five_logs"]:AddLog(category, data)
    end
end
```

<Note>
  É o único export do recurso.
</Note>

***

## Customização

* **Token:** `CoreLogs.Token` em `config/config.lua`.
* **O que é logado:** definido nos recursos que chamam `AddLog`, escolha `category` (reaproveite as existentes para consistência: `ENTROU`, `SAIU`, `SALARIO`, `MORTE`, `PRISAO`, `MULTA`, `BAN`, `KICK`, `CRAFTOU`, `ROUBO-ATM`, `DESMANCHE`, `TUNING-*`, `EMPREGO-*`, etc.), monte a `message` completa e preencha `adminId`/`playerId` (geram os filtros do painel).
