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