461 lines
17 KiB
PHP
461 lines
17 KiB
PHP
<?php
|
|
|
|
namespace MatchManagerSuite;
|
|
|
|
use FML\Controls\Frame;
|
|
use FML\Controls\Label;
|
|
use FML\Controls\Quad;
|
|
use FML\ManiaLink;
|
|
|
|
use ManiaControl\Manialinks\ManialinkManager;
|
|
use ManiaControl\Manialinks\ManialinkPageAnswerListener;
|
|
|
|
use ManiaControl\Callbacks\CallbackListener;
|
|
use ManiaControl\Logger;
|
|
use ManiaControl\ManiaControl;
|
|
use ManiaControl\Plugins\Plugin;
|
|
use ManiaControl\Plugins\PluginManager;
|
|
use ManiaControl\Plugins\PluginMenu;
|
|
use ManiaControl\Settings\Setting;
|
|
use ManiaControl\Settings\SettingManager;
|
|
use ManiaControl\Callbacks\TimerListener;
|
|
use ManiaControl\Callbacks\Callbacks;
|
|
use ManiaControl\Callbacks\CallbackManager;
|
|
|
|
use ManiaControl\Players\Player;
|
|
use ManiaControl\Players\PlayerManager;
|
|
|
|
use ManiaControl\Script\InvokeScriptCallback;
|
|
|
|
|
|
if (!class_exists('MatchManagerSuite\MatchManagerCore')) {
|
|
$this->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();
|
|
}
|
|
}
|
|
} |