]> git.lizzy.rs Git - lmz_opening_hours.git/blob - init.lua
accessability without german language keymap
[lmz_opening_hours.git] / init.lua
1 local modname = minetest.get_current_modname()
2 local storage = minetest.get_mod_storage()
3
4 opening_hours = {}
5
6 local opening_hours_default = {weekday_start = 14, weekday_end = 21, weekend_start = 8, weekend_end = 21, warn_offset = 15, warn_interval = 5}
7
8 local warn_cooldown = 0
9
10 local function get_date()
11         return os.date("*t")
12 end
13
14 local function get_date_formated()
15         return os.date("%d.%m.%y")
16 end
17
18 local function is_weekend()
19         local d = os.date("%w")
20         return d == "0" or d == "6"
21 end
22
23 local function opening_hours_index(t, k)
24         if k:sub(1, 6) == "today_" then 
25                 return t[k:gsub("today_", is_weekend() and "weekend_" or "weekday_")]
26         else
27                 return opening_hours_default[k]
28         end
29 end
30
31 local function save_data()
32         storage:from_table({fields = opening_hours})
33 end
34
35 local function load_data()
36         opening_hours = storage:to_table().fields
37         setmetatable(opening_hours, {__index = opening_hours_index})
38 end
39
40 local function reset_execption()
41         opening_hours.today = nil
42         opening_hours.today_start = nil
43         opening_hours.today_end = nil
44 end
45
46 local function create_exception()
47         opening_hours.today = get_date_formated()
48         opening_hours.today_start = opening_hours.today_start
49         opening_hours.today_end = opening_hours.today_end
50 end
51
52 local function tick(dtime)
53         local d = get_date()
54         if opening_hours.today and opening_hours.today ~= get_date_formated() then
55                 reset_execption()
56         end
57         local diff = tonumber(opening_hours.today_end) - d.hour
58         if diff == 1 then
59                 local minutes_remaining = (60 - d.min)
60                 if minutes_remaining <= tonumber(opening_hours.warn_offset) then
61                         if warn_cooldown <= 0 then
62                                 minetest.chat_send_all(minetest.colorize("#FF4D00", "Der Server schießt in " .. minutes_remaining .. " Minuten."))
63                                 warn_cooldown = tonumber(opening_hours.warn_interval) * 60
64                         else
65                                 warn_cooldown = warn_cooldown - dtime
66                         end
67                 end
68         elseif diff <= 0 then
69                 for _, player in pairs(minetest.get_connected_players()) do
70                         local name = player:get_player_name()
71                         if not minetest.check_player_privs(name, {server = true}) then
72                                 minetest.kick_player(name, "Der Server schließt!")
73                         end
74                 end
75         end
76 end
77
78 local function on_join(name)
79         if minetest.check_player_privs(name, {server = true}) then return end
80         local d = get_date()
81         local diff = tonumber(opening_hours.today_start) - d.hour
82         if diff > 0 then
83                 return "Besuch erfolgte außerhalb der Öffnungszeiten. Der Server hat in " .. math.ceil(diff) .. " Stunde(n) wieder geöffnet."
84         elseif tonumber(opening_hours.today_end) <= d.hour then
85                 return "Besuch erfolgte außerhalb der Öffnungszeiten. Der Server hat bereits geschlossen und hat Morgen wieder geöffnet."
86         end
87 end
88
89 local function show_gui(name)
90         local o = opening_hours
91         local formspec = "size[10.01,7.9267895878525]label[-0.14,-0.23840485478977;Öffnungszeiten]label[0.1,0.28175119202427;Mo.-Fr.]label[0.1,2.0156046814044;Sa.-So.]label[0.1,3.7494581707846;Heute]label[0.1,5.4833116601647;Einstellungen]label[0.34,6.3935847420893;Spieler ]label[2.18,6.3935847420893;Minuten vor Ablauf der Zeit alle]label[6.6,6.3935847420893;Minuten warnen.]image_button_exit[7.62,7.6072821846554;2.605,0.7835;;close;Schließen]image_button[5.14,7.6072821846554;2.605,0.7835;;save;Speichern]"
92         .. "field[0.64,1.4347637624621;1.0,0.82429501084599;fld_weekday_start;von;" .. o.weekday_start .. "]"
93         .. "field[1.6,1.4347637624621;1.0,0.82429501084599;fld_weekday_end;bis;" .. o.weekday_end .. "]"
94         .. "field[0.64,3.1686172518422;1.0,0.82429501084599;fld_weekend_start;von;" .. o.weekend_start .. "]"
95         .. "field[1.6,3.1686172518422;1.0,0.82429501084599;fld_weekend_end;bis;" .. o.weekend_end .. "]"
96         .. "field[1.6,6.6363242306025;1.0,0.82429501084599;fld_warn_offset;;" .. o.warn_offset .. "]"
97         .. "field[6.0,6.6363242306025;1.0,0.82429501084599;fld_warn_interval;;" .. o.warn_interval .. "]"
98         .. (o.today
99                         and ""
100                                 .. "field[0.64,4.9024707412224;1.0,0.82429501084599;fld_today_start;von;" .. o.today_start .. "]"
101                                 .. "field[1.6,4.9024707412224;1.0,0.82429501084599;fld_today_end;bis;" .. o.today_end .. "]"
102                         or "image_button[0.34,4.5296922410056;4.205,0.7835;;add_exception;Ausnahmeregelung hinzufügen]"
103                 )
104         minetest.show_formspec(name, "lmz_opening_hours:gui", formspec)
105 end
106
107 local function progress_gui_input(player, formname, fields)
108         local name = player:get_player_name()
109         if formname ~= "lmz_opening_hours:gui" or not minetest.check_player_privs(name, {server = true}) then return end
110         if fields.add_exception then
111                 create_exception()
112         end
113         for k, v in pairs(fields) do
114                 if k:sub(1, 4) == "fld_" and tonumber(v) then
115                         opening_hours[k:gsub("fld_", "")] = v
116                 end
117         end
118         if not fields.quit and not fields.close then show_gui(name) end
119 end
120
121 load_data()
122
123 minetest.register_globalstep(tick)
124 minetest.register_on_shutdown(save_data)
125 minetest.register_on_prejoinplayer(on_join)
126 minetest.register_chatcommand("opening_hours", {privs = {server = true}, description = "Die Öffnungszeiten konfigurieren", func = show_gui})
127 minetest.register_chatcommand("öffnungszeiten", {privs = {server = true}, description = "Die Öffnungszeiten konfigurieren", func = show_gui})
128 minetest.register_on_player_receive_fields(progress_gui_input)
129
130