From 26d2173fa2b53ae7d910cbad0fe9ab7e0c0e5335 Mon Sep 17 00:00:00 2001 From: kremsy Date: Fri, 10 Jan 2014 13:08:26 +0100 Subject: [PATCH] terminate client, moved loading to other position --- application/core/ManiaControl.php | 211 ++++++++++++++++-------------- 1 file changed, 114 insertions(+), 97 deletions(-) diff --git a/application/core/ManiaControl.php b/application/core/ManiaControl.php index a3d207db..e05b3771 100644 --- a/application/core/ManiaControl.php +++ b/application/core/ManiaControl.php @@ -42,10 +42,9 @@ require_once __DIR__ . '/Server/Server.php'; require_once __DIR__ . '/Settings/SettingManager.php'; require_once __DIR__ . '/UpdateManager.php'; list($endiantest) = array_values(unpack('L1L', pack('V', 1))); -if ($endiantest == 1) { +if($endiantest == 1) { require_once __DIR__ . '/PhpRemote/GbxRemote.inc.php'; -} -else { +} else { require_once __DIR__ . '/PhpRemote/GbxRemote.bem.php'; } @@ -58,11 +57,11 @@ class ManiaControl implements CommandListener { /** * Constants */ - const VERSION = '0.01'; + const VERSION = '0.01'; const API_VERSION = '2013-04-16'; - const OS_UNIX = 'Unix'; - const OS_WIN = 'Windows'; - + const OS_UNIX = 'Unix'; + const OS_WIN = 'Windows'; + /** * Public properties */ @@ -87,7 +86,7 @@ class ManiaControl implements CommandListener { public $settingManager = null; public $statisticManager = null; public $updateManager = null; - + /** * Private properties */ @@ -98,27 +97,27 @@ class ManiaControl implements CommandListener { */ public function __construct() { $this->log('Loading ManiaControl v' . self::VERSION . '...'); - + // Load config $this->config = FileUtil::loadConfig('server.xml'); - + // Load ManiaControl Modules - $this->database = new Database($this); - $this->callbackManager = new CallbackManager($this); - $this->settingManager = new SettingManager($this); - $this->statisticManager = new StatisticManager($this); - $this->manialinkManager = new ManialinkManager($this); - $this->actionsMenu = new ActionsMenu($this); - $this->chat = new Chat($this); - $this->commandManager = new CommandManager($this); - $this->server = new Server($this); + $this->database = new Database($this); + $this->callbackManager = new CallbackManager($this); + $this->settingManager = new SettingManager($this); + $this->statisticManager = new StatisticManager($this); + $this->manialinkManager = new ManialinkManager($this); + $this->actionsMenu = new ActionsMenu($this); + $this->chat = new Chat($this); + $this->commandManager = new CommandManager($this); + $this->server = new Server($this); $this->authenticationManager = new AuthenticationManager($this); - $this->playerManager = new PlayerManager($this); - $this->mapManager = new MapManager($this); - $this->configurator = new Configurator($this); - $this->pluginManager = new PluginManager($this); - $this->updateManager = new UpdateManager($this); - + $this->playerManager = new PlayerManager($this); + $this->mapManager = new MapManager($this); + $this->configurator = new Configurator($this); + $this->pluginManager = new PluginManager($this); + $this->updateManager = new UpdateManager($this); + // Register for commands $this->commandManager->registerCommandListener('version', $this, 'command_Version'); $this->commandManager->registerCommandListener('restart', $this, 'command_Restart', true); @@ -131,7 +130,7 @@ class ManiaControl implements CommandListener { * @param string $message */ public function log($message, $stripCodes = false) { - if ($stripCodes) { + if($stripCodes) { $message = Formatter::stripCodes($message); } logMessage($message); @@ -145,15 +144,15 @@ class ManiaControl implements CommandListener { */ public function getOS($compareOS = null) { $windows = defined('PHP_WINDOWS_VERSION_MAJOR'); - if ($compareOS) { + if($compareOS) { // Return bool whether OS equals $compareOS - if ($compareOS == self::OS_WIN) { + if($compareOS == self::OS_WIN) { return $windows; } return !$windows; } // Return OS - if ($windows) { + if($windows) { return self::OS_WIN; } return self::OS_UNIX; @@ -166,7 +165,7 @@ class ManiaControl implements CommandListener { * @return string */ public function getClientErrorText($client = null) { - if (is_object($client)) { + if(is_object($client)) { return $client->getErrorMessage() . ' (' . $client->getErrorCode() . ')'; } return $this->client->getErrorMessage() . ' (' . $this->client->getErrorCode() . ')'; @@ -175,7 +174,7 @@ class ManiaControl implements CommandListener { /** * Handle Version Command * - * @param array $chatCallback + * @param array $chatCallback * @param Player $player */ public function command_Version(array $chatCallback, Player $player) { @@ -186,11 +185,11 @@ class ManiaControl implements CommandListener { /** * Handle Restart AdminCommand * - * @param array $chatCallback + * @param array $chatCallback * @param Player $player */ public function command_Restart(array $chatCallback, Player $player) { - if (!AuthenticationManager::checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { + if(!AuthenticationManager::checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { $this->authenticationManager->sendNotAllowed($player); return; } @@ -200,11 +199,11 @@ class ManiaControl implements CommandListener { /** * Handle //shutdown command * - * @param array $chat + * @param array $chat * @param Player $player */ public function command_Shutdown(array $chat, Player $player) { - if (!$this->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { + if(!$this->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { $this->authenticationManager->sendNotAllowed($player); return; } @@ -217,7 +216,9 @@ class ManiaControl implements CommandListener { * @param string $message */ public function quit($message = null) { - if ($message) $this->log($message); + if($message) { + $this->log($message); + } exit(); } @@ -227,16 +228,16 @@ class ManiaControl implements CommandListener { public function handleShutdown() { // OnShutdown callback $this->callbackManager->triggerCallback(CallbackManager::CB_MC_ONSHUTDOWN, array(CallbackManager::CB_MC_ONSHUTDOWN)); - + // Announce quit $this->chat->sendInformation('ManiaControl shutting down.'); - + // Hide manialinks $this->client->query('SendHideManialinkPage'); - + // Close connection $this->client->Terminate(); - + $this->log('Quitting ManiaControl!'); exit(); } @@ -249,30 +250,31 @@ class ManiaControl implements CommandListener { public function restart($message = null) { // Shutdown callback $this->callbackManager->triggerCallback(CallbackManager::CB_MC_ONSHUTDOWN, array(CallbackManager::CB_MC_ONSHUTDOWN)); - + // Announce restart $this->chat->sendInformation('Restarting ManiaControl...'); - if ($message) $this->log($message); - + if($message) { + $this->log($message); + } + // Hide widgets $this->client->query('SendHideManialinkPage'); - + // Close connection $this->client->Terminate(); - + $this->log('Restarting ManiaControl!'); - + // Execute start script in background - if ($this->getOS(self::OS_UNIX)) { + if($this->getOS(self::OS_UNIX)) { $command = 'sh ' . escapeshellarg(ManiaControlDir . '/ManiaControl.sh') . ' > /dev/null &'; exec($command); - } - else { + } else { // TODO: validate restart on windows $command = 'start /B ' . escapeshellarg(ManiaControlDir . '/ManiaControl.bat'); pclose(popen($command, 'r')); } - + exit(); } @@ -281,43 +283,46 @@ class ManiaControl implements CommandListener { */ public function run() { $this->log('Starting ManiaControl v' . self::VERSION . '!'); - + // Load plugins $this->pluginManager->loadPlugins(); - + // Connect to server $this->connect(); - + // Register shutdown handler register_shutdown_function(array($this, 'handleShutdown')); - - // Loading finished - $this->log('Loading completed!'); - - // Announce ManiaControl - $this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!'); - + // OnInit callback $this->callbackManager->triggerCallback(CallbackManager::CB_MC_ONINIT, array(CallbackManager::CB_MC_ONINIT)); - + + // Announce ManiaControl + $this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!'); + + // Loading finished + $this->log('Loading completed!'); + // Main loop - while (!$this->shutdownRequested) { + while(!$this->shutdownRequested) { $loopStart = microtime(true); - + // Disable script timeout set_time_limit(30); - + // Manager callbacks $this->callbackManager->manageCallbacks(); - + // Yield for next tick - $loopEnd = microtime(true); + $loopEnd = microtime(true); $sleepTime = 300000 - $loopEnd + $loopStart; - if ($sleepTime > 0) { + if($sleepTime > 0) { usleep($sleepTime); } } - + + //Close the client connection + $this->client->Terminate(); + // Shutdown $this->quit(); } @@ -328,64 +333,76 @@ class ManiaControl implements CommandListener { private function connect() { // Load remote client $this->client = new \IXR_ClientMulticall_Gbx(); - + $host = $this->config->server->xpath('host'); - if (!$host) trigger_error("Invalid server configuration (host).", E_USER_ERROR); - $host = (string) $host[0]; + if(!$host) { + trigger_error("Invalid server configuration (host).", E_USER_ERROR); + } + $host = (string)$host[0]; $port = $this->config->server->xpath('port'); - if (!$host) trigger_error("Invalid server configuration (port).", E_USER_ERROR); - $port = (string) $port[0]; - + if(!$host) { + trigger_error("Invalid server configuration (port).", E_USER_ERROR); + } + $port = (string)$port[0]; + $this->log("Connecting to server at {$host}:{$port}..."); - + // Connect - if (!$this->client->InitWithIp($host, $port, 20)) { + if(!$this->client->InitWithIp($host, $port, 20)) { trigger_error("Couldn't connect to server! " . $this->getClientErrorText(), E_USER_ERROR); } - + $login = $this->config->server->xpath('login'); - if (!$login) trigger_error("Invalid server configuration (login).", E_USER_ERROR); - $login = (string) $login[0]; - $pass = $this->config->server->xpath('pass'); - if (!$pass) trigger_error("Invalid server configuration (password).", E_USER_ERROR); - $pass = (string) $pass[0]; - + if(!$login) { + trigger_error("Invalid server configuration (login).", E_USER_ERROR); + } + $login = (string)$login[0]; + $pass = $this->config->server->xpath('pass'); + if(!$pass) { + trigger_error("Invalid server configuration (password).", E_USER_ERROR); + } + $pass = (string)$pass[0]; + // Authenticate - if (!$this->client->query('Authenticate', $login, $pass)) { + if(!$this->client->query('Authenticate', $login, $pass)) { trigger_error("Couldn't authenticate on server with user '{$login}'! " . $this->getClientErrorText(), E_USER_ERROR); } - + // Enable callback system - if (!$this->client->query('EnableCallbacks', true)) { + if(!$this->client->query('EnableCallbacks', true)) { trigger_error("Couldn't enable callbacks! " . $this->getClientErrorText(), E_USER_ERROR); } - + // Wait for server to be ready - if (!$this->server->waitForStatus(4)) { + if(!$this->server->waitForStatus(4)) { trigger_error("Server couldn't get ready!", E_USER_ERROR); } - + // Set api version - if (!$this->client->query('SetApiVersion', self::API_VERSION)) { + if(!$this->client->query('SetApiVersion', self::API_VERSION)) { trigger_error("Couldn't set API version '" . self::API_VERSION . "'! This might cause problems. " . $this->getClientErrorText()); } - + // Connect finished $this->log("Server Connection successfully established!"); - + // Hide old widgets $this->client->query('SendHideManialinkPage'); - + // Enable script callbacks if needed - if ($this->server->getGameMode() != 0) return; - if (!$this->client->query('GetModeScriptSettings')) { + if($this->server->getGameMode() != 0) { + return; + } + if(!$this->client->query('GetModeScriptSettings')) { trigger_error("Couldn't get mode script settings. " . $this->getClientErrorText()); return; } $scriptSettings = $this->client->getResponse(); - if (!array_key_exists('S_UseScriptCallbacks', $scriptSettings)) return; + if(!array_key_exists('S_UseScriptCallbacks', $scriptSettings)) { + return; + } $scriptSettings['S_UseScriptCallbacks'] = true; - if (!$this->client->query('SetModeScriptSettings', $scriptSettings)) { + if(!$this->client->query('SetModeScriptSettings', $scriptSettings)) { trigger_error("Couldn't set mode script settings to enable script callbacks. " . $this->getClientErrorText()); return; }