From a9b1842a6fa6476fd73e0cd0613e9eaaacb0759a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Schro=CC=88der?= Date: Tue, 19 Nov 2013 20:29:37 +0100 Subject: [PATCH] - Improved Join/Leave messages - Moved Server Commands into separate class - Added \Server namespace --- application/core/Commands/CommandManager.php | 194 +-------------- application/core/ManiaControl.php | 6 +- .../core/Manialinks/ManialinkIdHandler.php | 6 +- application/core/Maps/MapCommands.php | 2 +- application/core/Players/PlayerManager.php | 10 +- application/core/{ => Server}/Server.php | 21 +- application/core/Server/ServerCommands.php | 225 ++++++++++++++++++ application/core/Settings/SettingManager.php | 2 - 8 files changed, 249 insertions(+), 217 deletions(-) rename application/core/{ => Server}/Server.php (94%) create mode 100644 application/core/Server/ServerCommands.php diff --git a/application/core/Commands/CommandManager.php b/application/core/Commands/CommandManager.php index 5ac684eb..17df15bb 100644 --- a/application/core/Commands/CommandManager.php +++ b/application/core/Commands/CommandManager.php @@ -15,16 +15,13 @@ use ManiaControl\Players\Player; * * @author steeffeen & kremsy */ -// TODO: settings for command auth levels -class CommandManager implements CallbackListener, CommandListener { +class CommandManager implements CallbackListener { /** * Private properties */ private $maniaControl = null; private $commandListeners = array(); - private $serverShutdownTime = -1; - private $serverShutdownEmpty = false; /** * Construct commands manager @@ -33,15 +30,7 @@ class CommandManager implements CallbackListener, CommandListener { */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - - $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MC_5_SECOND, $this, 'each5Seconds'); $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERCHAT, $this, 'handleChatCallback'); - - // Register basic commands - $commands = array('version', 'shutdown', 'shutdownserver', 'systeminfo', 'setservername', 'kick'); - foreach ($commands as $command) { - $this->registerCommandListener($command, $this, 'command_' . $command); - } } /** @@ -96,187 +85,6 @@ class CommandManager implements CallbackListener, CommandListener { } return true; } - - /** - * Send ManiaControl version - * - * @param array $chat - * @return bool - */ - private function command_version(array $chat) { - $login = $chat[1][1]; - $message = 'This server is using ManiaControl v' . ManiaControl::VERSION . '!'; - return $this->maniaControl->chat->sendInformation($message, $login); - } - - /** - * Handle systeminfo command - * - * @param array $chat - * @param Player $player - * @return bool - */ - private function command_systeminfo(array $chat, Player $player) { - if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return false; - } - $systemInfo = $this->maniaControl->server->getSystemInfo(); - $message = 'SystemInfo: ip=' . $systemInfo['PublishedIp'] . ', port=' . $systemInfo['Port'] . ', p2pPort=' . - $systemInfo['P2PPort'] . ', title=' . $systemInfo['TitleId'] . ', login=' . $systemInfo['ServerLogin'] . ', '; - return $this->maniaControl->chat->sendInformation($message, $player->login); - } - - /** - * Handle shutdown command - * - * @param array $chat - * @param Player $player - * @return bool - */ - private function command_shutdown(array $chat, Player $player) { - if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return false; - } - return $this->maniaControl->quit("ManiaControl shutdown requested by '{$player->login}'"); - } - - /** - * Handle server shutdown command - * - * @param array $chat - * @param Player $player - * @return bool - */ - private function command_shutdownserver(array $chat, Player $player) { - if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return false; - } - // Check for delayed shutdown - $params = explode(' ', $chat[1][2]); - if (count($params) >= 2) { - $param = $params[1]; - if ($param == 'empty') { - $this->serverShutdownEmpty = !$this->serverShutdownEmpty; - if ($this->serverShutdownEmpty) { - $this->maniaControl->chat->sendInformation("The server will shutdown as soon as it's empty!", $player->login); - return true; - } - $this->maniaControl->chat->sendInformation("Empty-shutdown cancelled!", $player->login); - return true; - } - $delay = (int) $param; - if ($delay <= 0) { - // Cancel shutdown - $this->serverShutdownTime = -1; - $this->maniaControl->chat->sendInformation("Delayed shutdown cancelled!", $player->login); - return true; - } - // Trigger delayed shutdown - $this->serverShutdownTime = time() + $delay * 60.; - $this->maniaControl->chat->sendInformation("The server will shut down in {$delay} minutes!", $player->login); - return true; - } - return $this->shutdownServer($player->login); - } - - /** - * Handle kick command - * - * @param array $chat - * @param Player $player - * @return bool - */ - private function command_kick(array $chat, Player $player) { - if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_OPERATOR)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return false; - } - $params = explode(' ', $chat[1][2], 3); - if (count($params) < 2) { - // TODO: show usage - return false; - } - $target = $params[1]; - $target = $this->maniaControl->playerManager->getPlayer($target); - if (!$target) { - $this->maniaControl->chat->sendError("Invalid player login.", $player->login); - return false; - } - $message = ''; - if (isset($params[2])) { - $message = $params[2]; - } - return $this->maniaControl->client->query('Kick', $target->login, $message); - } - - /** - * Handle setservername command - * - * @param array $chat - * @param Player $player - * @return bool - */ - private function command_setservername(array $chat, Player $player) { - if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_ADMIN)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return false; - } - $params = explode(' ', $chat[1][2], 2); - if (count($params) < 2) { - // TODO: show usage - return false; - } - $serverName = $params[1]; - if (!$this->maniaControl->client->query('SetServerName', $serverName)) { - trigger_error("Couldn't set server name. " . $this->maniaControl->getClientErrorText()); - $this->maniaControl->chat->sendError("Error setting server name!", $player->login); - return false; - } - $serverName = $this->maniaControl->server->getName(); - $this->maniaControl->chat->sendInformation("New Name: " . $serverName, $player->login); - return true; - } - - /** - * Check stuff each 5 seconds - * - * @param array $callback - * @return bool - */ - public function each5Seconds(array $callback) { - // Empty shutdown - if ($this->serverShutdownEmpty) { - $players = $this->maniaControl->server->getPlayers(); - if (count($players) <= 0) { - return $this->shutdownServer('empty'); - } - } - - // Delayed shutdown - if ($this->serverShutdownTime > 0) { - if (time() >= $this->serverShutdownTime) { - return $this->shutdownServer('delayed'); - } - } - } - - /** - * Perform server shutdown - * - * @param string $login - * @return bool - */ - private function shutdownServer($login = '#') { - if (!$this->maniaControl->client->query('StopServer')) { - trigger_error("Server shutdown command from '{login}' failed. " . $this->maniaControl->getClientErrorText()); - return false; - } - $this->maniaControl->quit("Server shutdown requested by '{$login}'"); - return true; - } } ?> diff --git a/application/core/ManiaControl.php b/application/core/ManiaControl.php index dd38a057..ce77ba70 100644 --- a/application/core/ManiaControl.php +++ b/application/core/ManiaControl.php @@ -9,6 +9,7 @@ use ManiaControl\Manialinks\ManialinkIdHandler; use ManiaControl\Maps\MapManager; use ManiaControl\Players\PlayerManager; use ManiaControl\Plugins\PluginManager; +use ManiaControl\Server\Server; require_once __DIR__ . '/Callbacks/CallbackManager.php'; require_once __DIR__ . '/Commands/CommandManager.php'; @@ -23,7 +24,7 @@ require_once __DIR__ . '/Maps/Map.php'; require_once __DIR__ . '/Maps/MapManager.php'; require_once __DIR__ . '/Players/PlayerManager.php'; require_once __DIR__ . '/Plugins/PluginManager.php'; -require_once __DIR__ . '/Server.php'; +require_once __DIR__ . '/Server/Server.php'; require_once __DIR__ . '/Settings/SettingManager.php'; require_once __DIR__ . '/GbxDataFetcher/gbxdatafetcher.inc.php'; require_once __DIR__ . '/ManiaExchange/mxinfofetcher.inc.php'; @@ -63,7 +64,6 @@ class ManiaControl { public $playerManager = null; public $pluginManager = null; public $server = null; - public $settingConfigurator = null; public $settingManager = null; /** @@ -80,8 +80,8 @@ class ManiaControl { $this->manialinkIdHandler = new ManialinkIdHandler(); $this->settingManager = new SettingManager($this); $this->chat = new Chat($this); - $this->server = new Server($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); diff --git a/application/core/Manialinks/ManialinkIdHandler.php b/application/core/Manialinks/ManialinkIdHandler.php index 48458163..55897fd4 100644 --- a/application/core/Manialinks/ManialinkIdHandler.php +++ b/application/core/Manialinks/ManialinkIdHandler.php @@ -20,11 +20,11 @@ class ManialinkIdHandler { * @return array with manialink Ids */ public function reserveManiaLinkIds($count) { - $mlIds = array(); + $manialinkIds = array(); for ($i = 0; $i < $count; $i++) { - array_push($mlIds, ++$this->maniaLinkIdCount); + array_push($manialinkIds, $this->maniaLinkIdCount++); } - return $mlIds; + return $manialinkIds; } } diff --git a/application/core/Maps/MapCommands.php b/application/core/Maps/MapCommands.php index d9e26f6f..a706a4d9 100644 --- a/application/core/Maps/MapCommands.php +++ b/application/core/Maps/MapCommands.php @@ -76,7 +76,7 @@ class MapCommands implements CommandListener { // TODO: mx fetcher nutzen? $params = explode(' ', $chat[1][2], 2); if (count($params) < 2) { - // TODO: show usage + $this->maniaControl->chat->sendUsageInfo('Usage example: //addmap 1234', $player->login); return false; } // Check if ManiaControl can even write to the maps dir diff --git a/application/core/Players/PlayerManager.php b/application/core/Players/PlayerManager.php index a94677ff..a39799fe 100644 --- a/application/core/Players/PlayerManager.php +++ b/application/core/Players/PlayerManager.php @@ -114,14 +114,12 @@ class PlayerManager implements CallbackListener { if (!$this->maniaControl->settingManager->getSetting($this, self::SETTING_JOIN_LEAVE_MESSAGES)) { return; } + // TODO: improve styling? $string = array(0 => 'New Player', 1 => '$0f0Operator', 2 => '$0f0Admin', 3 => '$0f0MasterAdmin', 4 => '$0f0MasterAdmin'); + $nickname = Formatter::stripCodes($player->nickname); $this->maniaControl->chat->sendChat( - '$ff0' . $string[$player->authLevel] . ': ' . $player->nickname . '$z $ff0Nation:$fff ' . $player->getCountry() . + '$ff0' . $string[$player->authLevel] . ': ' . $nickname . '$z $ff0Nation:$fff ' . $player->getCountry() . ' $ff0Ladder: $fff' . $player->ladderRank); - - // TODO: remove $w, $l and stuff out of nick - // TODO: postfix playerConnect callBack as soon as needed - // TODO: Better style colours of the message or anything else } /** @@ -137,7 +135,7 @@ class PlayerManager implements CallbackListener { return; } $played = Formatter::formatTimeH(time() - $player->joinTime); - $this->maniaControl->chat->sendChat('$<'.$player->nickname . '$> $ff0has left the game. Played:$fff ' . $played); + $this->maniaControl->chat->sendChat('$<' . $player->nickname . '$> $ff0has left the game. Played:$fff ' . $played); } /** diff --git a/application/core/Server.php b/application/core/Server/Server.php similarity index 94% rename from application/core/Server.php rename to application/core/Server/Server.php index d555c862..e0dc1df2 100644 --- a/application/core/Server.php +++ b/application/core/Server/Server.php @@ -1,6 +1,11 @@ config = FileUtil::loadConfig('server.xml'); + + $this->serverCommands = new ServerCommands($maniaControl); } /** @@ -249,16 +252,16 @@ class Server { $map = $this->getMap(); $gameMode = $this->getGameMode(); $time = time(); - $fileName = "Ghost.{$login}.{$gameMode}.{$time}.{$map['UId']}.Replay.Gbx"; + $fileName = "GhostReplays/Ghost.{$login}.{$gameMode}.{$time}.{$map['UId']}.Replay.Gbx"; // Save ghost replay - if (!$this->maniaControl->client->query('SaveBestGhostsReplay', $player->login, self::GHOSTREPLAYDIR . $fileName)) { + if (!$this->maniaControl->client->query('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/' . self::GHOSTREPLAYDIR . $fileName); + $ghostReplay = file_get_contents($dataDir . 'Replays/' . $fileName); if (!$ghostReplay) { trigger_error("Couldn't retrieve saved ghost replay."); return null; diff --git a/application/core/Server/ServerCommands.php b/application/core/Server/ServerCommands.php new file mode 100644 index 00000000..6874eebb --- /dev/null +++ b/application/core/Server/ServerCommands.php @@ -0,0 +1,225 @@ +maniaControl = $maniaControl; + + $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MC_5_SECOND, $this, 'each5Seconds'); + + $this->maniaControl->commandManager->registerCommandListener('version', $this, 'command_Version'); + $this->maniaControl->commandManager->registerCommandListener('/setservername', $this, 'command_SetServerName'); + $this->maniaControl->commandManager->registerCommandListener('/kick', $this, 'command_Kick'); + $this->maniaControl->commandManager->registerCommandListener('/systeminfo', $this, 'command_SystemInfo'); + $this->maniaControl->commandManager->registerCommandListener('/shutdown', $this, 'command_Shutdown'); + $this->maniaControl->commandManager->registerCommandListener('/shutdownserver', $this, 'command_ShutdownServer'); + } + + /** + * Check stuff each 5 seconds + * + * @param array $callback + * @return bool + */ + public function each5Seconds(array $callback) { + // Empty shutdown + if ($this->serverShutdownEmpty) { + $players = $this->maniaControl->server->getPlayers(); + if (count($players) <= 0) { + return $this->shutdownServer('empty'); + } + } + + // Delayed shutdown + if ($this->serverShutdownTime > 0) { + if (time() >= $this->serverShutdownTime) { + return $this->shutdownServer('delayed'); + } + } + } + + /** + * Send ManiaControl version + * + * @param array $chat + * @return bool + */ + public function command_Version(array $chat) { + $login = $chat[1][1]; + $message = 'This server is using ManiaControl v' . ManiaControl::VERSION . '!'; + return $this->maniaControl->chat->sendInformation($message, $login); + } + + /** + * Handle systeminfo command + * + * @param array $chat + * @param Player $player + * @return bool + */ + public function command_SystemInfo(array $chat, Player $player) { + if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return false; + } + $systemInfo = $this->maniaControl->server->getSystemInfo(); + $message = 'SystemInfo: ip=' . $systemInfo['PublishedIp'] . ', port=' . $systemInfo['Port'] . ', p2pPort=' . + $systemInfo['P2PPort'] . ', title=' . $systemInfo['TitleId'] . ', login=' . $systemInfo['ServerLogin'] . ', '; + return $this->maniaControl->chat->sendInformation($message, $player->login); + } + + /** + * Handle shutdown command + * + * @param array $chat + * @param Player $player + * @return bool + */ + public function command_Shutdown(array $chat, Player $player) { + if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return false; + } + return $this->maniaControl->quit("ManiaControl shutdown requested by '{$player->login}'"); + } + + /** + * Handle server shutdown command + * + * @param array $chat + * @param Player $player + * @return bool + */ + public function command_ShutdownServer(array $chat, Player $player) { + if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return false; + } + // Check for delayed shutdown + $params = explode(' ', $chat[1][2]); + if (count($params) >= 2) { + $param = $params[1]; + if ($param == 'empty') { + $this->serverShutdownEmpty = !$this->serverShutdownEmpty; + if ($this->serverShutdownEmpty) { + $this->maniaControl->chat->sendInformation("The server will shutdown as soon as it's empty!", $player->login); + return true; + } + $this->maniaControl->chat->sendInformation("Empty-shutdown cancelled!", $player->login); + return true; + } + $delay = (int) $param; + if ($delay <= 0) { + // Cancel shutdown + $this->serverShutdownTime = -1; + $this->maniaControl->chat->sendInformation("Delayed shutdown cancelled!", $player->login); + return true; + } + // Trigger delayed shutdown + $this->serverShutdownTime = time() + $delay * 60.; + $this->maniaControl->chat->sendInformation("The server will shut down in {$delay} minutes!", $player->login); + return true; + } + return $this->shutdownServer($player->login); + } + + /** + * Handle kick command + * + * @param array $chat + * @param Player $player + * @return bool + */ + public function command_Kick(array $chat, Player $player) { + if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_OPERATOR)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return false; + } + $params = explode(' ', $chat[1][2], 3); + if (count($params) < 2) { + $this->maniaControl->chat->sendUsageInfo('Usage example: //kick login', $player->login); + return false; + } + $target = $params[1]; + $target = $this->maniaControl->playerManager->getPlayer($target); + if (!$target) { + $this->maniaControl->chat->sendError("Invalid player login.", $player->login); + return false; + } + $message = ''; + if (isset($params[2])) { + $message = $params[2]; + } + return $this->maniaControl->client->query('Kick', $target->login, $message); + } + + /** + * Handle setservername command + * + * @param array $chat + * @param Player $player + * @return bool + */ + public function command_SetServerName(array $chat, Player $player) { + if (!$this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_ADMIN)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return false; + } + $params = explode(' ', $chat[1][2], 2); + if (count($params) < 2) { + $this->maniaControl->chat->sendUsageInfo('Usage example: //setservername ManiaPlanet Server', $player->login); + return false; + } + $serverName = $params[1]; + if (!$this->maniaControl->client->query('SetServerName', $serverName)) { + trigger_error("Couldn't set server name. " . $this->maniaControl->getClientErrorText()); + $this->maniaControl->chat->sendError("Error setting server name!", $player->login); + return false; + } + $serverName = $this->maniaControl->server->getName(); + $this->maniaControl->chat->sendInformation("New Name: " . $serverName, $player->login); + return true; + } + + /** + * Perform server shutdown + * + * @param string $login + * @return bool + */ + private function shutdownServer($login = '#') { + if (!$this->maniaControl->client->query('StopServer')) { + trigger_error("Server shutdown command from '{login}' failed. " . $this->maniaControl->getClientErrorText()); + return false; + } + $this->maniaControl->quit("Server shutdown requested by '{$login}'"); + return true; + } +} + +?> diff --git a/application/core/Settings/SettingManager.php b/application/core/Settings/SettingManager.php index 98b86ad2..6f1b5e30 100644 --- a/application/core/Settings/SettingManager.php +++ b/application/core/Settings/SettingManager.php @@ -36,9 +36,7 @@ class SettingManager { */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - $this->initTables(); - $this->configurator = new SettingConfigurator($maniaControl); }