From 415ca788c292488a1c99ebec53c2e3da4f69fa6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Schro=CC=88der?= Date: Thu, 20 Mar 2014 16:18:35 +0100 Subject: [PATCH] server config model class --- application/core/Server/Config.php | 36 ++++++++ application/core/Server/Server.php | 141 ++++++++++++++++++++--------- 2 files changed, 135 insertions(+), 42 deletions(-) create mode 100644 application/core/Server/Config.php diff --git a/application/core/Server/Config.php b/application/core/Server/Config.php new file mode 100644 index 00000000..6738304b --- /dev/null +++ b/application/core/Server/Config.php @@ -0,0 +1,36 @@ +id = $id; + $this->host = $host; + $this->port = $port; + $this->login = $login; + $this->pass = $pass; + } +} diff --git a/application/core/Server/Server.php b/application/core/Server/Server.php index 00c3eb34..22ac40f8 100644 --- a/application/core/Server/Server.php +++ b/application/core/Server/Server.php @@ -13,16 +13,17 @@ use Maniaplanet\DedicatedServer\Xmlrpc\Exception; * @author steeffeen & kremsy */ class Server implements CallbackListener { - - /** + + /* * Constants */ - const TABLE_SERVERS = 'mc_servers'; + const TABLE_SERVERS = 'mc_servers'; const CB_TEAM_MODE_CHANGED = 'ServerCallback.TeamModeChanged'; - - /** - * Public Properties + + /* + * Public properties */ + public $config = null; public $index = -1; public $ip = null; public $port = -1; @@ -33,9 +34,9 @@ class Server implements CallbackListener { public $serverCommands = null; public $usageReporter = null; public $rankingManager = null; - - /** - * Private Properties + + /* + * Private properties */ private $maniaControl = null; private $teamMode = false; @@ -48,30 +49,84 @@ class Server implements CallbackListener { public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; $this->initTables(); - + $this->serverCommands = new ServerCommands($maniaControl); - $this->usageReporter = new UsageReporter($maniaControl); + $this->usageReporter = new UsageReporter($maniaControl); $this->rankingManager = new RankingManager($maniaControl); - + // Register for callbacks $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_ONINIT, $this, 'onInit'); } + /** + * Load the Server Configuration from the Config XML + */ + public function loadConfig() { + if (!$this->maniaControl->config) trigger_error('Error loading Server Config!', E_USER_ERROR); + + // Config id + $id = null; + global $argv; + foreach ($argv as $arg) { + $parts = explode('=', $arg); + if (count($parts) < 2) continue; + if ($parts[0] != '-id') continue; + $id = $parts[1]; + break; + } + + // Xml server tag with given id + $serverTag = null; + if ($id) { + $serverTags = $this->maniaControl->config->xpath("server[@id='{$id}']"); + if ($serverTags) $serverTag = $serverTags[0]; + if (!$serverTag) trigger_error("No Server configured with the ID '{$id}'!", E_USER_ERROR); + } + else { + $serverTags = $this->maniaControl->config->xpath('server'); + if ($serverTags) $serverTag = $serverTags[0]; + if (!$serverTag) trigger_error('No Server configured!', E_USER_ERROR); + } + + // Host + $host = $serverTag->xpath('host'); + if ($host) $host = (string) $host[0]; + if (!$host) trigger_error("Invalid server configuration (host).", E_USER_ERROR); + + // Port + $port = $serverTag->xpath('port'); + if ($port) $port = (string) $port[0]; + if (!$port) trigger_error("Invalid server configuration (port).", E_USER_ERROR); + + // Login + $login = $serverTag->xpath('login'); + if ($login) $login = (string) $login[0]; + if (!$login) trigger_error("Invalid server configuration (login).", E_USER_ERROR); + + // Pass + $pass = $serverTag->xpath('pass'); + if ($pass) $pass = (string) $pass[0]; + if (!$pass) trigger_error("Invalid server configuration (password).", E_USER_ERROR); + + // Create config object + $this->config = new Config($id, $host, $port, $login, $pass); + } + /** * Refetch the Server Properties */ private function updateProperties() { // System info - $systemInfo = $this->maniaControl->client->getSystemInfo(); - $this->ip = $systemInfo->publishedIp; - $this->port = $systemInfo->port; + $systemInfo = $this->maniaControl->client->getSystemInfo(); + $this->ip = $systemInfo->publishedIp; + $this->port = $systemInfo->port; $this->p2pPort = $systemInfo->p2PPort; - $this->login = $systemInfo->serverLogin; + $this->login = $systemInfo->serverLogin; $this->titleId = $systemInfo->titleId; - + // Database index - $mysqli = $this->maniaControl->database->mysqli; - $query = "INSERT INTO `" . self::TABLE_SERVERS . "` ( + $mysqli = $this->maniaControl->database->mysqli; + $query = "INSERT INTO `" . self::TABLE_SERVERS . "` ( `login` ) VALUES ( ? @@ -99,8 +154,8 @@ class Server implements CallbackListener { * @return bool */ private function initTables() { - $mysqli = $this->maniaControl->database->mysqli; - $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_SERVERS . "` ( + $mysqli = $this->maniaControl->database->mysqli; + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_SERVERS . "` ( `index` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(100) NOT NULL, PRIMARY KEY (`index`), @@ -127,19 +182,19 @@ class Server implements CallbackListener { */ public function getAllServers() { $mysqli = $this->maniaControl->database->mysqli; - $query = "SELECT * FROM `" . self::TABLE_SERVERS . "`"; + $query = "SELECT * FROM `" . self::TABLE_SERVERS . "`"; $result = $mysqli->query($query); if (!$result) { trigger_error($mysqli->error); return array(); } - + $servers = array(); - while($row = $result->fetch_object()) { + while ($row = $result->fetch_object()) { array_push($servers, $row); } $result->close(); - + return $servers; } @@ -156,10 +211,10 @@ class Server implements CallbackListener { * @param bool $teamMode */ public function setTeamMode($teamMode = true) { - $oldStatus = $this->teamMode; + $oldStatus = $this->teamMode; $this->teamMode = $teamMode; - - // Trigger callback + + // Trigger callback if ($oldStatus != $this->teamMode) { $this->maniaControl->callbackManager->triggerCallback(self::CB_TEAM_MODE_CHANGED, $teamMode); } @@ -174,7 +229,6 @@ class Server implements CallbackListener { return $this->teamMode; } - /** * Fetch Game Data Directory * @@ -226,17 +280,18 @@ class Server implements CallbackListener { * Fetch current Game Mode * * @param bool $stringValue - * @param int $parseValue + * @param int $parseValue * @return int | string */ public function getGameMode($stringValue = false, $parseValue = null) { if (is_int($parseValue)) { $gameMode = $parseValue; - } else { + } + else { $gameMode = $this->maniaControl->client->getGameMode(); } if ($stringValue) { - switch($gameMode) { + switch ($gameMode) { case 0: return 'Script'; case 1: @@ -267,7 +322,8 @@ class Server implements CallbackListener { public function getValidationReplay($login) { try { $replay = $this->maniaControl->client->getValidationReplay($login); - } catch(Exception $e) { + } + catch (Exception $e) { trigger_error("Couldn't get validation replay of '{$login}'. " . $e->getMessage()); return null; } @@ -285,21 +341,22 @@ class Server implements CallbackListener { if (!$this->checkAccess($dataDir)) { return null; } - + // Build file name - $map = $this->maniaControl->mapManager->getCurrentMap(); + $map = $this->maniaControl->mapManager->getCurrentMap(); $gameMode = $this->getGameMode(); - $time = time(); + $time = time(); $fileName = "GhostReplays/Ghost.{$login}.{$gameMode}.{$time}.{$map->uid}.Replay.Gbx"; - + // Save ghost replay try { $this->maniaControl->client->saveBestGhostsReplay($login, $fileName); - } catch(Exception $e) { + } + catch (Exception $e) { trigger_error("Couldn't save ghost replay. " . $e->getMessage()); return null; } - + // Load replay file $ghostReplay = file_get_contents("{$dataDir}Replays/{$fileName}"); if (!$ghostReplay) { @@ -322,12 +379,12 @@ class Server implements CallbackListener { return true; } // Server not yet in given status - Wait for it... - $waitBegin = time(); + $waitBegin = time(); $maxWaitTime = 50; - $lastStatus = $response->name; + $lastStatus = $response->name; $this->maniaControl->log("Waiting for server to reach status {$statusCode}..."); $this->maniaControl->log("Current Status: {$lastStatus}"); - while($response->code !== 4) { + while ($response->code !== 4) { sleep(1); $response = $this->maniaControl->client->getStatus(); if ($lastStatus !== $response->name) {