fivem-discord-webhook-logs

fivem-discord-webhook-logs

Logguer les events critiques de ton serveur FiveM (kills, kicks, bans, transactions économiques) vers un channel Discord. Setup complet sur Wisp chez VeryCloud avec ressource sur mesure ou solution existante.

Introduction

Avoir tes logs serveur dans Discord = monitoring quasi-temps réel, accessible à tout ton staff, sans avoir besoin d'ouvrir un panel. Combiné avec des notifications mobile Discord, tu sais immédiatement si quelque chose part en vrille. Ce guide t'explique comment poser ça proprement sur ton FiveM Wisp VeryCloud.

Prérequis

  • Un serveur FiveM chez VeryCloud
  • Un serveur Discord où tu as les droits admin
  • Accès Files dans Wisp

Étape 1 : Créer le webhook Discord

  1. Ouvre ton serveur Discord
  2. Crée un channel (ex : #logs-fivem)
  3. Clic droit sur le channel → Edit ChannelIntegrationsWebhooks
  4. New Webhook → nomme-le, copie l'URL (format https://discord.com/api/webhooks/.../...)

Garde cette URL secrète : qui la possède peut poster dans ton channel.

Étape 2 : Choisir une approche

Plusieurs options :

ApprocheDifficultéFlexibilité
Ressource existante (logs-system, ox_logger)FacileLimitée aux events prévus
Logger custom LuaMoyenneTotale
Bridge externe (Node.js + RCON)Plus complexeTrès flexible

Ce guide montre la voie 2 — logger custom Lua — la plus polyvalente.

Étape 3 : Créer la ressource logger

Dans Wisp → Files/resources/[utils]/discord_logger/ :

fxmanifest.lua :

fx_version 'cerulean'
game 'gta5'
author 'VeryCloud'
description 'Discord webhook logger'
version '1.0.0'

server_scripts {
    'config.lua',
    'logger.lua'
}

config.lua :

Config = {}

Config.Webhooks = {
    -- Un webhook par categorie
    general    = 'https://discord.com/api/webhooks/.../GENERAL',
    admin      = 'https://discord.com/api/webhooks/.../ADMIN',
    economy    = 'https://discord.com/api/webhooks/.../ECONOMY',
    moderation = 'https://discord.com/api/webhooks/.../MODERATION',
}

Config.BotName = 'VeryCloud Logs'
Config.BotAvatar = 'https://verycloud.fr/static/brand.svg'

logger.lua :

local function send(category, embed)
    local url = Config.Webhooks[category]
    if not url then return end

    PerformHttpRequest(url, function(err, _, _)
        if err and err ~= 204 then
            print('[discord_logger] HTTP error: ' .. err)
        end
    end, 'POST', json.encode({
        username = Config.BotName,
        avatar_url = Config.BotAvatar,
        embeds = { embed }
    }), { ['Content-Type'] = 'application/json' })
end

exports('log', function(category, title, description, color, fields)
    send(category, {
        title = title,
        description = description,
        color = color or 3447003,  -- bleu par defaut
        fields = fields or {},
        timestamp = os.date('!%Y-%m-%dT%H:%M:%SZ'),
        footer = {
            text = GetCurrentResourceName()
        }
    })
end)

Étape 4 : Ajouter la ressource

Dans /server.cfg :

ensure discord_logger

Restart.

Étape 5 : Utilisation depuis d'autres ressources

Depuis n'importe quelle ressource de ton serveur :

exports.discord_logger:log(
    'moderation',
    'Joueur kick',
    'Mathys a kick PlayerXYZ',
    15158332,  -- couleur rouge
    {
        { name = 'Modérateur', value = 'Mathys', inline = true },
        { name = 'Joueur', value = 'PlayerXYZ', inline = true },
        { name = 'Raison', value = 'AFK trop long', inline = false }
    }
)

Étape 6 : Hook sur les events natifs FiveM

Pour logger les connexions/déconnexions automatiquement, ajoute dans logger.lua :

AddEventHandler('playerConnecting', function(name, _, deferrals)
    local id = source
    local identifiers = GetPlayerIdentifiers(id)
    exports.discord_logger:log('general', 'Connexion', name, 3066993, {
        { name = 'Steam', value = identifiers[1] or 'N/A', inline = true },
        { name = 'Player ID', value = tostring(id), inline = true }
    })
end)

AddEventHandler('playerDropped', function(reason)
    local name = GetPlayerName(source) or 'Inconnu'
    exports.discord_logger:log('general', 'Deconnexion', name, 10038562, {
        { name = 'Raison', value = reason, inline = false }
    })
end)

Étape 7 : Logger les commandes admin

Si tu utilises ACE ou un framework :

RegisterCommand('kick', function(source, args)
    if IsPlayerAceAllowed(source, 'command.kick') then
        local target = tonumber(args[1])
        local reason = table.concat(args, ' ', 2)
        DropPlayer(target, reason)

        exports.discord_logger:log('moderation',
            'Kick admin',
            ('%s a kick %s'):format(GetPlayerName(source), GetPlayerName(target)),
            15158332,
            { { name = 'Raison', value = reason } }
        )
    end
end)

Étape 8 : Rate-limiting

Discord webhook : 30 requêtes / minute par webhook. Au-delà, 429 Too Many Requests.

Pour éviter ça avec un serveur très actif, batch les logs :

local queue = {}
local flushInterval = 5  -- secondes

CreateThread(function()
    while true do
        Wait(flushInterval * 1000)
        for category, embeds in pairs(queue) do
            if #embeds > 0 then
                send(category, { embeds = embeds })
                queue[category] = {}
            end
        end
    end
end)

Étape 9 : Sécurité du webhook

  • Ne jamais commit le webhook URL sur Git (ajoute config.lua à .gitignore)
  • Régénère l'URL si elle fuite (Discord → Edit Webhook → Reset)
  • Channel privé réservé au staff côté Discord
  • Ne logue jamais d'infos sensibles (mdp, paiements complets, données perso) : RGPD oblige

Étape 10 : Alternatives clé en main

Si tu ne veux pas coder :

  • screenshot-basic + logs-system : ressources gratuites qui font déjà ça
  • ox_logger (Overextended) : intégré aux frameworks ox
  • es_extended intègre un système de logs Discord configurable

Pour un setup rapide, utilise ces ressources. Pour de la finesse et un parfait contrôle, ton logger custom comme ci-dessus.

Dépannage

Pas de message Discord, pas d'erreur

  • Webhook URL incorrecte (copie-colle parfait depuis Discord)
  • Channel supprimé / webhook révoqué côté Discord

429 Too Many Requests

  • Trop de logs par minute → batch ou diminue la verbosité
  • Mets un cooldown serveur sur les logs identiques

Embed cassé

  • Discord limite la taille des champs (1024 chars par field, 6000 chars total)
  • Tronque les longs textes

Commandes utiles

# Tester un webhook depuis ton PC
curl -X POST -H "Content-Type: application/json" \
  -d '{"content":"Test depuis CLI"}' \
  https://discord.com/api/webhooks/.../...

# Resetter un webhook côté Discord
# -> Edit Channel / Integrations / Webhooks / [...] / Reset URL

Conclusion

Logger Discord = obligatoire pour tout serveur FiveM communautaire. 30 minutes pour poser une ressource custom, et ton staff a une visibilité totale sur tout ce qui se passe en temps réel. Choisis avec soin ce que tu logues (RGPD), batch les logs si volume important, et garde tes webhooks privés.

Pour aller plus loin : niveaux de log (info/warn/error), alerting sur seuils via webhook Discord avec @here, intégration avec un APM externe.

Ressources

Rejoignez notre serveur communautaire Discord

Pour toute question, suggestion ou simplement pour discuter avec la communauté, rejoignez-nous sur Discord !

900+Membres