dedimania continue
This commit is contained in:
		
				
					committed by
					
						
						Steffen Schröder
					
				
			
			
				
	
			
			
			
						parent
						
							deb08cfbd0
						
					
				
				
					commit
					6affb6825b
				
			@@ -41,10 +41,23 @@ class AsynchronousFileReader {
 | 
				
			|||||||
		foreach($this->sockets as $key => &$socket) {
 | 
							foreach($this->sockets as $key => &$socket) {
 | 
				
			||||||
			/** @var SocketStructure $socket */
 | 
								/** @var SocketStructure $socket */
 | 
				
			||||||
			$socket->streamBuffer .= fread($socket->socket, 4096);
 | 
								$socket->streamBuffer .= fread($socket->socket, 4096);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								//$socket->streamBuffer .= fgets($socket->socket, 4096);
 | 
				
			||||||
 | 
								//var_dump($socket->streamBuffer);
 | 
				
			||||||
 | 
								/*	$meta = stream_get_meta_data($socket->socket);
 | 
				
			||||||
 | 
									while($meta["unread_bytes"] > 0){
 | 
				
			||||||
 | 
										var_dump("test");
 | 
				
			||||||
 | 
										$socket->streamBuffer .= fgets($socket->socket, 4096);
 | 
				
			||||||
 | 
										$meta = stream_get_meta_data($socket->socket);
 | 
				
			||||||
 | 
										var_dump($meta);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									var_dump($meta);
 | 
				
			||||||
 | 
									exit();*/
 | 
				
			||||||
			if (feof($socket->socket) || time() > ($socket->creationTime + self::SOCKET_TIMEOUT)) {
 | 
								if (feof($socket->socket) || time() > ($socket->creationTime + self::SOCKET_TIMEOUT)) {
 | 
				
			||||||
				fclose($socket->socket);
 | 
									fclose($socket->socket);
 | 
				
			||||||
				unset($this->sockets[$key]);
 | 
									unset($this->sockets[$key]);
 | 
				
			||||||
 | 
					 | 
				
			||||||
				$result = "";
 | 
									$result = "";
 | 
				
			||||||
				$error  = 0;
 | 
									$error  = 0;
 | 
				
			||||||
				if (time() > ($socket->creationTime + self::SOCKET_TIMEOUT)) {
 | 
									if (time() > ($socket->creationTime + self::SOCKET_TIMEOUT)) {
 | 
				
			||||||
@@ -84,15 +97,36 @@ class AsynchronousFileReader {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$header = $this->parseHeader($resultArray[0]);
 | 
							$header = $this->parseHeader($resultArray[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (isset($header["transfer-encoding"])) {
 | 
							if (isset($header["transfer-encoding"])) {
 | 
				
			||||||
			$result = $this->decode_chunked($resultArray[1]);
 | 
								$result = $this->decode_chunked($resultArray[1]);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			$result = $resultArray[1];
 | 
								$result = $resultArray[1];
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return $result;
 | 
							return $this->decompressData($header, $result);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Checks if the data is Compressed and uncompress it
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param $header
 | 
				
			||||||
 | 
						 * @param $data
 | 
				
			||||||
 | 
						 * @return string
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function decompressData($header, $data) {
 | 
				
			||||||
 | 
							if (isset($header["content-encoding"])) {
 | 
				
			||||||
 | 
								switch($header["content-encoding"]) {
 | 
				
			||||||
 | 
									case "gzip":
 | 
				
			||||||
 | 
									case "gzip;":
 | 
				
			||||||
 | 
										return gzdecode($data);
 | 
				
			||||||
 | 
									case "deflate":
 | 
				
			||||||
 | 
									case "deflate;":
 | 
				
			||||||
 | 
										return gzinflate($data);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $data;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Decode Chunks
 | 
						 * Decode Chunks
 | 
				
			||||||
@@ -134,6 +168,58 @@ class AsynchronousFileReader {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Send Data via POST Method
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param        $url
 | 
				
			||||||
 | 
						 * @param        $function
 | 
				
			||||||
 | 
						 * @param        $content
 | 
				
			||||||
 | 
						 * @param string $contentType
 | 
				
			||||||
 | 
						 * @return bool|null
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function postData($url, $function, $content, $compressed = false, $contentType = 'UTF-8') {
 | 
				
			||||||
 | 
							if (!is_callable($function)) {
 | 
				
			||||||
 | 
								$this->maniaControl->log("Function is not callable");
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!$url) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$urlData = parse_url($url);
 | 
				
			||||||
 | 
							$port    = (isset($urlData['port']) ? $urlData['port'] : 80);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$socket = @fsockopen($urlData['host'], $port, $errno, $errstr, 4);
 | 
				
			||||||
 | 
							if (!$socket) {
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$query = 'POST ' . $urlData['path'] . ' HTTP/1.1' . PHP_EOL;
 | 
				
			||||||
 | 
							$query .= 'Host: ' . $urlData['host'] . PHP_EOL;
 | 
				
			||||||
 | 
							$query .= 'Accept-Charset: utf-8' . PHP_EOL;
 | 
				
			||||||
 | 
							$query .= 'Accept-Encoding: gzip, deflate' . PHP_EOL;
 | 
				
			||||||
 | 
							//$query .= 'Content-Encoding: gzip' . PHP_EOL;
 | 
				
			||||||
 | 
							$query .= 'Content-Type: text/xml; charset=utf-8;' . PHP_EOL;
 | 
				
			||||||
 | 
							$query .= 'Keep-Alive: 300' . PHP_EOL;
 | 
				
			||||||
 | 
							$query .= 'Connection: Keep-Alive' . PHP_EOL;
 | 
				
			||||||
 | 
							$query .= 'User-Agent: ManiaControl v' . ManiaControl::VERSION . PHP_EOL;
 | 
				
			||||||
 | 
							$query .= 'Content-Length: ' . strlen($content) . PHP_EOL . PHP_EOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$query .= $content . PHP_EOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fwrite($socket, $query);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$success = stream_set_blocking($socket, 0);
 | 
				
			||||||
 | 
							if (!$success) {
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$socketStructure = new SocketStructure($url, $socket, $function);
 | 
				
			||||||
 | 
							array_push($this->sockets, $socketStructure);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Load a remote file
 | 
						 * Load a remote file
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ class Map {
 | 
				
			|||||||
	public $mapType = '';
 | 
						public $mapType = '';
 | 
				
			||||||
	public $mapStyle = '';
 | 
						public $mapStyle = '';
 | 
				
			||||||
	public $nbCheckpoints = -1;
 | 
						public $nbCheckpoints = -1;
 | 
				
			||||||
 | 
						public $nbLaps = -1;
 | 
				
			||||||
	/** @var MXMapInfo $mx */
 | 
						/** @var MXMapInfo $mx */
 | 
				
			||||||
	public $mx = null;
 | 
						public $mx = null;
 | 
				
			||||||
	public $authorLogin = '';
 | 
						public $authorLogin = '';
 | 
				
			||||||
@@ -57,6 +58,7 @@ class Map {
 | 
				
			|||||||
		$this->mapType       = $mpMap->mapType;
 | 
							$this->mapType       = $mpMap->mapType;
 | 
				
			||||||
		$this->mapStyle      = $mpMap->mapStyle;
 | 
							$this->mapStyle      = $mpMap->mapStyle;
 | 
				
			||||||
		$this->nbCheckpoints = $mpMap->nbCheckpoints;
 | 
							$this->nbCheckpoints = $mpMap->nbCheckpoints;
 | 
				
			||||||
 | 
							$this->nbLaps        = $mpMap->nbLaps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$this->authorNick = $this->authorLogin;
 | 
							$this->authorNick = $this->authorLogin;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -377,6 +377,7 @@ class MapManager implements CallbackListener {
 | 
				
			|||||||
		if (array_key_exists($rpcMap->uId, $this->maps)) {
 | 
							if (array_key_exists($rpcMap->uId, $this->maps)) {
 | 
				
			||||||
			$this->currentMap                = $this->maps[$rpcMap->uId];
 | 
								$this->currentMap                = $this->maps[$rpcMap->uId];
 | 
				
			||||||
			$this->currentMap->nbCheckpoints = $rpcMap->nbCheckpoints;
 | 
								$this->currentMap->nbCheckpoints = $rpcMap->nbCheckpoints;
 | 
				
			||||||
 | 
								$this->currentMap->nbLaps        = $rpcMap->nbLaps;
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		$map                   = $this->initializeMap($rpcMap);
 | 
							$map                   = $this->initializeMap($rpcMap);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -225,7 +225,7 @@ class Server implements CallbackListener {
 | 
				
			|||||||
				case 1:
 | 
									case 1:
 | 
				
			||||||
					return 'Rounds';
 | 
										return 'Rounds';
 | 
				
			||||||
				case 2:
 | 
									case 2:
 | 
				
			||||||
					return 'TimeAttack';
 | 
										return 'Timeattack';
 | 
				
			||||||
				case 3:
 | 
									case 3:
 | 
				
			||||||
					return 'Team';
 | 
										return 'Team';
 | 
				
			||||||
				case 4:
 | 
									case 4:
 | 
				
			||||||
@@ -306,7 +306,7 @@ class Server implements CallbackListener {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		// Server not yet in given status - Wait for it...
 | 
							// Server not yet in given status - Wait for it...
 | 
				
			||||||
		$waitBegin   = time();
 | 
							$waitBegin   = time();
 | 
				
			||||||
		$maxWaitTime = 20;
 | 
							$maxWaitTime = 30;
 | 
				
			||||||
		$lastStatus  = $response->name;
 | 
							$lastStatus  = $response->name;
 | 
				
			||||||
		$this->maniaControl->log("Waiting for server to reach status {$statusCode}...");
 | 
							$this->maniaControl->log("Waiting for server to reach status {$statusCode}...");
 | 
				
			||||||
		$this->maniaControl->log("Current Status: {$lastStatus}");
 | 
							$this->maniaControl->log("Current Status: {$lastStatus}");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,12 +5,16 @@ require_once "DedimaniaData.php";
 | 
				
			|||||||
use ManiaControl\Callbacks\CallbackListener;
 | 
					use ManiaControl\Callbacks\CallbackListener;
 | 
				
			||||||
use ManiaControl\Callbacks\TimerListener;
 | 
					use ManiaControl\Callbacks\TimerListener;
 | 
				
			||||||
use ManiaControl\ManiaControl;
 | 
					use ManiaControl\ManiaControl;
 | 
				
			||||||
 | 
					use ManiaControl\Players\Player;
 | 
				
			||||||
use ManiaControl\Plugins\Plugin;
 | 
					use ManiaControl\Plugins\Plugin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
					class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Constants
 | 
						 * Constants
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
						const ID                            = 100;
 | 
				
			||||||
 | 
						const VERSION                       = 0.1;
 | 
				
			||||||
 | 
						const MLID_DEDIMANIA                = 'Dedimania.ManialinkId';
 | 
				
			||||||
	const XMLRPC_MULTICALL              = 'system.multicall';
 | 
						const XMLRPC_MULTICALL              = 'system.multicall';
 | 
				
			||||||
	const DEDIMANIA_URL                 = 'http://dedimania.net:8081/Dedimania';
 | 
						const DEDIMANIA_URL                 = 'http://dedimania.net:8081/Dedimania';
 | 
				
			||||||
	const DEDIMANIA_OPENSESSION         = 'dedimania.OpenSession';
 | 
						const DEDIMANIA_OPENSESSION         = 'dedimania.OpenSession';
 | 
				
			||||||
@@ -21,6 +25,7 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
	const DEDIMANIA_UPDATESERVERPLAYERS = 'dedimania.UpdateServerPlayers';
 | 
						const DEDIMANIA_UPDATESERVERPLAYERS = 'dedimania.UpdateServerPlayers';
 | 
				
			||||||
	const DEDIMANIA_SETCHALLENGETIMES   = 'dedimania.SetChallengeTimes';
 | 
						const DEDIMANIA_SETCHALLENGETIMES   = 'dedimania.SetChallengeTimes';
 | 
				
			||||||
	const DEDIMANIA_WARNINGSANDTTR2     = 'dedimania.WarningsAndTTR2';
 | 
						const DEDIMANIA_WARNINGSANDTTR2     = 'dedimania.WarningsAndTTR2';
 | 
				
			||||||
 | 
						const USE_COMPRESSION               = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Private Properties
 | 
						 * Private Properties
 | 
				
			||||||
@@ -29,6 +34,9 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
	private $maniaControl = null;
 | 
						private $maniaControl = null;
 | 
				
			||||||
	/** @var DedimaniaData $dedimaniaData */
 | 
						/** @var DedimaniaData $dedimaniaData */
 | 
				
			||||||
	private $dedimaniaData = null;
 | 
						private $dedimaniaData = null;
 | 
				
			||||||
 | 
						private $manialink = null;
 | 
				
			||||||
 | 
						//private $lastSendManialink = array();
 | 
				
			||||||
 | 
						private $updateManialink = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Prepares the Plugin
 | 
						 * Prepares the Plugin
 | 
				
			||||||
@@ -51,41 +59,229 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$this->openDedimaniaSession(true);
 | 
							$this->maniaControl->timerManager->registerTimerListening($this, 'updateEverySecond', 1000);
 | 
				
			||||||
	}
 | 
							$this->maniaControl->timerManager->registerTimerListening($this, 'handleEveryMinute', 1000 * 60);
 | 
				
			||||||
 | 
							//TODO parse settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private function openDedimaniaSession($init = false) {
 | 
					 | 
				
			||||||
		// Open session
 | 
							// Open session
 | 
				
			||||||
		$serverInfo          = $this->maniaControl->server->getInfo();
 | 
							$serverInfo          = $this->maniaControl->server->getInfo();
 | 
				
			||||||
		$serverVersion       = $this->maniaControl->client->getVersion();
 | 
							$serverVersion       = $this->maniaControl->client->getVersion();
 | 
				
			||||||
		$packMask            = substr($this->maniaControl->server->titleId, 2);
 | 
							$packMask            = substr($this->maniaControl->server->titleId, 2);
 | 
				
			||||||
		$this->dedimaniaData = new DedimaniaData("abc", "cde", $serverInfo->path, $packMask, $serverVersion);
 | 
							$this->dedimaniaData = new DedimaniaData(".paragoncanyon", "a3ee654ac8", $serverInfo->path, $packMask, $serverVersion);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$this->openDedimaniaSession();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$url = self::DEDIMANIA_URL;
 | 
						/**
 | 
				
			||||||
 | 
						 * Opens the Dedimania Session
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function openDedimaniaSession() {
 | 
				
			||||||
 | 
							//$content = gzcompress($this->encode_request(self::DEDIMANIA_OPENSESSION, array($this->dedimaniaData->toArray())));
 | 
				
			||||||
 | 
							$content = $this->encode_request(self::DEDIMANIA_OPENSESSION, array($this->dedimaniaData->toArray()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		//TODO make postFile method in FileReader
 | 
							$this->maniaControl->fileReader->postData(self::DEDIMANIA_URL, function ($data, $error) {
 | 
				
			||||||
		$urlData = parse_url($url);
 | 
								$this->maniaControl->log("Try to connect on Dedimania");
 | 
				
			||||||
 | 
								$data = $this->decode($data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$content = gzcompress($this->encode_request(self::DEDIMANIA_OPENSESSION, array($this->dedimaniaData->toArray())));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		$query = 'POST ' . $urlData['path'] . ' HTTP/1.1' . PHP_EOL;
 | 
					 | 
				
			||||||
		$query .= 'Host: ' . $urlData['host'] . PHP_EOL;
 | 
					 | 
				
			||||||
		$query .= 'Accept-Charset: utf-8;' . PHP_EOL;
 | 
					 | 
				
			||||||
		$query .= 'Accept-Encoding: gzip;' . PHP_EOL;
 | 
					 | 
				
			||||||
		$query .= 'Content-Type: text/xml; charset=utf-8;' . PHP_EOL;
 | 
					 | 
				
			||||||
		$query .= 'Keep-Alive: 300;' . PHP_EOL;
 | 
					 | 
				
			||||||
		$query .= 'User-Agent: ManiaControl v' . ManiaControl::VERSION . PHP_EOL;
 | 
					 | 
				
			||||||
		$query .= 'Content-Length: ' . strlen($content) . PHP_EOL . PHP_EOL;
 | 
					 | 
				
			||||||
		$query .= $content . PHP_EOL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		$this->maniaControl->fileReader->loadFile($url, function ($data, $error) {
 | 
					 | 
				
			||||||
			var_dump($data);
 | 
					 | 
				
			||||||
			var_dump($error);
 | 
								var_dump($error);
 | 
				
			||||||
 | 
								if (is_array($data)) {
 | 
				
			||||||
 | 
									foreach($data as $index => $methodResponse) {
 | 
				
			||||||
 | 
										if (xmlrpc_is_fault($methodResponse)) {
 | 
				
			||||||
 | 
											$this->handleXmlRpcFault($methodResponse);
 | 
				
			||||||
 | 
										} else if ($index <= 0) {
 | 
				
			||||||
 | 
											$responseData = $methodResponse[0];
 | 
				
			||||||
 | 
											var_dump($responseData);
 | 
				
			||||||
 | 
											$this->dedimaniaData->sessionId = $responseData['SessionId'];
 | 
				
			||||||
 | 
											if ($this->dedimaniaData->sessionId != '') {
 | 
				
			||||||
 | 
												$this->maniaControl->log("Dedimania connection successfully established.");
 | 
				
			||||||
 | 
												$this->fetchDedimaniaRecords();
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												$this->maniaControl->log("Error while opening Dedimania Connection");
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}, $content, self::USE_COMPRESSION);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		}, 'UTF-8', $query);
 | 
						/**
 | 
				
			||||||
 | 
						 * Handle 1Second callback
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function updateEverySecond($time) {
 | 
				
			||||||
 | 
							$this->updateManialink = false;
 | 
				
			||||||
 | 
							//TODO send manialink
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Check if the session is alive every minute
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param null $callback
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public function handleEveryMinute($callback = null) {
 | 
				
			||||||
 | 
							//$this->checkDedimaniaSession();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Fetch Dedimania Records
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param bool $reset
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function fetchDedimaniaRecords($reset = true) {
 | 
				
			||||||
 | 
							if ($this->dedimaniaData->sessionId == '') {
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ($reset) {
 | 
				
			||||||
 | 
								// Reset records
 | 
				
			||||||
 | 
								$this->dedimaniaData->records = array();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$serverInfo = $this->getServerInfo();
 | 
				
			||||||
 | 
							$playerInfo = $this->getPlayerList();
 | 
				
			||||||
 | 
							$mapInfo    = $this->getMapInfo();
 | 
				
			||||||
 | 
							$gameMode   = $this->getGameModeString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!$serverInfo || !$playerInfo || !$mapInfo || !$gameMode) {
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$data    = array($this->dedimaniaData->sessionId, $mapInfo, $gameMode, $serverInfo, $playerInfo);
 | 
				
			||||||
 | 
							$content = $this->encode_request(self::DEDIMANIA_GETRECORDS, $data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$this->maniaControl->fileReader->postData(self::DEDIMANIA_URL, function ($data, $error) {
 | 
				
			||||||
 | 
								$data = $this->decode($data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (is_array($data)) {
 | 
				
			||||||
 | 
									foreach($data as $index => $methodResponse) {
 | 
				
			||||||
 | 
										if (xmlrpc_is_fault($methodResponse)) {
 | 
				
			||||||
 | 
											$this->handleXmlRpcFault($methodResponse);
 | 
				
			||||||
 | 
											return false;
 | 
				
			||||||
 | 
										} else if ($index <= 0) {
 | 
				
			||||||
 | 
											$responseData                 = $methodResponse[0];
 | 
				
			||||||
 | 
											$this->dedimaniaData->records = $responseData;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$this->updateManialink = true;
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							}, $content, self::USE_COMPRESSION);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Checks If a Dedimania Session exists, if not create a new oen
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function checkDedimaniaSession() {
 | 
				
			||||||
 | 
							if ($this->dedimaniaData->sessionId == '') {
 | 
				
			||||||
 | 
								$this->openDedimaniaSession();
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$content = $this->encode_request(self::DEDIMANIA_CHECKSESSION, array($this->dedimaniaData->sessionId));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$this->maniaControl->fileReader->postData(self::DEDIMANIA_URL, function ($data, $error) {
 | 
				
			||||||
 | 
								$data = $this->decode($data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (is_array($data)) {
 | 
				
			||||||
 | 
									foreach($data as $methodResponse) {
 | 
				
			||||||
 | 
										if (xmlrpc_is_fault($methodResponse)) {
 | 
				
			||||||
 | 
											$this->handleXmlRpcFault($methodResponse);
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											$responseData = $methodResponse[0];
 | 
				
			||||||
 | 
											if (is_bool($responseData)) {
 | 
				
			||||||
 | 
												if (!$responseData) {
 | 
				
			||||||
 | 
													$this->openDedimaniaSession();
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}, $content, self::USE_COMPRESSION);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Build server info Structure for callbacks
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function getServerInfo() {
 | 
				
			||||||
 | 
							$server = $this->maniaControl->client->getServerOptions();
 | 
				
			||||||
 | 
							if (!$server) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (count($this->maniaControl->playerManager->getPlayers()) == 0) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$playerCount    = $this->maniaControl->playerManager->getPlayerCount();
 | 
				
			||||||
 | 
							$spectatorCount = $this->maniaControl->playerManager->getSpectatorCount();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return array('SrvName' => $server->name, 'Comment' => $server->comment, 'Private' => (strlen($server->password) > 0), 'NumPlayers' => $playerCount, 'MaxPlayers' => $server->currentMaxPlayers, 'NumSpecs' => $spectatorCount, 'MaxSpecs' => $server->currentMaxSpectators);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Build simple player list for callbacks
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function getPlayerList($votes = false) {
 | 
				
			||||||
 | 
							$client = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$players = $this->maniaControl->playerManager->getPlayers();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (count($players) == 0) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$playerInfo = array();
 | 
				
			||||||
 | 
							foreach($players as $player) {
 | 
				
			||||||
 | 
								/** @var Player $player */
 | 
				
			||||||
 | 
								array_push($playerInfo, array('Login' => $player->login, 'IsSpec' => $player->isSpectator));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return $playerInfo;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Build map info struct for dedimania requests
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function getMapInfo() {
 | 
				
			||||||
 | 
							$map = $this->maniaControl->mapManager->getCurrentMap();
 | 
				
			||||||
 | 
							if (!$map) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$mapInfo                  = array();
 | 
				
			||||||
 | 
							$mapInfo['UId']           = $map->uid;
 | 
				
			||||||
 | 
							$mapInfo['Name']          = $map->name;
 | 
				
			||||||
 | 
							$mapInfo['Author']        = $map->authorLogin;
 | 
				
			||||||
 | 
							$mapInfo['Environment']   = $map->environment;
 | 
				
			||||||
 | 
							$mapInfo['NbCheckpoints'] = $map->nbCheckpoints;
 | 
				
			||||||
 | 
							$mapInfo['NbLaps']        = $map->nbLaps;
 | 
				
			||||||
 | 
							return $mapInfo;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Get Dedimania string representation of the current game mode
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @return String
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function getGameModeString() {
 | 
				
			||||||
 | 
							$gameMode = $this->maniaControl->server->getGameMode();
 | 
				
			||||||
 | 
							if ($gameMode === null) {
 | 
				
			||||||
 | 
								trigger_error("Couldn't retrieve game mode. ");
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							switch($gameMode) {
 | 
				
			||||||
 | 
								case 1:
 | 
				
			||||||
 | 
								case 3:
 | 
				
			||||||
 | 
								case 5:
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									return 'Rounds';
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								case 2:
 | 
				
			||||||
 | 
								case 4:
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									return 'TA';
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return null;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -100,6 +296,15 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
		return xmlrpc_encode_request(self::XMLRPC_MULTICALL, array($paramArray), array('encoding' => 'UTF-8', 'escaping' => 'markup'));
 | 
							return xmlrpc_encode_request(self::XMLRPC_MULTICALL, array($paramArray), array('encoding' => 'UTF-8', 'escaping' => 'markup'));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Handles xml rpc fault
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param $fault
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private function handleXmlRpcFault($fault) {
 | 
				
			||||||
 | 
							trigger_error('XmlRpc Fault: ' . $fault['faultString'] . ' (' . $fault['faultCode'] . ')');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Decodes xml rpc response
 | 
						 * Decodes xml rpc response
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
@@ -114,6 +319,8 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
	 * Unload the plugin and its resources
 | 
						 * Unload the plugin and its resources
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public function unload() {
 | 
						public function unload() {
 | 
				
			||||||
 | 
							$this->maniaControl->timerManager->unregisterTimerListenings($this);
 | 
				
			||||||
 | 
							$this->maniaControl->callbackManager->unregisterCallbackListener($this);
 | 
				
			||||||
		unset($this->maniaControl);
 | 
							unset($this->maniaControl);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -123,7 +330,7 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
	 * @return int
 | 
						 * @return int
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public static function getId() {
 | 
						public static function getId() {
 | 
				
			||||||
		// TODO: Implement getId() method.
 | 
							return self::ID;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -132,7 +339,7 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
	 * @return string
 | 
						 * @return string
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public static function getName() {
 | 
						public static function getName() {
 | 
				
			||||||
		// TODO: Implement getName() method.
 | 
							return "Dedimania Plugin";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -141,7 +348,7 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
	 * @return float
 | 
						 * @return float
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public static function getVersion() {
 | 
						public static function getVersion() {
 | 
				
			||||||
		// TODO: Implement getVersion() method.
 | 
							return self::VERSION;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -150,7 +357,7 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
	 * @return string
 | 
						 * @return string
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public static function getAuthor() {
 | 
						public static function getAuthor() {
 | 
				
			||||||
		// TODO: Implement getAuthor() method.
 | 
							return "kremsy and steeffeen";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -159,6 +366,6 @@ class Dedimania implements CallbackListener, TimerListener, Plugin {
 | 
				
			|||||||
	 * @return string
 | 
						 * @return string
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public static function getDescription() {
 | 
						public static function getDescription() {
 | 
				
			||||||
		// TODO: Implement getDescription() method.
 | 
							return "Dedimania Plugin for Trackmania";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -26,6 +26,8 @@ class DedimaniaData {
 | 
				
			|||||||
	public $version;
 | 
						public $version;
 | 
				
			||||||
	public $login;
 | 
						public $login;
 | 
				
			||||||
	public $code;
 | 
						public $code;
 | 
				
			||||||
 | 
						public $sessionId = '';
 | 
				
			||||||
 | 
						public $records = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public function __construct($serverLogin, $dedimaniaCode, $path, $packmask, Version $serverVersion) {
 | 
						public function __construct($serverLogin, $dedimaniaCode, $path, $packmask, Version $serverVersion) {
 | 
				
			||||||
		$this->game          = "TM2";
 | 
							$this->game          = "TM2";
 | 
				
			||||||
@@ -41,8 +43,12 @@ class DedimaniaData {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	public function toArray() {
 | 
						public function toArray() {
 | 
				
			||||||
		$array = array();
 | 
							$array = array();
 | 
				
			||||||
		foreach(get_object_vars($this) as $key => $value)
 | 
							foreach(get_object_vars($this) as $key => $value) {
 | 
				
			||||||
 | 
								if ($key == 'records' || $key == 'sessionId') {
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			$array[ucfirst($key)] = $value;
 | 
								$array[ucfirst($key)] = $value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return $array;
 | 
							return $array;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
} 
 | 
					} 
 | 
				
			||||||
		Reference in New Issue
	
	Block a user