Exemplos Práticos

🎮 Sistema de Notificações de Player

-- Notificar quando players conectam/desconectam
addEventHandler("onPlayerJoin", root, function()
    local playerName = getPlayerName(source)
    local playerSerial = getPlayerSerial(source)
    local playerIP = getPlayerIP(source)
    
    LockSystem.Webhook.sendDiscordEmbed("https://discord.com/api/webhooks/YOUR_WEBHOOK",
        "👋 Player Conectado",
        "**" .. playerName .. "** entrou no servidor", {
        color = 65280,  -- Verde
        fields = {
            {name = "Serial", value = playerSerial, inline = true},
            {name = "IP", value = playerIP, inline = true},
            {name = "Hora", value = os.date("%H:%M:%S"), inline = true},
            {name = "Players Online", value = tostring(#getElementsByType("player")), inline = true}
        },
        footer = {text = "Sistema de Monitoramento"},
        timestamp = true
    })
end)

addEventHandler("onPlayerQuit", root, function(quitType, reason, responsibleElement)
    local playerName = getPlayerName(source)
    local timeOnline = math.floor((getTickCount() - (getElementData(source, "joinTime") or 0)) / 60000)
    
    LockSystem.Webhook.sendDiscordEmbed("https://discord.com/api/webhooks/YOUR_WEBHOOK",
        "👋 Player Desconectado", 
        "**" .. playerName .. "** saiu do servidor", {
        color = 16776960,  -- Amarelo
        fields = {
            {name = "Tempo Online", value = timeOnline .. " minutos", inline = true},
            {name = "Motivo", value = reason or "Desconhecido", inline = true},
            {name = "Tipo", value = quitType, inline = true}
        },
        footer = {text = "Sistema de Monitoramento"},
        timestamp = true
    })
end)

🔨 Log de Ações Administrativas

-- Monitorar comandos administrativos
local adminCommands = {"ban", "kick", "mute", "warn", "tp", "givemoney"}

for _, cmd in ipairs(adminCommands) do
    addCommandHandler(cmd, function(player, command, target, ...)
        if not hasObjectPermissionTo(player, "general.administrator") then
            return
        end
        
        local adminName = getPlayerName(player)
        local args = table.concat({...}, " ")
        
        -- Executar comando normal primeiro
        -- ... código do comando ...
        
        -- Depois notificar via webhook
        LockSystem.Webhook.sendDiscordEmbed("https://discord.com/api/webhooks/ADMIN_WEBHOOK",
            "🔨 Ação Administrativa",
            "**" .. adminName .. "** executou: `/" .. command .. "`", {
            color = 15158332,  -- Vermelho
            fields = {
                {name = "Alvo", value = target or "N/A", inline = true},
                {name = "Argumentos", value = args ~= "" and args or "Nenhum", inline = true},
                {name = "Servidor", value = getServerName(), inline = true}
            },
            footer = {text = "Log Administrativo"},
            timestamp = true
        })
    end)
end

💰 Sistema de Alertas Financeiros

-- Alertar sobre transações suspeitas
function onMoneyTransaction(player, amount, reason)
    local playerName = getPlayerName(player)
    local playerMoney = getPlayerMoney(player)
    
    -- Alertar se transação muito alta
    if amount > 1000000 then
        LockSystem.Webhook.sendDiscordEmbed("https://discord.com/api/webhooks/FINANCIAL_WEBHOOK",
            "💰 Transação Suspeita",
            "Transação de alto valor detectada", {
            color = 16776960,  -- Amarelo
            fields = {
                {name = "Player", value = playerName, inline = true},
                {name = "Valor", value = "$" .. formatMoney(amount), inline = true},
                {name = "Saldo Atual", value = "$" .. formatMoney(playerMoney), inline = true},
                {name = "Motivo", value = reason, inline = false}
            },
            footer = {text = "Sistema Anti-Fraude"},
            timestamp = true
        })
    end
    
    -- Log de todas as transações importantes
    if amount > 100000 then
        LockSystem.Webhook.sendLog("info", "Transação financeira registrada", {
            player = playerName,
            amount = amount,
            reason = reason,
            balance_after = playerMoney
        })
    end
end

🚨 Sistema de Alertas de Segurança

-- Alertar sobre tentativas de hack
addEventHandler("onElementDataChange", root, function(dataName, oldValue, newValue)
    if getElementType(source) == "player" and dataName == "money" then
        local expectedMoney = getElementData(source, "expected_money") or 0
        
        -- Se money foi alterado sem ser pelo sistema oficial
        if math.abs(newValue - expectedMoney) > 1000 then
            local playerName = getPlayerName(source)
            local playerSerial = getPlayerSerial(source)
            
            LockSystem.Webhook.sendDiscordEmbed("https://discord.com/api/webhooks/SECURITY_WEBHOOK",
                "🚨 Possível Hack Detectado",
                "Alteração suspeita de dinheiro detectada", {
                color = 15158332,  -- Vermelho
                fields = {
                    {name = "Player", value = playerName, inline = true},
                    {name = "Serial", value = playerSerial, inline = true},
                    {name = "Valor Anterior", value = "$" .. formatMoney(oldValue), inline = true},
                    {name = "Valor Atual", value = "$" .. formatMoney(newValue), inline = true},
                    {name = "Diferença", value = "$" .. formatMoney(newValue - oldValue), inline = true},
                    {name = "Ação", value = "Player foi kickado", inline = true}
                },
                footer = {text = "Sistema Anti-Hack"},
                timestamp = true
            })
            
            -- Kick automático
            kickPlayer(source, "Alteração não autorizada de dinheiro")
        end
    end
end)

📊 Relatórios Automáticos de Status

-- Relatório de status a cada 30 minutos
setTimer(function()
    local stats = {
        players_online = #getElementsByType("player"),
        vehicles_spawned = #getElementsByType("vehicle"),
        uptime = getTickCount(),
        memory_usage = collectgarbage("count"),
        resources_running = #getResources()
    }
    
    -- Usar cache para comparar com relatório anterior
    local lastStats = LockSystem.Cache.get("last_server_stats") or {}
    LockSystem.Cache.set("last_server_stats", stats, 1800)
    
    local uptimeHours = math.floor(stats.uptime / 3600000)
    local uptimeMinutes = math.floor((stats.uptime % 3600000) / 60000)
    
    LockSystem.Webhook.sendDiscordEmbed("https://discord.com/api/webhooks/STATUS_WEBHOOK",
        "📊 Relatório de Status",
        "Relatório automático do servidor", {
        color = 3447003,  -- Azul
        fields = {
            {name = "👥 Players Online", value = tostring(stats.players_online), inline = true},
            {name = "🚗 Veículos", value = tostring(stats.vehicles_spawned), inline = true},
            {name = "⏱️ Uptime", value = uptimeHours .. "h " .. uptimeMinutes .. "m", inline = true},
            {name = "🧠 Memória", value = math.floor(stats.memory_usage) .. "KB", inline = true},
            {name = "📦 Resources", value = tostring(stats.resources_running), inline = true},
            {name = "🔄 Status", value = "🟢 Online", inline = true}
        },
        footer = {text = "Relatório Automático - " .. getServerName()},
        timestamp = true
    })
    
end, 1800000, 0)  -- A cada 30 minutos

🎯 Templates Pré-definidos

-- Usar templates para padronizar notificações
local template = LockSystem.Webhook.template("player_join", {
    player_name = "João123",
    player_serial = "ABC123456789", 
    player_ip = "192.168.1.100",
    timestamp = os.date("%H:%M:%S")
})

-- Template já formatado, só enviar
LockSystem.Webhook.sendDiscordEmbed("https://discord.com/api/webhooks/YOUR_WEBHOOK",
    template.title, template.description, {
    color = template.color,
    fields = template.fields
})

-- Templates disponíveis:
-- "player_join" - Player conectando
-- "player_leave" - Player desconectando  
-- "admin_action" - Ação administrativa
-- "error" - Erro do sistema

Atualizado