* @copyright 2014-2017 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class InstallMenu implements ConfiguratorMenu, ManialinkPageAnswerListener { /* * Constants */ const SETTING_PERMISSION_INSTALL_PLUGINS = 'Install Plugins'; const ACTION_PREFIX_INSTALL_PLUGIN = 'PluginInstallMenu.Install.'; const ACTION_REFRESH_LIST = 'PluginInstallMenu.RefreshList'; /* * Private properties */ /** @var ManiaControl $maniaControl */ private $maniaControl = null; /** * Create a new plugin install menu instance * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; // Permissions $this->maniaControl->getAuthenticationManager()->definePermissionLevel(self::SETTING_PERMISSION_INSTALL_PLUGINS, AuthenticationManager::AUTH_LEVEL_SUPERADMIN); // Callbacks $this->maniaControl->getManialinkManager()->registerManialinkPageAnswerListener(self::ACTION_REFRESH_LIST, $this, 'handleRefreshListAction'); } /** * @see \ManiaControl\Configurator\ConfiguratorMenu::getTitle() */ public static function getTitle() { return 'Install Plugins'; } /** * @see \ManiaControl\Configurator\ConfiguratorMenu::getMenu() */ public function getMenu($width, $height, Script $script, Player $player) { $paging = new Paging(); $script->addFeature($paging); $frame = new Frame(); // Config $pagerSize = 9.; $entryHeight = 5.; $posY = 0.; $pageFrame = null; $url = ManiaControl::URL_WEBSERVICE . 'plugins'; $response = WebReader::getUrl($url); $dataJson = $response->getContent(); $pluginList = json_decode($dataJson); $index = 0; if (!is_array($pluginList)) { // Error text $errorFrame = $this->getErrorFrame(); $frame->add($errorFrame); } else if (empty($pluginList)) { // Empty text $emptyFrame = $this->getEmptyFrame(); $frame->add($emptyFrame); } else { // Build plugin list // Pagers $pagerPrev = new Quad_Icons64x64_1(); $frame->add($pagerPrev); $pagerPrev->setPosition($width * 0.39, $height * -0.44, 2)->setSize($pagerSize, $pagerSize)->setSubStyle($pagerPrev::SUBSTYLE_ArrowPrev); $pagerNext = clone $pagerPrev; $frame->add($pagerNext); $pagerNext->setX($width * 0.45); $pageCountLabel = new Label_Text(); $frame->add($pageCountLabel); $pageCountLabel->setHAlign($pageCountLabel::RIGHT)->setPosition($width * 0.35, $height * -0.44, 1)->setStyle($pageCountLabel::STYLE_TextTitle1)->setTextSize(2); $paging->addButtonControl($pagerNext)->addButtonControl($pagerPrev)->setLabel($pageCountLabel); // Info tooltip $infoTooltipLabel = new Label(); $frame->add($infoTooltipLabel); $infoTooltipLabel->setAlign($infoTooltipLabel::LEFT, $infoTooltipLabel::TOP)->setPosition($width * -0.45, $height * -0.22)->setSize($width * 0.7, $entryHeight)->setTextSize(1)->setTranslate(true)->setVisible(false)->setAutoNewLine(true)->setMaxLines(5); // List plugins foreach ($pluginList as $plugin) { if ($this->maniaControl->getPluginManager()->isPluginIdInstalled($plugin->id) ) { // Already installed -> Skip continue; } if ($index % 10 === 0) { // New page $pageFrame = new Frame(); $frame->add($pageFrame); $paging->addPageControl($pageFrame); $posY = $height * 0.41; } $pluginFrame = new Frame(); $pageFrame->add($pluginFrame); $pluginFrame->setY($posY); $nameLabel = new Label_Text(); $pluginFrame->add($nameLabel); $nameLabel->setHAlign($nameLabel::LEFT)->setX($width * -0.46)->setSize($width * 0.62, $entryHeight)->setStyle($nameLabel::STYLE_TextCardSmall)->setTextSize(2)->setText($plugin->name); $description = "Author: {$plugin->author}\nVersion: {$plugin->currentVersion->version}\nDesc: {$plugin->description}"; $nameLabel->addTooltipLabelFeature($infoTooltipLabel, $description); if (!$this->isPluginCompatible($plugin)) { // Incompatibility label $infoLabel = new Label_Text(); $pluginFrame->add($infoLabel); $infoLabel->setHAlign($infoLabel::RIGHT)->setX($width * 0.47)->setSize($width * 0.33, $entryHeight)->setTextSize(1)->setTextColor('f30'); if ($plugin->currentVersion->min_mc_version > ManiaControl::VERSION) { $infoLabel->setText("Needs at least MC-Version '{$plugin->currentVersion->min_mc_version}'"); } else { $infoLabel->setText("Needs at most MC-Version '{$plugin->currentVersion->max_mc_version}'"); } } else { // Install button $installButton = new Label_Button(); $pluginFrame->add($installButton); $installButton->setHAlign($installButton::RIGHT)->setX($width * 0.47)->setStyle($installButton::STYLE_CardButtonSmall)->setText('Install')->setTranslate(true)->setAction(self::ACTION_PREFIX_INSTALL_PLUGIN . $plugin->id); } if ($plugin->currentVersion->verified > 0) { // Suggested quad $suggestedQuad = new Quad_Icons64x64_1(); $pluginFrame->add($suggestedQuad); $suggestedQuad->setPosition($width * 0.45, $entryHeight * 0.12, 2)->setSize(4, 4)->setSubStyle($suggestedQuad::SUBSTYLE_StateSuggested); } $posY -= $entryHeight; $index++; } } return $frame; } /** * Build the Frame to display when an Error occurred * * @return Frame */ private function getErrorFrame() { $frame = new Frame(); $infoLabel = new Label_Text(); $frame->add($infoLabel); $infoLabel->setVAlign($infoLabel::BOTTOM)->setY(2)->setSize(100, 25)->setTextColor('f30')->setTranslate(true)->setText('An error occurred. Please try again later.'); $refreshQuad = new Quad_Icons64x64_1(); $frame->add($refreshQuad); $refreshQuad->setY(-4)->setSize(8, 8)->setSubStyle($refreshQuad::SUBSTYLE_Refresh)->setAction(self::ACTION_REFRESH_LIST); return $frame; } /** * Build the Frame to display when no Plugins are left to install * * @return Frame */ private function getEmptyFrame() { $frame = new Frame(); $infoLabel = new Label_Text(); $frame->add($infoLabel); $infoLabel->setSize(100, 50)->setTextColor('0f3')->setTranslate(true)->setText('No other plugins available.'); return $frame; } /** * Check if the given Plugin can be installed without Issues * * @param object $plugin * @return bool */ private function isPluginCompatible($plugin) { if ($plugin->currentVersion->min_mc_version > 0 && $plugin->currentVersion->min_mc_version > ManiaControl::VERSION) { // ManiaControl needs to be updated return false; } if ($plugin->currentVersion->max_mc_version > 0 && $plugin->currentVersion->max_mc_version < ManiaControl::VERSION) { // Plugin is outdated return false; } return true; } /** * @see \ManiaControl\Configurator\ConfiguratorMenu::saveConfigData() */ public function saveConfigData(array $configData, Player $player) { } /** * Handle the Refresh MLAction * * @param array $actionCallback * @param Player $player */ public function handleRefreshListAction(array $actionCallback, Player $player) { $this->maniaControl->getConfigurator()->showMenu($player, $this); } }