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 ;
use ManiaControl\Callbacks\CallbackManager ;
2014-05-01 01:41:19 +02:00
use ManiaControl\Manialinks\ManialinkManager ;
2014-01-14 19:47:40 +01:00
use ManiaControl\ManiaControl ;
use ManiaControl\Players\Player ;
2014-01-14 20:13:52 +01:00
/**
2014-04-12 12:14:37 +02:00
* Help Manager
2014-01-14 20:13:52 +01:00
*
2014-04-12 12:14:37 +02:00
* @ author kremsy
* @ copyright ManiaControl 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-01-14 20:02:35 +01:00
class HelpManager implements CommandListener , CallbackListener {
2014-04-12 12:14:37 +02:00
/*
2014-01-14 19:47:40 +01:00
* Private Properties
*/
private $maniaControl = null ;
private $playerCommands = array ();
private $adminCommands = array ();
/**
* Construct a new Commands Manager
*
* @ param \ManiaControl\ManiaControl $maniaControl
*/
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-01-14 20:02:35 +01:00
// Register for callbacks
2014-02-19 12:53:06 +01:00
$this -> maniaControl -> callbackManager -> registerCallbackListener ( CallbackManager :: CB_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-01-14 19:47:40 +01:00
//Register the help command
2014-05-01 01:41:19 +02:00
$this -> maniaControl -> commandManager -> registerCommandListener ( 'help' , $this , 'command_playerHelp' , false , 'Shows all commands in chat.' );
$this -> maniaControl -> commandManager -> registerCommandListener ( 'helpall' , $this , 'command_playerHelpAll' , false , 'Shows all commands in ManiaLink with description.' );
$this -> maniaControl -> commandManager -> registerCommandListener ( 'help' , $this , 'command_adminHelp' , true , 'Shows all admin commands in chat.' );
$this -> maniaControl -> commandManager -> 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
/**
* Shows a list of Admin Commands
*
* @ param array $chat
* @ param Player $player
*/
public function command_adminHelp ( array $chat , Player $player ) {
2014-05-01 01:41:19 +02:00
$showCommands = array ();
$registeredMethods = array ();
2014-01-14 20:02:35 +01:00
foreach ( array_reverse ( $this -> adminCommands ) as $command ) {
2014-05-01 01:55:04 +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' ]];
$showCommands [ $name ][ 'Name' ] .= '|' . $command [ 'Name' ];
} else {
$showCommands [ $command [ 'Name' ]] = $command ;
$registeredMethods [ $command [ 'Method' ]] = $command [ 'Name' ];
}
}
usort ( $showCommands , function ( $a , $b ) {
return strcmp ( $a [ " Name " ], $b [ " Name " ]);
});
$message = 'Supported Admin Commands: ' ;
foreach ( $showCommands as $command ) {
2014-01-14 20:02:35 +01:00
$message .= $command [ 'Name' ] . ',' ;
}
$message = substr ( $message , 0 , - 1 );
$this -> maniaControl -> chat -> sendChat ( $message , $player -> login );
}
2014-01-14 19:47:40 +01:00
2014-01-14 20:02:35 +01:00
/**
* Shows a list of Player Commands
*
* @ param array $chat
* @ param Player $player
*/
2014-01-14 19:47:40 +01:00
public function command_playerHelp ( array $chat , Player $player ) {
2014-05-01 01:41:19 +02:00
$showCommands = array ();
$registeredMethods = array ();
2014-01-14 20:02:35 +01:00
foreach ( array_reverse ( $this -> playerCommands ) as $command ) {
2014-05-01 01:55:04 +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' ]];
$showCommands [ $name ][ 'Name' ] .= '|' . $command [ 'Name' ];
} else {
$showCommands [ $command [ 'Name' ]] = $command ;
$registeredMethods [ $command [ 'Method' ]] = $command [ 'Name' ];
}
}
usort ( $showCommands , function ( $a , $b ) {
return strcmp ( $a [ " Name " ], $b [ " Name " ]);
});
$message = 'Supported Player Commands: ' ;
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 );
$this -> maniaControl -> chat -> sendChat ( $message , $player -> login );
2014-01-14 19:47:40 +01:00
}
2014-05-01 01:41:19 +02:00
/**
* Shows a ManiaLink list of Player Commands
*
* @ param array $chat
* @ param Player $player
*/
public function command_playerHelpAll ( array $chat , Player $player ) {
$this -> prepareHelpAll ( $this -> playerCommands , $player );
}
/**
* Shows a ManiaLink list of Admin Commands
*
* @ param array $chat
* @ param Player $player
*/
public function command_adminHelpAll ( array $chat , Player $player ) {
$this -> prepareHelpAll ( $this -> adminCommands , $player );
}
private function prepareHelpAll ( $commands , $player ) {
$showCommands = array ();
$registeredMethods = array ();
foreach ( array_reverse ( $commands ) as $command ) {
if ( array_key_exists ( $command [ 'Method' ], $registeredMethods )) {
if ( $showCommands [ $registeredMethods [ $command [ 'Method' ]]][ 'Description' ] == $command [ 'Description' ]) {
$name = $registeredMethods [ $command [ 'Method' ]];
$showCommands [ $name ][ 'Name' ] .= '|' . $command [ 'Name' ];
} else {
$showCommands [ $command [ 'Name' ]] = $command ;
$registeredMethods [ $command [ 'Method' ]] = $command [ 'Name' ];
}
} else {
$showCommands [ $command [ 'Name' ]] = $command ;
$registeredMethods [ $command [ 'Method' ]] = $command [ 'Name' ];
}
}
usort ( $showCommands , function ( $a , $b ) {
return strcmp ( $a [ " Name " ], $b [ " Name " ]);
});
$this -> showHelpAllList ( $showCommands , $player );
}
private function showHelpAllList ( $commands , $player ) {
$width = $this -> maniaControl -> manialinkManager -> styleManager -> getListWidgetsWidth ();
$height = $this -> maniaControl -> manialinkManager -> styleManager -> getListWidgetsHeight ();
// create manialink
$maniaLink = new ManiaLink ( ManialinkManager :: MAIN_MLID );
$script = $maniaLink -> getScript ();
$paging = new Paging ();
$script -> addFeature ( $paging );
// Main frame
$frame = $this -> maniaControl -> manialinkManager -> styleManager -> getDefaultListFrame ( $script , $paging );
$maniaLink -> add ( $frame );
// Start offsets
$x = - $width / 2 ;
$y = $height / 2 ;
//Predefine description Label
$descriptionLabel = $this -> maniaControl -> manialinkManager -> styleManager -> getDefaultDescriptionLabel ();
$frame -> add ( $descriptionLabel );
// Headline
$headFrame = new Frame ();
$frame -> add ( $headFrame );
$headFrame -> setY ( $y - 5 );
$array = array ( " Command " => $x + 5 , " Description " => $x + 50 );
$this -> maniaControl -> manialinkManager -> labelLine ( $headFrame , $array );
$i = 1 ;
$y = $y - 10 ;
$pageFrames = array ();
foreach ( $commands as $command ) {
if ( ! isset ( $pageFrame )) {
$pageFrame = new Frame ();
$frame -> add ( $pageFrame );
if ( ! empty ( $pageFrames )) {
$pageFrame -> setVisible ( false );
}
array_push ( $pageFrames , $pageFrame );
$y = $height / 2 - 10 ;
$paging -> addPage ( $pageFrame );
}
$playerFrame = new Frame ();
$pageFrame -> add ( $playerFrame );
$playerFrame -> setY ( $y );
if ( $i % 2 != 0 ) {
$lineQuad = new Quad_BgsPlayerCard ();
$playerFrame -> add ( $lineQuad );
$lineQuad -> setSize ( $width , 4 );
$lineQuad -> setSubStyle ( $lineQuad :: SUBSTYLE_BgPlayerCardBig );
$lineQuad -> setZ ( 0.001 );
}
$array = array ( $command [ 'Name' ] => $x + 5 , $command [ 'Description' ] => $x + 50 );
$labels = $this -> maniaControl -> manialinkManager -> labelLine ( $playerFrame , $array );
$labels [ 0 ] -> setWidth ( 40 );
$y -= 4 ;
$i ++ ;
if (( $i - 1 ) % 15 == 0 ) {
unset ( $pageFrame );
}
}
// Render and display xml
$this -> maniaControl -> manialinkManager -> displayWidget ( $maniaLink , $player , 'HelpAllList' );
}
2014-01-14 19:47:40 +01:00
/**
* Registers a new Command
*
2014-05-01 01:41:19 +02:00
* @ param $name
* @ param bool $adminCommand
* @ param string $description
* @ param $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-01-14 19:47:40 +01: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
}