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); ?>