webview.php:
Code: Select all
<? require("quake3.php");?>
<?
  $q3=new Quake3;
  $serveradr="208.83.232.26";
  $serverport=27960;
  $website="www.gaminggroups.com";
  $status=$q3->getServerStatus($serveradr,$serverport,1500);
  if ($status) {
?>
</HEAD><body text=#FFFFFF bgcolor=#2B3856>
<center>
<table BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH=100%  bgcolor=#000000>
<tr><td style="border-width: 0" VALIGN=top><table id="0" class="drag" BORDER=1 CELLSPACING=0 CELLPADDING=2 WIDTH=100%  bgcolor=#000000>
<tr>
<td COLSPAN=3 CLASS="cellHeading">
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100% bgcolor=#000000>
<tr><td style="text-align: center" class="transparent"><font class="headingText" color=#FFFFFF><?=$q3->m_servervars["sv_hostname"]?></font></td></tr></table>
</td></tr>
</table>
<table id="1" class="drag" BORDER=1 CELLSPACING=0 CELLPADDING=0 WIDTH=100%" bgcolor=#625D5D >
<tr>
<td COLSPAN=3 CLASS="row1" style="text-align: center"><?=$q3->m_servervars["version"]?></td>
</tr>
<tr>
<td WIDTH=40%><table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100%>
<tr>
<td CLASS="row2" style="text-align: center"><?=$q3->m_servervars["sv_currentclients"]?> of max. <?=$q3->m_servervars["sv_maxclients"]?> players</td>
</tr>
<tr>
<td CLASS="row1" style="text-align: center">Cap Limit: <?=$q3->m_servervars["capturelimit"]?></td>
</tr>
<tr>
<td CLASS="row2" style="text-align: center"> DM Flags: <?=$q3->m_servervars["dmflags"]?></a></td>
</tr>
<tr>
<td CLASS="row1" style="text-align: center">Max Rate: <?=$q3->m_servervars["sv_maxRate"]?></td>
</tr>
<tr>
<td CLASS="neutral" style="text-align: center"><br>
<br>
<br>
<br>
<br>
<br>
<br>
</td>
</tr>
</table>
<td CLASS="cellHeading" WIDTH=20%>Map:  <?=$q3->m_servervars["mapname"]?><br>
<img TITLE="q3dm18" WIDTH=128 HEIGHT=128 SRC="images/maps/q3dm18.jpg">
</td>
<td WIDTH=40%>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100%  bgcolor=#000000>
<tr>
<td CLASS="row2" style="text-align: center"><?=$q3->m_servervars["gamename"] ?><?=$q3->m_servervars["g_ufreezeVersion"]?></td>
</tr>
<tr>
<td CLASS="row1" style="text-align: center">Frag Limit: <?=$q3->m_servervars["fraglimit"]?></td>
</tr>
<tr>
<td CLASS="row2" style="text-align: center">Time Limit: <?=$q3->m_servervars["timelimit"]?></td>
</tr>
<tr>
<td CLASS="neutral" style="text-align: center"><br>
<br>
<br>
<br>
<br>
<br>
<br>
</td>
</tr>
</table>
</td>
</tr>
</table>
<table id="2" class="drag" BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100%"  bgcolor=#000000>
<tr>
<td id="players" VALIGN=top WIDTH=70%>
<table BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH=100%  bgcolor=#000000>
<tr>
<td CLASS="cellHeading" WIDTH=64%>Player Name</td>
<td CLASS="cellHeading" WIDTH=18%>Score</td>
<td CLASS="cellHeading" WIDTH=18%>Ping</td>
</tr>
</table>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100%  bgcolor=#000000>
<? if (is_array($q3->m_playerinfo)) { ?>
    <? while (list(,$player) = each ($q3->m_playerinfo)) { ?>
    <TR>
        <TD WIDTH=64%><?=htmlspecialchars($player["name"])?> </TD><TD WIDTH=18%> <?=$player["frags"]?></TD><TD WIDTH=18%><?=$player["ping"]?></TD>
    </TR>
    <? } ?>
<? } else { ?>
    <TR>
        <TD COLSPAN="3">No players on server right now</TD>
    </TR>
    <? } ?>
</table>
</td>
<td id="rules" VALIGN=top WIDTH=30%>
<table BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH=100%  bgcolor=#000000>
<tr>
<td CLASS="cellHeading" WIDTH=40%>Rule</td>
<td CLASS="cellHeading" WIDTH=60%>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100%  bgcolor=#000000>
<tr><td style="text-align: center" class="transparent"><font class="headingText">Value</font></td><td align=right valign=top width=10 class="transparent"></td></table>
</td>
</tr>
</table>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100% bgcolor=#000000 >
<tr CLASS="row2" ><td CLASS="cell2" style="text-align: left" WIDTH=40%>-IP</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><? echo $serveradr; echo ":".$serverport;?></td>
</tr>
<tr CLASS="row1" ><td CLASS="cell1" style="text-align: left" WIDTH=40%>-URL</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?echo $website;?></td>
</tr>
<tr CLASS="row1" ><td CLASS="cell1" style="text-align: left" WIDTH=40%>g_autothawtime</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["g_autoThawTime"]?></td>
</tr>
<tr CLASS="row2"  ><td CLASS="cell2" style="text-align: left" WIDTH=40%>g_maxGameClients</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["g_maxGameClients"]?></td>
</tr>
<tr CLASS="row1"  ><td CLASS="cell1" style="text-align: left" WIDTH=40%>g_needpass</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["g_needpass"]?></td>
</tr>
<tr CLASS="row2"  ><td CLASS="cell2" style="text-align: left" WIDTH=40%>g_thawtime</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["g_thawTime"]?></td>
</tr>
<tr CLASS="row1"  ><td CLASS="cell1" style="text-align: left" WIDTH=40%>gamename</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["gamename"] ?></td>
</tr>
<tr CLASS="row2"  ><td CLASS="cell2" style="text-align: left" WIDTH=40%>Protocol</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["protocol"]?></td>
</tr>
<tr CLASS="row1"  ><td CLASS="cell1" style="text-align: left" WIDTH=40%>Max Ping</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["sv_maxPing"]?></td>
</tr>
<tr CLASS="row2"  ><td CLASS="cell2" style="text-align: left" WIDTH=40%>Min Ping</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["sv_minPing"]?></td>
</tr>
</tr>
<tr CLASS="row2"  ><td CLASS="cell2" style="text-align: left" WIDTH=40%>sv_privateClients</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["sv_privateClients"]?></td>
</tr>
</table>
</td>
</tr>
</table></td>
</tr>
</table><table id="footer" style="position:absolute; left:0px" BORDER=1 CELLSPACING=0 CELLPADDING=2 WIDTH=100%  bgcolor=#000000>
<tr><td style="text-align:left;" class="transparent"></td><td style="text-align:right;" class="transparent">Scores Red: <?=$q3->m_servervars["Score_Red"]?>  Blue: <?=$q3->m_servervars["Score_Blue"]?></tr></td></table></center>
</body></html>
<? } ?>
quake3.php:
Code: Select all
<?
//      **********************************************************************************************
//      Class Quake3
//      Author : Henrik Schack Jensen (henrik@schack.dk)
//
//      Changelog:
//      Version 1.00            03/13/2001 Initial release
//      A utilityclass (PHP4 only) to do serverstatus-queries against Quake3Arena servers
//
//      Syntax:
//
//      Function getServerStatus(serveraddress,serverport,timeout)
//      Get player/servervar info from server
//
//      All results are returned in membervariables:
//
//
//      Demosource is available at http://www.gameserver.dk/
//      **********************************************************************************************
//
//      Function used to sort players by frags
//      Needs to be defined globally in order for usort to call it
//
function fragsort ($a, $b) {
        if ($a["frags"] == $b["frags"]) return 0;
        if ($a["frags"] > $b["frags"]) {
                return -1;
        } else {
                return 1;
        }
}
Class Quake3 {
        var $m_playerinfo               ="";            // Info about players
        var $m_servervars               ="";            // Info about the server
        //
        // Get exact time, used for timeout counting
        //
        function timenow() {
                return doubleval(ereg_replace('^0\.([0-9]*) ([0-9]*)$','\\2.\\1',microtime()));
        }
        //
        // Function to remove funny characters from playernames
        //
        function removefunchars($data) {
                $result="";
                $skipnextchar=false;
                for ($i=0;$i<strlen($data);$i++) {
                        if (!$skipnextchar) {
                                $currentchar=ord(substr($data,$i,1));
                                if (($currentchar==27) || ($currentchar==94)) {
                                        $skipnextchar=true;
                                } else {
                                        if (($currentchar>=32) && ($currentchar<=127)) $result=$result.chr($currentchar);
                                        if (($currentchar>=160) && ($currentchar<=255)) $result=$result.chr($currentchar-128);
                                }
                        } else {
                                $skipnextchar=false;
                        }
                }
                return $result;
        }
        //
        // Read raw data from server
        //
        function getServerData($command,$serveraddress,$portnumber,$waittime) {
                $serverdata             ="";
                $serverdatalen=0;
                if ($waittime< 500) $waittime= 500;
                if ($waittime>2000) $waittime=2000;
                $waittime=doubleval($waittime/1000.0);
                if (!$cssocket=fsockopen("udp://".$serveraddress,$portnumber,$errnr)) {
                        $this->errmsg="No connection";
                        return "";
                }
                socket_set_blocking($cssocket,true);
                socket_set_timeout($cssocket,0,500000);
                fwrite($cssocket,$command,strlen($command));
                // Mark
                $starttime=$this->timenow();
                do {
                        $serverdata.=fgetc($cssocket);
                        $serverdatalen++;
                        $socketstatus=socket_get_status($cssocket);
                        if ($this->timenow()>($starttime+$waittime)) {
                                $this->errmsg="Connection timed out";
                                fclose($cssocket);
                                return "";
                        }
                } while ($socketstatus["unread_bytes"] );
                fclose($cssocket);
                return $serverdata;
        }
        // **********************************************************************
        // getServerStatus
        // Read rules/setup from the gameserver into m_servervars
        // Return true if successful
        // **********************************************************************
        function getServerStatus($serveraddress,$portnumber,$timeout) {
                $cmd="\xFF\xFF\xFF\xFFgetstatus\n";
                $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$timeout);
                if (strlen($serverdata)>20) {
                        $serverdata=substr($serverdata,20);
                } else {
                        return false;
                }
                $srvvars=substr($serverdata,0,strpos($serverdata,"\n"))."\\";
                $players=substr($serverdata,strpos($serverdata,"\n")+1);
                // Skip the last linefeed
                $players=substr($players,0,strlen($players)-1);
                // Split playerinfo and fill into array
                $playercount=0;
                if (strlen($players)) {
                        $playercollection=explode("\n",$players);
                        while (list($key,$data) = each ($playercollection)) {
                                eregi("^([-0-9]+) ([-0-9]+) \"(.*)\"",$data,$player);
                                $this->m_playerinfo[$key]=array("frags"=>$player[1],"ping"=>$player[2],"name"=>$this->removefunchars($player[3]));
                                $playercount++;
                        }
                }
                // Fake servervar containing number of current players
                $this->m_servervars["sv_currentclients"]=$playercount;
                if ($playercount>0) usort($this->m_playerinfo,"fragsort");
                // Split servervars and fill into array
                $name_tok = strtok ($srvvars,"\\");
                $val_tok  = strtok ("\\");
                while (strlen($name_tok)) {
                        $this->m_servervars[$name_tok]=$val_tok;
                        $name_tok = strtok ("\\");
                        $val_tok  = strtok ("\\");
                }
                return true;
        }
}
?>