maniaControl = $maniaControl; $this->initTables(); $this->serverCommands = new ServerCommands($maniaControl); // Register for callbacks $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MC_ONINIT, $this, 'onInit'); } /** * Refetch the Server Properties */ private function updateProperties() { // System info $systemInfo = $this->getSystemInfo(); $this->ip = $systemInfo->publishedIp; $this->port = $systemInfo->port; $this->p2pPort = $systemInfo->p2PPort; $this->login = $systemInfo->serverLogin; $this->titleId = $systemInfo->titleId; // Database index $mysqli = $this->maniaControl->database->mysqli; $query = "INSERT INTO `" . self::TABLE_SERVERS . "` ( `login` ) VALUES ( ? ) ON DUPLICATE KEY UPDATE `index` = LAST_INSERT_ID(`index`);"; $statement = $mysqli->prepare($query); if($mysqli->error) { trigger_error($mysqli->error); return; } $statement->bind_param('s', $this->login); $statement->execute(); if($statement->error) { trigger_error($statement->error); $statement->close(); return; } $this->index = $statement->insert_id; $statement->close(); } /** * Initialize necessary Database Tables * * @return bool */ private function initTables() { $mysqli = $this->maniaControl->database->mysqli; $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_SERVERS . "` ( `index` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(100) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`index`), UNIQUE KEY `login` (`login`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Servers' AUTO_INCREMENT=1;"; $statement = $mysqli->prepare($query); if($mysqli->error) { trigger_error($mysqli->error, E_USER_ERROR); return false; } $statement->execute(); if($statement->error) { trigger_error($statement->error, E_USER_ERROR); return false; } $statement->close(); return true; } /** * Handle OnInit Callback * * @param array $callback */ public function onInit(array $callback) { $this->updateProperties(); } /** * Fetch Game Data Directory * * @return string */ public function getDataDirectory() { if($this->dataDirectory == '') { if(!$this->dataDirectory = $this->maniaControl->client->gameDataDirectory()) { trigger_error("Couldn't get data directory. " . $this->maniaControl->getClientErrorText()); return null; } } return $this->dataDirectory; } /** * Fetch Maps Directory * * @return string */ public function getMapsDirectory() { $dataDirectory = $this->getDataDirectory(); if(!$dataDirectory) { return null; } return "{$dataDirectory}Maps/"; } /** * Checks if ManiaControl has Access to the given Directory * * @param string $directory * @return bool */ public function checkAccess($directory) { if(!$directory) { return false; } return (is_dir($directory) && is_writable($directory)); } /** * Get the Server Info * * @param bool $detailed * @return array */ public function getInfo($detailed = false) { if($detailed) { $login = $this->login; if(!$info = $this->maniaControl->client->getDetailedPlayerInfo($login)) { trigger_error("Couldn't fetch detailed server info. " . $this->maniaControl->getClientErrorText()); return null; } return $info; } if(!$info = $this->maniaControl->client->getMainServerPlayerInfo()) { trigger_error("Couldn't fetch server info. " . $this->maniaControl->getClientErrorText()); return null; } return $info; } /** * Get Server Options * * @return array */ public function getOptions() { if(!$options = $this->maniaControl->client->getServerOptions()) { trigger_error("Couldn't fetch server options. " . $this->maniaControl->getClientErrorText()); return null; } return $options; } /** * Fetch current Server Name * * @return string */ public function getName() { if(!$name = $this->maniaControl->client->getServerName()) { trigger_error("Couldn't fetch server name. " . $this->maniaControl->getClientErrorText()); return null; } return $name; } /** * Fetch Server Version * * @return string */ public function getVersion() { if(!$version = $this->maniaControl->client->getVersion()) { trigger_error("Couldn't fetch server version. " . $this->maniaControl->getClientErrorText()); return null; } return $version; } /** * Fetch Server System Info * * @return SystemInfos */ public function getSystemInfo() { if(!$systemInfo = $this->maniaControl->client->getSystemInfo()) { trigger_error("Couldn't fetch server system info. " . $this->maniaControl->getClientErrorText()); return null; } return $systemInfo; } /** * Fetch current Game Mode * * @param bool $stringValue * @param int $parseValue * @return int | string */ public function getGameMode($stringValue = false, $parseValue = null) { if(is_int($parseValue)) { $gameMode = $parseValue; } else { $gameMode = $this->maniaControl->client->getGameMode(); /*if(!$gameMode = $this->maniaControl->client->getGameMode()){ trigger_error("Couldn't fetch current game mode. " . $this->maniaControl->getClientErrorText()); return null; }*/ } if($stringValue) { switch($gameMode) { case 0: return 'Script'; case 1: return 'Rounds'; case 2: return 'TimeAttack'; case 3: return 'Team'; case 4: return 'Laps'; case 5: return 'Cup'; case 6: return 'Stunts'; default: return 'Unknown'; } } return $gameMode; } /** * Retrieve Validation Replay for the given Player * * @param Player $player * @return string */ public function getValidationReplay(Player $player) { if(!$replay = $this->maniaControl->client->getValidationReplay($player->login)) { trigger_error("Couldn't get validation replay of '{$player->login}'. " . $this->maniaControl->getClientErrorText()); return null; } return $replay; } /** * Retrieve Ghost Replay for the given Player * * @param Player $player * @return string */ public function getGhostReplay(Player $player) { $dataDir = $this->getDataDirectory(); if(!$this->checkAccess($dataDir)) { return null; } // Build file name $map = $this->getMap(); //TODO does that workm, where is the method?= $gameMode = $this->getGameMode(); $time = time(); $fileName = "GhostReplays/Ghost.{$player->login}.{$gameMode}.{$time}.{$map['UId']}.Replay.Gbx"; // Save ghost replay if(!$this->maniaControl->client->saveBestGhostsReplay($player->login, $fileName)) { trigger_error("Couldn't save ghost replay. " . $this->maniaControl->getClientErrorText()); return null; } // Load replay file $ghostReplay = file_get_contents("{$dataDir}Replays/{$fileName}"); if(!$ghostReplay) { trigger_error("Couldn't retrieve saved ghost replay."); return null; } return $ghostReplay; } /** * Wait for the Server to have the given Status * * @param int $statusCode * @return bool */ public function waitForStatus($statusCode = 4) { $response = $this->maniaControl->client->getStatus(); // Check if server has the given status if($response->code === 4) { return true; } // Server not yet in given status - Wait for it... $waitBegin = time(); $maxWaitTime = 20; $lastStatus = $response['Name']; $this->maniaControl->log("Waiting for server to reach status {$statusCode}..."); $this->maniaControl->log("Current Status: {$lastStatus}"); while($response->code !== 4) { sleep(1); $response = $this->maniaControl->client->getStatus(); if($lastStatus !== $response['Name']) { $this->maniaControl->log("New Status: {$response['Name']}"); $lastStatus = $response['Name']; } if(time() - $maxWaitTime > $waitBegin) { // It took too long to reach the status trigger_error("Server couldn't reach status {$statusCode} after {$maxWaitTime} seconds! " . $this->maniaControl->getClientErrorText()); return false; } } return true; } }