280 lines
7.5 KiB
Lua
280 lines
7.5 KiB
Lua
--[[
|
|
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)
|