All pastes #912749 Raw Edit

getLaanxStatus.inc.php

public text v1 · immutable
·published 2008-02-21 16:27 UTC
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,
		"npc" => 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;
			case "NPC_CLIENT":
				$serverstatus["npc"] = true;
				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;
	}
?>