Sistema de penalidades

master
BrunoMine 2018-07-19 16:29:31 -03:00
parent 4573176ed3
commit f142aa1b70
4 changed files with 530 additions and 1 deletions

246
comparar_tempo.lua Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
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:
<diferença de dias>
<diferença de horas>
<diferença de minutos>
Argumentos:
<ano da data>
<mes da data>
<dia do mes da data>
<hora do dia da data>
<minutos da hora do dia da data>
]]
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

View File

@ -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")

View File

@ -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)

279
recursos/penalidades.lua Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
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)