diff --git a/init.lua b/init.lua index 13c9753..93e28cf 100644 --- a/init.lua +++ b/init.lua @@ -32,5 +32,6 @@ dofile(modpath.."/comandos.lua") -- Recursos dofile(modpath.."/recursos/desligar.lua") dofile(modpath.."/recursos/conf.lua") +dofile(modpath.."/recursos/moderadores.lua") dofile(modpath.."/recursos/alerta_de_crash.lua") notificar("OK") diff --git a/recursos/moderadores.lua b/recursos/moderadores.lua new file mode 100644 index 0000000..ce16c5a --- /dev/null +++ b/recursos/moderadores.lua @@ -0,0 +1,134 @@ +--[[ + 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 . + + Recurso para desligamento do servidor + ]] + + +-- Lista de moderadores +if gestor.bd.verif("staff", "list") == false then + gestor.bd.salvar("staff", "list", {}) +end + +-- 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) + +-- Registrar aba 'desligar' +gestor.registrar_aba("moderadores", { + titulo = "Moderadores", + get_formspec = function(name) + + -- Gera string dos moderadores listados + local staff_list_string = "" + for staff,staff_name in ipairs(gestor.bd.pegar("staff", "list")) do + if staff_list_string ~= "" then staff_list_string = staff_list_string .. "," end + staff_list_string = staff_list_string .. staff_name + end + + local formspec = "label[3.5,1;Gerenciamento de Moderadores]" + .."label[9,1;Lista de Moderadores]" + .."textlist[9,1.5;4.5,3;staff_list;"..staff_list_string.."]" + .."field[3.8,2.3;5,1;new_staff;Novo moderador;]" + .."button[3.5,2.9;5,1;add_staff;Adicionar Moderador]" + .."button[3.5,3.8;5,1;rem_staff;Remover Moderador]" + + .."label[3.5,5;Interditar Servidor]" + .."checkbox[3.5,5.5;interditar;Interditar Servidor;"..tostring(minetest.settings:get("gestor_interditado", false)).."]" + .."textarea[3.8,6.3;10.2,1;;Expulsa todos os jogadores comuns e permite apenas moderadores conectarem;]" + .."field[3.8,7.5;7,1;aviso_interditado;Aviso de Servidor Interditado;"..(minetest.settings:get("gestor_aviso_interditado") or "").."]" + .."button[10.5,7.2;3,1;redefinir_msg;Redefinir]" + + return formspec + end, + on_receive_fields = function(player, fields) + local name = player:get_player_name() + + -- Selecionar item + if fields.staff_list and table.maxn(gestor.bd.pegar("staff", "list")) > 0 then + local n = string.split(fields.staff_list, ":") + acessos[name].escolha = tonumber(n[2]) or 1 + gestor.menu_principal(name) + + --Adicionar moderador + elseif fields.add_staff and fields.new_staff ~= "" then + local staff_list = gestor.bd.pegar("staff", "list") + table.insert(staff_list, fields.new_staff) + gestor.bd.salvar("staff", "list", staff_list) + gestor.menu_principal(name) + + -- Remover moderador + elseif fields.rem_staff and acessos[name].escolha then + local staff_list = gestor.bd.pegar("staff", "list") + table.remove(staff_list, acessos[name].escolha) + gestor.bd.salvar("staff", "list", staff_list) + gestor.menu_principal(name) + + -- Interditar + elseif fields.interditar then + minetest.settings:set("gestor_interditado", fields.interditar) + gestor.interditar_servidor() + + -- Redefir mensagem de interdição + elseif fields.redefinir_msg then + minetest.settings:set("gestor_aviso_interditado", fields.aviso_interditado) + -- Sair + elseif fields.exit then + acessos[name].escolha = nil + end + end, +}) + + +-- Interditar_servidor +gestor.interditado = minetest.settings:get_bool("gestor_interditado", false) +gestor.interditar_servidor = function() + -- Altera variavel global de controle + gestor.interditado = true + + local staff_list = gestor.bd.pegar("staff", "list") + local staff_list_i = {} + for _,n in ipairs(staff_list) do + staff_list_i[n] = true + end + + -- Mensagem + local msg = minetest.settings:get("gestor_aviso_interditado") or "" + + -- Expulsa jogadores que nao fazem parte dos moderadores + for _,player in ipairs(minetest.get_connected_players()) do + local name = player:get_player_name() + if staff_list_i[name] == nil and minetest.check_player_privs(name, {server=true}) ~= true then + minetest.kick_player(name, msg) + end + end +end + +-- Evita conectarem caso esteja interditado +minetest.register_on_prejoinplayer(function(name) + + -- Mensagem + local msg = minetest.settings:get("gestor_aviso_interditado") or "" + + if gestor.interditado ~= false then return msg end + + local staff_list = gestor.bd.pegar("staff", "list") + local staff_list_i = {} + for _,n in ipairs(staff_list) do + staff_list_i[n] = true + end + + if staff_list_i[name] == nil and minetest.check_player_privs(name, {server=true}) ~= true then + return msg + end +end)