From 9029fe1ed0d813320b631a5bcbec9c519fdae5e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Schro=CC=88der?= Date: Fri, 25 Jul 2014 16:51:47 +0200 Subject: [PATCH] save current server options every 6 hours as they could have been changed by an external tool --- application/core/Server/ServerOptionsMenu.php | 128 ++++++++++-------- 1 file changed, 73 insertions(+), 55 deletions(-) diff --git a/application/core/Server/ServerOptionsMenu.php b/application/core/Server/ServerOptionsMenu.php index bc2efb2c..f6c1d05c 100644 --- a/application/core/Server/ServerOptionsMenu.php +++ b/application/core/Server/ServerOptionsMenu.php @@ -13,6 +13,7 @@ use FML\Script\Script; use ManiaControl\Admin\AuthenticationManager; use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\Callbacks; +use ManiaControl\Callbacks\TimerListener; use ManiaControl\Configurator\ConfiguratorMenu; use ManiaControl\ManiaControl; use ManiaControl\Players\Player; @@ -26,7 +27,7 @@ use Maniaplanet\DedicatedServer\Xmlrpc\ServerOptionsException; * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ -class ServerOptionsMenu implements ConfiguratorMenu, CallbackListener { +class ServerOptionsMenu implements CallbackListener, ConfiguratorMenu, TimerListener { /* * Constants */ @@ -42,12 +43,12 @@ class ServerOptionsMenu implements ConfiguratorMenu, CallbackListener { const CB_SERVERSETTINGS_CHANGED = self::CB_SERVER_OPTIONS_CHANGED; /* - * Private Properties + * Private properties */ private $maniaControl = null; /** - * Create a new Server Options Instance + * Construct a new server options menu instance * * @param ManiaControl $maniaControl */ @@ -57,6 +58,7 @@ class ServerOptionsMenu implements ConfiguratorMenu, CallbackListener { // Callbacks $this->maniaControl->callbackManager->registerCallbackListener(Callbacks::ONINIT, $this, 'onInit'); + $this->maniaControl->timerManager->registerTimerListening($this, 'saveCurrentServerOptions', 6 * 3600 * 1000); // Permissions $this->maniaControl->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_CHANGE_SERVER_OPTIONS, AuthenticationManager::AUTH_LEVEL_SUPERADMIN); @@ -74,6 +76,7 @@ class ServerOptionsMenu implements ConfiguratorMenu, CallbackListener { `serverIndex` int(11) NOT NULL, `optionName` varchar(100) NOT NULL, `optionValue` varchar(500) NOT NULL, + `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`index`), UNIQUE KEY `option` (`serverIndex`, `optionName`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Server Options' AUTO_INCREMENT=1;"; @@ -98,6 +101,65 @@ class ServerOptionsMenu implements ConfiguratorMenu, CallbackListener { return 'Server Options'; } + /** + * Save the current server options in case they have been changed by an external tool + * + * @return bool + */ + public function saveCurrentServerOptions() { + $serverOptions = $this->maniaControl->client->getServerOptions(); + return $this->saveServerOptions($serverOptions); + } + + /** + * Save the given server options in the database + * + * @param ServerOptions $serverOptions + * @param bool $triggerCallbacks + * @return bool + */ + private function saveServerOptions(ServerOptions $serverOptions, $triggerCallbacks = false) { + $mysqli = $this->maniaControl->database->mysqli; + $query = "INSERT INTO `" . self::TABLE_SERVER_OPTIONS . "` ( + `serverIndex`, + `optionName`, + `optionValue` + ) VALUES ( + ?, ?, ? + ) ON DUPLICATE KEY UPDATE + `optionValue` = VALUES(`optionValue`);"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error); + return false; + } + + $optionName = null; + $optionValue = null; + $statement->bind_param('iss', $this->maniaControl->server->index, $optionName, $optionValue); + + $serverOptionsArray = $serverOptions->toArray(); + foreach ($serverOptionsArray as $optionName => $optionValue) { + if ($optionValue === null) { + continue; + } + + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error); + $statement->close(); + return false; + } + + if ($triggerCallbacks) { + $this->maniaControl->callbackManager->triggerCallback(self::CB_SERVER_OPTION_CHANGED, array(self::CB_SERVER_OPTION_CHANGED, $optionName, $optionValue)); + } + } + + $statement->close(); + return true; + } + /** * Handle OnInit callback */ @@ -113,7 +175,7 @@ class ServerOptionsMenu implements ConfiguratorMenu, CallbackListener { public function loadOptionsFromDatabase() { $mysqli = $this->maniaControl->database->mysqli; $query = "SELECT * FROM `" . self::TABLE_SERVER_OPTIONS . "` - WHERE serverIndex = {$this->maniaControl->server->index};"; + WHERE `serverIndex` = {$this->maniaControl->server->index};"; $result = $mysqli->query($query); if ($mysqli->error) { trigger_error($mysqli->error); @@ -141,8 +203,13 @@ class ServerOptionsMenu implements ConfiguratorMenu, CallbackListener { } catch (ServerOptionsException $exception) { $this->maniaControl->chat->sendExceptionToAdmins($exception); } - $message = ($loaded ? 'Server Options successfully loaded!' : 'Error loading Server Options!'); - $this->maniaControl->chat->sendSuccessToAdmins($message); + + if ($loaded) { + $this->maniaControl->chat->sendSuccessToAdmins('Server Options successfully loaded!'); + } else { + $this->maniaControl->chat->sendErrorToAdmins('Error loading Server Options!'); + } + return $loaded; } @@ -327,53 +394,4 @@ class ServerOptionsMenu implements ConfiguratorMenu, CallbackListener { return true; } - - /** - * Save the given server options in the database - * - * @param ServerOptions $serverOptions - * @param bool $triggerCallbacks - * @return bool - */ - private function saveServerOptions(ServerOptions $serverOptions, $triggerCallbacks = false) { - $mysqli = $this->maniaControl->database->mysqli; - $query = "INSERT INTO `" . self::TABLE_SERVER_OPTIONS . "` ( - `serverIndex`, - `optionName`, - `optionValue` - ) VALUES ( - ?, ?, ? - ) ON DUPLICATE KEY UPDATE - `optionValue` = VALUES(`optionValue`);"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error); - return false; - } - - $optionName = null; - $optionValue = null; - $statement->bind_param('iss', $this->maniaControl->server->index, $optionName, $optionValue); - - $serverOptionsArray = $serverOptions->toArray(); - foreach ($serverOptionsArray as $optionName => $optionValue) { - if ($optionValue === null) { - continue; - } - - $statement->execute(); - if ($statement->error) { - trigger_error($statement->error); - $statement->close(); - return false; - } - - if ($triggerCallbacks) { - $this->maniaControl->callbackManager->triggerCallback(self::CB_SERVER_OPTION_CHANGED, array(self::CB_SERVER_OPTION_CHANGED, $optionName, $optionValue)); - } - } - - $statement->close(); - return true; - } }