2 Mod Gestor para Minetest
3 Gestor v1.0 Copyright (C) 2016 BrunoMine (https://github.com/BrunoMine)
5 Recebeste uma cópia da GNU Lesser General
6 Public License junto com esse software,
7 se não, veja em <http://www.gnu.org/licenses/>.
9 Menu Principal (Painel do gestor)
12 local escolha_local_avulso
= {}
14 local escolha_vila
= memor
.online()
17 local modpath
= minetest
.get_modpath("gestor")
20 local desordenar
= function(tb
)
22 for _
,d
in ipairs(tb
) do
28 -- Lista-string configurada altomaticamente
29 gestor
.lista_vilas
= ""
31 while (gestor
.vilas
[i
]~=nil) do
32 gestor
.lista_vilas
= gestor
.lista_vilas
..gestor
.vilas
[i
]
33 if i
< table.maxn(gestor
.vilas
) then gestor
.lista_vilas
= gestor
.lista_vilas
.. "," end
37 -- Abrir Menu principal
38 local aba
= {} -- salva em que aba o jogador esta
39 gestor
.menu_principal
= function(name
, inicio
)
40 if inicio
== true then aba
[name
] = "inicio" end
42 local formspec
= "size[14,11]"
45 .."label[0,0;Gestor Administrativos do Servidor]"
46 .."button[0,1;3,1;desligar;Desligar]" -- Botao 1
47 .."button[0,2;3,1;lugares;Lugares]" -- Botao 2
48 .."button[0,3;3,1;conf;Diretrizes]" -- Botao 3
49 .."button[0,4;3,1;anticrash;AntiCrash]" -- Botao 4
50 --.."button[0,5;3,1;;]" -- Botao 5
51 --.."button[0,6;3,1;;]" -- Botao 6
52 --.."button[0,7;3,1;;]" -- Botao 7
53 --.."button[0,8;3,1;;]" -- Botao 8
54 --.."button[0,9;3,1;;]" -- Botao 9
61 if aba
[name
] == "lugares" then
63 lugares
["centro"] = desordenar(minetest
.get_dir_list(minetest
.get_worldpath().."/gestor/centro"))
64 lugares
["vilas"] = desordenar(minetest
.get_dir_list(minetest
.get_worldpath().."/gestor/lugares"))
65 lugares
["avulsos"] = desordenar(minetest
.get_dir_list(minetest
.get_worldpath().."/gestor/avulsos"))
66 local status_lugares
= {}
68 -- Status e teleporte do Centro do Servidor
69 if gestor
.bd
:verif("centro", "status") then
70 status_lugares
["centro"] = "Ativo"
71 formspec
= formspec
.."button_exit[7,2.5;3,1;ir_centro;Ir para Centro]"
72 formspec
= formspec
.."button[10,2.5;3,1;tp_centro;Redefinir pos. tp.]"
74 status_lugares
["centro"] = "Inativo"
77 -- Preparar variaveis para Lugares avulsos
78 local lista_avulsos
= ""
79 local desc_avulso
= "Selecione um lugar \nna lista ao lado \n<<<<<<<<<<<<<\npara saber sobre"
80 .."\nMaximizar a tela \najuda na leitura da \nlista e do texto"
82 for nome_avulso
, v
in pairs(lugares
["avulsos"]) do
83 if lista_avulsos
~= "" then lista_avulsos
= lista_avulsos
.."," end
84 if v
.status
then lista_avulsos
= lista_avulsos
.."OK |" else lista_avulsos
= lista_avulsos
.."PEND. |" end
85 lista_avulsos
= lista_avulsos
.." "..nome_avulso
87 if tonumber(escolha_local_avulso
[name
]) == n
then desc_avulso
= v
.texto
end
89 if lista_avulsos
== "" then lista_avulsos
= "Nenhum" end
91 "label[4,1;Lugares]"..
93 "label[4,2;Centro do Servidor - Spawn ("..status_lugares
["centro"]..")]"..
94 "button[4,2.5;3,1;construir_centro;Constrir Aqui]"..
97 "dropdown[4,4.5;4,1;vila;"..gestor
.lista_vilas
..";1]"..
98 "button[8,4.4;2.5,1;construir_vila;Constrir Aqui]"..
99 "button_exit[10.5,4.4;3.1,1;tp_vila;Definir spawn de vila]"..
101 "label[4,6;Lugares Avulsos]"..
102 "textlist[4,6.5;5,4;avulsos;"..lista_avulsos
.."]"..
103 "textarea[9.4,6.48;4.5,4.73;desc_avulso;Sobre o lugar;"..desc_avulso
.."]"
106 elseif aba
[name
] == "diretrizes" then
109 .."label[4,1;Diretrizes]"
110 .."label[4,2;Ponto de Spawn]"
111 .."button_exit[4,2.4;3,1;definir_spawn;Definir Aqui]"
112 .."button_exit[7,2.4;3,1;ir_spawn;Ir para Spawn]"
113 .."field[4.3,4.1;3,1;slots;Limite de Jogadores;"..minetest
.setting_get("max_users").."]"
114 .."button_exit[7,3.8;3,1;definir_slots;Redefinir Limite]"
117 elseif aba
[name
] == "anticrash" then
119 local status_senha
= ""
120 if gestor
.bd
:pegar("anticrash", "from_senha") then status_senha
= " (Salva)" end
122 local status_email
= "1"
123 if gestor
.bd
:pegar("anticrash", "status_email") == "true" then status_email
= "2" end
125 local status_backup
= "1"
126 if gestor
.bd
:pegar("anticrash", "status_backup") == "true" then status_backup
= "2" end
129 local bin_paths = io.popen"locate bin/minetest":read"*all"
130 bin_paths = string.gsub(bin_paths, "bin/minetest", "bin")
131 bin_paths = string.gsub(bin_paths, "\n", ",")
132 local path_selecionado = gestor.bd:pegar("anticrash", "bin_path") or "-"
134 local comando_selecionado
= 1
135 local co
= gestor
.bd
:pegar("anticrash", "comando_abertura")
136 for n
, c
in ipairs(string.split("minetest --server,minetestserver", ",")) do
138 comando_selecionado
= n
144 .."label[4,1;AntiCrash]"
145 -- Sistema Verificador AntiCrash
146 .."label[4,2;Sistema Verificador AntiCrash]"
147 .."button[4,2.6;3,1;salvar;Salvar Dados]"
148 .."field[7.4,3;3.2,1;quedas;Lim. quedas seguidas;"..gestor
.bd
:pegar("anticrash", "quedas").."]"
149 .."field[10.6,3;3.3,1;interval;Intervalo de verif. (s);"..gestor
.bd
:pegar("anticrash", "interval").."]"
150 .."textarea[4.3,3.8;9.6,1.5;comando;Comando de abertura do servidor (digite no terminal UNIX);$ cd \""..string.gsub(modpath
, " ", " ").."\"\n$ ./../mod/gestor/./gestor-anticrash-minetest.sh]"
151 -- Sistema Notificador via Email
152 .."label[4,5;Sistema Notificador via Email]"
153 .."label[4,5.4;Estado]"
154 .."dropdown[4,5.8;2,1;status_email;Inativo,Ativo;"..status_email
.."]"
155 .."field[6.3,6;4.3,1;from_email;Email emissor;"..gestor
.bd
:pegar("anticrash", "from_email").."]"
156 .."pwdfield[10.6,6;3.3,1;from_senha;Senha"..status_senha
.."]"
157 .."field[4.3,7;4,1;from_login;Login do SMTP;"..gestor
.bd
:pegar("anticrash", "from_login").."]"
158 .."field[8.3,7;4,1;from_smtp;SMTP do email emissor;"..gestor
.bd
:pegar("anticrash", "from_smtp").."]"
159 .."field[12.3,7;1.6,1;from_smtp_port;Porta;"..gestor
.bd
:pegar("anticrash", "from_smtp_port").."]"
160 .."field[4.3,8;5,1;from_subject;Titulo da mensagem de email enviada;"..gestor
.bd
:pegar("anticrash", "from_subject").."]"
161 .."field[9.3,8;4.6,1;to_email;Email do destinatario;"..gestor
.bd
:pegar("anticrash", "to_email").."]"
163 .."label[4,8.8;Sistema de Backup]"
164 .."dropdown[4,9.3;3,1;status_backup;Inativo,Ativo;"..status_backup
.."]"
165 .."button[10.6,8.6;3,1;testar_email;Enviar email teste]" -- Testar email
170 minetest
.show_formspec(name
, "gestor:menu_principal", formspec
)
174 -- Receptor de campos
175 minetest
.register_on_player_receive_fields(function(player
, formname
, fields
)
178 if formname
== "gestor:menu_principal" then
179 local name
= player
:get_player_name()
182 -- Alternar aba selecionada
185 if fields
.lugares
then -- Lugares
186 aba
[name
] = "lugares"
187 gestor
.menu_principal(name
)
189 elseif fields
.conf
then -- Diretrizes
190 aba
[name
] = "diretrizes"
191 gestor
.menu_principal(name
)
193 elseif fields
.anticrash
then -- AntiCrash
194 aba
[name
] = "anticrash"
195 gestor
.menu_principal(name
)
200 -- Botao Desligar servidor
201 if fields
.desligar
then
202 minetest
.show_formspec(name
, "gestor:aviso_desligamento", "size[4,1.8]"..
205 "label[0,0;Tem certeza que quer \ndesligar do servidor?]"..
206 "button[0,1;2,1;cancelar;Cancelar]"..
207 "button_exit[2,1;2,1;ok;Sim]"
212 -- Recebendo campos de Abas
216 if aba
[name
] == "lugares" then
217 if fields
.construir_centro
then
218 minetest
.show_formspec(name
, "gestor:aviso_construir_centro", "size[4,1.8]"..
221 "label[0,0;Tem certeza que quer \nconstruir Centro do Servidor]"..
222 "button[0,1;2,1;cancelar;Cancelar]"..
223 "button_exit[2,1;2,1;ok;Sim]"
225 elseif fields
.construir_vila
then
226 escolha_vila
[name
] = fields
.vila
227 minetest
.show_formspec(name
, "gestor:aviso_construir_vila", "size[4,3.8]"..
230 "label[0,0;Tem certeza que quer \nconstruir essa vila?]"..
231 "field[0.25,1.2;4,1;nome_vila;;Nome da Vila]"..
232 "label[0,2;Arquivo de midia: \n"..escolha_vila
[name
].."]"..
233 "button[0,3;2,1;cancelar;Cancelar]"..
234 "button_exit[2,3;2,1;ok;Sim]"
236 elseif fields
.tp_vila
then
238 if gestor
.bd
:verif("vilas", fields
.vila
) then
239 local dados_vila
= gestor
.bd
:pegar("vilas", fields
.vila
)
240 gestor
.bd
:salvar("vilas", fields
.vila
, {nome
=dados_vila
.nome
, pos
=player
:getpos()})
241 minetest
.chat_send_player(name
, "Posicao de teleporte da vila "..fields
.vila
.." redefinido para esse local.")
243 minetest
.chat_send_player(name
, "Vila "..fields
.vila
.." ainda nao existe.")
246 minetest
.log("error", "Nome da vila parece inconsistente ("..dump(fields
.vila
)..").")
248 elseif fields
.ir_centro
then
249 player
:setpos(gestor
.bd
:pegar("centro", "pos"))
250 minetest
.chat_send_player(name
, "Teleportado para o Centro do Servidor")
251 elseif fields
.tp_centro
then
252 gestor
.bd
:salvar("centro", "pos", player
:getpos())
253 minetest
.show_formspec(name
, "gestor:aviso", "size[4,1.8]"..
256 "label[0,0;AVISO\nPosicao de teleport \ndo Centro do Servidor \nredefinido para aqui]"
258 minetest
.after(2, gestor
.menu_principal
, name
)
259 elseif fields
.avulsos
then
260 local n
= string.split(fields
.avulsos
, ":")
261 escolha_local_avulso
[name
] = n
[2]
262 gestor
.menu_principal(name
)
266 elseif aba
[name
] == "diretrizes" then
267 if fields
.definir_spawn
then
268 local pos
= player
:getpos()
269 minetest
.setting_set("static_spawnpoint", pos
.x
.." "..pos
.y
.." "..pos
.z
)
270 minetest
.chat_send_player(name
, "Spawn redefinido aqui.")
271 elseif fields
.ir_spawn
then
272 local pos
= minetest
.setting_get_pos("static_spawnpoint") or {x
=0,y
=0,z
=0}
274 minetest
.chat_send_player(name
, "Teleportado para ponto de Spawn.")
275 elseif fields
.definir_slots
then
276 if tonumber(fields
.slots
) then
277 minetest
.setting_set("max_users", fields
.slots
)
278 minetest
.chat_send_player(name
, "Limite de jogadores redefinido para "..fields
.slots
..".")
280 minetest
.chat_send_player(name
, "Digite um numero para o limite de jogadores")
285 elseif aba
[name
] == "anticrash" then
287 if fields
.salvar
then
289 -- Salvar dados gerais
290 if fields
.from_email
== "" then fields
.from_email
= "-" end
291 if fields
.from_login
== "" then fields
.from_login
= "-" end
292 if fields
.from_smtp
== "" then fields
.from_smtp
= "-" end
293 if fields
.from_smtp_port
== "" then fields
.from_smtp_port
= "-" end
294 if fields
.from_subject
== "" then fields
.from_subject
= "-" end
295 if fields
.to_email
== "" then fields
.to_email
= "-" end
296 if fields
.quedas
== "" or not tonumber(fields
.quedas
) then fields
.quedas
= "5" end
297 if fields
.interval
== "" or not tonumber(fields
.interval
) then fields
.interval
= "300" end
298 gestor
.bd
:salvar("anticrash", "from_email", fields
.from_email
)
299 gestor
.bd
:salvar("anticrash", "from_login", fields
.from_login
)
300 gestor
.bd
:salvar("anticrash", "from_smtp", fields
.from_smtp
)
301 gestor
.bd
:salvar("anticrash", "from_smtp_port", fields
.from_smtp_port
)
302 gestor
.bd
:salvar("anticrash", "from_subject", fields
.from_subject
)
303 gestor
.bd
:salvar("anticrash", "to_email", fields
.to_email
)
304 gestor
.bd
:salvar("anticrash", "quedas", fields
.quedas
)
305 gestor
.bd
:salvar("anticrash", "interval", fields
.interval
)
306 if fields
.from_senha
~= "" then
307 gestor
.bd
:salvar("anticrash", "from_senha", fields
.from_senha
)
309 -- Salva todos os dados para o shell
310 gestor
.anticrash
.salvar_dados()
312 -- Verificar sistema de email
313 if fields
.status_email
== "Ativo" then
315 if fields
.from_email
== "-"
316 or fields
.from_smtp
== "-"
317 or fields
.from_smtp_port
== "-"
318 or fields
.from_subject
== "-"
319 or fields
.to_email
== "-"
320 or gestor
.bd
:verif("anticrash", "from_senha") ~= true
322 minetest
.show_formspec(name
, "gestor:aviso", "size[4,1.8]"..
325 "label[0,0;AVISO \nFaltam dados no sistema \nde emails]"
327 minetest
.after(2, gestor
.menu_principal
, name
)
328 gestor
.bd
:salvar("anticrash", "status_email", "false")
331 -- Verificando se sendemail esta instalado
332 local verif_sendemail
= os
.execute("sendemail --help")
333 if verif_sendemail
~= 0 and verif_sendemail
~= 256 then
334 minetest
.show_formspec(name
, "gestor:aviso", "size[4,1.8]"..
337 "label[0,0;AVISO \nFalta o software sendEmail \nno computador para usar \no Sistema de Email]"
339 minetest
.after(3, gestor
.menu_principal
, name
)
340 gestor
.bd
:salvar("anticrash", "status_email", "false")
344 gestor
.bd
:salvar("anticrash", "status_email", "true")
346 gestor
.bd
:salvar("anticrash", "status_email", "false")
349 -- Verificar sistema de backup
350 if fields
.status_backup
== "Ativo" then
351 -- Verificando se compactador TAR esta instalado
352 local verif_tar
= os
.execute("tar --help")
353 if verif_tar
~= 0 and verif_tar
~= 256 then
354 minetest
.show_formspec(name
, "gestor:aviso", "size[4,1.8]"..
357 "label[0,0;AVISO \nFalta o compactador TAR\nno computador para usar \no Sistema de Backups]"
359 minetest
.after(3, gestor
.menu_principal
, name
)
360 gestor
.bd
:salvar("anticrash", "status_backup", "false")
364 gestor
.bd
:salvar("anticrash", "status_backup", "true")
366 gestor
.bd
:salvar("anticrash", "status_backup", "false")
369 minetest
.show_formspec(name
, "gestor:aviso", "size[4,1.8]"..
372 "label[0,0;DADOS SALVOS \nTodos os dados foram \nsalvos com sucesso]"
375 minetest
.after(2, gestor
.menu_principal
, name
)
378 elseif fields
.testar_email
then
379 if gestor
.bd
:pegar("anticrash", "status_email") == "false" then
380 minetest
.show_formspec(name
, "gestor:aviso", "size[4,1.8]"..
383 "label[0,0;AVISO \nO sistema de emails \nprecisa estar ativo para \nenviar email teste]"
385 minetest
.after(2, gestor
.menu_principal
, name
)
388 local comando
= "sendemail "
389 .."-s \""..gestor
.bd
:pegar("anticrash", "from_smtp")..":"..gestor
.bd
:pegar("anticrash", "from_smtp_port").."\" "
390 .."-xu \""..gestor
.bd
:pegar("anticrash", "from_login").."\" "
391 .."-xp \""..gestor
.bd
:pegar("anticrash", "from_senha").."\" "
392 .."-f \""..gestor
.bd
:pegar("anticrash", "from_email").."\" "
393 .."-t \""..gestor
.bd
:pegar("anticrash", "to_email").."\" "
394 .."-u \"Gestor - Email teste\" "
395 .."-m \"Essa mensagem foi um teste enviado pelo mod gestor\" "
396 .."-o message-charset=UTF-8 &"
397 minetest
.show_formspec(name
, "gestor:aviso", "size[4,1.8]"..
400 "label[0,0;AVISO \nEmail de teste enviado \nverifique a caixa de \nentrada do destinatario]"
403 minetest
.after(2, gestor
.menu_principal
, name
)
410 -- Janelas de aviso e outros
414 if formname
== "gestor:aviso_desligamento" then
415 local name
= player
:get_player_name()
418 minetest
.chat_send_all("*** Servidor desligando em 3 segundos. (Por "..name
..")")
419 minetest
.after(3, minetest
.chat_send_all
, "*** Servidor Desligado")
420 minetest
.after(3, minetest
.request_shutdown
)
422 if fields
.cancelar
then
423 gestor
.menu_principal(name
)
427 -- Construir Centro do Servidor
428 if formname
== "gestor:aviso_construir_centro" then
429 local name
= player
:get_player_name()
433 local pos
= player
:getpos()
434 local dados_estrutura
= gestor
.diretrizes
.estruturas
["centro"]
435 if not dados_estrutura
then return minetest
.chat_send_player(name
, "Estrutura nao encontrada") end
436 local pos_c
= {x
=pos
.x
-(dados_estrutura
[1]/2), y
=pos
.y
-2, z
=pos
.z
-(dados_estrutura
[1]/2)}
437 local n_spawn
= {x
=pos
.x
, y
=pos
.y
+2, z
=pos
.z
}
438 -- Construir estrutura
439 if gestor
.estruturador
.carregar(pos_c
, "centro") == false then return minetest
.chat_send_player(name
, "Estrutura nao encontrada") end
440 -- Proteger area da estrutura
441 local resp
= gestor
.proteger_area(
442 name
, -- Quem registra
443 name
, -- Quem vai ser o dono
444 "Centro", -- Nome(etiqueta) da area
445 {x
=pos
.x
-(dados_estrutura
[1]/2)-10, y
=2000, z
=pos
.z
-(dados_estrutura
[1]/2)-10}, -- um dos cantos opostos
446 {x
=pos
.x
+(dados_estrutura
[1]/2)+10, y
=pos
.y
-60, z
=pos
.z
+(dados_estrutura
[1]/2)+10} -- outro dos cantos opostos
448 if resp
~= true then minetest
.chat_send_player(name
, "Falha ao proteger: "..resp
) end
450 minetest
.setting_set("static_spawnpoint", pos
.x
.." "..(pos
.y
+10).." "..pos
.z
)
451 gestor
.bd
:salvar("centro", "pos", n_spawn
)
452 gestor
.bd
:salvar("centro", "status", true)
454 player
:moveto(n_spawn
)
455 minetest
.chat_send_player(name
, "Centro construido e parcialmente definido. Configure a loja principal e o banco apenas. Recomendavel redefinir o spawn.")
458 if fields
.cancelar
then
459 gestor
.menu_principal(name
)
464 if formname
== "gestor:aviso_construir_vila" then
465 local name
= player
:get_player_name()
468 -- Verificando se ja existe essa vila
469 local vila
= escolha_vila
[name
]
470 if gestor
.bd
:verif("vilas", vila
) then return minetest
.chat_send_player(name
, "Vila ja existente") end
472 local pos
= player
:getpos()
473 local dados_estrutura
= gestor
.diretrizes
.estruturas
[vila
]
474 if not dados_estrutura
then return minetest
.chat_send_player(name
, "Estrutura nao encontrada") end
475 local pos_c
= {x
=pos
.x
-(dados_estrutura
[1]/2), y
=pos
.y
-2, z
=pos
.z
-(dados_estrutura
[1]/2)}
476 local n_spawn
= {x
=pos
.x
, y
=pos
.y
+10, z
=pos
.z
}
477 -- Construir estrutura
478 if gestor
.estruturador
.carregar(pos_c
, vila
) == false then return minetest
.chat_send_player(name
, "Estrutura nao encontrada") end
479 -- Proteger area da estrutura
480 local resp
= gestor
.proteger_area(
481 name
, -- Quem registra
482 name
, -- Quem vai ser o dono
483 fields
.vila
, -- Nome(etiqueta) da area
484 {x
=pos
.x
-(dados_estrutura
[1]/2)-10, y
=2000, z
=pos
.z
-(dados_estrutura
[1]/2)-10}, -- um dos cantos opostos
485 {x
=pos
.x
+(dados_estrutura
[1]/2)+10, y
=pos
.y
-60, z
=pos
.z
+(dados_estrutura
[1]/2)+10} -- outro dos cantos opostos
487 if resp
~= true then minetest
.chat_send_player(name
, "Falha ao proteger: "..resp
) end
489 gestor
.bd
:salvar("vilas", vila
, {nome
=fields
.nome_vila
,pos
=n_spawn
})
491 player
:moveto(n_spawn
)
492 minetest
.chat_send_player(name
, "*** Vila construida quase pronta. Ajuste as entradas da vila e o ponto de TP(spawn) perto da bilheteria. Configure lojas e bancos existentes.")
494 if fields
.cancelar
then
495 gestor
.menu_principal(name
)