-
Notifications
You must be signed in to change notification settings - Fork 1
/
init.lua
100 lines (92 loc) · 2.71 KB
/
init.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
--[[
original code provided by tenplus1
This mod instigates an effective border for new players joining a server
with persistence of the last state and visa records across server restarts
]]
local mod_data = minetest.get_mod_storage()
local border = mod_data:get_string("status")
local visa = mod_data:get_string("visa")
local duration = minetest.settings:get("border.visa_duration") or 86400 -- 1 day
local msg = minetest.settings:get("border.msg") or "\nSorry, no new players being admitted at this time!"
local function update_visa_cache(name)
-- If name exists in cache remove it
if visa[name] then
visa[name] = nil
collectgarbage()
else
-- cache visa
visa[name] = os.time() + duration
end
mod_data:set_string("visa", minetest.serialize(visa))
end
if border == "" then
-- Initialise
mod_data:set_string("status", "OPEN")
border = "OPEN"
end
if visa == "" then
-- initialise
visa = {}
else
-- load visa table
visa = minetest.deserialize(visa)
-- iterate
for name,expires in pairs(visa) do
local t_remains = expires - os.time()
if t_remains > 0 then
--set
minetest.after(t_remains, update_visa_cache, name)
else
-- remove
update_visa_cache(name)
end
end
end
-- announce status
minetest.after(5, function()
minetest.chat_send_all("[border:info] border is "..border)
end)
-- chat command to toggle the border status
minetest.register_chatcommand("border", {
params = "",
description = "Toggles if new players are allowed",
privs = {server = true},
func = function (name, param)
if border == "CLOSED" then
border = "OPEN"
minetest.chat_send_player(name, "[border:info] allowing new players.")
else
border = "CLOSED"
minetest.chat_send_player(name, "[border:info] refusing new players.")
end
mod_data:set_string("status", border) -- save current state
end
})
-- add visa
minetest.register_chatcommand("visa", {
params = "player",
description = "Adds a temporary visa allowing a new player to create an account",
privs = {server = true},
func = function (name, param)
if not param then
minetest.chat_send_player(name, "Use: /visa <name>")
end
update_visa_cache(param)
minetest.after(duration, update_visa_cache, param)
minetest.chat_send_player(name, "A visa was issued to "..param)
end
})
-- register callback
minetest.register_on_prejoinplayer(function(name, ip)
-- owner exception
if minetest.setting_get("name") == name then
return
end
-- stop NEW players from joining unless they have a visa
local player_exists = minetest.get_auth_handler().get_auth(name)
if border == "CLOSED" and not player_exists and not visa[name] then
return msg
end
if visa[name] then update_visa_cache(name) end -- remove visa
end
)