TomeNET Metaserver Web Interface

<?php

$page_title = 'TomeNET servers';
require('header.inc.php');

echo('<h1>TomeNET Metaserver Web Interface</h1>');

if (array_key_exists('source', $_GET)) {
    show_source('meta.php');
    require('footer.inc.php');
    die();
}

$addr = 'ovh.muuttuja.org';
$port = 8801;

$meta = '';
$servers = array();

$xml_parser = xml_parser_create();
$tag_tree = array();

function startElement($parser, $name, $attrs) {
    global $tag_tree, $server, $player, $game, $version;
    array_unshift($tag_tree, $name);
    switch ($name) {
        case 'SERVER':
            $server = array('url' => $attrs['URL'], 'port' => $attrs['PORT'], 'players' => array());
            break;
        case 'PLAYER':
            $player = '';
            break;
        case 'GAME':
            $game = '';
            break;
        case 'VERSION':
            $version = '';
            break;
    }
}

function endElement($parser, $name) {
    global $tag_tree, $servers, $server, $player, $game, $version;
    array_shift($tag_tree);
    switch ($name) {
        case 'SERVER':
            $servers[] = $server;
            break;
        case 'PLAYER':
            $server['players'][] = $player;
            break;
        case 'GAME':
            $server['game'] = $game;
            break;
        case 'VERSION':
            $server['version'] = $version;
            break;
    }
}

function charData($parser, $data) {
    global $tag_tree, $meta_name, $player, $game, $version;
    switch ($tag_tree[0]) {
        case 'META':
            $meta_name .= $data;
            break;
        case 'PLAYER':
            $player .= $data;
            break;
        case 'GAME':
            $game .= $data;
            break;
        case 'VERSION':
            $version .= $data;
            break;
    }
}

$fp = fsockopen($addr, $port, $errno, $errstr, 2);

if ($fp !== FALSE) {

    xml_set_element_handler($xml_parser, 'startElement', 'endElement');
    xml_set_character_data_handler($xml_parser, 'charData');

    xml_parse($xml_parser, '<servers>');

    while (!feof($fp)) {
        $data = fread($fp, 8192);
        if (!xml_parse($xml_parser, $data)) {
            printf("XML error: %s at line %d\n",
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser));
        }
    }

    fclose($fp);

    if (!xml_parse($xml_parser, '</servers>', TRUE)) {
        printf("XML error: %s at line %d\n",
               xml_error_string(xml_get_error_code($xml_parser)),
               xml_get_current_line_number($xml_parser));
    }

    xml_parser_free($xml_parser);

?>

<h2><?php echo(htmlentities($meta_name)); ?></h2>
<table border="1" cellpadding="2" cellspacing="0">
<tr><th>Name</th><th>Port</th><th>Number of Players</th><th>Players</th><th>Game</th><th>Version</th></tr>
<?php
    foreach ($servers as $server) {
        echo('<tr><td>' . htmlentities($server['url']) . '</td>');
        echo('<td align="center">' . htmlentities($server['port']) . '</td>');
        echo('<td align="center">' . count($server['players']) . '</td>');
        if (count($server['players'])) {
            echo('<td align="center">' . htmlentities(implode(', ', $server['players'])) . '</td>');
        } else {
            echo('<td align="center">&nbsp;</td>');
        }
        echo('<td align="center">' . htmlentities($server['game']) . '</td>');
        echo('<td align="center">' . htmlentities($server['version']) . "</td></tr>\n");
    }
?>
</table>
<?php
} else {
    printf('<p>Couldn\'t connect to meta! (errno = %d, errstr = "%s")</p>', $errno, $errstr);
?>
<p>Alternative server list:<br>
<a href="http://www.tomenet.net/meta.php">http://www.tomenet.net/meta.php</a></p>
<?php
}
?>
<p><a href="meta.php?source=1">Source code</a></p>
<?php
require('footer.inc.php');
?>