Jump to content

Guardar LOGS MTA


Recommended Posts

Como eu poderia fazer para guardar logs do meu servidor em um arquivo de texto, logs de chat (td q é digitado ou comandos)... combate (quem atirou em quem ou matou quem com tal arma tal lugar)...  queria saber se isso é possivel, pq seria bom e ajudaria na moderação do servidor e em denuncias

Link to comment
  • Other Languages Moderators

Sim, é possível fazer. Você pode escolher algumas formas de fazer; algumas delas são: banco de dados ou um simples arquivo de texto. Há vários eventos que detectam o que aconteceu dentro do servidor, seja com jogadores ou o servidor em si. Deixarei abaixo alguns eventos que possam ser úteis:

[Antes de tudo, considere usar getRealTime para obter o horário e/ou dia que tal ação aconteceu. Em outras palavras, para ter um controle melhor sobre os acontecimentos.]

onPlayerChat - Pode ser útil para obter e armazenar as mensagem que os jogadores enviaram no servidor;
onPlayerCommand - Utilizado para obter os comandos que os jogadores executaram no servidor;
onPlayerWasted - Com esse evento, você pode obter o jogador que matou o outro, ou suicídio;
onPlayerChangeNick - Útil para obter a alteração do nome de um jogador; (Exemplo: fiz besteira no servidor e rapidamente mudei de nome. Com um registro em mãos, você iria ter uma prova)
onPlayerConnect - O evento é chamado assim que um jogador clica para entrar no servidor, isto é, antes de entrar, digamos assim. Decidi adicioná-lo a lista de eventos pois pode ser útil;
onPlayerPrivateMessage - Pode valer a pena salvar o registro de mensagens que os jogadores mandam via privado (/msg);
onPlayerLogin - O MTA por si só já salva os registros de logins, mas caso queira criar um do zero para o seu sistema, vá em frente.

Exemplo:

Spoiler

-- Tabela da classe
local LogSystem = {}

-- Variáveis. Apenas para manter o código editável
local FILEPATH = "logs/"
local FILENAME = "server"
local FILE_EXTENSION = "log"
local MAX_SIZE = 100 -- MB

function LogSystem:init()
    local o = setmetatable({}, {__index = LogSystem})

    -- Inicializar [file = arquivo, size = tamanho atual do arquivo, time = salvar horário?]
    o["file"] = nil
    o["size"] = 0
    o["time"] = nil

    local path = FILEPATH .. FILENAME .. "." .. FILE_EXTENSION
    local exist = fileExists(path)

    -- Se o arquivo não existir, vamos criá-lo
    if not exist then
        o["file"] = fileCreate(path)

        -- Criado com sucesso?
        if o["file"] then
            print("[LOG] Arquivo de registro foi criado com sucesso.")
        end
    else
        -- Caso o arquivo já exista, apenas carregue-o
        o["file"] = fileOpen(path)
        o["size"] = fileGetSize(o["file"])

        if (o["size"] > MAX_SIZE * 1000000) then -- O tamanho do arquivo é maior que MAX_SIZE? Se sim, enviaremos uma mensagem para o servidor
            outputChatBox("#cccccc[LOG] #ff6969ATENÇÃO! #ffffffO arquivo de LOG está maior que " .. MAX_SIZE .. "MB! [Tamanho: " .. string.format("%.1f", o["size"] / 1000000) .. "MB]", root, 255, 255, 255, true)
        end
    end

    return o
end

function LogSystem:option(option, ...)
    local args = {...}

    if option == "end" then
        fileClose(self["file"])
        print("[LOG] O registro do servidor foi desligado.")
    elseif option == "time" then
        local isBoolean = args[1] and type(args[1]) == "boolean"

        if isBoolean then
            self["time"] = args[1]
        end
    elseif option == "size" then
        print("[LOG] Tamanho do arquivo de registro: " .. (self["size"] * 1000000) .. "MB.")
    end
end

function LogSystem:update(message)
    if self["file"] then
        local now = self["time"] and {getRealTime().monthday, getRealTime().month + 1, getRealTime().year + 1900} or {"?", "?", "?"}

        fileWrite(self["file"], "[" .. now[3] .. "-" .. now[2] .. "-" .. now[1] .. "] " .. message .. "\n")
        fileFlush(self["file"])

        -- Atualizar o tamanho
        self["size"] = fileGetSize(self["file"])

        -- Feedback
        print("[LOG] Novo registro inserido no arquivo.")
    end
