2014-01-14 19:47:40 +01:00
< ? php
namespace ManiaControl\Commands ;
2014-05-01 01:41:19 +02:00
use FML\Controls\Frame ;
use FML\Controls\Quads\Quad_BgsPlayerCard ;
use FML\ManiaLink ;
use FML\Script\Features\Paging ;
2014-01-14 20:02:35 +01:00
use ManiaControl\Callbacks\CallbackListener ;
2014-05-24 16:39:12 +02:00
use ManiaControl\Callbacks\Callbacks ;
2014-01-14 19:47:40 +01:00
use ManiaControl\ManiaControl ;
2014-05-02 17:50:30 +02:00
use ManiaControl\Manialinks\ManialinkManager ;
2014-01-14 19:47:40 +01:00
use ManiaControl\Players\Player ;
2014-01-14 20:13:52 +01:00
/**
2014-07-25 16:28:47 +02:00
* ManiaControl Help Manager Class
2014-01-14 20:13:52 +01:00
*
2014-05-02 17:50:30 +02:00
* @ author ManiaControl Team < mail @ maniacontrol . com >
* @ copyright 2014 ManiaControl Team
* @ license http :// www . gnu . org / licenses / GNU General Public License , Version 3
2014-01-14 20:13:52 +01:00
*/
2014-06-14 15:48:27 +02:00
// TODO: refactor code - i see duplicated code all over the place..
2014-01-14 20:02:35 +01:00
class HelpManager implements CommandListener , CallbackListener {
2014-04-12 12:14:37 +02:00
/*
2014-08-02 22:31:46 +02:00
* Private properties
2014-01-14 19:47:40 +01:00
*/
2014-08-02 22:31:46 +02:00
/** @var ManiaControl $maniaControl */
2014-01-14 19:47:40 +01:00
private $maniaControl = null ;
private $playerCommands = array ();
private $adminCommands = array ();
/**
* Construct a new Commands Manager
*
2014-07-25 16:28:47 +02:00
* @ param ManiaControl $maniaControl
2014-01-14 19:47:40 +01:00
*/
2014-01-14 20:02:35 +01:00
public function __construct ( ManiaControl $maniaControl ) {
2014-01-14 19:47:40 +01:00
$this -> maniaControl = $maniaControl ;
2014-07-25 16:28:47 +02:00
// Callbacks
2014-08-13 11:05:52 +02:00
$this -> maniaControl -> getCallbackManager () -> registerCallbackListener ( Callbacks :: ONINIT , $this , 'handleOnInit' );
2014-01-14 20:02:35 +01:00
}
2014-02-19 15:44:00 +01:00
/**
* Handle ManiaControl OnInit Callback
*/
public function handleOnInit () {
2014-08-13 11:05:52 +02:00
$this -> maniaControl -> getCommandManager () -> registerCommandListener ( 'help' , $this , 'command_playerHelp' , false , 'Shows all commands in chat.' );
$this -> maniaControl -> getCommandManager () -> registerCommandListener ( 'helpall' , $this , 'command_playerHelpAll' , false , 'Shows all commands in ManiaLink with description.' );
$this -> maniaControl -> getCommandManager () -> registerCommandListener ( 'help' , $this , 'command_adminHelp' , true , 'Shows all admin commands in chat.' );
$this -> maniaControl -> getCommandManager () -> registerCommandListener ( 'helpall' , $this , 'command_adminHelpAll' , true , 'Shows all admin commands in ManiaLink with description.' );
2014-01-14 19:47:40 +01:00
}
2014-01-14 20:02:35 +01:00
/**
2014-07-25 16:28:47 +02:00
* Show a list of Admin Commands
2014-01-14 20:02:35 +01:00
*
2014-05-02 18:21:38 +02:00
* @ param array $chatCallback
2014-01-14 20:02:35 +01:00
* @ param Player $player
*/
2014-05-02 18:21:38 +02:00
public function command_adminHelp ( array $chatCallback , Player $player ) {
2014-05-02 17:50:30 +02:00
$showCommands = array ();
2014-05-01 01:41:19 +02:00
$registeredMethods = array ();
2014-05-02 17:50:30 +02:00
foreach ( array_reverse ( $this -> adminCommands ) as $command ) {
2014-06-14 14:32:29 +02:00
if ( array_key_exists ( $command [ 'Method' ], $registeredMethods ) && $showCommands [ $registeredMethods [ $command [ 'Method' ]]][ 'Description' ] === $command [ 'Description' ]) {
2014-05-01 01:41:19 +02:00
$name = $registeredMethods [ $command [ 'Method' ]];
2014-05-02 17:50:30 +02:00
$showCommands [ $name ][ 'Name' ] .= '|' . $command [ 'Name' ];
2014-05-01 01:41:19 +02:00
} else {
2014-05-02 17:50:30 +02:00
$showCommands [ $command [ 'Name' ]] = $command ;
2014-05-01 01:41:19 +02:00
$registeredMethods [ $command [ 'Method' ]] = $command [ 'Name' ];
}
}
2014-06-14 15:48:27 +02:00
usort ( $showCommands , function ( $commandA , $commandB ) {
return strcmp ( $commandA [ 'Name' ], $commandB [ 'Name' ]);
2014-05-01 01:41:19 +02:00
});
$message = 'Supported Admin Commands: ' ;
2014-05-02 17:50:30 +02:00
foreach ( $showCommands as $command ) {
2014-01-14 20:02:35 +01:00
$message .= $command [ 'Name' ] . ',' ;
}
$message = substr ( $message , 0 , - 1 );
2014-08-13 11:05:52 +02:00
$this -> maniaControl -> getChat () -> sendChat ( $message , $player );
2014-01-14 20:02:35 +01:00
}
2014-01-14 19:47:40 +01:00
2014-01-14 20:02:35 +01:00
/**
2014-07-25 16:28:47 +02:00
* Show a list of Player Commands
2014-01-14 20:02:35 +01:00
*
2014-05-02 18:21:38 +02:00
* @ param array $chatCallback
2014-01-14 20:02:35 +01:00
* @ param Player $player
*/
2014-05-02 18:21:38 +02:00
public function command_playerHelp ( array $chatCallback , Player $player ) {
2014-05-02 17:50:30 +02:00
$showCommands = array ();
2014-05-01 01:41:19 +02:00
$registeredMethods = array ();
2014-05-02 17:50:30 +02:00
foreach ( array_reverse ( $this -> playerCommands ) as $command ) {
2014-06-14 14:32:29 +02:00
if ( array_key_exists ( $command [ 'Method' ], $registeredMethods ) && $showCommands [ $registeredMethods [ $command [ 'Method' ]]][ 'Description' ] === $command [ 'Description' ]) {
2014-05-01 01:41:19 +02:00
$name = $registeredMethods [ $command [ 'Method' ]];
2014-05-02 17:50:30 +02:00
$showCommands [ $name ][ 'Name' ] .= '|' . $command [ 'Name' ];
2014-05-01 01:41:19 +02:00
} else {
2014-05-02 17:50:30 +02:00
$showCommands [ $command [ 'Name' ]] = $command ;
2014-05-01 01:41:19 +02:00
$registeredMethods [ $command [ 'Method' ]] = $command [ 'Name' ];
}
}
2014-06-14 15:48:27 +02:00
usort ( $showCommands , function ( $commandA , $commandB ) {
return strcmp ( $commandA [ 'Name' ], $commandB [ 'Name' ]);
2014-05-01 01:41:19 +02:00
});
$message = 'Supported Player Commands: ' ;
2014-05-02 17:50:30 +02:00
foreach ( $showCommands as $command ) {
2014-01-14 20:02:35 +01:00
$message .= $command [ 'Name' ] . ',' ;
2014-01-14 19:47:40 +01:00
}
2014-01-14 20:02:35 +01:00
$message = substr ( $message , 0 , - 1 );
2014-08-13 11:05:52 +02:00
$this -> maniaControl -> getChat () -> sendChat ( $message , $player );
2014-01-14 19:47:40 +01:00
}
2014-05-01 01:41:19 +02:00
/**
2014-07-25 16:28:47 +02:00
* Show a ManiaLink list of Player Commands
2014-05-01 01:41:19 +02:00
*
2014-05-02 18:21:38 +02:00
* @ param array $chatCallback
2014-05-01 01:41:19 +02:00
* @ param Player $player
*/
2014-05-02 18:21:38 +02:00
public function command_playerHelpAll ( array $chatCallback , Player $player ) {
2014-05-01 01:41:19 +02:00
$this -> prepareHelpAll ( $this -> playerCommands , $player );
}
2014-05-01 01:58:57 +02:00
/**
2014-05-13 16:40:05 +02:00
* Prepare the commands for the HelpAll ManiaLink .
2014-05-01 01:58:57 +02:00
*
2014-05-13 16:40:05 +02:00
* @ param array $commands
* @ param mixed $player
2014-05-01 01:58:57 +02:00
*/
2014-05-13 16:40:05 +02:00
private function prepareHelpAll ( array $commands , $player ) {
2014-05-02 17:50:30 +02:00
$showCommands = array ();
2014-05-01 01:41:19 +02:00
$registeredMethods = array ();
2014-05-02 17:50:30 +02:00
foreach ( array_reverse ( $commands ) as $command ) {
if ( array_key_exists ( $command [ 'Method' ], $registeredMethods )) {
2014-06-14 14:32:29 +02:00
if ( $showCommands [ $registeredMethods [ $command [ 'Method' ]]][ 'Description' ] === $command [ 'Description' ]) {
2014-05-01 01:41:19 +02:00
$name = $registeredMethods [ $command [ 'Method' ]];
2014-05-02 17:50:30 +02:00
$showCommands [ $name ][ 'Name' ] .= '|' . $command [ 'Name' ];
2014-05-01 01:41:19 +02:00
} else {
2014-05-02 17:50:30 +02:00
$showCommands [ $command [ 'Name' ]] = $command ;
2014-05-01 01:41:19 +02:00
$registeredMethods [ $command [ 'Method' ]] = $command [ 'Name' ];
}
} else {
2014-05-02 17:50:30 +02:00
$showCommands [ $command [ 'Name' ]] = $command ;
2014-05-01 01:41:19 +02:00
$registeredMethods [ $command [ 'Method' ]] = $command [ 'Name' ];
}
}
2014-06-14 15:48:27 +02:00
usort ( $showCommands , function ( $commandA , $commandB ) {
return strcmp ( $commandA [ 'Name' ], $commandB [ 'Name' ]);
2014-05-01 01:41:19 +02:00
});
$this -> showHelpAllList ( $showCommands , $player );
}
2014-05-01 01:58:57 +02:00
/**
2014-07-25 16:28:47 +02:00
* Show the HelpAll list to the player .
2014-05-01 01:58:57 +02:00
*
2014-05-13 16:40:05 +02:00
* @ param array $commands
* @ param mixed $player
2014-05-01 01:58:57 +02:00
*/
2014-05-13 16:40:05 +02:00
private function showHelpAllList ( array $commands , $player ) {
2014-08-13 11:05:52 +02:00
$width = $this -> maniaControl -> getManialinkManager () -> getStyleManager () -> getListWidgetsWidth ();
$height = $this -> maniaControl -> getManialinkManager () -> getStyleManager () -> getListWidgetsHeight ();
2014-05-01 01:41:19 +02:00
// create manialink
$maniaLink = new ManiaLink ( ManialinkManager :: MAIN_MLID );
2014-05-02 17:50:30 +02:00
$script = $maniaLink -> getScript ();
$paging = new Paging ();
2014-05-01 01:41:19 +02:00
$script -> addFeature ( $paging );
// Main frame
2014-08-13 11:05:52 +02:00
$frame = $this -> maniaControl -> getManialinkManager () -> getStyleManager () -> getDefaultListFrame ( $script , $paging );
2014-05-01 01:41:19 +02:00
$maniaLink -> add ( $frame );
// Start offsets
2014-06-14 15:48:27 +02:00
$posX = - $width / 2 ;
$posY = $height / 2 ;
2014-05-01 01:41:19 +02:00
//Predefine description Label
2014-08-13 11:05:52 +02:00
$descriptionLabel = $this -> maniaControl -> getManialinkManager () -> getStyleManager () -> getDefaultDescriptionLabel ();
2014-05-01 01:41:19 +02:00
$frame -> add ( $descriptionLabel );
// Headline
$headFrame = new Frame ();
$frame -> add ( $headFrame );
2014-06-14 15:48:27 +02:00
$headFrame -> setY ( $posY - 5 );
$array = array ( 'Command' => $posX + 5 , 'Description' => $posX + 50 );
2014-08-13 11:05:52 +02:00
$this -> maniaControl -> getManialinkManager () -> labelLine ( $headFrame , $array );
2014-05-01 01:41:19 +02:00
2014-06-14 15:48:27 +02:00
$index = 1 ;
$posY -= 10 ;
2014-05-15 17:45:08 +02:00
$pageFrame = null ;
2014-05-02 17:50:30 +02:00
foreach ( $commands as $command ) {
2014-06-14 15:48:27 +02:00
if ( $index % 15 === 1 ) {
2014-05-01 01:41:19 +02:00
$pageFrame = new Frame ();
$frame -> add ( $pageFrame );
2014-06-14 15:48:27 +02:00
$posY = $height / 2 - 10 ;
2014-05-01 01:41:19 +02:00
$paging -> addPage ( $pageFrame );
}
$playerFrame = new Frame ();
$pageFrame -> add ( $playerFrame );
2014-06-14 15:48:27 +02:00
$playerFrame -> setY ( $posY );
2014-05-01 01:41:19 +02:00
2014-06-14 15:48:27 +02:00
if ( $index % 2 !== 0 ) {
2014-05-01 01:41:19 +02:00
$lineQuad = new Quad_BgsPlayerCard ();
$playerFrame -> add ( $lineQuad );
$lineQuad -> setSize ( $width , 4 );
$lineQuad -> setSubStyle ( $lineQuad :: SUBSTYLE_BgPlayerCardBig );
$lineQuad -> setZ ( 0.001 );
}
2014-06-14 15:48:27 +02:00
$array = array ( $command [ 'Name' ] => $posX + 5 , $command [ 'Description' ] => $posX + 50 );
2014-08-13 11:05:52 +02:00
$labels = $this -> maniaControl -> getManialinkManager () -> labelLine ( $playerFrame , $array );
2014-05-02 15:35:52 +02:00
$label = $labels [ 0 ];
$label -> setWidth ( 40 );
2014-05-01 01:41:19 +02:00
2014-06-14 15:48:27 +02:00
$posY -= 4 ;
$index ++ ;
2014-05-01 01:41:19 +02:00
}
// Render and display xml
2014-08-13 11:05:52 +02:00
$this -> maniaControl -> getManialinkManager () -> displayWidget ( $maniaLink , $player , 'HelpAllList' );
2014-05-01 01:41:19 +02:00
}
2014-05-02 17:50:30 +02:00
/**
2014-07-25 16:28:47 +02:00
* Show a ManiaLink list of Admin Commands
2014-05-02 17:50:30 +02:00
*
2014-05-02 18:21:38 +02:00
* @ param array $chatCallback
2014-05-02 17:50:30 +02:00
* @ param Player $player
*/
2014-05-02 18:21:38 +02:00
public function command_adminHelpAll ( array $chatCallback , Player $player ) {
2014-05-02 17:50:30 +02:00
$this -> prepareHelpAll ( $this -> adminCommands , $player );
}
2014-01-14 19:47:40 +01:00
/**
2014-07-25 16:28:47 +02:00
* Register a new Command
2014-01-14 19:47:40 +01:00
*
2014-07-25 16:28:47 +02:00
* @ param string $name
2014-05-01 01:41:19 +02:00
* @ param bool $adminCommand
* @ param string $description
2014-07-25 16:28:47 +02:00
* @ param string $method
2014-01-14 19:47:40 +01:00
*/
2014-05-01 01:41:19 +02:00
public function registerCommand ( $name , $adminCommand = false , $description = '' , $method ) {
2014-05-02 17:50:30 +02:00
if ( $adminCommand ) {
2014-05-01 01:41:19 +02:00
array_push ( $this -> adminCommands , array ( " Name " => $name , " Description " => $description , " Method " => $method ));
2014-01-14 19:47:40 +01:00
} else {
2014-05-01 01:41:19 +02:00
array_push ( $this -> playerCommands , array ( " Name " => $name , " Description " => $description , " Method " => $method ));
2014-01-14 19:47:40 +01:00
}
}
2014-04-12 12:14:37 +02:00
}