Soull_Sec Posted June 20, 2020 Share Posted June 20, 2020 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 androksi Posted June 21, 2020 Other Languages Moderators Share Posted June 21, 2020 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 Lembrando que é possível salvar qualquer tipo de registro, basta usar a criatividade. 1 1 Link to comment
Other Languages Moderators Lord Henry Posted June 21, 2020 Other Languages Moderators Share Posted June 21, 2020 Apenas uma observação: onPlayerCommand também é chamado ao mandar mensagens no chat, pois internamente vc está usando o comando /say Mensagem 1 1 Link to comment
Soull_Sec Posted June 21, 2020 Author Share Posted June 21, 2020 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
Soull_Sec Posted June 21, 2020 Author Share Posted June 21, 2020 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 Lord Henry Posted June 22, 2020 Other Languages Moderators Share Posted June 22, 2020 (edited) 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 June 22, 2020 by Lord Henry 1 Link to comment
DNL291 Posted June 23, 2020 Share Posted June 23, 2020 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. 1 Link to comment
Soull_Sec Posted June 23, 2020 Author Share Posted June 23, 2020 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now