2022-04-24 21:55:51 +02:00
<? 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 ;
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 ;
2024-06-16 17:03:55 +02:00
const PLUGIN_VERSION = 1.1 ;
2022-04-24 21:55:51 +02:00
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 );
}
2024-06-16 17:03:55 +02:00
// All callbacks are loaded in handleAfterInit
$this -> maniaControl -> getCallbackManager () -> registerCallbackListener ( Callbacks :: AFTERINIT , $this , 'handleAfterInit' );
$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 );
}
/**
* handleAfterInit
*
* Plugins are loaded alphabetically, so we have to we wait they are all loaded before check.
*
* @return void
*/
public function handleAfterInit () {
$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 ()));
return ;
2022-04-24 21:55:51 +02:00
}
2024-06-16 17:03:55 +02:00
$this -> generateManialink ();
$this -> displayManialink ();
2022-04-24 21:55:51 +02:00
$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' );
}
/**
* 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 ();
}
}
}