end

local log = LogSystem:init()
log:option("time", true)

addEventHandler("onPlayerChat", root, function(message)
    local str = getPlayerName(source) .. ": " .. message

    log:update(str)
end)

addEventHandler("onPlayerCommand", root, function(command)
    local str = getPlayerName(source) .. " executou /" .. command

    log:update(str)
end)

addEventHandler("onPlayerWasted", root, function(ammo, attacker)
    local str

    if not attacker then
        str = getPlayerName(source) .. " se suicidou."
    else
        if isElement(attacker) then
            str = getPlayerName(attacker) .. " matou " .. getPlayerName(source)
        end
    end

    log:update(str)
end)

addEventHandler("onPlayerChangeNick", root, function(old, new, byScript)
    local str
    local check = byScript and " [ALTERADO POR SCRIPT]" or ""

    str = old .. " agora chama-se " .. new .. check

    log:update(str)
end)

 

Imagem do arquivo de registro:

Spoiler

spacer.png

Lembrando que é possível salvar qualquer tipo de registro, basta usar a criatividade.

  • Like 1
  • Thanks 1
Link to comment

Bem interessante, mas isso não causaria lag no servidor né? Ou o armazenamento continuo desses dados poderia ocasionar aumento dos MS do servidor ou algo do tipo?
Outra pergunta, tem alguma variavel onde eu consiga detectar dano que um player deu em alguem e detectar a arma utilizada pelo mesmo, as vezes o cara so deu um tiro e eu gostaria de saber se tem como detectar isso com por exemplo o onPlayerDamage , da para detectar quem atacou com o attacker, mas como faço para detectar quem recebeu? e é possivel obter a arma utilizada? Desde já muito obrigado pela ajuda que estão me dando @andreisrww e @Lord Henry .

Link to comment
12 hours ago, Lord Henry said:

Apenas uma observação: onPlayerCommand também é chamado ao mandar mensagens no chat, pois internamente vc está usando o comando /say Mensagem

Então eu poderia usar somente o onPlayerCommand e não seria necessario o onPlayerChat né? A não ser que eu quise-se obter 2 logs separadas uma só de comandos e outra so de chats para ficar mais organizado? Mas so o onPlayerCommand ja funcionaria para isso?

Alem de que acho que da pra por uns IF's e separar os comandos /say e os demais comandos, como eu poderia fazer isso? Pq ai eu poderia separar os comandos que foram enviados normalmente, do /say e /deepweb por exemplo e teria as logs completas. 

Link to comment
  • Other Languages Moderators
19 hours ago, Soull_Sec said:

Então eu poderia usar somente o onPlayerCommand e não seria necessario o onPlayerChat né?

A diferença é que o onPlayerChat só é chamado quando uma mensagem é enviada, seja ela pelo /say, /teamsay ou /me.

Enquanto o outro é chamado em todos os comandos, inclusive de chat.

Edited by Lord Henry
  • Thanks 1
Link to comment
  • Moderators

onPlayerCommand pode sobrecarregar além do esperado o servidor/arquivo de log; se for um server com 300 player pra cima, acho que o dono deve pensar bem antes de fazer um log com esse evento, embora eu nunca tenha feito testes então não sei qual as reais consequências.


Se optar por utilizar: tenha em mente também que esse evento é chamado mesmo que tal comando não exista no jogo; fazer uma verificação com wasEventCancelled e definir um cooldown na execução para cada jogador.

  • Thanks 1
Link to comment
15 hours ago, DNL291 said:

onPlayerCommand pode sobrecarregar além do esperado o servidor/arquivo de log; se for um server com 300 player pra cima, acho que o dono deve pensar bem antes de fazer um log com esse evento, embora eu nunca tenha feito testes então não sei qual as reais consequências.


Se optar por utilizar: tenha em mente também que esse evento é chamado mesmo que tal comando não exista no jogo; fazer uma verificação com wasEventCancelled e definir um cooldown na execução para cada jogador.

Hmmm, ok, muito obrigado :) 

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...