From f142aa1b705ea39b1087c8d7068a48784459ca17 Mon Sep 17 00:00:00 2001 From: BrunoMine Date: Thu, 19 Jul 2018 16:29:31 -0300 Subject: [PATCH] Sistema de penalidades --- comparar_tempo.lua | 246 ++++++++++++++++++++++++++++++++++ init.lua | 2 + recursos/moderadores.lua | 4 +- recursos/penalidades.lua | 279 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 530 insertions(+), 1 deletion(-) create mode 100644 comparar_tempo.lua create mode 100644 recursos/penalidades.lua diff --git a/comparar_tempo.lua b/comparar_tempo.lua new file mode 100644 index 0000000..ee71f0d --- /dev/null +++ b/comparar_tempo.lua @@ -0,0 +1,246 @@ +--[[ + Mod Gestor para Minetest + Copyright (C) 2018 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Contador de tempo + ]] + +-- Quantos dias tem cada mes +local dias_meses = { + 31, -- Janeiro + 28, -- Fevereiro (29 em ano bissexto) + 31, -- Março + 30, -- Abril + 31, -- Maio + 30, -- Junho + 31, -- Julho + 31, -- Agosto + 30, -- Setembro + 31, -- Outubro + 30, -- Novembro + 31 -- Dezembro +} + +-- Pegar dias do mes naquele ano +local pegar_dias_mes = function(mes, ano) + + -- converter para valor numerico + mes = tonumber(mes) + ano = tonumber(ano) + + -- ajustando para numero entre 1 e 12 + if mes > 12 then mes = mes - (math.floor(mes/12)*12) end + + -- caso o mes de zero + if mes == 0 then mes = 12 end + + if mes == 2 and math.fmod(ano, 4) == 0 then + return dias_meses[mes] + 1 + else + return dias_meses[mes] + end +end + +-- Pegar numero maior +local pegar_maior = function(n1, n2) + if tonumber(n1) > tonumber(n2) then + return n1 + else + return n2 + end +end + +-- Pegar numero menor +local pegar_menor = function(n1, n2) + if n1 < n2 then + return n1 + else + return n2 + end +end + +-- Comparar data +--[[ + Esse metodo recebe uma data como argumento e retorna + as quantidades de dias, horas e minutos em relação à + data atual + Retorno: + + + + Argumentos: + + + + + + ]] +gestor.comparar_data = function(ano, mes, dia, hora, minuto) + if not ano or not tonumber(ano) then + minetest.log("error", "[Gestor] Ano invalido em especificado (em gestor.comparar_data)") + return false + end + if not mes or not tonumber(mes) then + minetest.log("error", "[Gestor] Mes invalido em especificado (em gestor.comparar_data)") + return false + end + if not dia or not tonumber(dia) then + minetest.log("error", "[Gestor] Dia invalido em especificado (em gestor.comparar_data)") + return false + end + if not hora or not tonumber(hora) then + minetest.log("error", "[Gestor] Hora invalido em especificado (em gestor.comparar_data)") + return false + end + if not minuto or not tonumber(minuto) then + minetest.log("error", "[Gestor] Minuto invalido em especificado (em gestor.comparar_data)") + return false + end + + -- Conversoes + ano = tonumber(ano) + mes = tonumber(mes) + dia = tonumber(dia) + hora = tonumber(hora) + minuto = tonumber(minuto) + + -- Pegando data atual + local ano_atual = tonumber(os.date("%Y")) + local mes_atual = tonumber(os.date("%m")) + local dia_atual = tonumber(os.date("%d")) + local hora_atual = tonumber(os.date("%H")) + local minuto_atual = tonumber(os.date("%M")) + + -- Pegar diferença de ano + local dif_ano = ano - ano_atual + + -- Pegar diferença de meses + local dif_meses = mes - (mes_atual - (dif_ano*12)) -- (considerando os meses de um ano para outro) + + -- Pegar a diferença de dias + local dif_dias = 0 + -- Pegar dias dos meses que passaram + if dif_meses > 0 then -- do mes atual ate o mes futuro (apenas os meses inteiros, logo o ultimo nao conta, por isso o menos 1) + local a = ano_atual -- ano do mes contado + local n = mes_atual -- qual mes do ano contado + for m=mes_atual, mes_atual+dif_meses-1 do + if n > 12 then + n = n - 12 + a = a + 1 + end + dif_dias = dif_dias + pegar_dias_mes(m, a) + n = n + 1 + end + elseif dif_meses < 0 then -- do mes passado do passado ate o mes atual + local a = ano -- ano do mes contado + local n = mes -- qual mes do ano contado + for m=mes, mes+math.abs(dif_meses)-1 do + if n > 12 then + n = n - 12 + a = a + 1 + end + dif_dias = dif_dias + pegar_dias_mes(m, a) + n = n + 1 + end + dif_dias = dif_dias * (-1) -- mantem valor negativo por estar no passado + end + -- Adiciona a diferença de dias conforme os dias do mes de cada data + dif_dias = dif_dias + (dia - dia_atual) + + -- Pegar diferença de horas + local dif_horas = 0 + if dif_dias > 0 then + if hora >= hora_atual then + dif_horas = hora - hora_atual + else + dif_dias = dif_dias - 1 + dif_horas = (hora + 24) - hora_atual + end + elseif dif_dias < 0 then + dif_dias = dif_dias + 1 -- (1 dia é tirado para ser fracionado em horas pois 1 desses dias não foi inteiro) + dif_horas = (24-hora) + hora_atual -- (desconta as horas de 24 horas de um dia que foi descontado) + if dif_horas >= 24 then + dif_dias = dif_dias - 1 + dif_horas = dif_horas - 24 + end + dif_horas = dif_horas * (-1) -- mantem valor negativo por estar no passado + else -- A data é do mesmo dia + dif_horas = hora - hora_atual + end + + -- Pegar diferença de minutos + local dif_minutos = 0 + if dif_horas > 0 then + if minuto >= minuto_atual then + dif_minutos = minuto - minuto_atual + else + dif_horas = dif_horas - 1 + dif_minutos = (minuto + 60) - minuto_atual + end + elseif dif_horas < 0 then + dif_horas = dif_horas + 1 -- (1 dia é tirado para ser fracionado em horas pois 1 desses dias não foi inteiro) + dif_minutos = (60-minuto) + minuto_atual -- (desconta as horas de 24 horas de um dia que foi descontado) + if dif_minutos >= 60 then + dif_horas = dif_horas - 1 + dif_minutos = dif_minutos - 60 + end + dif_minutos = dif_minutos * (-1) -- mantem valor negativo por estar no passado + else -- A data é da mesma hora + dif_minutos = minuto - minuto_atual + end + + -- Reajuste de valores (caso o saldo de horas esteja incompativel com saldo de dias) + if dif_horas > 1 and dif_dias < 1 then + dif_dias = dif_dias + 1 + dif_horas = dif_horas - 24 + end + if dif_horas < 1 and dif_dias > 1 then + dif_dias = dif_dias - 1 + dif_horas = dif_horas + 24 + end + + return dif_dias, dif_horas, dif_minutos + +end + +-- Calcular data_fim +-- Tabela de argumentos +-- data_add = { +-- anos = 1, -- Anos para para o fim +-- meses = 1, -- Idem +-- dias = 1, -- Idem +-- horas = 1, -- idem +-- minutos = 1, -- idem +-- } +gestor.calcular_data_fim = function(data_add) + local data_atual = os.date("%Y %m %d %H %M") + data_atual = string.split(data_atual, " ") + local data_fim = { + tonumber(data_atual[1]+data_add.anos), + tonumber(data_atual[2]+data_add.meses), + (tonumber(data_atual[3])+data_add.dias), + (tonumber(data_atual[4])+data_add.horas), + (tonumber(data_atual[5])+data_add.minutos) + } + if data_fim[5] >= 60 then + data_fim[4] = data_fim[4] + 1 + data_fim[5] = data_fim[5] - 60 + end + if data_fim[4] >= 24 then + data_fim[3] = data_fim[3] + 1 + data_fim[4] = data_fim[4] - 24 + end + if data_fim[3] > 30 then + data_fim[2] = data_fim[2] + 1 + data_fim[3] = data_fim[3] - 30 + end + if data_fim[2] > 12 then + data_fim[1] = data_fim[1] + 1 + data_fim[2] = data_fim[2] - 12 + end + return data_fim +end diff --git a/init.lua b/init.lua index 93e28cf..67f587d 100644 --- a/init.lua +++ b/init.lua @@ -28,10 +28,12 @@ gestor.bd = dofile(modpath.."/lib/memor.lua") notificar("Carregando...") dofile(modpath.."/diretrizes.lua") dofile(modpath.."/menu_principal.lua") +dofile(modpath.."/comparar_tempo.lua") dofile(modpath.."/comandos.lua") -- Recursos dofile(modpath.."/recursos/desligar.lua") dofile(modpath.."/recursos/conf.lua") dofile(modpath.."/recursos/moderadores.lua") +dofile(modpath.."/recursos/penalidades.lua") dofile(modpath.."/recursos/alerta_de_crash.lua") notificar("OK") diff --git a/recursos/moderadores.lua b/recursos/moderadores.lua index ce16c5a..2759b44 100644 --- a/recursos/moderadores.lua +++ b/recursos/moderadores.lua @@ -120,7 +120,7 @@ minetest.register_on_prejoinplayer(function(name) -- Mensagem local msg = minetest.settings:get("gestor_aviso_interditado") or "" - if gestor.interditado ~= false then return msg end + if gestor.interditado == false then return end local staff_list = gestor.bd.pegar("staff", "list") local staff_list_i = {} @@ -132,3 +132,5 @@ minetest.register_on_prejoinplayer(function(name) return msg end end) + + diff --git a/recursos/penalidades.lua b/recursos/penalidades.lua new file mode 100644 index 0000000..8f9db7b --- /dev/null +++ b/recursos/penalidades.lua @@ -0,0 +1,279 @@ +--[[ + Mod Gestor para Minetest + Gestor v2.0 Copyright (C) 2018 BrunoMine (https://github.com/BrunoMine) + + Recebeste uma cópia da GNU Lesser General + Public License junto com esse software, + se não, veja em . + + Castigo a jogadores + ]] + + +-- Controle de acessos +local acessos = {} +minetest.register_on_joinplayer(function(player) + acessos[player:get_player_name()] = {} +end) +minetest.register_on_leaveplayer(function(player) + acessos[player:get_player_name()] = nil +end) + +-- Penalidades +local penas = { + "Silenciar", + "Banir", +} + +-- Gera string para formspec +local penas_list_string = "" +for _,name in ipairs(penas) do + if penas_list_string ~= "" then penas_list_string = penas_list_string .. "," end + penas_list_string = penas_list_string .. name +end + +-- Tempos para penalidades +local tempos_penas = { + "1 minuto", + "5 minutos", + "15 minutos", + "30 minutos", + "1 hora", + "6 horas", + "12 horas", + "1 dia", + "2 dias", + "3 dias", + "4 dias", + "5 dias", + "10 dias", + "15 dias", + "20 dias", + "25 dias", + "30 dias", + "2 meses", + "3 meses", + "4 meses", + "5 meses", + "6 meses", + "1 ano", + "2 anos", + "sempre" +} +-- Gera string para formspec +local tempos_penas_list_string = "" +for _,name in ipairs(tempos_penas) do + if tempos_penas_list_string ~= "" then tempos_penas_list_string = tempos_penas_list_string .. "," end + tempos_penas_list_string = tempos_penas_list_string .. name +end + + +-- Registrar aba 'diretrizes' +gestor.registrar_aba("penalidades", { + titulo = "Penalidades", + get_formspec = function(name) + + local formspec = "label[3.5,1;Penalidades]" + + .."field[3.8,2.3;5,1;jogador;Jogador a penalizar;]" + .."button[3.5,2.9;5,1;rem_pena;Remover Penalidades]" + + .."label[8.5,1.65;Pena]" + .."dropdown[8.5,2.08;3,1;tipo_pena;"..penas_list_string..";]" + .."label[11.4,1.65;Tempo]" + .."dropdown[11.4,2.08;2,1;tempo_pena;"..tempos_penas_list_string..";]" + .."button[8.5,2.9;5,1;add_pena;Aplicar Penalidade]" + + if acessos[name].aviso_penalidades then + formspec = formspec.."label[3.5,3.8;"..acessos[name].aviso_penalidades.."]" + acessos[name].aviso_penalidades = nil + end + + return formspec + end, + on_receive_fields = function(player, fields) + local name = player:get_player_name() + + -- Adicionar pena + if fields.add_pena then + -- Verificar nome informado + if fields.jogador == "" then + acessos[name].aviso_penalidades = "Nenhum jogador informado" + gestor.menu_principal(name) + return + end + + -- Penalizar jogador + gestor.penalizar(fields.jogador, fields.tipo_pena, fields.tempo_pena) + acessos[name].aviso_penalidades = "Penalidade aplicada em "..fields.jogador + gestor.menu_principal(name) + + -- Remover pena + elseif fields.rem_pena then + -- Verificar nome informado + if fields.jogador == "" then + acessos[name].aviso_penalidades = "Nenhum jogador informado" + gestor.menu_principal(name) + return + end + + for _,p in ipairs(penas) do + gestor.remover_penalidade(fields.jogador, p) + end + acessos[name].aviso_penalidades = "Todas penalidades removidas de "..fields.jogador + gestor.menu_principal(name) + end + + end, +}) + +-- Remover penalidade +gestor.remover_penalidade = function(name, pena) + if pena == "Banir" then + gestor.bd.remover("penalizados", "Banir_"..name) + + elseif pena == "Silenciar" then + + local privs = minetest.get_player_privs(name) + privs.shout = true + minetest.set_player_privs(name, privs) + gestor.bd.remover("penalizados", "Silenciar_"..name) + end +end + +-- Penalizar jogador +gestor.penalizar = function(name, pena, tempo) + + -- Em caso de banimento ja expulsa do servidor + if pena == "Banir" then + minetest.kick_player(name, "Foste expulso do servidor") + end + + -- Remove priv shout se for silenciar + if pena == "Silenciar" then + local privs = minetest.get_player_privs(name) + privs.shout = nil + minetest.set_player_privs(name, privs) + end + + if tempo == "sempre" then + -- Salva pena no banco de dados + gestor.bd.salvar("penalizados", pena.."_"..name, "sempre") + return + end + + -- Calcular data a ser adicionada para contagem + local data_add = {} + local t = string.split(tempo, " ") + if t[2] == "minuto" or t[2] == "minutos" then + data_add = { + minutos = tonumber(t[1]), + horas = 0, + dias = 0, + meses = 0, + anos = 0, + } + elseif t[2] == "hora" or t[2] == "horas" then + data_add = { + minutos = 0, + horas = tonumber(t[1]), + dias = 0, + meses = 0, + anos = 0, + } + elseif t[2] == "dia" or t[2] == "dias" then + data_add = { + minutos = 0, + horas = 0, + dias = tonumber(t[1]), + meses = 0, + anos = 0, + } + elseif t[2] == "mes" or t[2] == "meses" then + data_add = { + minutos = 0, + horas = 0, + dias = 0, + meses = tonumber(t[1]), + anos = 0, + } + elseif t[2] == "ano" or t[2] == "anos" then + data_add = { + minutos = 0, + horas = 0, + dias = 0, + meses = 0, + anos = tonumber(t[1]), + } + end + + local data_fim = gestor.calcular_data_fim(data_add) + + -- Salva pena no banco de dados + gestor.bd.salvar("penalizados", pena.."_"..name, data_fim) +end + +-- Impedir jogadores banidos de reconectar +minetest.register_on_prejoinplayer(function(name) + + -- Verificar se existe pena de banimento no banco de dados + if gestor.bd.verif("penalizados", "Banir_"..name) ~= true then return end + + -- Verificar data + local data_fim = gestor.bd.pegar("penalizados", "Banir_"..name) + + -- Caso seja banimento permanente + if data_fim == "sempre" then + return "Foste banido permanentemente deste servidor" + + -- Caso seja banimento temporario + else + local dif_dias, dif_horas, dif_minutos = gestor.comparar_data(data_fim[1], data_fim[2], data_fim[3], data_fim[4], data_fim[5]) + if dif_dias > 0 or dif_horas > 0 or dif_minutos > 0 then + local rest = "" + if dif_dias > 0 then rest = rest..dif_dias.."d " end + if dif_horas > 0 then rest = rest..dif_horas.."h " end + if dif_minutos > 0 then rest = rest..dif_minutos.."min " end + return "Foste banido temporariamente. Restam ainda "..rest.."para poderes retornar" + else + -- Fim da penalidade + gestor.remover_penalidade(name, "Banir") + return + end + end +end) + +-- Impedir jogadores silenciados de falaram no chat e restaura o priv de fala se estiver acabado o periodo de penalidade +minetest.register_on_chat_message(function(name, message) + + -- Verifica se tem o priv de fala + if minetest.check_player_privs(name, {shout=true}) == true then return end + + -- Verificar se existe pena de banimento no banco de dados + if gestor.bd.verif("penalizados", "Silenciar_"..name) ~= true then return end + + -- Verificar data + local data_fim = gestor.bd.pegar("penalizados", "Silenciar_"..name) + + -- Caso seja banimento permanente + if data_fim == "sempre" then + minetest.chat_send_player(name, "Foste silenciado permanentemente neste servidor") + return + -- Caso seja banimento temporario + else + local dif_dias, dif_horas, dif_minutos = gestor.comparar_data(data_fim[1], data_fim[2], data_fim[3], data_fim[4], data_fim[5]) + if dif_dias > 0 or dif_horas > 0 or dif_minutos > 0 then + local rest = "" + if dif_dias > 0 then rest = rest..dif_dias.."d " end + if dif_horas > 0 then rest = rest..dif_horas.."h " end + if dif_minutos > 0 then rest = rest..dif_minutos.."min " end + minetest.chat_send_player(name, "Foste silenciado temporariamente. Restam ainda "..rest.."para poderes voltar a falar normalmente") + return + else + -- Fim da penalidade + gestor.remover_penalidade(name, "Silenciar") + return + end + end + +end)