From 09f11afd6e1280186711061d0ca17355df16195b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steffen=20Schro=CC=88der?= Date: Tue, 13 May 2014 01:18:47 +0200 Subject: [PATCH] Base Listening Class for Callback Management --- .../core/Callbacks/CallbackManager.php | 124 ++++++++++++------ ...backManager.php => LibXmlRpcCallbacks.php} | 16 +-- application/core/Callbacks/Listening.php | 76 +++++++++++ .../core/Callbacks/ShootManiaCallbacks.php | 2 +- application/core/Callbacks/TimerListening.php | 33 +---- application/core/Commands/CommandManager.php | 5 +- .../core/Manialinks/ManialinkManager.php | 1 + .../plugins/MCTeam/CustomVotesPlugin.php | 6 +- 8 files changed, 178 insertions(+), 85 deletions(-) rename application/core/Callbacks/{LibXmlRpcCallbackManager.php => LibXmlRpcCallbacks.php} (91%) create mode 100644 application/core/Callbacks/Listening.php diff --git a/application/core/Callbacks/CallbackManager.php b/application/core/Callbacks/CallbackManager.php index 9dc28fec..c1f79f6b 100644 --- a/application/core/Callbacks/CallbackManager.php +++ b/application/core/Callbacks/CallbackManager.php @@ -56,38 +56,53 @@ class CallbackManager { * Private Properties */ private $maniaControl = null; - private $callbackListeners = array(); - private $scriptCallbackListener = array(); + private $callbackListenings = array(); + private $scriptCallbackListenings = array(); /** * Construct a new Callbacks Manager * - * @param \ManiaControl\ManiaControl $maniaControl + * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; $this->shootManiaCallbacks = new ShootManiaCallbacks($maniaControl, $this); - $this->libXmlRpcCallbacks = new LibXmlRpcCallbackManager($maniaControl, $this); + $this->libXmlRpcCallbacks = new LibXmlRpcCallbacks($maniaControl, $this); } /** * Register a new Callback Listener * - * @param string $callbackName - * @param \ManiaControl\Callbacks\CallbackListener $listener - * @param string $method + * @param string $callbackName + * @param CallbackListener $listener + * @param string $method * @return bool */ public function registerCallbackListener($callbackName, CallbackListener $listener, $method) { - if (!method_exists($listener, $method)) { - trigger_error("Given listener (" . get_class($listener) . ") can't handle callback '{$callbackName}' (no method '{$method}')!"); + if (is_array($callbackName)) { + $success = true; + foreach ($callbackName as $callback) { + if (!$this->registerCallbackListener($callback, $listener, $method)) { + $success = false; + } + } + return $success; + } + + if (!Listening::checkValidCallback($listener, $method)) { + $listenerClass = get_class($listener); + trigger_error("Given Listener '{$listenerClass}' can't handle Callback '{$callbackName}': No callable Method '{$method}'!"); return false; } - if (!array_key_exists($callbackName, $this->callbackListeners)) { - $this->callbackListeners[$callbackName] = array(); + + if (!array_key_exists($callbackName, $this->callbackListenings)) { + $this->callbackListenings[$callbackName] = array(); } - array_push($this->callbackListeners[$callbackName], array($listener, $method)); + + $listening = new Listening($listener, $method); + array_push($this->callbackListenings[$callbackName], $listening); + return true; } @@ -100,29 +115,56 @@ class CallbackManager { * @return bool */ public function registerScriptCallbackListener($callbackName, CallbackListener $listener, $method) { - if (!method_exists($listener, $method)) { - trigger_error("Given listener (" . get_class($listener) . ") can't handle script callback '{$callbackName}' (no method '{$method}')!"); + if (is_array($callbackName)) { + $success = true; + foreach ($callbackName as $callback) { + if (!$this->registerScriptCallbackListener($callback, $listener, $method)) { + $success = false; + } + } + return $success; + } + + if (!Listening::checkValidCallback($listener, $method)) { + $listenerClass = get_class($listener); + trigger_error("Given Listener '{$listenerClass}' can't handle Script Callback '{$callbackName}': No callable Method '{$method}'!"); return false; } - if (!array_key_exists($callbackName, $this->scriptCallbackListener)) { - $this->scriptCallbackListener[$callbackName] = array(); + + if (!array_key_exists($callbackName, $this->scriptCallbackListenings)) { + $this->scriptCallbackListenings[$callbackName] = array(); } - array_push($this->scriptCallbackListener[$callbackName], array($listener, $method)); + + $listening = new Listening($listener, $method); + array_push($this->scriptCallbackListenings[$callbackName], $listening); + return true; } /** - * Remove a Callback Listener + * Unregister a Callback Listener * * @param CallbackListener $listener * @return bool */ public function unregisterCallbackListener(CallbackListener $listener) { + return $this->removeCallbackListener($this->callbackListenings, $listener); + } + + /** + * Remove the Callback Listener from the given Listeners Array + * + * @param array $listeningsArray + * @param CallbackListener $listener + * @return bool + */ + private function removeCallbackListener(array &$listeningsArray, CallbackListener $listener) { $removed = false; - foreach ($this->callbackListeners as &$listeners) { - foreach ($listeners as $key => &$listenerCallback) { - if ($listenerCallback[0] === $listener) { - unset($listeners[$key]); + foreach ($listeningsArray as &$listenings) { + foreach ($listenings as $key => &$listening) { + /** @var Listening $listening */ + if ($listening->listener === $listener) { + unset($listenings[$key]); $removed = true; } } @@ -131,22 +173,13 @@ class CallbackManager { } /** - * Remove a Script Callback Listener + * Unregister a Script Callback Listener * * @param CallbackListener $listener * @return bool */ public function unregisterScriptCallbackListener(CallbackListener $listener) { - $removed = false; - foreach ($this->scriptCallbackListener as &$listeners) { - foreach ($listeners as $key => &$listenerCallback) { - if ($listenerCallback[0] === $listener) { - unset($listeners[$key]); - $removed = true; - } - } - } - return $removed; + return $this->removeCallbackListener($this->scriptCallbackListenings, $listener); } /** @@ -161,9 +194,8 @@ class CallbackManager { return; } - $callbacks = $this->maniaControl->client->executeCallbacks(); - // Handle callbacks + $callbacks = $this->maniaControl->client->executeCallbacks(); foreach ($callbacks as $callback) { $this->handleCallback($callback); } @@ -211,13 +243,16 @@ class CallbackManager { * @param string $callbackName */ public function triggerCallback($callbackName) { - if (!array_key_exists($callbackName, $this->callbackListeners)) { + if (!array_key_exists($callbackName, $this->callbackListenings)) { return; } + $params = func_get_args(); - $params = array_slice($params, 1, count($params), true); - foreach ($this->callbackListeners[$callbackName] as $listener) { - call_user_func_array(array($listener[0], $listener[1]), $params); + $params = array_slice($params, 1, null, true); + + foreach ($this->callbackListenings[$callbackName] as $listening) { + /** @var Listening $listening */ + $listening->triggerCallbackWithParams($params); } } @@ -239,13 +274,16 @@ class CallbackManager { * @param string $callbackName */ public function triggerScriptCallback($callbackName) { - if (!array_key_exists($callbackName, $this->scriptCallbackListener)) { + if (!array_key_exists($callbackName, $this->scriptCallbackListenings)) { return; } + $params = func_get_args(); - $params = array_slice($params, 1, count($params), true); - foreach ($this->scriptCallbackListener[$callbackName] as $listener) { - call_user_func_array(array($listener[0], $listener[1]), $params); + $params = array_slice($params, 1, null, true); + + foreach ($this->scriptCallbackListenings[$callbackName] as $listening) { + /** @var Listening $listening */ + $listening->triggerCallbackWithParams($params); } } } diff --git a/application/core/Callbacks/LibXmlRpcCallbackManager.php b/application/core/Callbacks/LibXmlRpcCallbacks.php similarity index 91% rename from application/core/Callbacks/LibXmlRpcCallbackManager.php rename to application/core/Callbacks/LibXmlRpcCallbacks.php index 4ce196d4..870bc092 100644 --- a/application/core/Callbacks/LibXmlRpcCallbackManager.php +++ b/application/core/Callbacks/LibXmlRpcCallbacks.php @@ -2,17 +2,16 @@ namespace ManiaControl\Callbacks; - use ManiaControl\ManiaControl; /** - * Class managing & converting LibXmlRpc Callbacks + * Class converting LibXmlRpc Callbacks * * @author ManiaControl Team * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ -class LibXmlRpcCallbackManager implements CallbackListener { +class LibXmlRpcCallbacks implements CallbackListener { /* * Private Properties */ @@ -26,16 +25,17 @@ class LibXmlRpcCallbackManager implements CallbackListener { */ public function __construct(ManiaControl $maniaControl, CallbackManager $callbackManager) { $this->maniaControl = $maniaControl; - $callbackManager->registerCallbackListener(Callbacks::SCRIPTCALLBACK, $this, 'handleScriptCallbacks'); + + $callbackManager->registerCallbackListener(Callbacks::SCRIPTCALLBACK, $this, 'handleScriptCallback'); } /** - * Handle Script Callbacks + * Handle the Script Callback * * @param string $name * @param mixed $data */ - public function handleScriptCallbacks($name, $data) { + public function handleScriptCallback($name, $data) { switch ($name) { case 'LibXmlRpc_BeginMatch': $this->maniaControl->callbackManager->triggerCallback(Callbacks::BEGINMATCH, $data[0]); @@ -82,7 +82,7 @@ class LibXmlRpcCallbackManager implements CallbackListener { } /** - * Triggers the Ranking of a Player + * Trigger the Ranking of a Player * * @param array $data */ @@ -90,4 +90,4 @@ class LibXmlRpcCallbackManager implements CallbackListener { $player = $this->maniaControl->playerManager->getPlayer($data[1]); $this->maniaControl->callbackManager->triggerCallback(Callbacks::PLAYERRANKING, $player, $data[0], $data[6], $data[5]); } -} \ No newline at end of file +} diff --git a/application/core/Callbacks/Listening.php b/application/core/Callbacks/Listening.php new file mode 100644 index 00000000..3171fce2 --- /dev/null +++ b/application/core/Callbacks/Listening.php @@ -0,0 +1,76 @@ + + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + */ +class Listening { + /* + * Public Properties + */ + public $listener = null; + public $method = null; + + /** + * Construct a new Timer Listening + * + * @param object $listener + * @param mixed $method + */ + public function __construct($listener, $method) { + $this->listener = $listener; + $this->method = $method; + } + + /** + * Check if the given Listener and Method build a valid Callback + * + * @param object $listener + * @param mixed $method + * @return bool + */ + public static function checkValidCallback($listener, $method) { + if (is_callable($method)) { + return true; + } + $listenerCallback = array($listener, $method); + if (is_callable($listenerCallback)) { + return true; + } + return false; + } + + /** + * Trigger the Listener's Method + */ + public function triggerCallback() { + $params = func_get_args(); + $this->triggerCallbackWithParams($params); + } + + /** + * Trigger the Listener's Method with the given Array of Params + * + * @param array $params + */ + public function triggerCallbackWithParams(array $params) { + call_user_func_array($this->getUserFunction(), $params); + } + + /** + * Get the Callable User Function + * + * @return callable + */ + public function getUserFunction() { + if (is_callable($this->method)) { + return $this->method; + } + return array($this->listener, $this->method); + } +} diff --git a/application/core/Callbacks/ShootManiaCallbacks.php b/application/core/Callbacks/ShootManiaCallbacks.php index 614fd6f4..1ecb43d0 100644 --- a/application/core/Callbacks/ShootManiaCallbacks.php +++ b/application/core/Callbacks/ShootManiaCallbacks.php @@ -44,7 +44,7 @@ class ShootManiaCallbacks implements CallbackListener { * Handle Script Callbacks * * @param string $name - * @param array $data + * @param mixed $data */ public function handleScriptCallbacks($name, $data) { switch ($name) { diff --git a/application/core/Callbacks/TimerListening.php b/application/core/Callbacks/TimerListening.php index 81f4b4b6..dde007ce 100644 --- a/application/core/Callbacks/TimerListening.php +++ b/application/core/Callbacks/TimerListening.php @@ -3,18 +3,16 @@ namespace ManiaControl\Callbacks; /** - * Model Class for a TimerListening + * Model Class for a Timer Listening * * @author ManiaControl Team * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ -class TimerListening { +class TimerListening extends Listening { /* * Public Properties */ - public $listener = null; - public $method = null; public $deltaTime = null; public $oneTime = null; public $lastTrigger = null; @@ -24,14 +22,14 @@ class TimerListening { * Construct a new Timer Listening * * @param TimerListener $listener - * @param string $method + * @param mixed $method * @param float $milliSeconds * @param bool $oneTime * @param bool $instantCall */ public function __construct(TimerListener $listener, $method, $milliSeconds, $oneTime = false, $instantCall = true) { - $this->listener = $listener; - $this->method = $method; + parent::__construct($listener, $method); + $this->deltaTime = $milliSeconds / 1000.; $this->oneTime = (bool)$oneTime; $this->instantCall = (bool)$instantCall; @@ -51,27 +49,6 @@ class TimerListening { } } - /** - * Trigger the Listener's Method - * - * @param float $time - */ - public function triggerCallback($time) { - call_user_func($this->getUserFunction(), $time); - } - - /** - * Get the Callable User Function - * - * @return callable - */ - public function getUserFunction() { - if (is_callable($this->method)) { - return $this->method; - } - return array($this->listener, $this->method); - } - /** * Check if the desired Time is reached * diff --git a/application/core/Commands/CommandManager.php b/application/core/Commands/CommandManager.php index 95929abf..bc2a22a7 100644 --- a/application/core/Commands/CommandManager.php +++ b/application/core/Commands/CommandManager.php @@ -19,6 +19,7 @@ class CommandManager implements CallbackListener { */ private $maniaControl = null; private $helpManager = array(); + // TODO: use listening class private $adminCommandListeners = array(); private $commandListeners = array(); @@ -38,7 +39,7 @@ class CommandManager implements CallbackListener { } /** - * Register a command listener + * Register a Command Listener * * @param string $commandName * @param CommandListener $listener @@ -97,7 +98,7 @@ class CommandManager implements CallbackListener { } /** - * Remove a Command Listener + * Unregister a Command Listener * * @param CommandListener $listener * @return bool diff --git a/application/core/Manialinks/ManialinkManager.php b/application/core/Manialinks/ManialinkManager.php index e62191e4..f2fb9b27 100644 --- a/application/core/Manialinks/ManialinkManager.php +++ b/application/core/Manialinks/ManialinkManager.php @@ -40,6 +40,7 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener * Private Properties */ private $maniaControl = null; + // TODO: use listening class private $pageAnswerListeners = array(); private $pageAnswerRegexListener = array(); diff --git a/application/plugins/MCTeam/CustomVotesPlugin.php b/application/plugins/MCTeam/CustomVotesPlugin.php index 27b8fe81..aba712ca 100644 --- a/application/plugins/MCTeam/CustomVotesPlugin.php +++ b/application/plugins/MCTeam/CustomVotesPlugin.php @@ -59,8 +59,8 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP const SETTING_VOTE_TIME = 'Voting Time'; const SETTING_DEFAULT_PLAYER_RATIO = 'Minimum Player Voters Ratio'; const SETTING_DEFAULT_RATIO = 'Default Success Ratio'; - const SETTING_SPECTATOR_ALLOW_VOTE = 'Allow Specators to vote'; - const SETTING_SPECTATOR_ALLOW_START_VOTE = 'Allow Specators to start a vote'; + const SETTING_SPECTATOR_ALLOW_VOTE = 'Allow Spectators to vote'; + const SETTING_SPECTATOR_ALLOW_START_VOTE = 'Allow Spectators to start a vote'; const MLID_WIDGET = 'CustomVotesPlugin.WidgetId'; const MLID_ICON = 'CustomVotesPlugin.IconWidgetId'; @@ -436,7 +436,7 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP return; } - //Specators are not allowed to start a vote + // Spectators are not allowed to start a vote if ($player->isSpectator && !$this->maniaControl->settingManager->getSetting($this, self::SETTING_SPECTATOR_ALLOW_START_VOTE)) { $this->maniaControl->chat->sendError('Spectators are not allowed to start a vote.', $player->login); return;