rendered paste body<?
# globals for XML functions
$depth = array();
$tag = array();
# defaults for request
$xmlfile = "http://laanx.fragnetics.com/_xml_reports/server_report.xml";
$serverstatus = array(
"online" => false,
"count" => 0,
"time" => 0,
"players" => array(),
"result" => false
);
define("LAANX_OK", 1);
define("LAANX_UNINIT", 0);
define("LAANX_NO_CONN", -1);
define("LAANX_BAD_XML", -2);
define("LAANX_OFFLINE", -3);
function get_document($url) # written by 'netspy', XHTMLforum.de
{
$content = '';
$is_header = TRUE;
$base_url = parse_url($url);
if(($fp = @fsockopen($base_url['host'], 80, $errno, $errstr, 20)) !== FALSE)
{
if(!empty($base_url['query']))
{
$query = '?'.$base_url['query'];
}
else
{
$query = '';
}
$data = 'GET '.$base_url['path'].$query." HTTP/1.0\r\n".'Host: '.$base_url['host']."\r\n"."Connection: Close\r\n\r\n";
stream_set_timeout($fp, 20);
fputs($fp, $data);
while(!feof($fp))
{
$line = fgets($fp, 4096);
if (!$is_header)
{
$content .= $line;
}
else
{
if (strlen(trim($line)) == 0)
{
$is_header = FALSE;
}
}
}
fclose($fp);
return $content;
}
else
{
return FALSE;
}
}
function get_document_2($url)
{
$base_url = parse_url($url);
if(!empty($base_url['query']))
{
$query = '?'.$base_url['query'];
}
else
{
$query = '';
}
$service_port = getservbyname("www", "tcp");
$address = gethostbyname($base_url["host"]);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket < 0)
{
return FALSE;
}
$result = socket_connect($socket, $address, $service_port);
if($result < 0)
{
return FALSE;
}
@stream_set_timeout($socket, 20);
$in = 'GET '.$base_url['path'].$query." HTTP/1.0\r\n".'Host: '.$base_url['host']."\r\n"."Connection: Close\r\n\r\n";
socket_write($socket, $in, strlen($in));
$out = "";
$content = "";
$in_header = true;
while($out = @socket_read($socket, 2048, PHP_BINARY_READ))
{
$content .= $out;
}
socket_close($socket);
if(strlen($content) > 10)
{
$eohdr = strpos($content, "\r\n\r\n")+4;
if($eohdr !== FALSE)
{
$content = substr($content, $eohdr);
}
}
return $content;
}
function startElement($parser, $name, $attrs)
{
global $depth, $tag, $serverstatus;
$tag["name"] = $name;
$tag["attrs"] = $attrs;
switch(strtoupper($name))
{
case "PLAYER":
$serverstatus["players"][$attrs["NAME"]] = array("guild" => $attrs["GUILD"], "title" => $attrs["TITLE"]);
break;
}
$depth[$parser]++;
}
function endElement($parser, $name)
{
global $depth;
$depth[$parser]--;
}
function characterData($parser, $data)
{
global $tag, $serverstatus;
$data = trim($data);
switch(strtoupper($tag["name"]))
{
case "LAANX_ONLINE":
if(!empty($data)) switch(strtoupper($data))
{
case "YES":
$serverstatus["online"] = true;
break;
default:
$serverstatus["online"] = false;
}
break;
case "ONLINE_COUNT":
if($serverstatus["count"]==0) // if not set
$serverstatus["count"] = intval($data);
break;
}
}
function getLaanxStatus()
{
global $serverstatus, $xmlfile;
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
// trigger_error("Reading content");
if(ini_get("allow_url_fopen") || (ini_set("allow_url_fopen", true) !== false))
{
// trigger_error("HTTP wrapper for file() is available.");
$content = file_get_contents($xmlfile);
}
else
{
// trigger_error("HTTP wrapper for file() not available. Trying get_document().");
for($a = 0; $a < 5; $a++)
{
$content = get_document($xmlfile);
if($content) break;
}
}
if($content === false)
{
// trigger_error("get_document() failed. Trying get_document_2().");
for($a = 0; $a < 5; $a++)
{
$content = get_document_2($xmlfile);
if($content) break;
}
}
if($content === false)
{
// trigger_error("get_document_2() failed. Giving up...");
$serverstatus["result"] = LAANX_NO_CONN; # XML report not retrieved
return $serverstatus;
}
else
{
// trigger_error("XML file read.");
if(!xml_parse($xml_parser, $content, true))
{
// trigger_error("Parsing the XML content failed.");
xml_parser_free($xml_parser);
?>
<!--
<? var_export($content) ?>
-->
<?
$serverstatus["result"] = LAANX_BAD_XML; # XML parsed with errors
return $serverstatus;
}
}
xml_parser_free($xml_parser);
if($serverstatus["online"])
{
$serverstatus["result"] = LAANX_OK; # OK
}
else
{
$serverstatus["result"] = LAANX_OFFLINE; # Server offline
$serverstatus["count"] = 0;
$serverstatus["players"] = array();
}
return $serverstatus;
}
?>