DRS Logs

v2.2.2 drs_logs
Ver na loja

Logs profissionais para o Discord e dentro do jogo, feitos para ajudar a staff. O script inclui:

  • 23 categorias, cada uma com o seu canal no Discord;
  • canais criados sozinhos por um bot (categoria 🔒・Logs), com o webhook já ligado;
  • embeds com a foto do Discord do jogador, jogador e alvo lado a lado e os identificadores prontos a copiar;
  • combat log, inventário com origem e destino, assaltos, polícia, banco, veículos e muito mais;
  • substitui o qb-logs e liga-se a todos os scripts DRS;
  • painel /logs com feed ao vivo e pesquisa própria em cada aba.

Funciona com Qbox, QBCore, ESX ou sem framework.

#Requisitos

RecursoObrigatório
oxmysqlNão — sem base de dados os últimos logs ficam em memória (Config.MemoryLimit)
Qbox, QBCore ou ESXNão (deteção automática; sem framework funciona na mesma)
Bot do DiscordNão — só para os canais automáticos e as fotos do Discord. Sem bot usas webhooks
OneSyncRecomendado — o combat log usa o weaponDamageEvent

#Instalação

  1. Coloca drs_logs em resources.
  2. Desliga o qb-logs (o drs_logs substitui-o; os scripts continuam a funcionar).
  3. Adiciona ao server.cfg, depois da framework:
server.cfg
ensure oxmysql
ensure qb-core
ensure drs_logs
  1. Escolhe como os logs chegam ao Discord (ver abaixo): bot (recomendado) ou webhooks.
  2. Dá acesso ao /logs (os grupos de admin da framework já têm):
server.cfg
add_ace group.admin drs.logs allow

A tabela drs_logs é criada sozinha. Os logs com mais de Config.RetentionDays dias são apagados.

#Discord

#Com bot (recomendado)

  1. Cria uma aplicação em discord.com/developers, separador Bot, e copia o token.
  2. Convida o bot para o teu servidor do Discord com as permissões Ver canais, Gerir canais e Gerir webhooks.
  3. Põe o token no server.cfg:
server.cfg
set drs_logs_bot_token "O_TOKEN_DO_BOT"
  1. Se o bot estiver em mais do que um servidor do Discord, põe o ID do servidor em ServerConfig.Discord.guildId (server_config.lua).

Em cada arranque o script:

  • procura a categoria 🔒・Logs e cria-a se não existir (privada: o @everyone não a vê; os cargos de staffRoles veem);
  • confirma que há um canal para cada categoria de log e cria os que faltam dentro da categoria, com as permissões dela;
  • liga um webhook "DRS Logs" a cada canal.

Se criou alguma coisa, avisa na consola:

consola
[drs_logs] CONFIRMA AS PERMISSÕES DOS CANAIS em "🔒・Logs" (quem pode ver os logs).

Dica

Se apagarem um canal, ele volta a aparecer no arranque seguinte. Para verificar sem reiniciar: drslogs_sync na consola.

Com o bot, os embeds levam também a foto do Discord do jogador (Config.DiscordAvatars).

#Só com webhooks

Mete os webhooks em ServerConfig.Webhooks (server_config.lua): um por categoria, default para as que não têm e all para uma cópia de tudo. Um webhook escrito lá tem sempre prioridade sobre o do bot.

Nota

Se o Discord não responder (rede em baixo ou erro do Discord), os logs ficam na fila e são reenviados até 5 vezes.

#Categorias

