aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Martinez <kaeza@users.sf.net>2014-07-09 06:32:24 -0300
committerDiego Martinez <kaeza@users.sf.net>2014-07-09 06:38:28 -0300
commit7923c393e9d2db75fa630a65f5e03491473299ef (patch)
treeb255a853787e073fe79cdda2293cd18c226d49b4
parent19d92df3bc219641de436994e9b21d1b200f10c8 (diff)
downloadxban2-7923c393e9d2db75fa630a65f5e03491473299ef.tar.gz
xban2-7923c393e9d2db75fa630a65f5e03491473299ef.tar.bz2
xban2-7923c393e9d2db75fa630a65f5e03491473299ef.zip
Add simple GUI to check records interactively.
-rw-r--r--gui.lua92
-rw-r--r--init.lua57
2 files changed, 127 insertions, 22 deletions
diff --git a/gui.lua b/gui.lua
new file mode 100644
index 0000000..6b60ed3
--- /dev/null
+++ b/gui.lua
@@ -0,0 +1,92 @@
+
+local FORMNAME = "xban2:main"
+
+local states = { }
+
+local table_insert, table_concat =
+ table.insert, table.concat
+
+local ESC = minetest.formspec_escape
+
+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
+ 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]",
+ }
+ table_insert(fs,
+ ("textlist[0.5,2;3,5.5;player;%s;%d;0]"):
+ format(table_concat(list, ","), index))
+ local record_name = list[index]
+ if record_name then
+ local record, err = xban.get_record(record_name)
+ if record then
+ local reclist = { }
+ for _, r in ipairs(record) do
+ table_insert(reclist, ESC(r))
+ 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]")
+ end
+ end
+ fs = table_concat(fs)
+ print(fs)
+ return 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]
+ 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
+ minetest.show_formspec(name, FORMNAME, make_fs(name))
+ end
+ return
+ end
+ 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)
+ minetest.show_formspec(name, FORMNAME, make_fs(name))
+ end
+end)
+
+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,
+})
diff --git a/init.lua b/init.lua
index 53b2e8d..6a4c06f 100644
--- a/init.lua
+++ b/init.lua
@@ -131,6 +131,32 @@ function xban.unban_player(player, source) --> bool, err
return true
end
+function xban.get_record(player)
+ local e = xban.find_entry(player)
+ if not e then
+ return nil, ("No entry for `%s'"):format(player)
+ elseif (not e.record) or (#e.record == 0) then
+ return nil, ("`%s' has no ban records"):format(player)
+ end
+ local record = { }
+ for _, rec in ipairs(e.record) do
+ local msg
+ if rec.expires then
+ msg = ("%s, Expires: %s"):format(
+ rec.reason, os.date("%c", e.expires))
+ else
+ msg = rec.reason
+ end
+ table.insert(record, ("[%s]: %s"):format(os.date("%c", e.time), msg))
+ end
+ local last_pos
+ if e.last_pos then
+ last_pos = ("User was last seen at %s"):format(
+ minetest.pos_to_string(e.last_pos))
+ end
+ return record, last_pos
+end
+
minetest.register_on_prejoinplayer(function(name, ip)
local e = xban.find_entry(name) or xban.find_entry(ip)
if not e then return end
@@ -220,31 +246,17 @@ minetest.register_chatcommand("xban_record", {
"Usage: /xban_record <player_or_ip>")
return
end
- local e = xban.find_entry(params)
- if not e then
- minetest.chat_send_player(name,
- ("[xban_record] No entry for `%s'"):format(params))
- return
- elseif (not e.record) or (#e.record == 0) then
- minetest.chat_send_player(name,
- ("[xban_record] `%s' has no ban records"):format(params))
+ local record, last_pos = xban.get_record(plname)
+ if not record then
+ local err = last_pos
+ minetest.chat_send_player(name, "[xban] "..err)
return
end
- for _, rec in ipairs(e.record) do
- local msg
- if rec.expires then
- msg = ("%s, Expires: %s"):format(
- rec.reason, os.date("%c", rec.expires))
- else
- msg = rec.reason
- end
- minetest.chat_send_player(name,
- ("[%s]: %s"):format(os.date("%c", rec.time), msg))
+ for _, e in ipairs(record) do
+ minetest.chat_send_player(name, "[xban] "..e)
end
- if e.last_pos then
- minetest.chat_send_player(name,
- ("User was last seen at %s"):format(
- minetest.pos_to_string(e.last_pos)))
+ if last_pos then
+ minetest.chat_send_player(name, "[xban] "..last_pos)
end
end,
})
@@ -311,3 +323,4 @@ load_db()
xban.db = db
dofile(xban.MP.."/dbimport.lua")
+dofile(xban.MP.."/gui.lua")