From 9e599c829c3908d572686ccd01e6aa45cf40cf94 Mon Sep 17 00:00:00 2001 From: kremsy Date: Thu, 2 Jan 2014 23:49:21 +0100 Subject: [PATCH] serversettings panel --- .../core/Configurators/Configurator.php | 12 +- .../core/Configurators/ScriptSettings.php | 183 +++++----- .../core/Configurators/ServerSettings.php | 329 ++++++++++++++++++ 3 files changed, 433 insertions(+), 91 deletions(-) create mode 100644 application/core/Configurators/ServerSettings.php diff --git a/application/core/Configurators/Configurator.php b/application/core/Configurators/Configurator.php index 362b88b1..879326ab 100644 --- a/application/core/Configurators/Configurator.php +++ b/application/core/Configurators/Configurator.php @@ -24,6 +24,7 @@ use ManiaControl\Commands\CommandListener; require_once __DIR__ . '/ConfiguratorMenu.php'; require_once __DIR__ . '/ScriptSettings.php'; +require_once __DIR__ . '/ServerSettings.php'; /** * Class managing ingame ManiaControl configuration @@ -48,6 +49,7 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn */ private $maniaControl = null; private $scriptSettings = null; + private $serverSettings = null; private $menus = array(); private $playersMenuShown = array(); private $manialink = null; @@ -80,11 +82,17 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERDISCONNECT, $this, 'handlePlayerDisconnect'); $this->maniaControl->callbackManager->registerCallbackListener(ScriptSettings::CB_SCRIPTSETTING_CHANGED, $this, 'reopenMenu'); - + $this->maniaControl->callbackManager->registerCallbackListener(ServerSettings::CB_SERVERSETTING_CHANGED, $this, 'reopenMenu'); + // Create script settings $this->scriptSettings = new ScriptSettings($maniaControl); $this->addMenu($this->scriptSettings); - + + // Create server settings + $this->serverSettings = new ServerSettings($maniaControl); + $this->addMenu($this->serverSettings); + + // Register for commands $this->maniaControl->commandManager->registerCommandListener('config', $this, 'handleConfigCommand', true); } diff --git a/application/core/Configurators/ScriptSettings.php b/application/core/Configurators/ScriptSettings.php index 7ed451f3..2d34ab3d 100644 --- a/application/core/Configurators/ScriptSettings.php +++ b/application/core/Configurators/ScriptSettings.php @@ -2,19 +2,19 @@ namespace ManiaControl\Configurators; +use FML\Controls\Control; +use FML\Controls\Entry; +use FML\Controls\Frame; +use FML\Controls\Label; +use FML\Controls\Labels\Label_Text; +use FML\Controls\Quads\Quad_Icons64x64_1; +use FML\Script\Pages; use FML\Script\Script; +use FML\Script\Tooltips; use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackManager; use ManiaControl\Formatter; use ManiaControl\ManiaControl; -use FML\Controls\Frame; -use FML\Controls\Label; -use FML\Script\Pages; -use FML\Script\Tooltips; -use FML\Controls\Control; -use FML\Controls\Quads\Quad_Icons64x64_1; -use FML\Controls\Labels\Label_Text; -use FML\Controls\Entry; use ManiaControl\Players\Player; /** @@ -26,10 +26,10 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { /** * Constants */ - const ACTION_PREFIX_SETTING = 'ScriptSetting.'; - const ACTION_SETTING_BOOL = 'ScriptSetting.ActionBoolSetting.'; + const ACTION_PREFIX_SETTING = 'ScriptSetting.'; + const ACTION_SETTING_BOOL = 'ScriptSetting.ActionBoolSetting.'; const CB_SCRIPTSETTING_CHANGED = 'ScriptSettings.SettingChanged'; - + /** * Private Properties */ @@ -42,10 +42,9 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - + // Register for callbacks - $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, - 'handleManialinkPageAnswer'); + $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); } /** @@ -62,11 +61,11 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { */ public function getMenu($width, $height, Script $script) { $pagesId = 'ScriptSettingsPages'; - $frame = new Frame(); - + $frame = new Frame(); + $this->maniaControl->client->query('GetModeScriptInfo'); $scriptInfo = $this->maniaControl->client->getResponse(); - if (isset($scriptInfo['faultCode'])) { + if(isset($scriptInfo['faultCode'])) { // Not in script mode $label = new Label(); $frame->add($label); @@ -74,64 +73,66 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { return $frame; } $scriptParams = $scriptInfo['ParamDescs']; - + $this->maniaControl->client->query('GetModeScriptSettings'); $scriptSettings = $this->maniaControl->client->getResponse(); - + // Config - $pagerSize = 9.; + $pagerSize = 9.; $settingHeight = 5.; $labelTextSize = 2; - $pageMaxCount = 13; - + $pageMaxCount = 13; + // Pagers $pagerPrev = new Quad_Icons64x64_1(); $frame->add($pagerPrev); $pagerPrev->setPosition($width * 0.39, $height * -0.44, 2); $pagerPrev->setSize($pagerSize, $pagerSize); $pagerPrev->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowPrev); - + $pagerNext = new Quad_Icons64x64_1(); $frame->add($pagerNext); $pagerNext->setPosition($width * 0.45, $height * -0.44, 2); $pagerNext->setSize($pagerSize, $pagerSize); $pagerNext->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowNext); - + $script->addPager($pagerPrev, -1, $pagesId); $script->addPager($pagerNext, 1, $pagesId); - + $pageCountLabel = new Label(); $frame->add($pageCountLabel); $pageCountLabel->setHAlign(Control::RIGHT); $pageCountLabel->setPosition($width * 0.35, $height * -0.44, 1); $pageCountLabel->setStyle('TextTitle1'); $pageCountLabel->setTextSize(2); - + $script->addPageLabel($pageCountLabel, $pagesId); - + // Setting pages $pageFrames = array(); - $y = 0.; - foreach ($scriptParams as $index => $scriptParam) { + $y = 0.; + foreach($scriptParams as $index => $scriptParam) { $settingName = $scriptParam['Name']; - - if (!isset($scriptSettings[$settingName])) continue; - - if (!isset($pageFrame)) { + + if(!isset($scriptSettings[$settingName])) { + continue; + } + + if(!isset($pageFrame)) { $pageFrame = new Frame(); $frame->add($pageFrame); - if (!empty($pageFrames)) { + if(!empty($pageFrames)) { $pageFrame->setVisible(false); } array_push($pageFrames, $pageFrame); $y = $height * 0.41; $script->addPage($pageFrame, count($pageFrames), $pagesId); } - + $settingFrame = new Frame(); $pageFrame->add($settingFrame); $settingFrame->setY($y); - + $nameLabel = new Label_Text(); $settingFrame->add($nameLabel); $nameLabel->setHAlign(Control::LEFT); @@ -140,18 +141,17 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { $nameLabel->setStyle($nameLabel::STYLE_TextCardSmall); $nameLabel->setTextSize($labelTextSize); $nameLabel->setText($settingName); - + $settingValue = $scriptSettings[$settingName]; - + $substyle = ''; - if ($settingValue === false) { + if($settingValue === false) { $substyle = Quad_Icons64x64_1::SUBSTYLE_LvlRed; - } - else if ($settingValue === true) { + } else if($settingValue === true) { $substyle = Quad_Icons64x64_1::SUBSTYLE_LvlGreen; } - - if ($substyle != '') { + + if($substyle != '') { $quad = new Quad_Icons64x64_1(); $settingFrame->add($quad); $quad->setX($width / 2 * 0.545); @@ -160,8 +160,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { $quad->setSize(4, 4); $quad->setHAlign(Control::CENTER); $quad->setAction(self::ACTION_SETTING_BOOL . $settingName); - } - else { + } else { $entry = new Entry(); $settingFrame->add($entry); $entry->setStyle(Label_Text::STYLE_TextValueSmall); @@ -172,7 +171,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { $entry->setName(self::ACTION_PREFIX_SETTING . $settingName); $entry->setDefault($settingValue); } - + $descriptionLabel = new Label(); $pageFrame->add($descriptionLabel); $descriptionLabel->setHAlign(Control::LEFT); @@ -183,13 +182,13 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { // $descriptionLabel->setTextPrefix('Desc: '); $descriptionLabel->setText($scriptParam['Desc']); $script->addTooltip($nameLabel, $descriptionLabel); - + $y -= $settingHeight; - if ($index % $pageMaxCount == $pageMaxCount - 1) { + if($index % $pageMaxCount == $pageMaxCount - 1) { unset($pageFrame); } } - + return $frame; } @@ -198,30 +197,32 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { * @see \ManiaControl\Configurators\ConfiguratorMenu::saveConfigData() */ public function saveConfigData(array $configData, Player $player) { + $this->maniaControl->client->query('GetModeScriptSettings'); $scriptSettings = $this->maniaControl->client->getResponse(); - + $prefixLength = strlen(self::ACTION_PREFIX_SETTING); - + $newSettings = array(); - foreach ($configData[3] as $setting) { - if (substr($setting['Name'], 0, $prefixLength) != self::ACTION_PREFIX_SETTING) continue; - + foreach($configData[3] as $setting) { + if(substr($setting['Name'], 0, $prefixLength) != self::ACTION_PREFIX_SETTING) + continue; + $settingName = substr($setting['Name'], $prefixLength); - if (!isset($scriptSettings[$settingName])) { + if(!isset($scriptSettings[$settingName])) { var_dump('no setting ' . $settingName); continue; } - - if ($setting['Value'] == $scriptSettings[$settingName]) { + + if($setting['Value'] == $scriptSettings[$settingName]) { // Not changed continue; } - + $newSettings[$settingName] = $setting['Value']; settype($newSettings[$settingName], gettype($scriptSettings[$settingName])); } - + $this->applyNewScriptSettings($newSettings, $player); } @@ -231,16 +232,20 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { * @param array $callback */ public function handleManialinkPageAnswer(array $callback) { - $actionId = $callback[1][2]; + $actionId = $callback[1][2]; $boolSetting = (strpos($actionId, self::ACTION_SETTING_BOOL) === 0); - if (!$boolSetting) return; - + if(!$boolSetting) + return; + $actionArray = explode(".", $actionId); - $setting = $actionArray[2]; - - $login = $callback[1][1]; + $setting = $actionArray[2]; + + $login = $callback[1][1]; $player = $this->maniaControl->playerManager->getPlayer($login); - + + //Save all Changes + $this->saveConfigData($callback[1], $player); + //Toggle the Boolean Setting $this->toggleBooleanSetting($setting, $player); } @@ -248,57 +253,57 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { * Toogle a Boolean Setting * * @param Player $player - * @param $setting + * @param $setting */ public function toggleBooleanSetting($setting, Player $player) { $this->maniaControl->client->query('GetModeScriptSettings'); $scriptSettings = $this->maniaControl->client->getResponse(); - - if (!isset($scriptSettings[$setting])) { + + if(!isset($scriptSettings[$setting])) { var_dump('no setting ' . $setting); return; } - - $newSettings = array(); + + $newSettings = array(); $newSettings[$setting] = ($scriptSettings[$setting] ? false : true); - + $this->applyNewScriptSettings($newSettings, $player); } /** * Apply the Array of new Script Settings * - * @param array $newSettings + * @param array $newSettings * @param Player $player */ private function applyNewScriptSettings(array $newSettings, Player $player) { - if (!$newSettings) return; + if(!$newSettings) + return; $success = $this->maniaControl->client->query('SetModeScriptSettings', $newSettings); - if (!$success) { + if(!$success) { $this->maniaControl->chat->sendError('Error occurred: ' . $this->maniaControl->getClientErrorText(), $player->login); return; } - + // Notifications $settingsCount = count($newSettings); - $settingIndex = 0; - $title = $this->maniaControl->authenticationManager->getAuthLevelName($player->authLevel); - $chatMessage = '$ff0' . $title . ' $<' . $player->nickname . '$> set ScriptSetting' . ($settingsCount > 1 ? 's' : '') . ' '; - foreach ($newSettings as $setting => $value) { + $settingIndex = 0; + $title = $this->maniaControl->authenticationManager->getAuthLevelName($player->authLevel); + $chatMessage = '$ff0' . $title . ' $<' . $player->nickname . '$> set ScriptSetting' . ($settingsCount > 1 ? 's' : '') . ' '; + foreach($newSettings as $setting => $value) { $chatMessage .= '$<' . '$fff' . preg_replace('/^S_/', '', $setting) . '$z$s$ff0 '; $chatMessage .= 'to $fff' . $this->parseSettingValue($value) . '$>'; - - if ($settingIndex <= $settingsCount - 2) { + + if($settingIndex <= $settingsCount - 2) { $chatMessage .= ', '; } - + // Trigger own callback - $this->maniaControl->callbackManager->triggerCallback(self::CB_SCRIPTSETTING_CHANGED, - array(self::CB_SCRIPTSETTING_CHANGED, $setting, $value)); - + $this->maniaControl->callbackManager->triggerCallback(self::CB_SCRIPTSETTING_CHANGED, array(self::CB_SCRIPTSETTING_CHANGED, $setting, $value)); + $settingIndex++; } - + $chatMessage .= '!'; $this->maniaControl->chat->sendInformation($chatMessage); $this->maniaControl->log(Formatter::stripCodes($chatMessage)); @@ -311,9 +316,9 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { * @return string */ private function parseSettingValue($value) { - if (is_bool($value)) { + if(is_bool($value)) { return ($value ? 'True' : 'False'); } - return (string) $value; + return (string)$value; } } diff --git a/application/core/Configurators/ServerSettings.php b/application/core/Configurators/ServerSettings.php new file mode 100644 index 00000000..d426f303 --- /dev/null +++ b/application/core/Configurators/ServerSettings.php @@ -0,0 +1,329 @@ +maniaControl = $maniaControl; + + // Register for callbacks + $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); + } + + /** + * + * @see \ManiaControl\Configurators\ConfiguratorMenu::getTitle() + */ + public function getTitle() { + return self::TITLE; + } + + /** + * + * @see \ManiaControl\Configurators\ConfiguratorMenu::getMenu() + */ + public function getMenu($width, $height, Script $script) { + $pagesId = 'ServerSettingsPages'; + $frame = new Frame(); + + $this->maniaControl->client->query('GetServerOptions'); + $serverSettings = $this->maniaControl->client->getResponse(); + + // Config + $pagerSize = 9.; + $settingHeight = 5.; + $labelTextSize = 2; + $pageMaxCount = 13; + + // Pagers + $pagerPrev = new Quad_Icons64x64_1(); + $frame->add($pagerPrev); + $pagerPrev->setPosition($width * 0.39, $height * -0.44, 2); + $pagerPrev->setSize($pagerSize, $pagerSize); + $pagerPrev->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowPrev); + + $pagerNext = new Quad_Icons64x64_1(); + $frame->add($pagerNext); + $pagerNext->setPosition($width * 0.45, $height * -0.44, 2); + $pagerNext->setSize($pagerSize, $pagerSize); + $pagerNext->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowNext); + + $script->addPager($pagerPrev, -1, $pagesId); + $script->addPager($pagerNext, 1, $pagesId); + + $pageCountLabel = new Label(); + $frame->add($pageCountLabel); + $pageCountLabel->setHAlign(Control::RIGHT); + $pageCountLabel->setPosition($width * 0.35, $height * -0.44, 1); + $pageCountLabel->setStyle('TextTitle1'); + $pageCountLabel->setTextSize(2); + + $script->addPageLabel($pageCountLabel, $pagesId); + + + // Setting pages + $pageFrames = array(); + $y = 0.; + $id = 0; + foreach($serverSettings as $name => $value) { + //TODO Comment 4 lines maybe + //Continue on CurrentMaxPlayers... + $pos = strpos($name, "Current"); //TODO maybe current irgentwo anzeigen + if($pos !== false) { + continue; + } + + if(!isset($pageFrame)) { + $pageFrame = new Frame(); + $frame->add($pageFrame); + if(!empty($pageFrames)) { + $pageFrame->setVisible(false); + } + array_push($pageFrames, $pageFrame); + $y = $height * 0.41; + $script->addPage($pageFrame, count($pageFrames), $pagesId); + } + + $settingFrame = new Frame(); + $pageFrame->add($settingFrame); + $settingFrame->setY($y); + + $nameLabel = new Label_Text(); + $settingFrame->add($nameLabel); + $nameLabel->setHAlign(Control::LEFT); + $nameLabel->setX($width * -0.46); + $nameLabel->setSize($width * 0.4, $settingHeight); + $nameLabel->setStyle($nameLabel::STYLE_TextCardSmall); + $nameLabel->setTextSize($labelTextSize); + $nameLabel->setText($name); + $nameLabel->setTextColor("FFF"); + + //$settingValue = $scriptSettings[$name]; + + $substyle = ''; + if($value === false) { + $substyle = Quad_Icons64x64_1::SUBSTYLE_LvlRed; + } else if($value === true) { + $substyle = Quad_Icons64x64_1::SUBSTYLE_LvlGreen; + } + + $entry = new Entry(); + $settingFrame->add($entry); + $entry->setStyle(Label_Text::STYLE_TextValueSmall); + $entry->setHAlign(Control::CENTER); + $entry->setX($width / 2 * 0.46); + $entry->setTextSize(1); + $entry->setSize($width * 0.48, $settingHeight * 0.9); + $entry->setName(self::ACTION_PREFIX_SETTING . $name); + $entry->setDefault($value); + + + if($substyle != '') { + $quad = new Quad_Icons64x64_1(); + $settingFrame->add($quad); + $quad->setX($width / 2 * 0.46); + $quad->setZ(-0.01); + $quad->setSubStyle($substyle); + $quad->setSize(4, 4); + $quad->setHAlign(Control::CENTER); + $quad->setAction(self::ACTION_SETTING_BOOL . $name); + + $entry->setVisible(false); + } + + + $y -= $settingHeight; + if($id % $pageMaxCount == $pageMaxCount - 1) { + unset($pageFrame); + } + + $id++; + } + + return $frame; + } + + /** + * + * @see \ManiaControl\Configurators\ConfiguratorMenu::saveConfigData() + */ + public function saveConfigData(array $configData, Player $player) { + //Note on ServerOptions the whole Options have to be saved, otherwise a error will appear + + $this->maniaControl->client->query('GetServerOptions'); + $serverSettings = $this->maniaControl->client->getResponse(); + + $prefixLength = strlen(self::ACTION_PREFIX_SETTING); + + + $actionArray = explode(".", $configData[2]); + + $boolSettingName = ''; + if(isset($actionArray[2])) { + $boolSettingName = self::ACTION_PREFIX_SETTING . $actionArray[2]; + } + + //var_dump($configData[3]); + $newSettings = array(); + foreach($configData[3] as $setting) { + if(substr($setting['Name'], 0, $prefixLength) != self::ACTION_PREFIX_SETTING) { + continue; + } + + //Check if it was a boolbox + // var_dump($setting['Name'], $boolSettingName, ""); + if($setting['Name'] == $boolSettingName) { + $setting['Value'] = ($setting['Value'] ? false : true); + var_dump($setting['Value']); + var_dump("test13"); + } + + $settingName = substr($setting['Name'], $prefixLength); + + $newSettings[$settingName] = $setting['Value']; + settype($newSettings[$settingName], gettype($serverSettings[$settingName])); + } + + $this->applyNewScriptSettings($newSettings, $player); + } + + /** + * Handle ManialinkPageAnswer Callback + * + * @param array $callback + */ + public function handleManialinkPageAnswer(array $callback) { + $actionId = $callback[1][2]; + $boolSetting = (strpos($actionId, self::ACTION_SETTING_BOOL) === 0); + if(!$boolSetting) { + return; + } + + $actionArray = explode(".", $actionId); + $setting = $actionArray[2]; + + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + + + //Save all Changes + $this->saveConfigData($callback[1], $player); + //$this->toggleBooleanSetting($setting, $player); + } + + /** + * Toogle a Boolean Setting + * + * @param Player $player + * @param $setting + */ + public function toggleBooleanSetting($setting, Player $player) { + $this->maniaControl->client->query('GetServerOptions'); + $serverSettings = $this->maniaControl->client->getResponse(); + + if(!isset($serverSettings[$setting])) { + var_dump('no setting ' . $setting); + return; + } + + $newSettings = array(); + $newSettings[$setting] = ($serverSettings[$setting] ? false : true); + + var_dump($newSettings); + $this->applyNewScriptSettings($newSettings, $player); + + } + + /** + * Apply the Array of new Script Settings + * + * @param array $newSettings + * @param Player $player + */ + private function applyNewScriptSettings(array $newSettings, Player $player) { + if(!$newSettings) { + return; + } + $success = $this->maniaControl->client->query('SetServerOptions', $newSettings); + if(!$success) { + $this->maniaControl->chat->sendError('Error occurred: ' . $this->maniaControl->getClientErrorText(), $player->login); + return; + } + + //var_dump($newSettings); + // Notifications + $settingsCount = count($newSettings); + $settingIndex = 0; + $title = $this->maniaControl->authenticationManager->getAuthLevelName($player->authLevel); + //$chatMessage = '$ff0' . $title . ' $<' . $player->nickname . '$> set ScriptSetting' . ($settingsCount > 1 ? 's' : '') . ' '; + foreach($newSettings as $setting => $value) { + + + //$chatMessage .= '$<' . '$fff' . preg_replace('/^S_/', '', $setting) . '$z$s$ff0 '; + //$chatMessage .= 'to $fff' . $this->parseSettingValue($value) . '$>'; + + /*if ($settingIndex <= $settingsCount - 2) { + $chatMessage .= ', '; + }*/ + + // Trigger own callback + $this->maniaControl->callbackManager->triggerCallback(self::CB_SERVERSETTING_CHANGED, array(self::CB_SERVERSETTING_CHANGED, $setting, $value)); + + $settingIndex++; + } + + // $chatMessage .= '!'; + // $this->maniaControl->chat->sendInformation($chatMessage); + //$this->maniaControl->log(Formatter::stripCodes($chatMessage)); + + //TODO reopen menu + } + + /** + * Parse the Setting Value to a String Representation + * + * @param mixed $value + * @return string + */ + private function parseSettingValue($value) { + if(is_bool($value)) { + return ($value ? 'True' : 'False'); + } + return (string)$value; + } +}