CategoriaO que regista
📥 Entradas e saídasLigar, sair (motivo e tempo de sessão)
💬 ChatMensagens do chat, /ooc e /me
💀 MortesQuem matou quem, arma, distância e tiro na cabeça
🚪 Combat logQuem sai pouco depois de levar ou dar dano, ou caído/morto
🔫 DisparosResumo dos tiros de cada jogador
💥 ExplosõesTipo de explosão; as suspeitas ficam marcadas e podem mencionar um cargo
🦹 AssaltosLojas, cofres, bancos, termite, joalharia, casas, drogas, zonas
🚓 PolíciaAlgemas, escoltas, revistas, multas, prisão, MDT
🚨 Chamadas 112Chamadas e alertas para a polícia
🚑 INEMAções do drs_ambulancejob
🎒 InventárioItens recebidos, perdidos e dados a outros jogadores
🗄 Cofres e malasGuardar e tirar de cofres, malas, porta-luvas e chão
💰 DinheiroMovimentos de dinheiro a partir de Config.MoneyThreshold
🏦 BancoTransferências e logs do banco
🛒 LojasCompras e casa de penhores
🚗 VeículosStand, mecânico, venda de carros
💼 EmpregosMudanças de emprego, contratar, despedir
📨 ReportsTickets e reports
⭐ StaffAções da staff (drs_admin)
🛡 AnticheatLogs do anticheat
🔨 txAdminKicks, avisos, bans, anúncios, reinícios
📦 RecursosRecursos ligados e desligados
🧩 ScriptsTudo o que não tem canal próprio

Cada categoria tem cor, ícone e emoji em Config.Categories e pode ser desligada (enabled = false).

#Inventário: origem e destino

Cada log de inventário tem os campos 📤 Origem e 📥 Destino:

  • Guardar: Zé guardou 3× Água → Cofre police_stash
  • Tirar: Zé tirou 1× Água ← Mala ABC123
  • Dar: Gonçalo deu 1× Telemóvel a Maria

Funciona com qb-inventory, ox_inventory (hooks) e ESX. Config.Inventory permite ignorar itens, definir uma quantidade mínima e desligar os cofres.

#Combat log

Regista quem sai do servidor até Config.CombatLog.seconds segundos depois de dar ou levar dano, ou estando caído ou morto (drs_ambulancejob ou metadata do QBCore). O log diz com quem estava em combate, há quanto tempo e o motivo da saída, e fica marcado como alerta.

#Ligação a outros scripts

#Substitui o qb-logs

O evento qb-log:server:CreateLog continua a funcionar. O nome do log escolhe a categoria (Config.QbLogRoutes), por exemplo stash → Cofres e malas, cuffing → Polícia, 112 → Chamadas. tagEveryone passa a alerta (menciona o cargo de ServerConfig.Ping, nunca o @everyone).

#Scripts DRS

Todos os scripts DRS mandam os seus logs para o drs_logs quando ele está ligado. Config.ResourceRoutes diz para que categoria vai cada um.

#Eventos de qualquer script

Config.EventLogs regista eventos de rede de qualquer script, com o jogador, o alvo, a posição e os dados. Já vem com os assaltos do QBCore, o qb-policejob, o qb-vehicleshop, os cofres e o drs_policejob.

config.lua
{ event = 'police:server:CuffPlayer', category = 'police', title = 'ev_cuff', target = 1,
  fields = { { arg = 2, label = 'f_soft', kind = 'bool' } } },

target é o número do argumento com o ID do outro jogador; kind pode ser money, bool ou text.

