summaryrefslogtreecommitdiff
path: root/xban2
diff options
context:
space:
mode:
Diffstat (limited to 'xban2')
-rw-r--r--xban2/gui.lua138
1 files changed, 91 insertions, 47 deletions
diff --git a/xban2/gui.lua b/xban2/gui.lua
index 544f3be..fb0c1df 100644
--- a/xban2/gui.lua
+++ b/xban2/gui.lua
@@ -1,56 +1,118 @@
local FORMNAME = "xban2:main"
+local MAXLISTSIZE = 100
+
+local strfind, format = string.find, string.format
+
+local ESC = minetest.formspec_escape
+
+local function make_list(filter)
+ filter = filter or ""
+ local list, n, dropped = { }, 0, false
+ for k in pairs(minetest.auth_table) do
+ if strfind(k, filter, 1, true) then
+ if n >= MAXLISTSIZE then
+ dropped = true
+ break
+ end
+ n=n+1 list[n] = k
+ end
+ end
+ table.sort(list)
+ return list, dropped
+end
local states = { }
-local table_insert, table_concat =
- table.insert, table.concat
+local function get_state(name)
+ local state = states[name]
+ if not state then
+ state = { index=1, filter="" }
+ states[name] = state
+ state.list, state.dropped = make_list()
+ end
+ return state
+end
-local ESC = minetest.formspec_escape
+local function get_record_simple(name)
+ local e = xban.find_entry(name)
+ if not e then
+ return nil, ("No entry for `%s'"):format(name)
+ elseif (not e.record) or (#e.record == 0) then
+ return nil, ("`%s' has no ban records"):format(name)
+ end
+ local record = { }
+ for _, rec in ipairs(e.record) do
+ local msg = (os.date("%Y-%m-%d %H:%M:%S", rec.time).." | "
+ ..(rec.reason or "No reason given."))
+ table.insert(record, msg)
+ end
+ return record, e.record
+end
local function make_fs(name)
- local state = states[name]
- if not state then return end
- local list, index, filter = state.list, state.index, state.filter
- if index > #list then
- index = #list
+ local state = get_state(name)
+ local list, filter = state.list, state.filter
+ local pli, ei = state.player_index or 1, state.entry_index or 0
+ if pli > #list then
+ pli = #list
end
local fs = {
- "size[10,8]",
- "label[0.5,0.6;Filter]",
- "field[1.5,0.5;6,2;filter;;"..ESC(filter).."]",
- "button[7.5,0.5;2,1;search;Search]",
+ "size[16,12]",
+ "label[0,-.1;Filter]",
+ "field[1.5,0;12.8,1;filter;;"..ESC(filter).."]",
+ "button[14,-.3;2,1;search;Search]",
}
- table_insert(fs,
- ("textlist[0.5,2;3,5.5;player;%s;%d;0]"):
- format(table_concat(list, ","), index))
- local record_name = list[index]
+ local fsn = #fs
+ fsn=fsn+1 fs[fsn] = format("textlist[0,.8;4,9.3;player;%s;%d;0]",
+ table.concat(list, ","), pli)
+ local record_name = list[pli]
if record_name then
- local record, err = xban.get_record(record_name)
+ local record, e = get_record_simple(record_name)
if record then
- local reclist = { }
- for _, r in ipairs(record) do
- table_insert(reclist, ESC(r))
+ for i, r in ipairs(record) do
+ record[i] = ESC(r)
+ end
+ fsn=fsn+1 fs[fsn] = format(
+ "textlist[4.2,.8;11.7,9.3;entry;%s;%d;0]",
+ table.concat(record, ","), ei)
+ local rec = e[ei]
+ if rec then
+ fsn=fsn+1 fs[fsn] = format("label[0,10.3;%s]",
+ ESC("Source: "..(rec.source or "<none>")
+ .."\nTime: "..os.date("%c", rec.time)
+ .."\n"..(rec.expires and
+ os.date("%c", rec.expires) or "")),
+ pli)
end
- table_insert(fs,
- ("textlist[4,2;5,5.5;entry;%s;0;0]"):
- format(table_concat(reclist, ",")))
else
- table_insert(fs,
- "textlist[4,2;5,5.5;entry;"..ESC(err)..";0]")
+ fsn=fsn+1 fs[fsn] = "textlist[4.2,.8;11.7,9.3;err;"..ESC(e)..";0]"
+ fsn=fsn+1 fs[fsn] = "label[0,10.3;"..ESC(e).."]"
end
+ else
+ local e = "No entry matches the query."
+ fsn=fsn+1 fs[fsn] = "textlist[4.2,.8;11.7,9.3;err;"..ESC(e)..";0]"
+ fsn=fsn+1 fs[fsn] = "label[0,10.3;"..ESC(e).."]"
end
- return table_concat(fs)
+ return table.concat(fs)
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= FORMNAME then return end
local name = player:get_player_name()
- local state = states[name]
+ local state = get_state(name)
if fields.player then
local t = minetest.explode_textlist_event(fields.player)
if (t.type == "CHG") or (t.type == "DCL") then
- state.index = t.index
+ state.player_index = t.index
+ minetest.show_formspec(name, FORMNAME, make_fs(name))
+ end
+ return
+ end
+ if fields.entry then
+ local t = minetest.explode_textlist_event(fields.entry)
+ if (t.type == "CHG") or (t.type == "DCL") then
+ state.entry_index = t.index
minetest.show_formspec(name, FORMNAME, make_fs(name))
end
return
@@ -58,14 +120,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.search then
local filter = fields.filter or ""
state.filter = filter
- local list = { }
- state.list = list
- for k in pairs(minetest.auth_table) do
- if k:find(filter, 1, true) then
- table_insert(list, k)
- end
- end
- table.sort(list)
+ state.list = make_list(filter)
minetest.show_formspec(name, FORMNAME, make_fs(name))
end
end)
@@ -74,17 +129,6 @@ minetest.register_chatcommand("xban_gui", {
description = "Show XBan GUI",
params = "",
func = function(name, params)
- local state = states[name]
- if not state then
- state = { index=1, filter="" }
- states[name] = state
- local list = { }
- state.list = list
- for k in pairs(minetest.auth_table) do
- table_insert(list, k)
- end
- table.sort(list)
- end
minetest.show_formspec(name, FORMNAME, make_fs(name))
end,
})