php ufreeze server monitor
Posted: Sat Jan 28, 2012 11:28 pm
So I know that there's a few better ways of doing this, however I haven't had much time so here's the update so far. I'm going to be editing the webview.php to add rcon control for kicking along with a few other things dealing with rcon, it will also have the ability once I'm finished with it, to talk directly to users on the server, and see what the users on the server are saying. I'm currently running ufreeze which I'm developing all of this code around, so it might not be extremely friendly with other mods or settings.
webview.php:
quake3.php:
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;
}
}
?>