#Painel /logs

  • feed ao vivo e as últimas 24 h, 7 dias ou tudo;
  • pesquisa própria em cada aba: nome, personagem, ID (12 ou #12), license, Discord, Steam, item, matrícula, rua… várias palavras procuram todas ao mesmo tempo;
  • ver só um jogador a partir do detalhe;
  • detalhe de cada log com os identificadores prontos a copiar.

#Para programadores

servidor
exports.drs_logs:Log('vehicles', 'Compra no stand', ('Comprou um %s por %s $'):format(model, price), source, {
    target = sellerId,
    fields = { { name = 'Matrícula', value = plate } },
    color = '#22c55e', flag = false,
})

TriggerEvent('drs_logs:server:log', { category = 'robbery', title = 'Assalto', message = '...', src = source })

Uma categoria nova aparece no menu logo que é usada; para lhe dar cor, ícone e canal acrescenta-a a Config.Categories e a ServerConfig.Discord.channels.

#Configuração completa

config.lua
-- DRS Logs — configuração / configuration
-- Os webhooks do Discord ficam no server_config.lua (só o servidor os lê).
-- Discord webhooks live in server_config.lua (only the server reads them).

Config = {}

Config.Locale = 'pt'            -- 'pt' | 'en'
Config.Framework = 'auto'       -- 'auto' | 'qbx' | 'qb' | 'esx' | 'none'
Config.StaffGroups = { 'god', 'admin', 'superadmin', 'mod' }

-- Visualizador em jogo (ACE drs.logs, grupos de staff acima ou ACE "command")
-- In-game viewer (ACE drs.logs, the staff groups above or the "command" ACE)
Config.Viewer = {
    enabled = true,
    command = 'logs',
    perPage = 50,
    accent = '#7c5cff',
}

-- Guardar na base de dados (oxmysql). Sem BD os logs ficam só em memória (os últimos MemoryLimit).
-- Store in the database (oxmysql). Without it, logs only stay in memory (the last MemoryLimit).
Config.Database = true
Config.RetentionDays = 30       -- apaga logs mais antigos que isto (0 = nunca) / delete older logs (0 = never)
Config.MemoryLimit = 1000

Config.ServerName = 'O Meu Servidor'
Config.LogIP = false            -- mostrar o IP nos logs (RGPD!) / show the IP in logs (GDPR!)
Config.DiscordName = 'DRS Logs'
Config.DiscordAvatar = ''       -- URL da imagem do bot / bot image URL

Config.LogoUrl = ''             -- logótipo do servidor nos embeds (URL de imagem) / server logo in embeds
Config.DiscordAvatars = true    -- foto do Discord do jogador nos embeds (precisa do bot) / player's Discord avatar in embeds (needs the bot)

-- Categorias: enabled liga/desliga, color é a cor no Discord e no menu, icon é o ícone do menu, emoji aparece no Discord.
-- Categories: enabled turns them on/off, color is used on Discord and in the menu, icon is the menu icon, emoji shows on Discord.
Config.Categories = {
    joins      = { enabled = true, color = '#34d399', icon = 'plug',      emoji = '📥' },
    chat       = { enabled = true, color = '#60a5fa', icon = 'chat',      emoji = '💬' },
    deaths     = { enabled = true, color = '#f87171', icon = 'skull',     emoji = '💀' },
    combatlog  = { enabled = true, color = '#dc2626', icon = 'door',      emoji = '🚪' },
    shooting   = { enabled = true, color = '#fb923c', icon = 'target',    emoji = '🔫' },
    explosions = { enabled = true, color = '#ef4444', icon = 'flame',     emoji = '💥' },
    robbery    = { enabled = true, color = '#e11d48', icon = 'mask',      emoji = '🦹' },
    police     = { enabled = true, color = '#3b82f6', icon = 'badge',     emoji = '🚓' },
    calls      = { enabled = true, color = '#f43f5e', icon = 'phone',     emoji = '🚨' },
    ems        = { enabled = true, color = '#fb7185', icon = 'cross',     emoji = '🚑' },
    inventory  = { enabled = true, color = '#2dd4bf', icon = 'backpack',  emoji = '🎒' },
    storage    = { enabled = true, color = '#14b8a6', icon = 'vault',     emoji = '🗄️' },
    money      = { enabled = true, color = '#fbbf24', icon = 'coins',     emoji = '💰' },
    banking    = { enabled = true, color = '#eab308', icon = 'bank',      emoji = '🏦' },
    shops      = { enabled = true, color = '#a3e635', icon = 'store',     emoji = '🛒' },
    vehicles   = { enabled = true, color = '#38bdf8', icon = 'car',       emoji = '🚗' },
    jobs       = { enabled = true, color = '#22d3ee', icon = 'briefcase', emoji = '💼' },
    reports    = { enabled = true, color = '#c084fc', icon = 'flag',      emoji = '📨' },
    staff      = { enabled = true, color = '#a78bfa', icon = 'star',      emoji = '⭐' },
    anticheat  = { enabled = true, color = '#f97316', icon = 'shield',    emoji = '🛡️' },
    txadmin    = { enabled = true, color = '#f472b6', icon = 'gavel',     emoji = '🔨' },
    resources  = { enabled = true, color = '#818cf8', icon = 'box',       emoji = '📦' },
    scripts    = { enabled = true, color = '#94a3b8', icon = 'layers',    emoji = '🧩' },
}

-- Combat log: quem sai do servidor pouco depois de levar ou dar dano, ou estando caído/morto.
-- Combat log: players who leave shortly after taking or dealing damage, or while down/dead.
Config.CombatLog = {
    seconds = 90,              -- saiu até X segundos depois do último dano / left within X seconds of the last damage
    whileDown = true,          -- conta também quem sai caído ou morto / also counts leaving while down or dead
    ignoreReasons = { 'Server shutting down' }, -- motivos que não contam (texto contido no motivo) / reasons that don't count
}

-- Disparos: o cliente junta os tiros e envia um resumo de X em X segundos.
-- Shooting: the client groups shots and sends a summary every X seconds.
Config.Shooting = { interval = 60, minShots = 3 }

-- Explosões: tipos que contam como suspeitos (vermelho e marcados). Lista: docs.fivem.net/natives (ADD_EXPLOSION).
-- Explosions: types that count as suspicious (red and flagged). Names in shared/weapons.lua (ExplosionNames).
Config.Explosions = {
    ignore = { 'DIR_STEAM', 'DIR_WATER_HYDRANT', 'EXTINGUISHER', 'EXTINGUISHER2', 'BIRD_CRAP', 'SNOWBALL', 'FLARE', 'SMOKEGRENADE' },
    suspicious = { 'GRENADE', 'GRENADELAUNCHER', 'STICKYBOMB', 'ROCKET', 'TANKSHELL', 'PLANE_ROCKET', 'RAILGUN', 'PROXMINE',
        'VALKYRIE_CANNON', 'AIR_DEFENCE', 'PIPEBOMB', 'EXPLOSIVEAMMO', 'EXPLOSIVEAMMO_SHOTGUN', 'APCSHELL', 'BOMB_CLUSTER', 'BOMB_GAS',
        'BOMB_INCENDIARY', 'BOMB_STANDARD', 'BOMB_STANDARD_WIDE', 'ORBITAL_CANNON', 'HUNTER_BARRAGE', 'HUNTER_CANNON', 'OPPRESSOR2_CANNON',
        'RAYGUN', 'SCRIPT_MISSILE', 'SCRIPT_MISSILE_LARGE', 'EMPLAUNCHER_EMP' },
    perPlayerSeconds = 2,                -- junta explosões do mesmo jogador / groups explosions from one player
}

-- Dinheiro (QBCore/Qbox): só regista movimentos a partir deste valor.
-- Money (QBCore/Qbox): only logs changes of at least this amount.
Config.MoneyThreshold = 1000

-- Logs de recursos a arrancar só depois deste tempo (evita centenas de linhas no arranque do servidor).
-- Resource start logs only after this many seconds (avoids hundreds of lines at server boot).
Config.ResourceGraceSeconds = 60

-- Inventário: qb-inventory (pelos logs que ele já faz), ox_inventory (hooks de mover, dar e comprar) e ESX.
-- Inventory: qb-inventory (through the logs it already makes), ox_inventory (move, give and buy hooks) and ESX.
Config.Inventory = {
    ignoreItems = {},          -- itens que não se registam / items that are not logged, ex.: { 'water', 'sandwich' }
    minAmount = 1,             -- só regista a partir desta quantidade / only logs from this amount
    stashes = true,            -- registar também o que entra/sai de cofres, malas e porta-luvas / also log stashes, trunks and gloveboxes
}

-- Assaltos e outras ações: qualquer evento de rede de qualquer script fica registado com o jogador que o enviou,
-- a posição e os dados. Os de origem são os assaltos do QBCore; acrescenta os dos teus scripts.
-- Robberies and other actions: any network event from any script is logged with the player who sent it,
-- the position and the data. The defaults are the QBCore robberies; add the ones from your scripts.
Config.EventLogs = {
    cooldown = 10,             -- segundos entre logs do mesmo jogador no mesmo evento / seconds between logs per player per event
    -- event: nome do evento · category · title: chave do locale ou texto · flag: alerta
    -- target = n.º do argumento que é o ID do outro jogador · fields = { { arg = n, label = 'f_...', kind = 'money'|'bool'|'text' } }
    -- event name · category · title: locale key or text · flag: alert · target = argument index holding the other player's ID
    events = {
        -- assaltos (QBCore) / robberies
        { event = 'qb-storerobbery:server:callCops', category = 'robbery', title = 'ev_store_start', flag = true, fields = { { arg = 3, label = 'f_street' } } },
        { event = 'qb-storerobbery:server:takeMoney', category = 'robbery', title = 'ev_store_register' },
        { event = 'qb-storerobbery:server:SafeReward', category = 'robbery', title = 'ev_store_safe' },
        { event = 'qb-bankrobbery:server:callCops', category = 'robbery', title = 'ev_bank_start', flag = true, fields = { { arg = 2, label = 'f_bank' }, { arg = 3, label = 'f_street' } } },
        { event = 'qb-bankrobbery:server:setLockerState', category = 'robbery', title = 'ev_bank_locker' },
        { event = 'thermite:StartServerFire', category = 'robbery', title = 'ev_thermite' },
        { event = 'qb-jewellery:server:setVitrineState', category = 'robbery', title = 'ev_jewel_vitrine' },
        { event = 'qb-jewellery:server:vitrineReward', category = 'robbery', title = 'ev_jewel_reward' },
        { event = 'qb-houserobbery:server:enterHouse', category = 'robbery', title = 'ev_house_enter' },
        { event = 'qb-houserobbery:server:searchFurniture', category = 'robbery', title = 'ev_house_search' },
        { event = 'qb-truckrobbery:server:callCops', category = 'robbery', title = 'ev_truck_start', flag = true },
        { event = 'qb-moneysafe:server:DepositMoney', category = 'robbery', title = 'ev_safe_deposit', fields = { { arg = 1, label = 'f_safe' }, { arg = 2, label = 'f_amount', kind = 'money' } } },
        { event = 'qb-moneysafe:server:WithdrawMoney', category = 'robbery', title = 'ev_safe_withdraw', flag = true, fields = { { arg = 1, label = 'f_safe' }, { arg = 2, label = 'f_amount', kind = 'money' } } },

        -- polícia (qb-policejob) / police
        { event = 'police:server:CuffPlayer', category = 'police', title = 'ev_cuff', target = 1, fields = { { arg = 2, label = 'f_soft', kind = 'bool' } } },
        { event = 'police:server:EscortPlayer', category = 'police', title = 'ev_escort', target = 1 },
        { event = 'police:server:SearchPlayer', category = 'police', title = 'ev_search' },
        { event = 'police:server:SeizeCash', category = 'police', title = 'ev_seize', target = 1 },
        { event = 'police:server:JailPlayer', category = 'police', title = 'ev_jail', target = 1, fields = { { arg = 2, label = 'f_months' } } },
        { event = 'police:server:BillPlayer', category = 'police', title = 'ev_bill', target = 1, fields = { { arg = 2, label = 'f_amount', kind = 'money' } } },
        { event = 'police:server:policeAlert', category = 'calls', title = 'ev_police_alert', fields = { { arg = 1, label = 'f_text' } } },

        -- polícia (drs_policejob)
        { event = 'drs_pd:cuff', category = 'police', title = 'ev_cuff', target = 1, fields = { { arg = 2, label = 'f_hard', kind = 'bool' } } },
        { event = 'drs_pd:uncuff', category = 'police', title = 'ev_uncuff', target = 1 },
        { event = 'drs_pd:escort', category = 'police', title = 'ev_escort', target = 1 },
        { event = 'drs_pd:search', category = 'police', title = 'ev_search_target', target = 1 },
        { event = 'drs_pd:putInVehicle', category = 'police', title = 'ev_put_vehicle', target = 1 },
        { event = 'drs_pd:takeOutVehicle', category = 'police', title = 'ev_take_vehicle', target = 1 },

        -- stand (qb-vehicleshop) / dealership
        { event = 'qb-vehicleshop:server:buyShowroomVehicle', category = 'vehicles', title = 'ev_buy_vehicle', fields = { { arg = 1, label = 'f_vehicle' } } },
        { event = 'qb-vehicleshop:server:financeVehicle', category = 'vehicles', title = 'ev_finance_vehicle', fields = { { arg = 3, label = 'f_vehicle' }, { arg = 1, label = 'f_down', kind = 'money' } } },
        { event = 'qb-vehicleshop:server:sellShowroomVehicle', category = 'vehicles', title = 'ev_sell_vehicle', target = 2 },
    },
}

-- Logs de outros scripts (qb-log) que vão para uma categoria própria em vez de "scripts".
-- Logs from other scripts (qb-log) that go to their own category instead of "scripts".
-- Logs de outros scripts que se ignoram porque o drs_logs já os faz (ex.: entradas/saídas do qb-core).
-- Logs from other scripts that are ignored because drs_logs already does them (e.g. qb-core joins/leaves).
Config.QbLogIgnore = { joinleave = true }

Config.QbLogRoutes = {
    joinleave = 'joins', ooc = 'chat', me = 'chat', death = 'deaths', ['combat-log'] = 'combatlog',
    playerinventory = 'inventory', drop = 'storage', trunk = 'storage', stash = 'storage', glovebox = 'storage',
    robbing = 'robbery', storerobbery = 'robbery', bankrobbery = 'robbery', jewelery = 'robbery', jewellery = 'robbery',
    truckrobbery = 'robbery', houserobbery = 'robbery', moneysafes = 'robbery', powerplants = 'robbery',
    cuffing = 'police', pmelding = 'police', ['112'] = 'calls',
    playermoney = 'money', moneyitems = 'money', banking = 'banking', casino = 'money',
    shops = 'shops', dealers = 'shops', pawnshop = 'shops',
    vehicleshop = 'vehicles', vehicleupgrades = 'vehicles', vehiclesales = 'vehicles', bennys = 'vehicles',
    bossmenu = 'jobs', gangmenu = 'jobs', recyclejob = 'jobs',
    report = 'reports', bans = 'staff', anticheat = 'anticheat', house = 'scripts', default = 'scripts',
}

-- Os scripts DRS (bridge com Bridge.Log) mandam os logs deles para aqui quando o drs_logs está ligado.
-- Para que categoria vai cada recurso (os outros vão para "scripts").
-- DRS scripts send their own logs here when drs_logs is running. Which category each resource goes to.
Config.ResourceRoutes = {
    drs_banking = 'banking', drs_vehicleshop = 'vehicles', drs_mechanic = 'vehicles', drs_insurance = 'vehicles',
    drs_policejob = 'police', drs_mdt = 'police', drs_prison = 'police', drs_bodycam = 'police', drs_fingerprint = 'police',
    drs_gps = 'police', drs_speedcam = 'police', drs_k9 = 'police', drs_communityservice = 'police',
    drs_dispatch = 'calls', drs_ambulancejob = 'ems', drs_tickets = 'reports', drs_admin = 'staff', drs_announce = 'staff',
    drs_bossmenu = 'jobs', drs_jobcreator = 'jobs', drs_drugsales = 'robbery', drs_zonewars = 'robbery',
    drs_crafting = 'inventory', drs_mining = 'jobs', drs_giftcodes = 'money', drs_battlepass = 'scripts', drs_halloween = 'scripts',
}

-- Substitui o qb-logs: aceita o evento qb-log:server:CreateLog de todos os scripts QBCore (desliga o qb-logs).
-- O nome do log escolhe a categoria (Config.QbLogRoutes); "tagEveryone" passa a alerta (menciona o cargo de ServerConfig.Ping).
-- Replaces qb-logs: accepts qb-log:server:CreateLog from every QBCore script (turn qb-logs off).
Config.CaptureQbLogs = true

#Configuração do servidor (webhooks e bot)

server_config.lua
-- DRS Logs — webhooks do Discord (só o servidor lê este ficheiro; nunca vão para os jogadores).
-- Discord webhooks (only the server reads this file; they never reach players).
-- Deixa vazio para não enviar essa categoria para o Discord (continua a aparecer no /logs).
-- Leave empty to skip Discord for that category (it still shows in /logs).

ServerConfig = {}

-- ---------------------------------------------------------------- canais criados sozinhos / auto-created channels
-- Com um bot do Discord, sempre que o recurso arranca verifica se existe a categoria e um canal por categoria de log.
-- O que faltar é criado dentro da categoria (com as permissões da categoria) e com o webhook já ligado:
-- não precisas de copiar webhooks. Os webhooks escritos mais abaixo têm prioridade.
-- With a Discord bot, every start checks the category and one channel per log category; whatever is missing is
-- created inside the category (synced with its permissions) with its webhook. Webhooks written below take priority.
--
-- O bot precisa das permissões / the bot needs: Ver canais, Gerir canais, Gerir webhooks (View/Manage Channels, Manage Webhooks)
ServerConfig.Discord = {
    enabled = true,
    -- token do bot: aqui ou na convar do server.cfg (set drs_logs_bot_token "..."), que tem prioridade
    -- bot token: here or in a server.cfg convar, which takes priority
    botToken = '',
    tokenConvar = 'drs_logs_bot_token',
    guildId = '',                      -- ID do servidor do Discord (vazio = o único servidor onde o bot está)
    category = '🔒・Logs',
    -- cargos que veem a categoria quando ela é criada (o @everyone fica sem ver) / roles that can see a new category
    staffRoles = {},
    -- nome do canal de cada categoria de log (false = sem canal) / channel name for each log category (false = none)
    channels = {
        joins      = '📥・entradas-saidas',
        chat       = '💬・chat',
        deaths     = '💀・mortes',
        combatlog  = '🚪・combat-log',
        shooting   = '🔫・disparos',
        explosions = '💥・explosoes',
        robbery    = '🦹・assaltos',
        police     = '🚓・policia',
        calls      = '🚨・chamadas-112',
        ems        = '🚑・inem',
        inventory  = '🎒・inventario',
        storage    = '🗄・cofres-e-malas',
        money      = '💰・dinheiro',
        banking    = '🏦・banco',
        shops      = '🛒・lojas',
        vehicles   = '🚗・veiculos',
        jobs       = '💼・empregos',
        reports    = '📨・reports',
        staff      = '⭐・staff',
        anticheat  = '🛡・anticheat',
        txadmin    = '🔨・txadmin',
        resources  = '📦・recursos',
        scripts    = '🧩・scripts',
    },
}

ServerConfig.Webhooks = {
    default    = '',   -- usado quando a categoria não tem webhook / used when a category has none
    all        = '',   -- recebe uma cópia de tudo / receives a copy of everything

    joins      = '',
    chat       = '',
    deaths     = '',
    shooting   = '',
    explosions = '',
    resources  = '',
    txadmin    = '',
    money      = '',
    jobs       = '',
    inventory  = '',
    robbery    = '',
    combatlog  = '',
    police     = '',
    calls      = '',
    ems        = '',
    storage    = '',
    banking    = '',
    shops      = '',
    vehicles   = '',
    reports    = '',
    staff      = '',
    anticheat  = '',
    scripts    = '',
}

-- Categorias que mencionam um cargo no Discord (ID do cargo). Ex.: explosions = '123456789012345678'
-- Categories that ping a Discord role (role ID).
ServerConfig.Ping = {
    explosions = '',
    combatlog  = '',
    robbery    = '',
}