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)