1-- Print errors to stdout
2__old_ALERT = _ALERT
3_ALERT = print
4
5function color_print(y, x, str)
6        Term_putstr(x, y, strlen(str), TERM_WHITE, str)
7end
8
9MAX_LEN = 70
10
11function get_server_notes(x)
12        local notes = ""
13
14        for i = 1, getn(x) do
15                if x[i].label == "notes" then
16			notes = x[i][1]
17			return notes
18		end
19        end
20        return game, version
21end
22
23function get_game_version(x)
24        local game, version = "unknown", "unknown"
25
26        for i = 1, getn(x) do
27                if x[i].label == "game" then game = x[i][1] end
28                if x[i].label == "version" then version = x[i][1] end
29        end
30        return game, version
31end
32
33function get_players(x)
34        local players = ""
35
36        for i = 1, getn(x) do
37                if x[i].label == "player" then
38                        if strlen(players..", "..x[i][1]) < MAX_LEN then
39                                if players ~= "" then
40		                	players = players..", "..x[i][1]
41                                else
42		                	players = x[i][1]
43                                end
44                        else
45                                return players..", ..."
46                        end
47                end
48        end
49        return players
50end
51
52function get_players_count(x)
53        local nb = 0
54
55        for i = 1, getn(x) do
56                if x[i].label == "player" then
57                        nb = nb + 1
58                end
59        end
60        return nb
61end
62
63meta_list = {}
64function meta_display(xml_feed)
65        local x = xml:collect(xml_feed)
66        local i, nb, e, k, line, cat_slot
67        local categories = {}
68        local meta_name = "Unknown metaserver"
69        local nb_servers = 0
70
71        for i = 1, getn(x) do
72                if type(x[i]) == 'table' then
73                        if x[i].label == "server" then
74	                        local game, version = get_game_version(x[i])
75				local cat_name = game .. " " .. version
76
77				cat_slot = 0
78				for k, e in categories do
79					if e.name == cat_name then
80						cat_slot = k
81						break
82					end
83				end
84
85				if cat_slot == 0 then
86					cat_slot = getn(categories) + 1
87					categories[cat_slot] = { name = cat_name, servers = {} }
88				end
89
90--				local server_notes
91--				server_notes = get_server_notes(x[i])
92
93	                        local extra
94        	                if get_players_count(x[i]) == 1 then
95	        	        	extra = "\255b" .. get_players_count(x[i]) .. " player"
96                        	else
97	                		extra = "\255b" .. get_players_count(x[i]) .. " players"
98	                        end
99
100        	                tinsert(categories[cat_slot].servers, {
101                	        	name = x[i].args.url,
102                        		port = x[i].args.port,
103					protocol = x[i].args.protocol,
104                                	extra = extra,
105	                                players = get_players(x[i]),
106        	                })
107
108                                nb_servers = nb_servers + 1
109                        elseif x[i].label == "meta" then
110                                meta_name = x[i][1]
111                        end
112                end
113        end
114
115        line = 0
116        nb = 0
117        color_print(line, 0, "\255y" .. meta_name .. " \255Wwith " .. nb_servers .. " connected servers"); line = line + 1; line = line + 1
118        for k, e in categories do
119                color_print(line, 0, "\255o" .. e.name .. " :"); line = line + 1
120
121		e = e.servers
122                for i = 1, getn(e) do
123        	        color_print(line, 2, "\255G" .. strchar(nb + strbyte('a')) .. ") \255w" .. e[i].name)
124        	        color_print(line, 50, e[i].extra); line = line + 1
125        	        color_print(line, 4, e[i].players); line = line + 1
126
127                        -- Store the info for retrieval
128                        meta_list[nb] = { e[i].name, e[i].port, e[i].protocol }
129                        nb = nb + 1
130                end
131        end
132	line = line + 1
133        color_print(line, 0, "\255BSelect a server or press \255RQ\255B to enter an IP or hostname manually."); line = line + 1
134
135        return nb
136end
137
138function meta_get(xml_feed, pos)
139        -- protocol to be used when connecting the selected server - mikaelh
140        server_protocol = meta_list[pos][3]
141
142        return meta_list[pos][1], meta_list[pos][2]
143end
144
145-- Restore a good neat handler
146_ALERT = __old_ALERT
147