diff options
| author | Diego Martinez <kaeza@users.sf.net> | 2014-07-09 06:32:24 -0300 | 
|---|---|---|
| committer | Diego Martinez <kaeza@users.sf.net> | 2014-07-09 06:38:28 -0300 | 
| commit | 7923c393e9d2db75fa630a65f5e03491473299ef (patch) | |
| tree | b255a853787e073fe79cdda2293cd18c226d49b4 | |
| parent | 19d92df3bc219641de436994e9b21d1b200f10c8 (diff) | |
Add simple GUI to check records interactively.
| -rw-r--r-- | gui.lua | 92 | ||||
| -rw-r--r-- | init.lua | 57 | 
2 files changed, 127 insertions, 22 deletions
| @@ -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, +}) @@ -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") | 
