Reminder: This is still beta and has issues on occasion. Mainly because it is slow and polls all the servers every time the page is loaded...

<?php
/*************************************************************************

ASAASB - A Simple Armagetron Advanced Server Browser
Copyright (C) 2005 Guru3
Copyright (C) 2007 Luke-Jr

**************************************************************************

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  
*************************************************************************/
function serverlist_css() {
    
?>
            table.serverlist {
                width: 100%;
            }
            .serverlist_bg {
                background-color: #0b170b;
                color: white;
                background: url(background-aamenu.png);
                background-attachment: fixed;
                /* font-weight: bold;
                font-family: fixed; */
            }
            a { color: inherit; }
            table.serverlist,table.serverlist td,table.serverlist tr {
                border-collapse: collapse;
                border: 1px solid #183118 /*#254c25*/;
            }
            table.serverlist td {
                padding: 0 0.5ex;
            }
            table.serverlist td.numplayers { text-align: right; }
            table.serverlist td.players { border-color: #79ff79; border-left: 0; }
            /*td.numplayers {
                border-right-color: #3c823c;
            }
            td.numplayers:last-child { border-color: inherit; } */
            table.serverlist th {
                color: #a44646;
                font-weight: bold;
                text-align: left;
            }
            table.serverlist th.sortkey {
                color: #f3a9a9;
            }
            
            table.rcsid {
                border: 0;
                margin-top: 1em;
                border-collapse: collapse;
            }
            table.rcsid tr td                { padding-right: 0.35em    }
            table.rcsid tr td.page            { text-align: right        }
            table.rcsid tr td.lastmodstr,
            table.rcsid tr td.date,
            table.rcsid tr td.time,
            table.rcsid tr td.who,
            table.rcsid tr td.version        { text-align: left        }
            table.rcsid tr td form            { margin: 0 }
            
            font.darktext { background-color: white; }
    <?
}
function 
serverlist_betanotice() {
    
?>
Reminder: This is still <strong>beta</strong> and has issues on occasion. Mainly because it is slow and polls all the servers every time the page is loaded...<br /><br />
    <?
}

function 
serverlist_gpl($extraClasses false) {
    if (
$_GET['source'] != '') {
        
ini_set('highlight.bg',      '#0b170b');
        
ini_set('highlight.comment''#FF8000');
        
ini_set('highlight.default''#00d0d0');
        
ini_set('highlight.html',    '#d0d0d0');
        
ini_set('highlight.keyword''#00d000');
        
ini_set('highlight.string',  '#ff5050');
        
        
$srcreq $_GET['source'];
        switch (
$srcreq) {
        case 
'_top':
            
$srcreq $_SERVER['SCRIPT_FILENAME'];
            break;
        case 
'_self':
            
$srcreq __FILE__;
            break;
        case 
'aap_master.php':
        case 
'aap_serverinfo.php':
            break;
        default:
            die(
'I don\'t show that source!');
        }
    echo 
'<div class="src';
    if (
$extraClasses)
        echo 
$extraClasses";
    echo 
'">';
        
highlight_file($srcreq);
    echo 
'</div>';
    exit;
    }
}

require_once(
'armagetron-php-client.php');
if (!@include(
'player_name_links.php')) {
    function 
link_name($s) {
        return 
false;
    }
}

function 
convert_colours($s$terminate true) {
    if (
$terminate)
        
$s .= '0xRESETT';
    
$r '';
    
$fc 0;
    while ((
$i strpos($s'0x')) !== false) {
        
$r .= substr($s0$i);
        for (; 
$fc 0; --$fc)
            
$r .= '</font>';
        if (!
strcasecmp(substr($s$i 26), 'RESETT')) {
        } else {
            
$Cr hexdec(substr($s$i 22));
            
$Cg hexdec(substr($s$i 42));
            
$Cb hexdec(substr($s$i 62));
            
$r .= '<font color="#' substr('0'.dechex($Cr), -2) . substr('0'.dechex($Cg), -2) . substr('0'.dechex($Cb), -2) . '"';
            if (
max($Cr$Cg$Cb) < 0x7f || ($Cr $Cg $Cb) < 0xff)
                
$r .= ' class="darktext"';
            
$r .= '>';
            ++
$fc;
        }
        
$s substr($s$i 8);
    }
    
$r .= $s;
    return 
$r;
}

function 
convert_string($s) {
    return 
convert_colours(htmlspecialchars($s));
}

function 
safelink($s) {
    
$s trim(preg_replace('/0x.{6}/i'''$s));
    if (!
preg_match(',(([a-z0-9-]+):[^ ]*),i'$s$matches))
    {
        
// Give it a chance as HTTP
        
if (preg_match(',((?:[a-z0-9.-]+)\.(?:com|org|net|info|biz|name|[a-z]{2})(?:/[^ ]*)?)(?: .*)?$,i'$s$matches))
            return 
'http://' $matches[1];
        return 
false;
    }
    
$uri $matches[1];
    
$scheme $matches[2];
    switch(
$scheme) {
    case 
'http':
    case 
'mailto':
    case 
'xmpp':
    case 
'tel':
    case 
'pots':
        return 
$uri;
        break;
    default:
    }
    return 
false;
}

function 
serverlist_main($extraClasses false) {
    
serverlist_gpl($extraClasses);
    
$servers getMasterInfo('master3.armagetronad.net');

$sortkey $_GET['sort'];
$sortflip $_GET['sortflip'];
if (
$sortkey) {
    global 
$serverinfo;
    
$serverinfo = array();
    foreach (
$servers as $i) {
        
$si = new serverinfo($i['host'], $i['port']);
        if (
false === $si->name)
            continue;
        
            
$serverinfo[] = $si;
            
$si->fname trim(filtercolors($si->name));
    }
    
    function 
cmp_numplayers($a$b) {
        global 
$serverinfo;
        return 
$serverinfo[$b]->num_players_by_server $serverinfo[$a]->num_players_by_server;
    }
    function 
cmp_version($a$b) {
        global 
$serverinfo;
        return 
version_compare($serverinfo[$a]->version$serverinfo[$b]->version);
    }
    function 
cmp_name($a$b) {
        global 
$serverinfo;
        return 
strnatcasecmp($serverinfo[$a]->fname$serverinfo[$b]->fname);
    }
    function 
cmp_address($a$b) {
        global 
$serverinfo;
        if (
$hc strnatcasecmp($serverinfo[$a]->host$serverinfo[$b]->host))
            return 
$hc;
        return 
$serverinfo[$a]->port $serverinfo[$b]->port;
    }
    
    
uksort($serverinfo'cmp_'.$sortkey);
    if (
$sortflip)
        
$serverinfo array_reverse($serverinfo);
} else
    
$serverinfo $servers;
    
    echo 
'<table class="serverlist';
    if (
$extraClasses)
        echo 
$extraClasses";
    echo 
'">';
    echo 
'<tr>';
    foreach (array(
        array(
'id'=>'name',            'label'=>'Server Name',    'sortable'=>true,    ),
        array(
'id'=>'version',        'label'=>'Version',        'sortable'=>true,    ),
        array(
'id'=>'address',        'label'=>'Address',        'sortable'=>true,    ),
        array(
'id'=>'numplayers',    'label'=>'Players',        'sortable'=>true,
                
'extra'=>' colspan="2"'    ),
    ) as 
$headinfo) {
        
$CSSclass $headinfo['id'];
        if (
$headinfo['id'] == $sortkey)
            
$CSSclass .= ' sortkey';
        echo 
'<th class="'.$CSSclass.'"'.$headinfo['extra'].'>';
        if (
$headinfo['sortable']) {
            echo 
'<a href="?sort='.$headinfo['id'];
            if (
$sortkey == $headinfo['id'] && !$sortflip)
                echo 
'&amp;sortflip=1';
            echo 
'">';
        }
        echo 
$headinfo['label'];
        if (
$headinfo['sortable'])
            echo 
'</a>';
        echo 
'</th>'."\n";
    }
    echo 
'</tr>';
    foreach (
$serverinfo as $i) {
        if (
$sortkey)
            
$si $i;
        else {
            
$si = new serverinfo($i['host'], $i['port']);
            if (
false === $si->name)
                continue;
        }
        
        echo 
'<tr>
    <td class="name">'
;
        if (
$si->uri)
            echo 
'<!-- lit uri: ' htmlspecialchars($si->uri) . ' -->';
        
$uri safelink($si->uri);
        if (
$uri)
            echo 
'<a target="_new" href="'.htmlspecialchars($uri).'">';
        echo 
convert_string($si->name);
        if (
$si->uri)    echo '</a>';
        echo 
'</td>
    <td class="version">'
;
        echo 
$si->version;
        echo 
'</td>
    <td class="address">'
;
        echo 
'<a href="armagetronad://'.htmlspecialchars(trim($si->host).':'.trim($si->port)).'">';
        echo 
$si->host.':'.$si->port;
        echo 
'</a>';
        echo 
'</td>
    <td class="numplayers">'
;
        echo 
$si->num_players_by_server;
        echo 
'</td>';
        if (
$si->num_players_by_server) {
            echo 
'
    <td class="players">'
;
            for (
$d 0$d $si->num_players_by_server$d++)
            {
                if (
$d != 0) {
                    echo 
', ';
                    if (
$d == $si->num_players_by_server 1)
                        echo 
'and ';
                }
                
$pn $si->players[$d];
                if (
$pl link_name($pn))
                    echo 
'<a target="_new" href="'.$pl.'">';
                echo 
convert_string($pn);
                if (
$pl)
                    echo 
'</a>';
            }
            echo 
'</td>';
        }
        echo 
'
</tr>'
;
        if (!
$sortkey)
            
flush();
    }
    echo 
'</table>';
?>
<br />
    <table class="rcsid">
<?php
global $top_rcsid$aap_master_rcsid$aap_serverinfo_rcsid$player_name_links_rcsid;
$serverlist_common_rcsid '$Id: serverlist-common.php 9035 2009-02-23 01:42:59Z luke-jr $';
$rcsexpr '%^\$'.'I'.'d: [^ ]+ ([0-9]+) ([0-9/-]+) ([0-9:]+)Z ([^ ]+) \$$%';
foreach (array(
    array(
        
'rcsid'        => $top_rcsid,
        
'page'        => preg_replace(',^.*/,'''$_SERVER['PHP_SELF']),
        
'Spage'        => '_top',
        
'action'    => 'modified',
    ),
    array(
        
'rcsid'        => $serverlist_common_rcsid,
        
'page'        => preg_replace(',^.*/,'''__FILE__),
        
'Spage'        => '_self',
        
'action'    => 'modified',
    ),
    array(
        
'rcsid'        => $aap_master_rcsid,
        
'page'        => 'aap_master.php',
        
'action'    => 'modified',
    ),
    array(
        
'rcsid'        => $aap_serverinfo_rcsid,
        
'page'        => 'aap_serverinfo.php',
        
'action'    => 'modified',
    ),
    array(
        
'rcsid'        => $player_name_links_rcsid,
        
'page'        => 'Player name link list',
        
'action'    => 'updated',
    ),
) as 
$data) {
    echo 
'<!-- ' $data['page'] . ' rcsid: ' $data['rcsid'] . ' -->';
    if (!
preg_match($rcsexpr$data['rcsid'], $matches))
        continue;
    
?>
    <tr>
    <td class="src">
            <?
    
if ($data['action'] == 'modified') {
        echo 
'<a href="?source='.($data['Spage']?$data['Spage']:$data['page']).'">(View Source)</a>';
    }
            
?>
    </td>
        <td class="page"><?=$data['page']?></td>
        <td class="lastmodstr">last <?=$data['action']?></td>
        <td class="date"><?=$matches[2]?></td>
    <td>at</td>
        <td class="time"><?=$matches[3]?></td>
    <td>by</td>
        <td class="who"><?=$matches[4]?></td>
    <td>(revision:</td>
        <td class="version"><?=$matches[1]?>)</td>
</tr>
    <?
}
?>
</table>
    <?
}

// NOTE: Intentionally leaving off closing php so we don't get extra whitespace