From 0f88a5e5f954a2dd510ad133dae1e1d16f16e9b0 Mon Sep 17 00:00:00 2001 From: beu Date: Sun, 24 Apr 2022 21:55:51 +0200 Subject: [PATCH] Initial commit of Admin UI --- MatchManagerSuite/MatchManagerAdminUI.php | 461 ++++++++++++++++++++++ 1 file changed, 461 insertions(+) create mode 100644 MatchManagerSuite/MatchManagerAdminUI.php diff --git a/MatchManagerSuite/MatchManagerAdminUI.php b/MatchManagerSuite/MatchManagerAdminUI.php new file mode 100644 index 0000000..c1773cb --- /dev/null +++ b/MatchManagerSuite/MatchManagerAdminUI.php @@ -0,0 +1,461 @@ +maniaControl->getChat()->sendErrorToAdmins('MatchManager Core is required to use one of MatchManager plugin. Install it and restart Maniacontrol'); + Logger::logError('MatchManager Core is required to use one of MatchManager plugin. Install it and restart Maniacontrol'); + return false; +} + +/** + * MatchManager Admin UI + * + * @author Beu + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + */ +class MatchManagerAdminUI implements CallbackListener, ManialinkPageAnswerListener, TimerListener, Plugin { + /* + * Constants + */ + const PLUGIN_ID = 174; + const PLUGIN_VERSION = 1; + const PLUGIN_NAME = 'MatchManager Admin UI'; + const PLUGIN_AUTHOR = 'Beu'; + + const MLID_ADMINUI_SIDEMENU = 'Matchmanager.AdminUI'; + + const ML_ACTION_CORE_MANAGESETTINGS = 'MatchManager.AdminUI.ManageSettings'; + const ML_ACTION_CORE_STOPMATCH = 'MatchManager.AdminUI.StopMatch'; + const ML_ACTION_CORE_PAUSEMATCH = 'MatchManager.AdminUI.PauseMatch'; + const ML_ACTION_CORE_SKIPROUND = 'MatchManager.AdminUI.SkipRound'; + const ML_ACTION_CORE_STARTMATCH = 'MatchManager.AdminUI.StartMatch'; + const ML_ACTION_MULTIPLECONFIGMANAGER_OPENCONFIGMANAGER = 'MatchManager.AdminUI.OpenConfigManager'; + const ML_ACTION_GSHEET_MANAGESETTINGS = 'MatchManager.AdminUI.ManageGSheet'; + + + const SETTING_POSX = 'Position X of the plugin'; + const SETTING_POSY = 'Position Y of the plugin'; + + // MatchManagerWidget Properties + const MATCHMANAGERCORE_PLUGIN = 'MatchManagerSuite\MatchManagerCore'; + const MATCHMANAGERGSHEET_PLUGIN = 'MatchManagerSuite\MatchManagerGSheet'; + const MATCHMANAGERMULTIPLECONFIGMANAGER_PLUGIN = 'MatchManagerSuite\MatchManagerMultipleConfigManager'; + + /* + * Private properties + */ + /** @var ManiaControl $maniaControl */ + private $maniaControl = null; + /** @var \MatchManagerSuite\MatchManagerCore */ + private $MatchManagerCore = null; + + private $manialink = null; + + /** + * @param \ManiaControl\ManiaControl $maniaControl + * @see \ManiaControl\Plugins\Plugin::prepare() + */ + public static function prepare(ManiaControl $maniaControl) { + } + + /** + * @see \ManiaControl\Plugins\Plugin::getId() + */ + public static function getId() { + return self::PLUGIN_ID; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getName() + */ + public static function getName() { + return self::PLUGIN_NAME; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getVersion() + */ + public static function getVersion() { + return self::PLUGIN_VERSION; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getAuthor() + */ + public static function getAuthor() { + return self::PLUGIN_AUTHOR; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getDescription() + */ + public static function getDescription() { + return 'A small UI for admins'; + } + + /** + * @param \ManiaControl\ManiaControl $maniaControl + * @return bool + * @see \ManiaControl\Plugins\Plugin::load() + */ + public function load(ManiaControl $maniaControl) { + // Init plugin + $this->maniaControl = $maniaControl; + if (!$this->maniaControl->getPluginManager()->getSavedPluginStatus(self::MATCHMANAGERCORE_PLUGIN)) { + throw new \Exception('MatchManager Core is needed to use ' . self::PLUGIN_NAME); + } + + if ($this->maniaControl->getPluginManager()->getSavedPluginStatus(self::MATCHMANAGERCORE_PLUGIN)) { + // plugin are loaded in alphabetic order, just wait 1 sec before trying to load MatchManager Core + $this->maniaControl->getTimerManager()->registerOneTimeListening($this, function () { + $this->MatchManagerCore = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERCORE_PLUGIN); + if ($this->MatchManagerCore === null) { + $this->maniaControl->getChat()->sendErrorToAdmins('MatchManager Core is needed to use ' . self::PLUGIN_NAME . ' plugin.'); + $this->maniaControl->getPluginManager()->deactivatePlugin((get_class())); + } else { + $this->generateManialink(); + $this->displayManialink(); + } + }, 1000); + } else { + throw new \Exception('MatchManager Core is needed to use ' . self::PLUGIN_NAME); + } + + $this->maniaControl->getCallbackManager()->registerCallbackListener(PluginManager::CB_PLUGIN_LOADED, $this, 'handlePluginLoaded'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(PluginManager::CB_PLUGIN_UNLOADED, $this, 'handlePluginUnloaded'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'updateSettings'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect'); + + $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::MP_STARTMATCHSTART, $this, 'generateManialink'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(MatchManagerCore::CB_MATCHMANAGER_STARTMATCH, $this, 'generateManialink'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(MatchManagerCore::CB_MATCHMANAGER_ENDMATCH, $this, 'generateManialink'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(MatchManagerCore::CB_MATCHMANAGER_STOPMATCH, $this, 'generateManialink'); + + $this->maniaControl->getCallbackManager()->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); + + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_POSX, 156., ""); + $this->maniaControl->getSettingManager()->initSetting($this, self::SETTING_POSY, 24., ""); + + return true; + } + + /** + * @see \ManiaControl\Plugins\Plugin::unload() + */ + public function unload() { + $this->maniaControl->getManialinkManager()->hideManialink(self::MLID_ADMINUI_SIDEMENU); + } + + /** + * Update Widgets on Setting Changes + * + * @param Setting $setting + */ + public function updateSettings(Setting $setting) { + if ($setting->belongsToClass($this)) { + $this->generateManialink(); + } + } + + /** + * Handle when a player connects + * + * @param Player $player + */ + public function handlePlayerConnect(Player $player) { + if ($player->authLevel > 0) { + $this->maniaControl->getManialinkManager()->sendManialink($this->manialink,$player->login); + } + } + + /** + * send Manialink to admins + * + * @return void + */ + private function displayManialink() { + $admins = $this->maniaControl->getAuthenticationManager()->getAdmins(); + if (!empty($admins)) { + $this->maniaControl->getManialinkManager()->sendManialink($this->manialink, $admins); + } + } + + /** + * handleManialinkPageAnswer + * + * @param array $callback + * @return void + */ + public function handleManialinkPageAnswer(array $callback) { + $actionId = $callback[1][2]; + $actionArray = explode('.', $actionId); + if ($actionArray[0] != "MatchManager" || $actionArray[1] != "AdminUI") { + return; + } + + $login = $callback[1][1]; + $player = $this->maniaControl->getPlayerManager()->getPlayer($login); + if ($player->authLevel <= 0) { + return; + } + + switch ($actionId) { + case self::ML_ACTION_CORE_MANAGESETTINGS: + $pluginMenu = $this->maniaControl->getPluginManager()->getPluginMenu(); + if (defined("\ManiaControl\ManiaControl::ISTRACKMANIACONTROL")) { + $player->setCache($pluginMenu, PluginMenu::CACHE_SETTING_CLASS, "PluginMenu.Settings." . self::MATCHMANAGERCORE_PLUGIN); + } else { + $player->setCache($pluginMenu, PluginMenu::CACHE_SETTING_CLASS, self::MATCHMANAGERCORE_PLUGIN); + } + $this->maniaControl->getConfigurator()->showMenu($player, $pluginMenu); + break; + case self::ML_ACTION_CORE_STOPMATCH: + $this->MatchManagerCore->MatchStop(); + break; + case self::ML_ACTION_CORE_PAUSEMATCH: + $this->MatchManagerCore->setNadeoPause(); + break; + case self::ML_ACTION_CORE_SKIPROUND: + $this->MatchManagerCore->onCommandMatchEndWU(array(), $player); + $this->MatchManagerCore->onCommandUnsetPause(array(), $player); + $this->MatchManagerCore->onCommandMatchEndRound(array(), $player); + break; + case self::ML_ACTION_CORE_STARTMATCH: + $this->MatchManagerCore->MatchStart(); + break; + case self::ML_ACTION_MULTIPLECONFIGMANAGER_OPENCONFIGMANAGER: + /** @var \MatchManagerSuite\MatchManagerMultipleConfigManager */ + $MatchManagerMultipleConfigManager = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERMULTIPLECONFIGMANAGER_PLUGIN); + if ($MatchManagerMultipleConfigManager !== null) { + $MatchManagerMultipleConfigManager->showConfigListUI(array(), $player); + } + break; + case self::ML_ACTION_GSHEET_MANAGESETTINGS: + $pluginMenu = $this->maniaControl->getPluginManager()->getPluginMenu(); + if (defined("\ManiaControl\ManiaControl::ISTRACKMANIACONTROL")) { + $player->setCache($pluginMenu, PluginMenu::CACHE_SETTING_CLASS, "PluginMenu.Settings." . self::MATCHMANAGERGSHEET_PLUGIN); + } else { + $player->setCache($pluginMenu, PluginMenu::CACHE_SETTING_CLASS, self::MATCHMANAGERGSHEET_PLUGIN); + } + $this->maniaControl->getConfigurator()->showMenu($player, $pluginMenu); + break; + } + } + + /** + * generate, store and automatically send it to the admin + * + * @return void + */ + public function generateManialink() { + if ($this->MatchManagerCore === null) return; + $itemSize = 6.; + $quadStyle = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultQuadStyle(); + $quadSubstyle = $this->maniaControl->getManialinkManager()->getStyleManager()->getDefaultQuadSubstyle(); + $itemMarginFactorX = 1.3; + $itemMarginFactorY = 1.2; + + $maniaLink = new ManiaLink(self::MLID_ADMINUI_SIDEMENU); + $frame = new Frame(); + $maniaLink->addChild($frame); + $frame->setZ(ManialinkManager::MAIN_MANIALINK_Z_VALUE); + + $posX = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_POSX); + $posY = $this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_POSY); + + // Admin Menu Icon Frame + $iconFrame = new Frame(); + $frame->addChild($iconFrame); + $iconFrame->setPosition($posX, $posY); + + $backgroundQuad = new Quad(); + $iconFrame->addChild($backgroundQuad); + $backgroundQuad->setSize($itemSize * $itemMarginFactorX, $itemSize * $itemMarginFactorY); + $backgroundQuad->setStyles($quadStyle, $quadSubstyle); + $backgroundQuad->setZ(-1.); + + $itemQuad = new Label(); + $iconFrame->addChild($itemQuad); + $itemQuad->setText('$fc3$w🏆$m'); + $itemQuad->setSize($itemSize, $itemSize); + $itemQuad->setAreaFocusColor("00000000"); + $itemQuad->setAreaColor("00000000"); + + // Admin Menu Description + $descriptionLabel = new Label(); + $frame->addChild($descriptionLabel); + $descriptionLabel->setAlign($descriptionLabel::RIGHT, $descriptionLabel::TOP); + $descriptionLabel->setSize(40, 4); + $descriptionLabel->setTextSize(1); + $descriptionLabel->setTextColor('fff'); + $descriptionLabel->setTextPrefix('$s'); + + // Admin Menu + $popoutFrame = new Frame(); + $frame->addChild($popoutFrame); + $popoutFrame->setPosition($posX - $itemSize * 0.5, $posY); + $popoutFrame->setHorizontalAlign($popoutFrame::RIGHT); + $popoutFrame->setVisible(false); + + $backgroundQuad = new Quad(); + $popoutFrame->addChild($backgroundQuad); + $backgroundQuad->setHorizontalAlign($backgroundQuad::RIGHT); + $backgroundQuad->setStyles($quadStyle, $quadSubstyle); + + $backgroundQuad->setZ(-1.); + + $itemQuad->addToggleFeature($popoutFrame); + + // Add items + $itemPosX = -1; + + // Settings: + $menuQuad = new Quad(); + $popoutFrame->addChild($menuQuad); + $menuQuad->setStyle("UICommon64_1"); + $menuQuad->setSubStyle("Settings_light"); + $menuQuad->setSize($itemSize, $itemSize); + $menuQuad->setX($itemPosX); + $menuQuad->setHorizontalAlign($menuQuad::RIGHT); + $itemPosX -= $itemSize * 1.05; + $menuQuad->addTooltipLabelFeature($descriptionLabel, "Manage Core Settings"); + $menuQuad->setAction(self::ML_ACTION_CORE_MANAGESETTINGS); + + $MatchManagerMultipleConfigManager = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERMULTIPLECONFIGMANAGER_PLUGIN); + if ($MatchManagerMultipleConfigManager !== null) { + $menuQuad = new Quad(); + $popoutFrame->addChild($menuQuad); + $menuQuad->setStyle("UICommon64_2"); + $menuQuad->setSubStyle("Plugin_light"); + $menuQuad->setSize($itemSize, $itemSize); + $menuQuad->setX($itemPosX); + $menuQuad->setHorizontalAlign($menuQuad::RIGHT); + $itemPosX -= $itemSize * 1.05; + $menuQuad->addTooltipLabelFeature($descriptionLabel, "Manage Multiple Configs"); + $menuQuad->setAction(self::ML_ACTION_MULTIPLECONFIGMANAGER_OPENCONFIGMANAGER); + } + + $MatchManagerGsheet = $this->maniaControl->getPluginManager()->getPlugin(self::MATCHMANAGERGSHEET_PLUGIN); + if ($MatchManagerGsheet !== null) { + $menuQuad = new Quad(); + $popoutFrame->addChild($menuQuad); + $menuQuad->setStyle("UICommon64_2"); + $menuQuad->setSubStyle("DisplayIcons_light"); + $menuQuad->setSize($itemSize, $itemSize); + $menuQuad->setX($itemPosX); + $menuQuad->setHorizontalAlign($menuQuad::RIGHT); + $itemPosX -= $itemSize * 1.05; + $menuQuad->addTooltipLabelFeature($descriptionLabel, "Manage Google Sheet config"); + $menuQuad->setAction(self::ML_ACTION_GSHEET_MANAGESETTINGS); + } + + if ($this->MatchManagerCore->getMatchStatus()) { + $menuQuad = new Quad(); + $popoutFrame->addChild($menuQuad); + $menuQuad->setStyle("UICommon64_1"); + $menuQuad->setSubStyle("Stop_light"); + $menuQuad->setSize($itemSize, $itemSize); + $menuQuad->setX($itemPosX); + $menuQuad->setHorizontalAlign($menuQuad::RIGHT); + $itemPosX -= $itemSize * 1.05; + $menuQuad->addTooltipLabelFeature($descriptionLabel, "Stop the match"); + $menuQuad->setAction(self::ML_ACTION_CORE_STOPMATCH); + + $menuQuad = new Quad(); + $popoutFrame->addChild($menuQuad); + $menuQuad->setStyle("UICommon64_1"); + $menuQuad->setSubStyle("Pause_light"); + $menuQuad->setSize($itemSize, $itemSize); + $menuQuad->setX($itemPosX); + $menuQuad->setHorizontalAlign($menuQuad::RIGHT); + $itemPosX -= $itemSize * 1.05; + $menuQuad->addTooltipLabelFeature($descriptionLabel, "Pause the match"); + $menuQuad->setAction(self::ML_ACTION_CORE_PAUSEMATCH); + + $menuQuad = new Quad(); + $popoutFrame->addChild($menuQuad); + $menuQuad->setStyle("UICommon64_1"); + $menuQuad->setSubStyle("Cross_light"); + $menuQuad->setSize($itemSize, $itemSize); + $menuQuad->setX($itemPosX); + $menuQuad->setHorizontalAlign($menuQuad::RIGHT); + $itemPosX -= $itemSize * 1.05; + $menuQuad->addTooltipLabelFeature($descriptionLabel, "Skip the round / Warmup / Pause"); + $menuQuad->setAction(self::ML_ACTION_CORE_SKIPROUND); + } else { + $menuQuad = new Quad(); + $popoutFrame->addChild($menuQuad); + $menuQuad->setStyle("UICommon64_1"); + $menuQuad->setSubStyle("Play_light"); + $menuQuad->setSize($itemSize, $itemSize); + $menuQuad->setX($itemPosX); + $menuQuad->setHorizontalAlign($menuQuad::RIGHT); + $itemPosX -= $itemSize * 1.05; + $menuQuad->addTooltipLabelFeature($descriptionLabel, "Start the match"); + $menuQuad->setAction(self::ML_ACTION_CORE_STARTMATCH); + } + + $descriptionLabel->setPosition($posX - (count($popoutFrame->getChildren()) - 1) * $itemSize * 1.05 - 5, $posY); + $backgroundQuad->setSize((count($popoutFrame->getChildren()) - 1) * $itemSize * 1.05 + 2, $itemSize * $itemMarginFactorY); + + $this->manialink = $maniaLink; + $this->displayManialink(); + } + + /** + * handlePluginUnloaded + * + * @param string $pluginClass + * @param Plugin $plugin + * @return void + */ + public function handlePluginUnloaded(string $pluginClass, Plugin $plugin) { + if ($pluginClass == self::MATCHMANAGERCORE_PLUGIN) { + $this->maniaControl->getChat()->sendErrorToAdmins(self::PLUGIN_NAME . " disabled because MatchManager Core is now disabled"); + $this->maniaControl->getPluginManager()->deactivatePlugin((get_class())); + } + if (strstr($pluginClass, "MatchManagerSuite")) { + $this->generateManialink(); + } + } + + /** + * handlePluginLoaded + * + * @param string $pluginClass + * @param Plugin $plugin + * @return void + */ + public function handlePluginLoaded(string $pluginClass, Plugin $plugin) { + if (strstr($pluginClass, "MatchManagerSuite")) { + $this->generateManialink(); + } + } +} \ No newline at end of file