diff options
| author | Diego Martinez <kaeza@users.sf.net> | 2016-05-05 07:51:42 -0300 | 
|---|---|---|
| committer | Diego Martinez <kaeza@users.sf.net> | 2016-05-05 07:53:49 -0300 | 
| commit | 974b47f8f6f9f654e9ce3e0c2cb92e45ce743bcf (patch) | |
| tree | c2cb8e403fe740a14a61884bc6700b6607a4fb87 | |
| parent | 2903f6ae5a64e0e9a4c6fb660a2cf1d16a5cc689 (diff) | |
Make the GUI a little better.
| -rw-r--r-- | gui.lua | 138 | 
1 files changed, 91 insertions, 47 deletions
| @@ -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,  }) | 
