diff --git a/application/ManiaControl.php b/application/ManiaControl.php index 4ed1ab33..cba5fa71 100644 --- a/application/ManiaControl.php +++ b/application/ManiaControl.php @@ -4,7 +4,7 @@ define('LOG_WRITE_CURRENT_FILE', 'ManiaControl.log'); // Write current log to extra file in base dir define('LOG_NAME_USE_DATE', true); // Use current date as suffix for log file name in logs folder define('LOG_NAME_USE_PID', true); // Use current process id as suffix for log file name in logs folder - + // Define base dir define('ManiaControlDir', __DIR__); @@ -51,8 +51,7 @@ logMessage('Starting ManiaControl ...'); logMessage('Checking for installed MySQLi ... ', false); if (extension_loaded('mysqli')) { logMessage('FOUND!'); -} -else { +} else { logMessage('NOT FOUND!'); logMessage(' -- You don\'t have MySQLi installed, make sure to check: http://www.php.net/manual/en/mysqli.installation.php'); exit(); @@ -61,8 +60,7 @@ else { logMessage('Checking for installed cURL ... ', false); if (extension_loaded('curl')) { logMessage('FOUND!'); -} -else { +} else { logMessage('NOT FOUND!'); logMessage('You don\'t have cURL installed, make sure to check: http://www.php.net/manual/en/curl.installation.php'); exit(); @@ -70,12 +68,12 @@ else { /** * Log and echo the given text - * + * * @param string $message - * @param bool $eol + * @param bool $eol */ function logMessage($message, $eol = true) { - $date = date("d.M y H:i:s"); + $date = date("d.M y H:i:s"); $message = $date . ' ' . $message; if ($eol) { $message .= PHP_EOL; @@ -94,15 +92,15 @@ function logMessage($message, $eol = true) { // Autoload Function that loads ManiaControl Class Files on Demand spl_autoload_register(function ($className) { $classPath = str_replace('\\', DIRECTORY_SEPARATOR, $className); - + // Core file $classDirectoryPath = preg_replace('/ManiaControl/', 'core', $classPath, 1); - $filePath = ManiaControlDir . DIRECTORY_SEPARATOR . $classDirectoryPath . '.php'; + $filePath = ManiaControlDir . DIRECTORY_SEPARATOR . $classDirectoryPath . '.php'; if (file_exists($filePath)) { require_once $filePath; return; } - + // Plugin file $filePath = ManiaControlDir . DIRECTORY_SEPARATOR . 'plugins/' . $classPath . '.php'; if (file_exists($filePath)) { diff --git a/application/core/Callbacks/CallbackListener.php b/application/core/Callbacks/CallbackListener.php index 91676b59..c744fd4e 100644 --- a/application/core/Callbacks/CallbackListener.php +++ b/application/core/Callbacks/CallbackListener.php @@ -3,11 +3,11 @@ namespace ManiaControl\Callbacks; /** - * Interface for CallbackListener + * Interface for Callback Listener * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ interface CallbackListener { } diff --git a/application/core/Callbacks/CallbackManager.php b/application/core/Callbacks/CallbackManager.php index a9dff30d..389ea423 100644 --- a/application/core/Callbacks/CallbackManager.php +++ b/application/core/Callbacks/CallbackManager.php @@ -7,8 +7,8 @@ use ManiaControl\ManiaControl; /** * Class for managing Server and ManiaControl Callbacks * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class CallbackManager { @@ -118,8 +118,8 @@ class CallbackManager { */ public function unregisterCallbackListener(CallbackListener $listener) { $removed = false; - foreach($this->callbackListeners as &$listeners) { - foreach($listeners as $key => &$listenerCallback) { + foreach ($this->callbackListeners as &$listeners) { + foreach ($listeners as $key => &$listenerCallback) { if ($listenerCallback[0] != $listener) { continue; } @@ -138,8 +138,8 @@ class CallbackManager { */ public function unregisterScriptCallbackListener(CallbackListener $listener) { $removed = false; - foreach($this->scriptCallbackListener as &$listeners) { - foreach($listeners as $key => &$listenerCallback) { + foreach ($this->scriptCallbackListener as &$listeners) { + foreach ($listeners as $key => &$listenerCallback) { if ($listenerCallback[0] != $listener) { continue; } @@ -150,38 +150,6 @@ class CallbackManager { return $removed; } - /** - * Trigger a specific Callback - * - * @param string $callbackName - */ - public function triggerCallback($callbackName) { - if (!array_key_exists($callbackName, $this->callbackListeners)) { - 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); - } - } - - /** - * Trigger a specific Script Callback - * - * @param string $callbackName - */ - public function triggerScriptCallback($callbackName) { - if (!array_key_exists($callbackName, $this->scriptCallbackListener)) { - 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); - } - } - /** * Trigger internal Callbacks and manage Server Callbacks */ @@ -197,7 +165,7 @@ class CallbackManager { $callbacks = $this->maniaControl->client->executeCallbacks(); // Handle callbacks - foreach($callbacks as $callback) { + foreach ($callbacks as $callback) { $this->handleCallback($callback); } } @@ -209,12 +177,12 @@ class CallbackManager { */ private function handleCallback(array $callback) { $callbackName = $callback[0]; - switch($callbackName) { + switch ($callbackName) { case 'ManiaPlanet.BeginMatch': if ($this->maniaControl->mapManager->getCurrentMap()->getGame() == 'sm') { $this->triggerCallback($callbackName, $callback); } - break; + break; case 'ManiaPlanet.BeginMap': $this->maniaControl->mapManager->handleBeginMap($callback); $this->triggerCallback($callbackName, $callback); @@ -223,7 +191,7 @@ class CallbackManager { if ($this->maniaControl->mapManager->getCurrentMap()->getGame() == 'sm') { $this->triggerCallback($callbackName, $callback); } - break; + break; case 'ManiaPlanet.EndMap': $this->maniaControl->mapManager->handleEndMap($callback); $this->triggerCallback($callbackName, $callback); @@ -242,6 +210,22 @@ class CallbackManager { } } + /** + * Trigger a specific Callback + * + * @param string $callbackName + */ + public function triggerCallback($callbackName) { + if (!array_key_exists($callbackName, $this->callbackListeners)) { + 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); + } + } + /** * Handle the given Script Callback * @@ -253,4 +237,20 @@ class CallbackManager { $this->triggerScriptCallback($scriptCallbackName, $scriptCallbackData); $this->triggerCallback(Callbacks::SCRIPTCALLBACK, $scriptCallbackName, $scriptCallbackData[1]); } + + /** + * Trigger a specific Script Callback + * + * @param string $callbackName + */ + public function triggerScriptCallback($callbackName) { + if (!array_key_exists($callbackName, $this->scriptCallbackListener)) { + 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); + } + } } diff --git a/application/core/Callbacks/Callbacks.php b/application/core/Callbacks/Callbacks.php index b46bbffd..e3b4d1cc 100644 --- a/application/core/Callbacks/Callbacks.php +++ b/application/core/Callbacks/Callbacks.php @@ -1,11 +1,12 @@ + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ interface Callbacks { diff --git a/application/core/Callbacks/LibXmlRpcCallbackManager.php b/application/core/Callbacks/LibXmlRpcCallbackManager.php index 5b004e64..f35843f9 100644 --- a/application/core/Callbacks/LibXmlRpcCallbackManager.php +++ b/application/core/Callbacks/LibXmlRpcCallbackManager.php @@ -8,9 +8,9 @@ use ManiaControl\ManiaControl; /** * Class managing & converting LibXmlRpc Callbacks * - * @author ManiaControl Team - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class LibXmlRpcCallbackManager implements CallbackListener { /* @@ -21,7 +21,7 @@ class LibXmlRpcCallbackManager implements CallbackListener { /** * Create a new LibXmlRpc Callbacks Instance * - * @param ManiaControl $maniaControl + * @param ManiaControl $maniaControl * @param CallbackManager $callbackManager */ public function __construct(ManiaControl $maniaControl, CallbackManager $callbackManager) { @@ -33,10 +33,10 @@ class LibXmlRpcCallbackManager implements CallbackListener { * Handle Script Callbacks * * @param string $name - * @param array $data + * @param array $data */ public function handleScriptCallbacks($name, array $data) { - switch($name) { + switch ($name) { case 'LibXmlRpc_BeginMatch': $this->maniaControl->callbackManager->triggerCallback(Callbacks::BEGINMATCH, $data[0]); break; diff --git a/application/core/Callbacks/ShootManiaCallbacks.php b/application/core/Callbacks/ShootManiaCallbacks.php index a04d1def..614fd6f4 100644 --- a/application/core/Callbacks/ShootManiaCallbacks.php +++ b/application/core/Callbacks/ShootManiaCallbacks.php @@ -7,8 +7,8 @@ use ManiaControl\ManiaControl; /** * Class handling and parsing ShootMania Callbacks * - * @author steeffeen - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ShootManiaCallbacks implements CallbackListener { @@ -28,7 +28,7 @@ class ShootManiaCallbacks implements CallbackListener { /** * Create a new ShootMania Callbacks Instance * - * @param ManiaControl $maniaControl + * @param ManiaControl $maniaControl * @param CallbackManager $callbackManager */ public function __construct(ManiaControl $maniaControl, CallbackManager $callbackManager) { @@ -43,11 +43,11 @@ class ShootManiaCallbacks implements CallbackListener { /** * Handle Script Callbacks * - * @param $name - * @param $data + * @param string $name + * @param array $data */ public function handleScriptCallbacks($name, $data) { - switch($name) { + switch ($name) { case 'LibXmlRpc_Rankings': $this->maniaControl->server->rankingManager->updateRankings($data[0]); break; @@ -63,7 +63,7 @@ class ShootManiaCallbacks implements CallbackListener { /** * Triggers the AFK Status of an Player * - * @param $login + * @param string $login */ private function triggerAfkStatus($login) { $player = $this->maniaControl->playerManager->getPlayer($login); diff --git a/application/core/Callbacks/TimerListener.php b/application/core/Callbacks/TimerListener.php index ef9e764e..d492593c 100644 --- a/application/core/Callbacks/TimerListener.php +++ b/application/core/Callbacks/TimerListener.php @@ -5,9 +5,9 @@ namespace ManiaControl\Callbacks; /** * Interface for TimerListener * - * @author kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ interface TimerListener { } diff --git a/application/core/Callbacks/TimerManager.php b/application/core/Callbacks/TimerManager.php index 5d387cd4..ea3cd442 100644 --- a/application/core/Callbacks/TimerManager.php +++ b/application/core/Callbacks/TimerManager.php @@ -7,9 +7,9 @@ use ManiaControl\ManiaControl; /** * Class for managing Timers * - * @author kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class TimerManager { /* @@ -38,29 +38,13 @@ class TimerManager { $this->registerTimerListening($listener, $method, $time, true); } - /** - * Unregister a Timer Listening - * @param TimerListener $listener - * @param $method - * @return bool - */ - public function unregisterTimerListening(TimerListener $listener, $method){ - foreach($this->timerListenings as $key => $listening){ - if($listening->listener == $listener && $listening->method == $method){ - unset($this->timerListenings[$key]); - return true; - } - } - return false; - } - /** * Register a Timer Listening, note < 10ms it can get inaccurate * - * @param TimerListener $listener - * @param string $method - * @param float $time - * @param bool $oneTime + * @param TimerListener $listener + * @param string $method + * @param float $time + * @param bool $oneTime * @return bool */ public function registerTimerListening(TimerListener $listener, $method, $time, $oneTime = false) { @@ -71,14 +55,14 @@ class TimerManager { //Init the Timer Listening // TODO: extra model class - $listening = new \stdClass(); - $listening->listener = $listener; - $listening->method = $method; - $listening->deltaTime = $time / 1000; - $listening->oneTime = $oneTime; - if($oneTime){ + $listening = new \stdClass(); + $listening->listener = $listener; + $listening->method = $method; + $listening->deltaTime = $time / 1000; + $listening->oneTime = $oneTime; + if ($oneTime) { $listening->lastTrigger = microtime(true); - }else{ + } else { $listening->lastTrigger = -1; } array_push($this->timerListenings, $listening); @@ -86,6 +70,23 @@ class TimerManager { return true; } + /** + * Unregister a Timer Listening + * + * @param TimerListener $listener + * @param $method + * @return bool + */ + public function unregisterTimerListening(TimerListener $listener, $method) { + foreach ($this->timerListenings as $key => $listening) { + if ($listening->listener == $listener && $listening->method == $method) { + unset($this->timerListenings[$key]); + return true; + } + } + return false; + } + /** * Remove a Timer Listener * @@ -94,7 +95,7 @@ class TimerManager { */ public function unregisterTimerListenings(TimerListener $listener) { $removed = false; - foreach($this->timerListenings as $key => &$listening) { + foreach ($this->timerListenings as $key => &$listening) { if ($listening->listener != $listener) { continue; } @@ -109,7 +110,7 @@ class TimerManager { */ public function manageTimings() { $time = microtime(true); - foreach($this->timerListenings as $key => &$listening) { + foreach ($this->timerListenings as $key => &$listening) { if (($listening->lastTrigger + $listening->deltaTime) <= $time) { //Increase the lastTrigger time manually (to improve accuracy) diff --git a/application/core/Commands/CommandListener.php b/application/core/Commands/CommandListener.php index 393a4ad8..6924404e 100644 --- a/application/core/Commands/CommandListener.php +++ b/application/core/Commands/CommandListener.php @@ -4,10 +4,10 @@ namespace ManiaControl\Commands; /** * Interface for Command Listeners - * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ interface CommandListener { } diff --git a/application/core/Commands/CommandManager.php b/application/core/Commands/CommandManager.php index 2632c624..7525ce5c 100644 --- a/application/core/Commands/CommandManager.php +++ b/application/core/Commands/CommandManager.php @@ -9,9 +9,9 @@ use ManiaControl\ManiaControl; /** * Class for handling Chat Commands * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class CommandManager implements CallbackListener { /* @@ -50,7 +50,7 @@ class CommandManager implements CallbackListener { public function registerCommandListener($commandName, CommandListener $listener, $method, $adminCommand = false, $description = '') { if (is_array($commandName)) { $success = true; - foreach($commandName as $command) { + foreach ($commandName as $command) { if (!$this->registerCommandListener($command, $listener, $method, $adminCommand, $description)) { $success = false; } @@ -92,16 +92,16 @@ class CommandManager implements CallbackListener { */ public function unregisterCommandListener(CommandListener $listener) { $removed = false; - foreach($this->commandListeners as &$listeners) { - foreach($listeners as $key => &$listenerCallback) { + foreach ($this->commandListeners as &$listeners) { + foreach ($listeners as $key => &$listenerCallback) { if ($listenerCallback[0] == $listener) { unset($listeners[$key]); $removed = true; } } } - foreach($this->adminCommandListeners as &$listeners) { - foreach($listeners as $key => &$listenerCallback) { + foreach ($this->adminCommandListeners as &$listeners) { + foreach ($listeners as $key => &$listenerCallback) { if ($listenerCallback[0] == $listener) { unset($listeners[$key]); $removed = true; @@ -152,7 +152,7 @@ class CommandManager implements CallbackListener { // Compose uniformed message $message = '//' . $command; - foreach($commandArray as $commandPart) { + foreach ($commandArray as $commandPart) { $message .= ' ' . $commandPart; } $callback[1][2] = $message; @@ -167,7 +167,7 @@ class CommandManager implements CallbackListener { } // Inform command listeners - foreach($commandListeners[$command] as $listener) { + foreach ($commandListeners[$command] as $listener) { call_user_func(array($listener[0], $listener[1]), $callback, $player); } } diff --git a/application/core/Commands/HelpManager.php b/application/core/Commands/HelpManager.php index 513541de..3101685c 100644 --- a/application/core/Commands/HelpManager.php +++ b/application/core/Commands/HelpManager.php @@ -7,19 +7,18 @@ use FML\Controls\Label; use FML\Controls\Quads\Quad_BgsPlayerCard; use FML\ManiaLink; use FML\Script\Features\Paging; - use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackManager; -use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\ManiaControl; +use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\Players\Player; /** * Help Manager * - * @author kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class HelpManager implements CommandListener, CallbackListener { /* @@ -59,24 +58,24 @@ class HelpManager implements CommandListener, CallbackListener { * @param Player $player */ public function command_adminHelp(array $chat, Player $player) { - $showCommands = array(); + $showCommands = array(); $registeredMethods = array(); - foreach(array_reverse($this->adminCommands) as $command) { - if(array_key_exists($command['Method'], $registeredMethods) && $showCommands[$registeredMethods[$command['Method']]]['Description'] == $command['Description']) { + foreach (array_reverse($this->adminCommands) as $command) { + if (array_key_exists($command['Method'], $registeredMethods) && $showCommands[$registeredMethods[$command['Method']]]['Description'] == $command['Description']) { $name = $registeredMethods[$command['Method']]; - $showCommands[$name]['Name'] .= '|'.$command['Name']; + $showCommands[$name]['Name'] .= '|' . $command['Name']; } else { - $showCommands[$command['Name']] = $command; + $showCommands[$command['Name']] = $command; $registeredMethods[$command['Method']] = $command['Name']; } } - usort($showCommands, function($a, $b) { + usort($showCommands, function ($a, $b) { return strcmp($a["Name"], $b["Name"]); }); $message = 'Supported Admin Commands: '; - foreach($showCommands as $command) { + foreach ($showCommands as $command) { $message .= $command['Name'] . ','; } $message = substr($message, 0, -1); @@ -90,24 +89,24 @@ class HelpManager implements CommandListener, CallbackListener { * @param Player $player */ public function command_playerHelp(array $chat, Player $player) { - $showCommands = array(); + $showCommands = array(); $registeredMethods = array(); - foreach(array_reverse($this->playerCommands) as $command) { - if(array_key_exists($command['Method'], $registeredMethods) && $showCommands[$registeredMethods[$command['Method']]]['Description'] == $command['Description']) { + foreach (array_reverse($this->playerCommands) as $command) { + if (array_key_exists($command['Method'], $registeredMethods) && $showCommands[$registeredMethods[$command['Method']]]['Description'] == $command['Description']) { $name = $registeredMethods[$command['Method']]; - $showCommands[$name]['Name'] .= '|'.$command['Name']; + $showCommands[$name]['Name'] .= '|' . $command['Name']; } else { - $showCommands[$command['Name']] = $command; + $showCommands[$command['Name']] = $command; $registeredMethods[$command['Method']] = $command['Name']; } } - usort($showCommands, function($a, $b) { + usort($showCommands, function ($a, $b) { return strcmp($a["Name"], $b["Name"]); }); $message = 'Supported Player Commands: '; - foreach($showCommands as $command) { + foreach ($showCommands as $command) { $message .= $command['Name'] . ','; } $message = substr($message, 0, -1); @@ -124,16 +123,6 @@ class HelpManager implements CommandListener, CallbackListener { $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); - } - /** * Prepares the commands for the HelpAll ManiaLink. * @@ -141,24 +130,24 @@ class HelpManager implements CommandListener, CallbackListener { * @param $player */ private function prepareHelpAll($commands, $player) { - $showCommands = array(); + $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']) { + 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']; + $showCommands[$name]['Name'] .= '|' . $command['Name']; } else { - $showCommands[$command['Name']] = $command; + $showCommands[$command['Name']] = $command; $registeredMethods[$command['Method']] = $command['Name']; } } else { - $showCommands[$command['Name']] = $command; + $showCommands[$command['Name']] = $command; $registeredMethods[$command['Method']] = $command['Name']; } } - usort($showCommands, function($a, $b) { + usort($showCommands, function ($a, $b) { return strcmp($a["Name"], $b["Name"]); }); @@ -177,8 +166,8 @@ class HelpManager implements CommandListener, CallbackListener { // create manialink $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); - $script = $maniaLink->getScript(); - $paging = new Paging(); + $script = $maniaLink->getScript(); + $paging = new Paging(); $script->addFeature($paging); // Main frame @@ -203,7 +192,7 @@ class HelpManager implements CommandListener, CallbackListener { $i = 1; $y = $y - 10; $pageFrames = array(); - foreach($commands as $command) { + foreach ($commands as $command) { if (!isset($pageFrame)) { $pageFrame = new Frame(); $frame->add($pageFrame); @@ -227,7 +216,7 @@ class HelpManager implements CommandListener, CallbackListener { $lineQuad->setZ(0.001); } - $array = array($command['Name'] => $x + 5, $command['Description'] => $x + 50); + $array = array($command['Name'] => $x + 5, $command['Description'] => $x + 50); $labels = $this->maniaControl->manialinkManager->labelLine($playerFrame, $array); /** @var Label $label */ @@ -245,6 +234,16 @@ class HelpManager implements CommandListener, CallbackListener { $this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, 'HelpAllList'); } + /** + * 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); + } + /** * Registers a new Command * @@ -254,7 +253,7 @@ class HelpManager implements CommandListener, CallbackListener { * @param $method */ public function registerCommand($name, $adminCommand = false, $description = '', $method) { - if($adminCommand) { + if ($adminCommand) { array_push($this->adminCommands, array("Name" => $name, "Description" => $description, "Method" => $method)); } else { array_push($this->playerCommands, array("Name" => $name, "Description" => $description, "Method" => $method)); diff --git a/application/core/Configurators/Configurator.php b/application/core/Configurators/Configurator.php index 6a433034..f1891a3e 100644 --- a/application/core/Configurators/Configurator.php +++ b/application/core/Configurators/Configurator.php @@ -23,23 +23,23 @@ use ManiaControl\Players\Player; /** * Class managing ingame ManiaControl Configuration * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class Configurator implements CallbackListener, CommandListener, ManialinkPageAnswerListener { /* * Constants */ - const ACTION_TOGGLEMENU = 'Configurator.ToggleMenuAction'; - const ACTION_SAVECONFIG = 'Configurator.SaveConfigAction'; - const ACTION_SELECTMENU = 'Configurator.SelectMenu'; - const SETTING_MENU_POSX = 'Menu Widget Position: X'; - const SETTING_MENU_POSY = 'Menu Widget Position: Y'; - const SETTING_MENU_WIDTH = 'Menu Widget Width'; - const SETTING_MENU_HEIGHT = 'Menu Widget Height'; - const SETTING_MENU_STYLE = 'Menu Widget BackgroundQuad Style'; - const SETTING_MENU_SUBSTYLE = 'Menu Widget BackgroundQuad Substyle'; + const ACTION_TOGGLEMENU = 'Configurator.ToggleMenuAction'; + const ACTION_SAVECONFIG = 'Configurator.SaveConfigAction'; + const ACTION_SELECTMENU = 'Configurator.SelectMenu'; + const SETTING_MENU_POSX = 'Menu Widget Position: X'; + const SETTING_MENU_POSY = 'Menu Widget Position: Y'; + const SETTING_MENU_WIDTH = 'Menu Widget Width'; + const SETTING_MENU_HEIGHT = 'Menu Widget Height'; + const SETTING_MENU_STYLE = 'Menu Widget BackgroundQuad Style'; + const SETTING_MENU_SUBSTYLE = 'Menu Widget BackgroundQuad Substyle'; const SETTING_PERMISSION_OPEN_CONFIGURATOR = 'Open Configurator'; /* @@ -100,18 +100,13 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn } /** - * Handle Config Admin Command - * - * @param array $callback - * @param Player $player + * Add Menu Item to the Actions Menu */ - public function handleConfigCommand(array $callback, Player $player) { - if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_OPEN_CONFIGURATOR)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return; - } - - $this->showMenu($player); + private function addActionsMenuItem() { + $itemQuad = new Quad_UIConstruction_Buttons(); + $itemQuad->setSubStyle($itemQuad::SUBSTYLE_Tools); + $itemQuad->setAction(self::ACTION_TOGGLEMENU); + $this->maniaControl->actionsMenu->addAdminMenuItem($itemQuad, 100, 'Settings'); } /** @@ -124,46 +119,18 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn } /** - * Reopen the Menu - * - * @param Player $player - * @param int $menuId - */ - public function reopenMenu(Player $player, $menuId = 0) { - $this->showMenu($player, $menuId); - } - - /** - * Handle toggle menu action + * Handle Config Admin Command * * @param array $callback * @param Player $player */ - public function handleToggleMenuAction(array $callback, Player $player) { - $this->toggleMenu($player); - } - - /** - * Save the config data received from the manialink - * - * @param array $callback - * @param Player $player - */ - public function handleSaveConfigAction(array $callback, Player $player) { - foreach($this->menus as $menu) { - /** @var ConfiguratorMenu $menu */ - $menu->saveConfigData($callback[1], $player); + public function handleConfigCommand(array $callback, Player $player) { + if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_OPEN_CONFIGURATOR)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return; } - } - /** - * Handle PlayerDisconnect callback - * - * @param array $callback - */ - public function handlePlayerDisconnect(array $callback) { - $login = $callback[1][0]; - unset($this->playersMenuShown[$login]); + $this->showMenu($player); } /** @@ -178,73 +145,10 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn $this->playersMenuShown[$player->login] = true; } - /** - * Unset the player if he opened another Main Widget - * - * @param Player $player - * @param $openedWidget - */ - public function handleWidgetOpened(Player $player, $openedWidget) { - //unset when another main widget got opened - if ($openedWidget != 'Configurator') { - unset($this->playersMenuShown[$player->login]); - } - } - - /** - * Widget get closed -> unset player - * - * @param \ManiaControl\Players\Player $player - */ - public function closeWidget(Player $player) { - unset($this->playersMenuShown[$player->login]); - } - - /** - * Hide the Menu for the Player - * - * @param Player $player - */ - public function hideMenu(Player $player) { - unset($this->playersMenuShown[$player->login]); - $this->maniaControl->manialinkManager->closeWidget($player); - } - - /** - * Toggle the Menu for the Player - * - * @param Player $player - */ - public function toggleMenu(Player $player) { - if (isset($this->playersMenuShown[$player->login])) { - $this->hideMenu($player); - } else { - $this->showMenu($player); - } - } - - /** - * Gets the Menu Id - * - * @param $name - * @return int - */ - public function getMenuId($name) { - $i = 0; - foreach($this->menus as $menu) { - /** @var ConfiguratorMenu $menu */ - if ($menu == $name || $menu->getTitle() == $name) { - return $i; - } - $i++; - } - return 0; - } - /** * Build Menu ManiaLink if necessary * - * @param int $menuIdShown + * @param int $menuIdShown * @param Player $player * @return \FML\ManiaLink */ @@ -287,13 +191,13 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn $menusFrame->setX($menuWidth * -0.5 + $menuListWidth + $subMenuWidth * 0.5); // Create script and features - $script = $manialink->getScript(); - $menuScript = new Menu(); - $script->addFeature($menuScript); + $script = $manialink->getScript(); + $menuScript = new Menu(); + $script->addFeature($menuScript); $menuItemY = $menuHeight * 0.42; $menuId = 0; - foreach($this->menus as $menu) { + foreach ($this->menus as $menu) { /** @var ConfiguratorMenu $menu */ // Add title @@ -309,7 +213,7 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn if ($menuId == $menuIdShown) { $menuControl = $menu->getMenu($subMenuWidth, $subMenuHeight, $script, $player); $menusFrame->add($menuControl); - $menuScript->addElement($menuItemLabel, $menuControl); + $menuScript->addElement($menuItemLabel, $menuControl); } $menuItemY -= $menuItemHeight * 1.1; @@ -345,10 +249,116 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn $saveButton->setTranslate(true); $saveButton->setText('$zSave$z'); $saveButton->setAction(self::ACTION_SAVECONFIG); - + return $manialink; } + /** + * Reopen the Menu + * + * @param Player $player + * @param int $menuId + */ + public function reopenMenu(Player $player, $menuId = 0) { + $this->showMenu($player, $menuId); + } + + /** + * Handle toggle menu action + * + * @param array $callback + * @param Player $player + */ + public function handleToggleMenuAction(array $callback, Player $player) { + $this->toggleMenu($player); + } + + /** + * Toggle the Menu for the Player + * + * @param Player $player + */ + public function toggleMenu(Player $player) { + if (isset($this->playersMenuShown[$player->login])) { + $this->hideMenu($player); + } else { + $this->showMenu($player); + } + } + + /** + * Hide the Menu for the Player + * + * @param Player $player + */ + public function hideMenu(Player $player) { + unset($this->playersMenuShown[$player->login]); + $this->maniaControl->manialinkManager->closeWidget($player); + } + + /** + * Save the config data received from the manialink + * + * @param array $callback + * @param Player $player + */ + public function handleSaveConfigAction(array $callback, Player $player) { + foreach ($this->menus as $menu) { + /** @var ConfiguratorMenu $menu */ + $menu->saveConfigData($callback[1], $player); + } + } + + /** + * Handle PlayerDisconnect callback + * + * @param array $callback + */ + public function handlePlayerDisconnect(array $callback) { + $login = $callback[1][0]; + unset($this->playersMenuShown[$login]); + } + + /** + * Unset the player if he opened another Main Widget + * + * @param Player $player + * @param $openedWidget + */ + public function handleWidgetOpened(Player $player, $openedWidget) { + //unset when another main widget got opened + if ($openedWidget != 'Configurator') { + unset($this->playersMenuShown[$player->login]); + } + } + + /** + * Widget get closed -> unset player + * + * @param \ManiaControl\Players\Player $player + */ + public function closeWidget(Player $player) { + unset($this->playersMenuShown[$player->login]); + } + + /** + * Gets the Menu Id + * + * @param $name + * @return int + */ + public function getMenuId($name) { + $i = 0; + foreach ($this->menus as $menu) { + /** @var ConfiguratorMenu $menu */ + if ($menu == $name || $menu->getTitle() == $name) { + return $i; + } + $i++; + } + return 0; + } + /** * Handle ManialinkPageAnswer Callback * @@ -367,14 +377,4 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn $player = $this->maniaControl->playerManager->getPlayer($login); $this->showMenu($player, intval($actionArray[2])); } - - /** - * Add Menu Item to the Actions Menu - */ - private function addActionsMenuItem() { - $itemQuad = new Quad_UIConstruction_Buttons(); - $itemQuad->setSubStyle($itemQuad::SUBSTYLE_Tools); - $itemQuad->setAction(self::ACTION_TOGGLEMENU); - $this->maniaControl->actionsMenu->addAdminMenuItem($itemQuad, 100, 'Settings'); - } } diff --git a/application/core/Configurators/ManiaControlSettings.php b/application/core/Configurators/ManiaControlSettings.php index bb7a6fd4..1fed4eda 100644 --- a/application/core/Configurators/ManiaControlSettings.php +++ b/application/core/Configurators/ManiaControlSettings.php @@ -5,6 +5,7 @@ namespace ManiaControl\Configurators; use FML\Controls\Control; use FML\Controls\Entry; use FML\Controls\Frame; +use FML\Controls\Labels\Label_Button; use FML\Controls\Labels\Label_Text; use FML\Controls\Quads\Quad_Icons64x64_1; use FML\Script\Features\Paging; @@ -15,27 +16,26 @@ use ManiaControl\Callbacks\CallbackManager; use ManiaControl\ManiaControl; use ManiaControl\Players\Player; use ManiaControl\Players\PlayerManager; -use FML\Controls\Labels\Label_Button; use ManiaControl\Settings\SettingManager; /** * Class offering a Configurator for ManiaControl Settings - * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ManiaControlSettings implements ConfiguratorMenu, CallbackListener { /* * Constants */ - const TITLE = 'ManiaControl Settings'; - const ACTION_PREFIX_SETTING = 'MCSetting.'; - const ACTION_PREFIX_SETTINGCLASS = 'MCSettingClass.'; - const ACTION_SETTINGCLASS_BACK = 'MCSettingClassBack'; - const ACTION_SETTING_BOOL = 'MCSettings.ActionBoolSetting.'; + const TITLE = 'ManiaControl Settings'; + const ACTION_PREFIX_SETTING = 'MCSetting.'; + const ACTION_PREFIX_SETTINGCLASS = 'MCSettingClass.'; + const ACTION_SETTINGCLASS_BACK = 'MCSettingClassBack'; + const ACTION_SETTING_BOOL = 'MCSettings.ActionBoolSetting.'; const SETTING_PERMISSION_CHANGE_MC_SETTINGS = 'Change ManiaControl Settings'; - + /* * Private Properties */ @@ -44,22 +44,22 @@ class ManiaControlSettings implements ConfiguratorMenu, CallbackListener { /** * Create a new Script Settings Instance - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - + // Register for callbacks $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'handlePlayerDisconnect'); - + $this->maniaControl->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_CHANGE_MC_SETTINGS, AuthenticationManager::AUTH_LEVEL_ADMIN); } /** * Handle Player Disconnect Callback - * + * * @param Player $player */ public function handlePlayerDisconnect(Player $player) { @@ -67,76 +67,191 @@ class ManiaControlSettings implements ConfiguratorMenu, CallbackListener { } /** - * Get the Menu Title - * - * @return string - */ - public function getTitle() { - return self::TITLE; - } - - /** - * * @see \ManiaControl\Configurators\ConfiguratorMenu::getMenu() */ public function getMenu($width, $height, Script $script, Player $player) { if (isset($this->playersSettingCategoryOpened[$player->login]) && strlen($this->playersSettingCategoryOpened[$player->login]) > 0) { return $this->getMenuSettingsForClass($this->playersSettingCategoryOpened[$player->login], $width, $height, $script, $player); - } - else { + } else { return $this->getMenuSettingClasses($width, $height, $script, $player); } } /** - * Get the Menu showing all possible Classes - * - * @param float $width - * @param float $height + * Get the Menu showing the Settings for the given Class + * + * @param string $settingClass + * @param float $width + * @param float $height * @param Script $script * @param Player $player * @return \FML\Controls\Frame */ - private function getMenuSettingClasses($width, $height, Script $script, Player $player) { - $settingClasses = $this->maniaControl->settingManager->getSettingClasses(true); - + private function getMenuSettingsForClass($settingClass, $width, $height, Script $script, Player $player) { + $settings = $this->maniaControl->settingManager->getSettingsByClass($settingClass); + $paging = new Paging(); $script->addFeature($paging); $frame = new Frame(); - + // Config - $pagerSize = 9.; + $pagerSize = 9.; $settingHeight = 5.; - $pageMaxCount = 13; - $y = 0; - + $labelTextSize = 2; + $pageMaxCount = 13; + // Pagers $pagerPrev = new Quad_Icons64x64_1(); $frame->add($pagerPrev); $pagerPrev->setPosition($width * 0.39, $height * -0.44, 2); $pagerPrev->setSize($pagerSize, $pagerSize); $pagerPrev->setSubStyle($pagerPrev::SUBSTYLE_ArrowPrev); - + $pagerNext = new Quad_Icons64x64_1(); $frame->add($pagerNext); $pagerNext->setPosition($width * 0.45, $height * -0.44, 2); $pagerNext->setSize($pagerSize, $pagerSize); $pagerNext->setSubStyle($pagerNext::SUBSTYLE_ArrowNext); - + $paging->addButton($pagerNext); $paging->addButton($pagerPrev); - + + $pageCountLabel = new Label_Text(); + $frame->add($pageCountLabel); + $pageCountLabel->setHAlign($pageCountLabel::RIGHT); + $pageCountLabel->setPosition($width * 0.35, $height * -0.44); + $pageCountLabel->setStyle($pageCountLabel::STYLE_TextTitle1); + $pageCountLabel->setTextSize(2); + + $paging->setLabel($pageCountLabel); + + $backLabel = new Label_Button(); + $frame->add($backLabel); + $backLabel->setPosition($width * -0.49, $height * -0.44); + $backLabel->setHAlign($backLabel::LEFT); + $backLabel->setTextSize(2); + $backLabel->setText('Back'); + $backLabel->setAction(self::ACTION_SETTINGCLASS_BACK); + + $pageFrame = null; + $index = 0; + $y = 0; + foreach ($settings as $setting) { + if (!$pageFrame) { + $pageFrame = new Frame(); + $frame->add($pageFrame); + $y = $height * 0.41; + $paging->addPage($pageFrame); + } + + $settingFrame = new Frame(); + $pageFrame->add($settingFrame); + $settingFrame->setY($y); + + // TODO: display currently select setting class + + // Headline Label + if (false) { + $headLabel = new Label_Text(); + $settingFrame->add($headLabel); + $headLabel->setHAlign(Control::LEFT); + $headLabel->setX($width * -0.46); + $headLabel->setSize($width * 0.6, $settingHeight); + $headLabel->setStyle($headLabel::STYLE_TextCardSmall); + $headLabel->setTextSize($labelTextSize); + $headLabel->setText($setting->class); + $headLabel->setTextColor("F00"); + } // Headline + + $nameLabel = new Label_Text(); + $settingFrame->add($nameLabel); + $nameLabel->setHAlign(Control::LEFT); + $nameLabel->setX($width * -0.46); + $nameLabel->setSize($width * 0.6, $settingHeight); + $nameLabel->setStyle($nameLabel::STYLE_TextCardSmall); + $nameLabel->setTextSize($labelTextSize); + $nameLabel->setText($setting->setting); + $nameLabel->setTextColor("FFF"); + + if ($setting->type === SettingManager::TYPE_BOOL) { + $quad = new Quad_Icons64x64_1(); + $settingFrame->add($quad); + $quad->setX($width / 2 * 0.6); + $quad->setZ(-0.01); + $quad->setSubStyle(($setting->value ? $quad::SUBSTYLE_LvlGreen : $quad::SUBSTYLE_LvlRed)); + $quad->setSize(4, 4); + $quad->setAction(self::ACTION_SETTING_BOOL . $setting->index); + } else { + $entry = new Entry(); + $settingFrame->add($entry); + $entry->setStyle(Label_Text::STYLE_TextValueSmall); + $entry->setX($width / 2 * 0.65); + $entry->setTextSize(1); + $entry->setSize($width * 0.3, $settingHeight * 0.9); + $entry->setName(self::ACTION_PREFIX_SETTING . $setting->index); + $entry->setDefault($setting->value); + } + + $y -= $settingHeight; + if ($index % $pageMaxCount == $pageMaxCount - 1) { + $pageFrame = null; + } + + $index++; + } + + return $frame; + } + + /** + * Get the Menu showing all possible Classes + * + * @param float $width + * @param float $height + * @param Script $script + * @param Player $player + * @return \FML\Controls\Frame + */ + private function getMenuSettingClasses($width, $height, Script $script, Player $player) { + $settingClasses = $this->maniaControl->settingManager->getSettingClasses(true); + + $paging = new Paging(); + $script->addFeature($paging); + $frame = new Frame(); + + // Config + $pagerSize = 9.; + $settingHeight = 5.; + $pageMaxCount = 13; + $y = 0; + + // Pagers + $pagerPrev = new Quad_Icons64x64_1(); + $frame->add($pagerPrev); + $pagerPrev->setPosition($width * 0.39, $height * -0.44, 2); + $pagerPrev->setSize($pagerSize, $pagerSize); + $pagerPrev->setSubStyle($pagerPrev::SUBSTYLE_ArrowPrev); + + $pagerNext = new Quad_Icons64x64_1(); + $frame->add($pagerNext); + $pagerNext->setPosition($width * 0.45, $height * -0.44, 2); + $pagerNext->setSize($pagerSize, $pagerSize); + $pagerNext->setSubStyle($pagerNext::SUBSTYLE_ArrowNext); + + $paging->addButton($pagerNext); + $paging->addButton($pagerPrev); + $pageCountLabel = new Label_Text(); $frame->add($pageCountLabel); $pageCountLabel->setHAlign($pageCountLabel::RIGHT); $pageCountLabel->setPosition($width * 0.35, $height * -0.44, 1); $pageCountLabel->setStyle($pageCountLabel::STYLE_TextTitle1); $pageCountLabel->setTextSize(2); - + $paging->setLabel($pageCountLabel); - + $pageFrame = null; - $index = 0; + $index = 0; foreach ($settingClasses as $settingClass) { if (!$pageFrame) { $pageFrame = new Frame(); @@ -144,12 +259,12 @@ class ManiaControlSettings implements ConfiguratorMenu, CallbackListener { $y = $height * 0.41; $paging->addPage($pageFrame); } - + $classLabel = new Label_Text(); $settingClassArray = explode('\\', $settingClass); - $className = ""; - for($i = 1; $i < count($settingClassArray); $i++){ + $className = ""; + for ($i = 1; $i < count($settingClassArray); $i++) { $className .= $settingClassArray[$i] . " - "; } $className = substr($className, 0, -3); @@ -163,150 +278,92 @@ class ManiaControlSettings implements ConfiguratorMenu, CallbackListener { $classLabel->setText($className); $classLabel->setTextColor('fff'); $classLabel->setAction(self::ACTION_PREFIX_SETTINGCLASS . $settingClass); - + $y -= $settingHeight; - + if ($index % $pageMaxCount == $pageMaxCount - 1) { $pageFrame = null; } - + $index++; } - + return $frame; } /** - * Get the Menu showing the Settings for the given Class - * - * @param string $settingClass - * @param float $width - * @param float $height - * @param Script $script - * @param Player $player - * @return \FML\Controls\Frame + * Handle ManialinkPageAnswer Callback + * + * @param array $callback */ - private function getMenuSettingsForClass($settingClass, $width, $height, Script $script, Player $player) { - $settings = $this->maniaControl->settingManager->getSettingsByClass($settingClass); - - $paging = new Paging(); - $script->addFeature($paging); - $frame = new Frame(); - - // Config - $pagerSize = 9.; - $settingHeight = 5.; - $labelTextSize = 2; - $pageMaxCount = 13; - - // Pagers - $pagerPrev = new Quad_Icons64x64_1(); - $frame->add($pagerPrev); - $pagerPrev->setPosition($width * 0.39, $height * -0.44, 2); - $pagerPrev->setSize($pagerSize, $pagerSize); - $pagerPrev->setSubStyle($pagerPrev::SUBSTYLE_ArrowPrev); - - $pagerNext = new Quad_Icons64x64_1(); - $frame->add($pagerNext); - $pagerNext->setPosition($width * 0.45, $height * -0.44, 2); - $pagerNext->setSize($pagerSize, $pagerSize); - $pagerNext->setSubStyle($pagerNext::SUBSTYLE_ArrowNext); - - $paging->addButton($pagerNext); - $paging->addButton($pagerPrev); - - $pageCountLabel = new Label_Text(); - $frame->add($pageCountLabel); - $pageCountLabel->setHAlign($pageCountLabel::RIGHT); - $pageCountLabel->setPosition($width * 0.35, $height * -0.44); - $pageCountLabel->setStyle($pageCountLabel::STYLE_TextTitle1); - $pageCountLabel->setTextSize(2); - - $paging->setLabel($pageCountLabel); - - $backLabel = new Label_Button(); - $frame->add($backLabel); - $backLabel->setPosition($width * -0.49, $height * -0.44); - $backLabel->setHAlign($backLabel::LEFT); - $backLabel->setTextSize(2); - $backLabel->setText('Back'); - $backLabel->setAction(self::ACTION_SETTINGCLASS_BACK); - - $pageFrame = null; - $index = 0; - $y = 0; - foreach ($settings as $setting) { - if (!$pageFrame) { - $pageFrame = new Frame(); - $frame->add($pageFrame); - $y = $height * 0.41; - $paging->addPage($pageFrame); + public function handleManialinkPageAnswer(array $callback) { + $actionId = $callback[1][2]; + if ($actionId === self::ACTION_SETTINGCLASS_BACK) { + // Back to classes list + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + unset($this->playersSettingCategoryOpened[$player->login]); + $menuId = $this->maniaControl->configurator->getMenuId($this); + $this->maniaControl->configurator->showMenu($player, $menuId); + } else if (strpos($actionId, self::ACTION_SETTING_BOOL) === 0) { + // Bool setting change + $settingIndex = (int)substr($actionId, strlen(self::ACTION_SETTING_BOOL)); + + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + + // Toggle the Boolean Setting + $this->toggleBooleanSetting($settingIndex, $player); + + if ($callback[1][3]) { + // Save all Changes + $this->saveConfigData($callback[1], $player); + } else { + // Reopen menu directly + $menuId = $this->maniaControl->configurator->getMenuId($this); + $this->maniaControl->configurator->reopenMenu($player, $menuId); } - - $settingFrame = new Frame(); - $pageFrame->add($settingFrame); - $settingFrame->setY($y); - - // TODO: display currently select setting class - - // Headline Label - if (false) { - $headLabel = new Label_Text(); - $settingFrame->add($headLabel); - $headLabel->setHAlign(Control::LEFT); - $headLabel->setX($width * -0.46); - $headLabel->setSize($width * 0.6, $settingHeight); - $headLabel->setStyle($headLabel::STYLE_TextCardSmall); - $headLabel->setTextSize($labelTextSize); - $headLabel->setText($setting->class); - $headLabel->setTextColor("F00"); - } // Headline - - $nameLabel = new Label_Text(); - $settingFrame->add($nameLabel); - $nameLabel->setHAlign(Control::LEFT); - $nameLabel->setX($width * -0.46); - $nameLabel->setSize($width * 0.6, $settingHeight); - $nameLabel->setStyle($nameLabel::STYLE_TextCardSmall); - $nameLabel->setTextSize($labelTextSize); - $nameLabel->setText($setting->setting); - $nameLabel->setTextColor("FFF"); - - if ($setting->type === SettingManager::TYPE_BOOL) { - $quad = new Quad_Icons64x64_1(); - $settingFrame->add($quad); - $quad->setX($width / 2 * 0.6); - $quad->setZ(-0.01); - $quad->setSubStyle(($setting->value ? $quad::SUBSTYLE_LvlGreen : $quad::SUBSTYLE_LvlRed)); - $quad->setSize(4, 4); - $quad->setAction(self::ACTION_SETTING_BOOL . $setting->index); - } - else { - $entry = new Entry(); - $settingFrame->add($entry); - $entry->setStyle(Label_Text::STYLE_TextValueSmall); - $entry->setX($width / 2 * 0.65); - $entry->setTextSize(1); - $entry->setSize($width * 0.3, $settingHeight * 0.9); - $entry->setName(self::ACTION_PREFIX_SETTING . $setting->index); - $entry->setDefault($setting->value); - } - - $y -= $settingHeight; - if ($index % $pageMaxCount == $pageMaxCount - 1) { - $pageFrame = null; - } - - $index++; + } else if (strpos($actionId, self::ACTION_PREFIX_SETTINGCLASS) === 0) { + // Setting class selected + $settingClass = substr($actionId, strlen(self::ACTION_PREFIX_SETTINGCLASS)); + + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + + $this->playersSettingCategoryOpened[$player->login] = $settingClass; + + $menuId = $this->maniaControl->configurator->getMenuId($this); + $this->maniaControl->configurator->showMenu($player, $menuId); } - - return $frame; + } + + /** + * Toggles a Boolean Value + * + * @param int $settingIndex + * @param Player $player + */ + public function toggleBooleanSetting($settingIndex, Player $player) { + if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_CHANGE_MC_SETTINGS)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return; + } + + $oldSetting = $this->maniaControl->settingManager->getSettingByIndex($settingIndex); + + if (!isset($oldSetting)) { + var_dump('no setting ' . $settingIndex); + return; + } + + // Toggle value + $this->maniaControl->settingManager->setSetting($oldSetting->class, $oldSetting->setting, !$oldSetting->value); } /** * Save the Config Data - * - * @param array $configData + * + * @param array $configData * @param Player $player */ public function saveConfigData(array $configData, Player $player) { @@ -318,96 +375,33 @@ class ManiaControlSettings implements ConfiguratorMenu, CallbackListener { // TODO: improve needed, this won't save configData passed by boolean setting change return; } - + $maniaControlSettings = $this->maniaControl->settingManager->getSettings(); - + $prefixLength = strlen(self::ACTION_PREFIX_SETTING); - + foreach ($configData[3] as $setting) { $settingName = substr($setting['Name'], $prefixLength); - + $oldSetting = $maniaControlSettings[$settingName]; if ($setting['Value'] == $oldSetting->value || $oldSetting->type == 'bool') { continue; } - + $this->maniaControl->settingManager->setSetting($oldSetting->class, $oldSetting->setting, $setting['Value']); } - + // Reopen the Menu $menuId = $this->maniaControl->configurator->getMenuId($this->getTitle()); $this->maniaControl->configurator->reopenMenu($player, $menuId); } /** - * Handle ManialinkPageAnswer Callback - * - * @param array $callback + * Get the Menu Title + * + * @return string */ - public function handleManialinkPageAnswer(array $callback) { - $actionId = $callback[1][2]; - if ($actionId === self::ACTION_SETTINGCLASS_BACK) { - // Back to classes list - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - unset($this->playersSettingCategoryOpened[$player->login]); - $menuId = $this->maniaControl->configurator->getMenuId($this); - $this->maniaControl->configurator->showMenu($player, $menuId); - } - else if (strpos($actionId, self::ACTION_SETTING_BOOL) === 0) { - // Bool setting change - $settingIndex = (int) substr($actionId, strlen(self::ACTION_SETTING_BOOL)); - - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - - // Toggle the Boolean Setting - $this->toggleBooleanSetting($settingIndex, $player); - - if ($callback[1][3]) { - // Save all Changes - $this->saveConfigData($callback[1], $player); - } - else { - // Reopen menu directly - $menuId = $this->maniaControl->configurator->getMenuId($this); - $this->maniaControl->configurator->reopenMenu($player, $menuId); - } - } - else if (strpos($actionId, self::ACTION_PREFIX_SETTINGCLASS) === 0) { - // Setting class selected - $settingClass = substr($actionId, strlen(self::ACTION_PREFIX_SETTINGCLASS)); - - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - - $this->playersSettingCategoryOpened[$player->login] = $settingClass; - - $menuId = $this->maniaControl->configurator->getMenuId($this); - $this->maniaControl->configurator->showMenu($player, $menuId); - } - } - - /** - * Toggles a Boolean Value - * - * @param int $settingIndex - * @param Player $player - */ - public function toggleBooleanSetting($settingIndex, Player $player) { - if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_CHANGE_MC_SETTINGS)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return; - } - - $oldSetting = $this->maniaControl->settingManager->getSettingByIndex($settingIndex); - - if (!isset($oldSetting)) { - var_dump('no setting ' . $settingIndex); - return; - } - - // Toggle value - $this->maniaControl->settingManager->setSetting($oldSetting->class, $oldSetting->setting, !$oldSetting->value); + public function getTitle() { + return self::TITLE; } } diff --git a/application/core/Configurators/ScriptSettings.php b/application/core/Configurators/ScriptSettings.php index 24ec4071..ed60d163 100644 --- a/application/core/Configurators/ScriptSettings.php +++ b/application/core/Configurators/ScriptSettings.php @@ -23,8 +23,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\NotInScriptModeException; /** * Class offering a Configurator for Script Settings * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ScriptSettings implements ConfiguratorMenu, CallbackListener { @@ -100,17 +100,6 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { $this->loadSettingsFromDatabase(); } - /** - * Handle OnBegin Map Callback - * - * @param Map $map - */ - public function onBeginMap(Map $map) { - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_LOAD_DEFAULT_SETTINGS_MAP_BEGIN)) { - $this->loadSettingsFromDatabase(); - } - } - /** * Load Settings from Database * @@ -119,7 +108,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { public function loadSettingsFromDatabase() { try { $scriptSettings = $this->maniaControl->client->getModeScriptSettings(); - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { return false; } @@ -133,7 +122,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { } $loadedSettings = array(); - while($row = $result->fetch_object()) { + while ($row = $result->fetch_object()) { if (!isset($scriptSettings[$row->settingName])) { continue; } @@ -147,7 +136,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { try { $this->maniaControl->client->setModeScriptSettings($loadedSettings); - } catch(Exception $e) { + } catch (Exception $e) { trigger_error('Error occurred: ' . $e->getMessage()); return false; } @@ -155,23 +144,27 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { } /** - * @see \ManiaControl\Configurators\ConfiguratorMenu::getTitle() + * Handle OnBegin Map Callback + * + * @param Map $map */ - public function getTitle() { - return 'Script Settings'; + public function onBeginMap(Map $map) { + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_LOAD_DEFAULT_SETTINGS_MAP_BEGIN)) { + $this->loadSettingsFromDatabase(); + } } /** * @see \ManiaControl\Configurators\ConfiguratorMenu::getMenu() */ public function getMenu($width, $height, Script $script, Player $player) { - $paging = new Paging(); - $script->addFeature($paging); - $frame = new Frame(); + $paging = new Paging(); + $script->addFeature($paging); + $frame = new Frame(); try { $scriptInfo = $this->maniaControl->client->getModeScriptInfo(); - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { $label = new Label(); $frame->add($label); $label->setText($e->getMessage()); @@ -182,7 +175,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { try { $scriptSettings = $this->maniaControl->client->getModeScriptSettings(); - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { //do nothing } @@ -205,8 +198,8 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { $pagerNext->setSize($pagerSize, $pagerSize); $pagerNext->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowNext); - $paging->addButton($pagerNext); - $paging->addButton($pagerPrev); + $paging->addButton($pagerNext); + $paging->addButton($pagerPrev); $pageCountLabel = new Label(); $frame->add($pageCountLabel); @@ -215,12 +208,12 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { $pageCountLabel->setStyle('TextTitle1'); $pageCountLabel->setTextSize(2); - $paging->setLabel($pageCountLabel); + $paging->setLabel($pageCountLabel); // Setting pages $pageFrames = array(); $y = 0.; - foreach($scriptParams as $index => $scriptParam) { + foreach ($scriptParams as $index => $scriptParam) { /** @var \Maniaplanet\DedicatedServer\Structures\ScriptSettings $scriptParam */ $settingName = $scriptParam->name; @@ -236,7 +229,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { } array_push($pageFrames, $pageFrame); $y = $height * 0.41; - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); } $settingFrame = new Frame(); @@ -290,7 +283,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { $descriptionLabel->setTextSize($labelTextSize); $descriptionLabel->setTranslate(true); $descriptionLabel->setText($scriptParam->desc); - $nameLabel->addTooltipFeature($descriptionLabel); + $nameLabel->addTooltipFeature($descriptionLabel); $y -= $settingHeight; if ($index % $pageMaxCount == $pageMaxCount - 1) { @@ -301,50 +294,6 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { return $frame; } - /** - * @see \ManiaControl\Configurators\ConfiguratorMenu::saveConfigData() - */ - public function saveConfigData(array $configData, Player $player) { - if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_CHANGE_SCRIPT_SETTINGS)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return; - } - if (!$configData[3] || strpos($configData[3][0]['Name'], self::ACTION_PREFIX_SETTING) !== 0) { - return; - } - - try { - $scriptSettings = $this->maniaControl->client->getModeScriptSettings(); - } catch(NotInScriptModeException $e) { - return; - } - - $prefixLength = strlen(self::ACTION_PREFIX_SETTING); - - $newSettings = array(); - foreach($configData[3] as $setting) { - $settingName = substr($setting['Name'], $prefixLength + 1); - if (!isset($scriptSettings[$settingName])) { - var_dump('no setting ' . $settingName); - continue; - } - - if ($setting['Value'] == $scriptSettings[$settingName]) { - // Not changed - continue; - } - - $newSettings[$settingName] = $setting['Value']; - settype($newSettings[$settingName], gettype($scriptSettings[$settingName])); - } - - $this->applyNewScriptSettings($newSettings, $player); - - //Reopen the Menu - $menuId = $this->maniaControl->configurator->getMenuId($this->getTitle()); - $this->maniaControl->configurator->reopenMenu($player, $menuId); - } - /** * Handle ManialinkPageAnswer Callback * @@ -379,7 +328,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { public function toggleBooleanSetting($setting, Player $player) { try { $scriptSettings = $this->maniaControl->client->getModeScriptSettings(); - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { return; } @@ -408,7 +357,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { try { $this->maniaControl->client->setModeScriptSettings($newSettings); - } catch(Exception $e) { + } catch (Exception $e) { //TODO temp added 19.04.2014 $this->maniaControl->errorHandler->triggerDebugNotice("Exception line 416 ScriptSettings.php" . $e->getMessage()); $this->maniaControl->chat->sendError('Error occurred: ' . $e->getMessage(), $player->login); @@ -436,7 +385,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { $settingIndex = 0; $title = $this->maniaControl->authenticationManager->getAuthLevelName($player->authLevel); $chatMessage = '$ff0' . $title . ' $<' . $player->nickname . '$> set ScriptSetting' . ($settingsCount > 1 ? 's' : '') . ' '; - foreach($newSettings as $setting => $value) { + foreach ($newSettings as $setting => $value) { $chatMessage .= '$<' . '$fff' . preg_replace('/^S_/', '', $setting) . '$z$s$ff0 '; $chatMessage .= 'to $fff' . $this->parseSettingValue($value) . '$>'; @@ -478,4 +427,55 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { } return (string)$value; } + + /** + * @see \ManiaControl\Configurators\ConfiguratorMenu::saveConfigData() + */ + public function saveConfigData(array $configData, Player $player) { + if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_CHANGE_SCRIPT_SETTINGS)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return; + } + if (!$configData[3] || strpos($configData[3][0]['Name'], self::ACTION_PREFIX_SETTING) !== 0) { + return; + } + + try { + $scriptSettings = $this->maniaControl->client->getModeScriptSettings(); + } catch (NotInScriptModeException $e) { + return; + } + + $prefixLength = strlen(self::ACTION_PREFIX_SETTING); + + $newSettings = array(); + foreach ($configData[3] as $setting) { + $settingName = substr($setting['Name'], $prefixLength + 1); + if (!isset($scriptSettings[$settingName])) { + var_dump('no setting ' . $settingName); + continue; + } + + if ($setting['Value'] == $scriptSettings[$settingName]) { + // Not changed + continue; + } + + $newSettings[$settingName] = $setting['Value']; + settype($newSettings[$settingName], gettype($scriptSettings[$settingName])); + } + + $this->applyNewScriptSettings($newSettings, $player); + + //Reopen the Menu + $menuId = $this->maniaControl->configurator->getMenuId($this->getTitle()); + $this->maniaControl->configurator->reopenMenu($player, $menuId); + } + + /** + * @see \ManiaControl\Configurators\ConfiguratorMenu::getTitle() + */ + public function getTitle() { + return 'Script Settings'; + } } diff --git a/application/core/Configurators/ServerSettings.php b/application/core/Configurators/ServerSettings.php index 0596070e..a4663f33 100644 --- a/application/core/Configurators/ServerSettings.php +++ b/application/core/Configurators/ServerSettings.php @@ -20,8 +20,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\LadderModeUnknownException; /** * Class offering a Configurator for Server Settings * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ServerSettings implements ConfiguratorMenu, CallbackListener { @@ -109,7 +109,7 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { } $serverSettings = $this->maniaControl->client->getServerOptions()->toArray(); $applySettings = false; - while($row = $result->fetch_object()) { + while ($row = $result->fetch_object()) { if (!isset($serverSettings[$row->settingName])) { continue; } @@ -127,20 +127,13 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { return true; } - /** - * @see \ManiaControl\Configurators\ConfiguratorMenu::getTitle() - */ - public function getTitle() { - return 'Server Settings'; - } - /** * @see \ManiaControl\Configurators\ConfiguratorMenu::getMenu() */ public function getMenu($width, $height, Script $script, Player $player) { - $paging = new Paging(); - $script->addFeature($paging); - $frame = new Frame(); + $paging = new Paging(); + $script->addFeature($paging); + $frame = new Frame(); $serverSettings = $this->maniaControl->client->getServerOptions()->toArray(); @@ -163,8 +156,8 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { $pagerNext->setSize($pagerSize, $pagerSize); $pagerNext->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowNext); - $paging->addButton($pagerNext); - $paging->addButton($pagerPrev); + $paging->addButton($pagerNext); + $paging->addButton($pagerPrev); $pageCountLabel = new Label(); $frame->add($pageCountLabel); @@ -173,13 +166,13 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { $pageCountLabel->setStyle('TextTitle1'); $pageCountLabel->setTextSize(2); - $paging->setLabel($pageCountLabel); + $paging->setLabel($pageCountLabel); // Setting pages $pageFrames = array(); $y = 0.; $id = 0; - foreach($serverSettings as $name => $value) { + foreach ($serverSettings as $name => $value) { // Continue on CurrentMaxPlayers... $pos = strpos($name, "Current"); // TODO maybe display current somewhere if ($pos !== false) { @@ -194,7 +187,7 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { } array_push($pageFrames, $pageFrame); $y = $height * 0.41; - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); } $settingFrame = new Frame(); @@ -261,6 +254,25 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { return $frame; } + /** + * Handle ManialinkPageAnswer Callback + * + * @param array $callback + */ + public function handleManialinkPageAnswer(array $callback) { + $actionId = $callback[1][2]; + $boolSetting = (strpos($actionId, self::ACTION_SETTING_BOOL) === 0); + if (!$boolSetting) { + return; + } + + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + + // Save all Changes + $this->saveConfigData($callback[1], $player); + } + /** * @see \ManiaControl\Configurators\ConfiguratorMenu::saveConfigData() */ @@ -285,7 +297,7 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { } $newSettings = array(); - foreach($configData[3] as $setting) { + foreach ($configData[3] as $setting) { // Check if it was a boolean button if ($setting['Name'] == $boolSettingName) { $setting['Value'] = ($setting['Value'] ? false : true); @@ -304,25 +316,6 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { $this->maniaControl->configurator->reopenMenu($player, $menuId); } - /** - * Handle ManialinkPageAnswer Callback - * - * @param array $callback - */ - public function handleManialinkPageAnswer(array $callback) { - $actionId = $callback[1][2]; - $boolSetting = (strpos($actionId, self::ACTION_SETTING_BOOL) === 0); - if (!$boolSetting) { - return; - } - - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - - // Save all Changes - $this->saveConfigData($callback[1], $player); - } - /** * Apply the Array of new Server Settings * @@ -337,7 +330,7 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { try { $this->maniaControl->client->setServerOptions($newSettings); - } catch(LadderModeUnknownException $e) { + } catch (LadderModeUnknownException $e) { $this->maniaControl->chat->sendError("Unknown Ladder-Mode"); return false; } @@ -359,7 +352,7 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { return false; } - foreach($newSettings as $setting => $value) { + foreach ($newSettings as $setting => $value) { if ($value === null) { continue; } @@ -382,4 +375,11 @@ class ServerSettings implements ConfiguratorMenu, CallbackListener { return true; } + + /** + * @see \ManiaControl\Configurators\ConfiguratorMenu::getTitle() + */ + public function getTitle() { + return 'Server Settings'; + } } diff --git a/application/core/ManiaExchange/MXMapInfo.php b/application/core/ManiaExchange/MXMapInfo.php index b08ba4f8..81a23f2f 100644 --- a/application/core/ManiaExchange/MXMapInfo.php +++ b/application/core/ManiaExchange/MXMapInfo.php @@ -7,10 +7,10 @@ use ManiaControl\Formatter; /** * Mania Exchange Map Info Object * - * @author Xymph - * @updated kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author Xymph + * @updated kremsy + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class MXMapInfo { public $prefix, $id, $uid, $name, $userid, $author, $uploaded, $updated, $type, $maptype; @@ -19,6 +19,7 @@ class MXMapInfo { public $replaytyp, $replayid, $replaycnt, $acomment, $awards, $comments; public $pageurl, $replayurl, $imageurl, $thumburl, $downloadurl, $dir; public $ratingVoteCount, $ratingVoteAverage; + /** * Returns map object with all available data from MX map data * @@ -76,7 +77,7 @@ class MXMapInfo { $this->comments = $mx->CommentCount; $this->ratingVoteCount = isset($mx->RatingVoteCount) ? $mx->RatingVoteCount : 0; - $this->ratingVoteAverage = isset($mx->RatingVoteAverage) ? $mx->RatingVoteAverage : 0; + $this->ratingVoteAverage = isset($mx->RatingVoteAverage) ? $mx->RatingVoteAverage : 0; if ($this->trkvalue == 0 && $this->lbrating > 0) { $this->trkvalue = $this->lbrating; diff --git a/application/core/ManiaExchange/ManiaExchangeList.php b/application/core/ManiaExchange/ManiaExchangeList.php index 771211b8..98934715 100644 --- a/application/core/ManiaExchange/ManiaExchangeList.php +++ b/application/core/ManiaExchange/ManiaExchangeList.php @@ -29,9 +29,9 @@ use ManiaControl\Players\Player; /** * ManiaExchange List Widget Class * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener { /* @@ -66,6 +66,33 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener $this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_SEARCH_AUTHOR, $this, 'showList'); } + /** + * Handle ManialinkPageAnswer Callback + * + * @param array $callback + */ + public function handleManialinkPageAnswer(array $callback) { + $actionId = $callback[1][2]; + $actionArray = explode('.', $actionId); + if (count($actionArray) <= 2) { + return; + } + + $action = $actionArray[0] . '.' . $actionArray[1]; + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + $mapId = (int)$actionArray[2]; + + switch ($action) { + case self::ACTION_GET_MAPS_FROM_AUTHOR: + $callback[1][2] = 'auth:' . $actionArray[2]; + $this->showList($callback, $player); + break; + case self::ACTION_ADD_MAP: + $this->maniaControl->mapManager->addMapFromMx($mapId, $player->login); + break; + } + } /** * Shows the List @@ -80,7 +107,7 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener $author = ''; $environment = ''; if (count($params) >= 1) { - foreach($params as $param) { + foreach ($params as $param) { if ($param == '/xlist' || $param == MapCommands::ACTION_OPEN_XLIST) { continue; } @@ -130,8 +157,8 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener //Create ManiaLink $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); $script = $maniaLink->getScript(); - $paging = new Paging(); - $script->addFeature($paging); + $paging = new Paging(); + $script->addFeature($paging); // Main frame $frame = $this->maniaControl->manialinkManager->styleManager->getDefaultListFrame($script, $paging); @@ -151,7 +178,7 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener $i = 0; $y = $height / 2 - 16; $pageFrames = array(); - foreach($maps as $map) { //TODO order possibilities + foreach ($maps as $map) { //TODO order possibilities /** @var MxMapInfo $map */ if (!isset($pageFrame)) { $pageFrame = new Frame(); @@ -162,7 +189,7 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener array_push($pageFrames, $pageFrame); $y = $height / 2 - 16; - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); } // Map Frame @@ -179,7 +206,7 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener /** @var MxMapInfo $map */ $time = Formatter::time_elapsed_string(strtotime($map->updated)); - $array = array('$s'. $map->id => $x + 3.5, '$s'. $map->name => $x + 12.5, '$s'. $map->author => $x + 59, '$s'. str_replace("Arena", "", $map->maptype) => $x + 103, '$s'. $map->mood => $x + 118, '$s'. $time => $x + 130); + $array = array('$s' . $map->id => $x + 3.5, '$s' . $map->name => $x + 12.5, '$s' . $map->author => $x + 59, '$s' . str_replace("Arena", "", $map->maptype) => $x + 103, '$s' . $map->mood => $x + 118, '$s' . $time => $x + 130); $labels = $this->maniaControl->manialinkManager->labelLine($mapFrame, $array); /** @var Label_Text $authorLabel */ $authorLabel = $labels[2]; @@ -195,8 +222,8 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener $mxQuad->setX($x + 56); $mxQuad->setUrl($map->pageurl); $mxQuad->setZ(0.01); - $description = 'View $<' . $map->name . '$> on Mania-Exchange'; - $mxQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'View $<' . $map->name . '$> on Mania-Exchange'; + $mxQuad->addTooltipLabelFeature($descriptionLabel, $description); if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_ADD_MAP)) { $addQuad = new Quad_Icons64x64_1(); @@ -208,8 +235,8 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener $addQuad->setAction(self::ACTION_ADD_MAP . '.' . $map->id); $addQuad->setZ(0.01); - $description = 'Add-Map: $<' . $map->name . '$>'; - $addQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Add-Map: $<' . $map->name . '$>'; + $addQuad->addTooltipLabelFeature($descriptionLabel, $description); } //Award Quad @@ -230,7 +257,7 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener } //Map Karma - $karma = $map->ratingVoteAverage / 100; + $karma = $map->ratingVoteAverage / 100; $voteCount = $map->ratingVoteCount; if (is_numeric($karma) && $voteCount > 0) { $karmaGauge = new Gauge(); @@ -312,35 +339,6 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener $this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, 'ManiaExchangeList'); } - /** - * Handle ManialinkPageAnswer Callback - * - * @param array $callback - */ - public function handleManialinkPageAnswer(array $callback) { - $actionId = $callback[1][2]; - $actionArray = explode('.', $actionId); - if (count($actionArray) <= 2) { - return; - } - - $action = $actionArray[0] . '.' . $actionArray[1]; - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - $mapId = (int)$actionArray[2]; - - switch($action) { - case self::ACTION_GET_MAPS_FROM_AUTHOR: - $callback[1][2] = 'auth:' . $actionArray[2]; - $this->showList($callback, $player); - break; - case self::ACTION_ADD_MAP: - $this->maniaControl->mapManager->addMapFromMx($mapId, $player->login); - break; - } - } - - /** * Unset the player if he opened another Main Widget * @@ -364,5 +362,4 @@ class ManiaExchangeList implements CallbackListener, ManialinkPageAnswerListener unset($this->mapListShown[$player->login]); } - -} \ No newline at end of file +} \ No newline at end of file diff --git a/application/core/ManiaExchange/ManiaExchangeManager.php b/application/core/ManiaExchange/ManiaExchangeManager.php index ca850b3b..e7e4f228 100644 --- a/application/core/ManiaExchange/ManiaExchangeManager.php +++ b/application/core/ManiaExchange/ManiaExchangeManager.php @@ -10,8 +10,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\NotInScriptModeException; /** * Mania Exchange Info Searcher Class * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ManiaExchangeManager { @@ -57,49 +57,6 @@ class ManiaExchangeManager { $this->maniaControl = $maniaControl; } - - /** - * Store Map Info from MX and store the mxid in the database and the mx info in the map object - * - * @param $mxMapInfos - */ - public function updateMapObjectsWithManiaExchangeIds($mxMapInfos) { - $mysqli = $this->maniaControl->database->mysqli; - // Save map data - $saveMapQuery = "UPDATE `" . MapManager::TABLE_MAPS . "` - SET `mxid` = ? - WHERE `uid` = ?;"; - $saveMapStatement = $mysqli->prepare($saveMapQuery); - if ($mysqli->error) { - trigger_error($mysqli->error); - return; - } - $saveMapStatement->bind_param('is', $mapMxId, $mapUId); - foreach($mxMapInfos as $mxMapInfo) { - /** @var MXMapInfo $mxMapInfo */ - $mapMxId = $mxMapInfo->id; - $mapUId = $mxMapInfo->uid; - $saveMapStatement->execute(); - if ($saveMapStatement->error) { - trigger_error($saveMapStatement->error); - } - - //Take the uid out of the vector - if (isset($this->mxIdUidVector[$mxMapInfo->id])) { - $uid = $this->mxIdUidVector[$mxMapInfo->id]; - } else { - $uid = $mxMapInfo->uid; - } - $map = $this->maniaControl->mapManager->getMapByUid($uid); - if ($map) { - // TODO: how does it come that $map can be empty here? we got an error report for that - /** @var Map $map */ - $map->mx = $mxMapInfo; - } - } - $saveMapStatement->close(); - } - /** * Unset Map by Mx Id * @@ -138,7 +95,7 @@ class ManiaExchangeManager { } $id = 0; - foreach($maps as $map) { + foreach ($maps as $map) { /** @var Map $map */ $fetchMapStatement->bind_param('i', $map->index); $fetchMapStatement->execute(); @@ -182,37 +139,6 @@ class ManiaExchangeManager { $fetchMapStatement->close(); } - /** - * Get Map Info Asynchronously - * - * @param $id - * @param $function - * @return bool - */ - public function getMapInfo($id, $function) { - // Get Title Prefix - $titlePrefix = $this->maniaControl->mapManager->getCurrentMap()->getGame(); - - // compile search URL - $url = 'http://api.mania-exchange.com/' . $titlePrefix . '/maps/?ids=' . $id; - - return $this->maniaControl->fileReader->loadFile($url, function ($mapInfo, $error) use (&$function, $titlePrefix, $url) { - $mxMapInfo = null; - if ($error) { - trigger_error($error); - } else { - $mxMapList = json_decode($mapInfo); - if ($mxMapList === null) { - trigger_error('Cannot decode searched JSON data from ' . $url); - } else { - $mxMapInfo = new MXMapInfo($titlePrefix, $mxMapList[0]); - } - } - call_user_func($function, $mxMapInfo); - }, "application/json"); - } - - /** * Get the Whole MapList from MX by Mixed Uid and Id String fetch * @@ -244,7 +170,7 @@ class ManiaExchangeManager { } $maps = array(); - foreach($mxMapList as $map) { + foreach ($mxMapList as $map) { if ($map) { $mxMapObject = new MXMapInfo($titlePrefix, $map); if ($mxMapObject) { @@ -260,6 +186,78 @@ class ManiaExchangeManager { return $success; } + /** + * Store Map Info from MX and store the mxid in the database and the mx info in the map object + * + * @param $mxMapInfos + */ + public function updateMapObjectsWithManiaExchangeIds($mxMapInfos) { + $mysqli = $this->maniaControl->database->mysqli; + // Save map data + $saveMapQuery = "UPDATE `" . MapManager::TABLE_MAPS . "` + SET `mxid` = ? + WHERE `uid` = ?;"; + $saveMapStatement = $mysqli->prepare($saveMapQuery); + if ($mysqli->error) { + trigger_error($mysqli->error); + return; + } + $saveMapStatement->bind_param('is', $mapMxId, $mapUId); + foreach ($mxMapInfos as $mxMapInfo) { + /** @var MXMapInfo $mxMapInfo */ + $mapMxId = $mxMapInfo->id; + $mapUId = $mxMapInfo->uid; + $saveMapStatement->execute(); + if ($saveMapStatement->error) { + trigger_error($saveMapStatement->error); + } + + //Take the uid out of the vector + if (isset($this->mxIdUidVector[$mxMapInfo->id])) { + $uid = $this->mxIdUidVector[$mxMapInfo->id]; + } else { + $uid = $mxMapInfo->uid; + } + $map = $this->maniaControl->mapManager->getMapByUid($uid); + if ($map) { + // TODO: how does it come that $map can be empty here? we got an error report for that + /** @var Map $map */ + $map->mx = $mxMapInfo; + } + } + $saveMapStatement->close(); + } + + /** + * Get Map Info Asynchronously + * + * @param $id + * @param $function + * @return bool + */ + public function getMapInfo($id, $function) { + // Get Title Prefix + $titlePrefix = $this->maniaControl->mapManager->getCurrentMap()->getGame(); + + // compile search URL + $url = 'http://api.mania-exchange.com/' . $titlePrefix . '/maps/?ids=' . $id; + + return $this->maniaControl->fileReader->loadFile($url, function ($mapInfo, $error) use (&$function, $titlePrefix, $url) { + $mxMapInfo = null; + if ($error) { + trigger_error($error); + } else { + $mxMapList = json_decode($mapInfo); + if ($mxMapList === null) { + trigger_error('Cannot decode searched JSON data from ' . $url); + } else { + $mxMapInfo = new MXMapInfo($titlePrefix, $mxMapList[0]); + } + } + call_user_func($function, $mxMapInfo); + }, "application/json"); + } + /** * Fetch a MapList Asynchronously * @@ -302,13 +300,13 @@ class ManiaExchangeManager { if ($titlePrefix != "tm") { $url .= '&minexebuild=' . self::MIN_EXE_BUILD; } - + // Get MapTypes try { $scriptInfos = $this->maniaControl->client->getModeScriptInfo(); $mapTypes = $scriptInfos->compatibleMapTypes; $url .= '&mtype=' . $mapTypes; - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { } $success = $this->maniaControl->fileReader->loadFile($url, function ($mapInfo, $error) use (&$function, $titlePrefix) { @@ -332,7 +330,7 @@ class ManiaExchangeManager { } $maps = array(); - foreach($mxMapList as $map) { + foreach ($mxMapList as $map) { if (!empty($map)) { array_push($maps, new MXMapInfo($titlePrefix, $map)); } @@ -352,7 +350,7 @@ class ManiaExchangeManager { * @return int */ private function getEnvironment($env) { - switch($env) { + switch ($env) { case 'TMCanyon': return 1; case 'TMStadium': diff --git a/application/core/Manialinks/CustomUIManager.php b/application/core/Manialinks/CustomUIManager.php index 7cc53476..58b1ab49 100644 --- a/application/core/Manialinks/CustomUIManager.php +++ b/application/core/Manialinks/CustomUIManager.php @@ -12,9 +12,9 @@ use ManiaControl\Players\PlayerManager; /** * Class managing the Custom UI Settings * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class CustomUIManager implements CallbackListener, TimerListener { /* @@ -51,19 +51,6 @@ class CustomUIManager implements CallbackListener, TimerListener { $this->customUI = new CustomUI(); } - /** - * Update the CustomUI Manialink - * - * @param Player $player - */ - private function updateManialink(Player $player = null) { - if ($player) { - $this->maniaControl->manialinkManager->sendManialink($this->customUI, $player->login); - return; - } - $this->maniaControl->manialinkManager->sendManialink($this->customUI); - } - /** * Handle 1Second * @@ -77,6 +64,19 @@ class CustomUIManager implements CallbackListener, TimerListener { $this->updateManialink(); } + /** + * Update the CustomUI Manialink + * + * @param Player $player + */ + private function updateManialink(Player $player = null) { + if ($player) { + $this->maniaControl->manialinkManager->sendManialink($this->customUI, $player->login); + return; + } + $this->maniaControl->manialinkManager->sendManialink($this->customUI); + } + /** * Handle PlayerJoined Callback * @@ -87,9 +87,9 @@ class CustomUIManager implements CallbackListener, TimerListener { //send it again after 500ms $self = $this; - $this->maniaControl->timerManager->registerOneTimeListening($this, function($time) use (&$self, &$player){ + $this->maniaControl->timerManager->registerOneTimeListening($this, function ($time) use (&$self, &$player) { $self->updateManialink($player); - },500); + }, 500); } /** diff --git a/application/core/Manialinks/IconManager.php b/application/core/Manialinks/IconManager.php index 0dfc4d79..c7f0198b 100644 --- a/application/core/Manialinks/IconManager.php +++ b/application/core/Manialinks/IconManager.php @@ -8,15 +8,15 @@ use FML\ManiaLink; use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackManager; use ManiaControl\ManiaControl; -use ManiaControl\Players\PlayerManager; use ManiaControl\Players\Player; +use ManiaControl\Players\PlayerManager; /** * Class managing Icons * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class IconManager implements CallbackListener { /* @@ -95,15 +95,6 @@ class IconManager implements CallbackListener { $this->preloadIcons(); } - /** - * Handle PlayerConnect Callback - * - * @param Player $player - */ - public function handlePlayerConnect(Player $player) { - $this->preloadIcons($player); - } - /** * Preload Icons * @@ -115,7 +106,7 @@ class IconManager implements CallbackListener { $maniaLink->add($frame); $frame->setPosition(500, 500); - foreach($this->icons as $iconUrl) { + foreach ($this->icons as $iconUrl) { $iconQuad = new Quad(); $iconQuad->setImage($iconUrl); $iconQuad->setSize(1, 1); @@ -125,4 +116,13 @@ class IconManager implements CallbackListener { // Send manialink $this->maniaControl->manialinkManager->sendManialink($maniaLink, $player); } + + /** + * Handle PlayerConnect Callback + * + * @param Player $player + */ + public function handlePlayerConnect(Player $player) { + $this->preloadIcons($player); + } } \ No newline at end of file diff --git a/application/core/Manialinks/ManialinkManager.php b/application/core/Manialinks/ManialinkManager.php index b0e41bc7..e62191e4 100644 --- a/application/core/Manialinks/ManialinkManager.php +++ b/application/core/Manialinks/ManialinkManager.php @@ -15,27 +15,27 @@ use Maniaplanet\DedicatedServer\Xmlrpc\NotInScriptModeException; /** * Manialink Manager Class - * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener { /* * Constants */ - const MAIN_MLID = 'Main.ManiaLinkId'; - const ACTION_CLOSEWIDGET = 'ManiaLinkManager.CloseWidget'; + const MAIN_MLID = 'Main.ManiaLinkId'; + const ACTION_CLOSEWIDGET = 'ManiaLinkManager.CloseWidget'; const CB_MAIN_WINDOW_CLOSED = 'ManialinkManagerCallback.MainWindowClosed'; const CB_MAIN_WINDOW_OPENED = 'ManialinkManagerCallback.MainWindowOpened'; - + /* * Public Properties */ public $styleManager = null; public $customUIManager = null; public $iconManager = null; - + /* * Private Properties */ @@ -45,15 +45,15 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener /** * Create a new manialink manager - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { - $this->maniaControl = $maniaControl; - $this->styleManager = new StyleManager($maniaControl); + $this->maniaControl = $maniaControl; + $this->styleManager = new StyleManager($maniaControl); $this->customUIManager = new CustomUIManager($maniaControl); - $this->iconManager = new IconManager($maniaControl); - + $this->iconManager = new IconManager($maniaControl); + // Register for callbacks $this->registerManialinkPageAnswerListener(self::ACTION_CLOSEWIDGET, $this, 'closeWidgetCallback'); $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); @@ -61,10 +61,10 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener /** * Register a new manialink page answer listener - * - * @param string $actionId + * + * @param string $actionId * @param ManialinkPageAnswerListener $listener - * @param string $method + * @param string $method * @return bool */ public function registerManialinkPageAnswerListener($actionId, ManialinkPageAnswerListener $listener, $method) { @@ -72,24 +72,24 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener trigger_error("Given listener for actionId '{$actionId}' doesn't have callback method '{$method}'!"); return false; } - + if (!array_key_exists($actionId, $this->pageAnswerListeners) || !is_array($this->pageAnswerListeners[$actionId])) { // Init listeners array $this->pageAnswerListeners[$actionId] = array(); } - + // Register page answer listener array_push($this->pageAnswerListeners[$actionId], array($listener, $method)); - + return true; } /** * Register a new manialink page answer reg ex listener - * - * @param string $actionIdRegex + * + * @param string $actionIdRegex * @param ManialinkPageAnswerListener $listener - * @param string $method + * @param string $method * @return bool */ public function registerManialinkPageAnswerRegexListener($actionIdRegex, ManialinkPageAnswerListener $listener, $method) { @@ -97,26 +97,26 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener trigger_error("Given listener for actionIdRegex '{$actionIdRegex}' doesn't have callback method '{$method}'!"); return false; } - + if (!array_key_exists($actionIdRegex, $this->pageAnswerRegexListener) || !is_array($this->pageAnswerRegexListener[$actionIdRegex])) { // Init regex listeners array $this->pageAnswerRegexListener[$actionIdRegex] = array(); } - + // Register page answer reg exlistener array_push($this->pageAnswerRegexListener[$actionIdRegex], array($listener, $method)); - + return true; } /** * Remove a Manialink Page Answer Listener - * + * * @param ManialinkPageAnswerListener $listener * @return bool */ public function unregisterManialinkPageAnswerListener(ManialinkPageAnswerListener $listener) { - $removed = false; + $removed = false; $allListeners = array_merge($this->pageAnswerListeners, $this->pageAnswerRegexListener); foreach ($allListeners as &$listeners) { foreach ($listeners as $key => &$listenerCallback) { @@ -132,21 +132,21 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener /** * Handle ManialinkPageAnswer callback - * + * * @param array $callback */ public function handleManialinkPageAnswer(array $callback) { $actionId = $callback[1][2]; - $login = $callback[1][1]; - $player = $this->maniaControl->playerManager->getPlayer($login); - + $login = $callback[1][1]; + $player = $this->maniaControl->playerManager->getPlayer($login); + if (array_key_exists($actionId, $this->pageAnswerListeners) && is_array($this->pageAnswerListeners[$actionId])) { // Inform page answer listeners foreach ($this->pageAnswerListeners[$actionId] as $listener) { call_user_func($listener, $callback, $player); } } - + // Check regex listeners foreach ($this->pageAnswerRegexListener as $actionIdRegex => $pageAnswerRegexListeners) { if (preg_match($actionIdRegex, $actionId)) { @@ -160,7 +160,7 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener /** * Hide the Manialink with the given Id - * + * * @param mixed $manialinkId * @param mixed $logins */ @@ -174,23 +174,23 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener $this->sendManialink($emptyManialink, $logins); } } - + /** * Send the given manialink to players - * + * * @param string $manialinkText - * @param mixed $logins - * @param int $timeout - * @param bool $hideOnClick + * @param mixed $logins + * @param int $timeout + * @param bool $hideOnClick * @return bool */ public function sendManialink($manialinkText, $logins = null, $timeout = 0, $hideOnClick = false) { - $manialinkText = (string) $manialinkText; - + $manialinkText = (string)$manialinkText; + if (!$manialinkText) { return true; } - + try { if (!$logins) { return $this->maniaControl->client->sendDisplayManialinkPage(null, $manialinkText, $timeout, $hideOnClick); @@ -211,60 +211,27 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener $success = false; } } - + return $success; } - } - catch (LoginUnknownException $e) { + } catch (LoginUnknownException $e) { return false; } - + return true; } - /** - * Enable the alt menu for the player - * - * @param Player $player - * @return bool - */ - public function enableAltMenu(Player $player) { - try { - $success = $this->maniaControl->client->triggerModeScriptEvent('LibXmlRpc_EnableAltMenu', $player->login); - } - catch (NotInScriptModeException $e) { - return false; - } - return $success; - } - - /** - * Disable the alt menu for the player - * - * @param Player $player - * @return bool - */ - public function disableAltMenu(Player $player) { - try { - $success = $this->maniaControl->client->triggerModeScriptEvent('LibXmlRpc_DisableAltMenu', $player->login); - } - catch (NotInScriptModeException $e) { - return false; - } - return $success; - } - /** * Displays a ManiaLink Widget to a certain Player (Should only be used on Main Widgets) - * - * @param mixed $maniaLink + * + * @param mixed $maniaLink * @param Player $player * @param string $widgetName */ public function displayWidget($maniaLink, Player $player, $widgetName = '') { // render and display xml $this->sendManialink($maniaLink, $player->login); - + if ($widgetName != '') { // TODO make check by manialinkId, getter is needed to avoid uses on non main widgets $this->disableAltMenu($player); @@ -273,10 +240,25 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener } } + /** + * Disable the alt menu for the player + * + * @param Player $player + * @return bool + */ + public function disableAltMenu(Player $player) { + try { + $success = $this->maniaControl->client->triggerModeScriptEvent('LibXmlRpc_DisableAltMenu', $player->login); + } catch (NotInScriptModeException $e) { + return false; + } + return $success; + } + /** * Closes a widget via the callback - * - * @param array $callback + * + * @param array $callback * @param Player $player */ public function closeWidgetCallback(array $callback, Player $player) { @@ -285,28 +267,42 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener /** * Closes a Manialink Widget - * + * * @param Player $player - * @param bool $widgetId + * @param bool $widgetId */ public function closeWidget(Player $player, $widgetId = false) { if (!$widgetId) { $emptyManialink = new ManiaLink(self::MAIN_MLID); $this->sendManialink($emptyManialink, $player->login); $this->enableAltMenu($player); - + // Trigger callback $this->maniaControl->callbackManager->triggerCallback(self::CB_MAIN_WINDOW_CLOSED, $player); - } - else { + } else { $emptyManialink = new ManiaLink($widgetId); $this->sendManialink($emptyManialink, $player->login); } } + /** + * Enable the alt menu for the player + * + * @param Player $player + * @return bool + */ + public function enableAltMenu(Player $player) { + try { + $success = $this->maniaControl->client->triggerModeScriptEvent('LibXmlRpc_EnableAltMenu', $player->login); + } catch (NotInScriptModeException $e) { + return false; + } + return $success; + } + /** * Adds a line of labels - * + * * @param Frame $frame * @param array $labelStrings * @param array $properties @@ -314,12 +310,12 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener */ public function labelLine(Frame $frame, array $labelStrings, array $properties = array()) { // define standard properties - $hAlign = (isset($properties['hAlign']) ? $properties['hAlign'] : Control::LEFT); - $style = (isset($properties['style']) ? $properties['style'] : Label_Text::STYLE_TextCardSmall); - $textSize = (isset($properties['textSize']) ? $properties['textSize'] : 1.5); + $hAlign = (isset($properties['hAlign']) ? $properties['hAlign'] : Control::LEFT); + $style = (isset($properties['style']) ? $properties['style'] : Label_Text::STYLE_TextCardSmall); + $textSize = (isset($properties['textSize']) ? $properties['textSize'] : 1.5); $textColor = (isset($properties['textColor']) ? $properties['textColor'] : 'FFF'); - $profile = (isset($properties['profile']) ? $properties['profile'] : false); - + $profile = (isset($properties['profile']) ? $properties['profile'] : false); + $labels = array(); foreach ($labelStrings as $text => $x) { $label = new Label_Text(); @@ -330,14 +326,14 @@ class ManialinkManager implements ManialinkPageAnswerListener, CallbackListener $label->setTextSize($textSize); $label->setText($text); $label->setTextColor($textColor); - + if ($profile) { $label->addPlayerProfileFeature($profile); } - + $labels[] = $label; // add Label to the labels array } - + return $labels; } } diff --git a/application/core/Manialinks/ManialinkPageAnswerListener.php b/application/core/Manialinks/ManialinkPageAnswerListener.php index 49033942..9a0b9f83 100644 --- a/application/core/Manialinks/ManialinkPageAnswerListener.php +++ b/application/core/Manialinks/ManialinkPageAnswerListener.php @@ -5,9 +5,9 @@ namespace ManiaControl\Manialinks; /** * Interface for Manialink Page Answer Listeners * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ interface ManialinkPageAnswerListener { } diff --git a/application/core/Manialinks/StyleManager.php b/application/core/Manialinks/StyleManager.php index bfcf69b0..6b5bb21e 100644 --- a/application/core/Manialinks/StyleManager.php +++ b/application/core/Manialinks/StyleManager.php @@ -16,9 +16,9 @@ use ManiaControl\ManiaControl; /** * Class managing default Control Styles * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class StyleManager { /* @@ -97,43 +97,6 @@ class StyleManager { return $this->maniaControl->settingManager->getSetting($this, self::SETTING_QUAD_DEFAULT_SUBSTYLE); } - /** - * Get the default main window style - * - * @return string - */ - public function getDefaultMainWindowStyle() { - return $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAIN_WIDGET_DEFAULT_STYLE); - } - - /** - * Get the default main window substyle - * - * @return string - */ - public function getDefaultMainWindowSubStyle() { - return $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAIN_WIDGET_DEFAULT_SUBSTYLE); - } - - /** - * Get the default list widget width - * - * @return string - */ - public function getListWidgetsWidth() { - return $this->maniaControl->settingManager->getSetting($this, self::SETTING_LIST_WIDGETS_WIDTH); - } - - /** - * Get the default list widget height - * - * @return string - */ - public function getListWidgetsHeight() { - return $this->maniaControl->settingManager->getSetting($this, self::SETTING_LIST_WIDGETS_HEIGHT); - } - - /** * Gets the Default Description Label * @@ -154,13 +117,31 @@ class StyleManager { return $descriptionLabel; } + /** + * Get the default list widget width + * + * @return string + */ + public function getListWidgetsWidth() { + return $this->maniaControl->settingManager->getSetting($this, self::SETTING_LIST_WIDGETS_WIDTH); + } + + /** + * Get the default list widget height + * + * @return string + */ + public function getListWidgetsHeight() { + return $this->maniaControl->settingManager->getSetting($this, self::SETTING_LIST_WIDGETS_HEIGHT); + } + /** * Builds the Default List Frame * * @return Frame $frame */ public function getDefaultListFrame() { - $args = func_get_args(); + $args = func_get_args(); $script = null; $paging = null; foreach ($args as $arg) { @@ -171,7 +152,7 @@ class StyleManager { $paging = $arg; } } - + $width = $this->getListWidgetsWidth(); $height = $this->getListWidgetsHeight(); $quadStyle = $this->getDefaultMainWindowStyle(); @@ -210,10 +191,10 @@ class StyleManager { $pagerNext->setSize($pagerSize, $pagerSize); $pagerNext->setSubStyle(Quad_Icons64x64_1::SUBSTYLE_ArrowNext); - if ($paging) { - $paging->addButton($pagerNext); - $paging->addButton($pagerPrev); - } + if ($paging) { + $paging->addButton($pagerNext); + $paging->addButton($pagerPrev); + } $pageCountLabel = new Label_Text(); $frame->add($pageCountLabel); @@ -221,11 +202,29 @@ class StyleManager { $pageCountLabel->setPosition($width * 0.40, $height * -0.44, 1); $pageCountLabel->setStyle($pageCountLabel::STYLE_TextTitle1); $pageCountLabel->setTextSize(1.3); - if ($paging) { - $paging->setLabel($pageCountLabel); - } + if ($paging) { + $paging->setLabel($pageCountLabel); + } } return $frame; } + + /** + * Get the default main window style + * + * @return string + */ + public function getDefaultMainWindowStyle() { + return $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAIN_WIDGET_DEFAULT_STYLE); + } + + /** + * Get the default main window substyle + * + * @return string + */ + public function getDefaultMainWindowSubStyle() { + return $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAIN_WIDGET_DEFAULT_SUBSTYLE); + } } diff --git a/application/core/Maps/Map.php b/application/core/Maps/Map.php index c9651f48..6a37873c 100644 --- a/application/core/Maps/Map.php +++ b/application/core/Maps/Map.php @@ -6,10 +6,10 @@ use ManiaControl\Formatter; use ManiaControl\ManiaExchange\MXMapInfo; /** - * Map Class + * Map Model Class * - * @author kremsy & steeffeen - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class Map { @@ -76,7 +76,7 @@ class Map { * @return string */ public function getGame() { - switch($this->environment) { + switch ($this->environment) { case 'Storm': return "sm"; case 'Canyon': diff --git a/application/core/Maps/MapCommands.php b/application/core/Maps/MapCommands.php index 7d5891b8..41bf4e37 100644 --- a/application/core/Maps/MapCommands.php +++ b/application/core/Maps/MapCommands.php @@ -5,8 +5,8 @@ namespace ManiaControl\Maps; use FML\Controls\Quad; use FML\Controls\Quads\Quad_Icons64x64_1; use FML\Controls\Quads\Quad_UIConstruction_Buttons; -use ManiaControl\Callbacks\CallbackManager; use ManiaControl\Callbacks\CallbackListener; +use ManiaControl\Callbacks\CallbackManager; use ManiaControl\Commands\CommandListener; use ManiaControl\ManiaControl; use ManiaControl\Manialinks\IconManager; @@ -18,8 +18,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\FaultException; /** * Class offering Commands to manage Maps * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class MapCommands implements CommandListener, ManialinkPageAnswerListener, CallbackListener { @@ -194,7 +194,7 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb } try { $this->maniaControl->client->nextMap(); - } catch(ChangeInProgressException $e) { + } catch (ChangeInProgressException $e) { } $message = '$<' . $player->nickname . '$> skipped the current Map!'; $this->maniaControl->chat->sendSuccess($message); @@ -218,7 +218,7 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb try { $this->maniaControl->client->restartMap(); - } catch(ChangeInProgressException $e) { + } catch (ChangeInProgressException $e) { } } @@ -254,25 +254,25 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb } $chatCommand = explode(' ', $chat[1][2]); - if(isset($chatCommand[1])) { - if(strstr($chatCommand[1], '.txt')) { + if (isset($chatCommand[1])) { + if (strstr($chatCommand[1], '.txt')) { $maplist = $chatCommand[1]; } else { - $maplist = $chatCommand.'.txt'; + $maplist = $chatCommand . '.txt'; } } else { $maplist = 'maplist.txt'; } - $maplist = 'MatchSettings/'.$maplist; + $maplist = 'MatchSettings/' . $maplist; try { $this->maniaControl->client->saveMatchSettings($maplist); - $message = 'Maplist $<$fff'.$maplist.'$> written.'; + $message = 'Maplist $<$fff' . $maplist . '$> written.'; $this->maniaControl->chat->sendSuccess($message, $player); $this->maniaControl->log($message, true); - } catch(FaultException $e) { - $this->maniaControl->chat->sendError('Cannot write maplist $<$fff'.$maplist.'$>!', $player); + } catch (FaultException $e) { + $this->maniaControl->chat->sendError('Cannot write maplist $<$fff' . $maplist . '$>!', $player); } } @@ -289,26 +289,26 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb } $chatCommand = explode(' ', $chat[1][2]); - if(isset($chatCommand[1])) { - if(strstr($chatCommand[1], '.txt')) { + if (isset($chatCommand[1])) { + if (strstr($chatCommand[1], '.txt')) { $maplist = $chatCommand[1]; } else { - $maplist = $chatCommand[1].'.txt'; + $maplist = $chatCommand[1] . '.txt'; } } else { $maplist = 'maplist.txt'; } - $maplist = 'MatchSettings/'.$maplist; + $maplist = 'MatchSettings/' . $maplist; try { $this->maniaControl->client->loadMatchSettings($maplist); - $message = 'Maplist $<$fff'.$maplist.'$> loaded.'; + $message = 'Maplist $<$fff' . $maplist . '$> loaded.'; $this->maniaControl->mapManager->restructureMapList(); $this->maniaControl->chat->sendSuccess($message, $player); $this->maniaControl->log($message, true); - } catch(FaultException $e) { - $this->maniaControl->chat->sendError('Cannot load maplist $<$fff'.$maplist.'$>!', $player); + } catch (FaultException $e) { + $this->maniaControl->chat->sendError('Cannot load maplist $<$fff' . $maplist . '$>!', $player); } } @@ -320,7 +320,7 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb public function handleManialinkPageAnswer(array $callback) { $actionId = $callback[1][2]; - $login = $callback[1][1]; + $login = $callback[1][1]; $player = $this->maniaControl->playerManager->getPlayer($login); if (strstr($actionId, self::ACTION_SHOW_AUTHOR)) { @@ -330,6 +330,30 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb } } + /** + * Show the Player a List of Maps from the given Author + * + * @param string $author + * @param Player $player + */ + private function showMapListAuthor($author, Player $player) { + $maps = $this->maniaControl->mapManager->getMaps(); + $mapList = array(); + /** @var Map $map */ + foreach ($maps as $map) { + if ($map->authorLogin == $author) { + $mapList[] = $map; + } + } + + if (count($mapList) == 0) { + $this->maniaControl->chat->sendError('There are no maps to show!', $player->login); + return; + } + + $this->maniaControl->mapManager->mapList->showMapList($player, $mapList); + } + /** * Handle /maps command * @@ -339,19 +363,19 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb public function command_List(array $chatCallback, Player $player) { $chatCommands = explode(' ', $chatCallback[1][2]); $this->maniaControl->mapManager->mapList->playerCloseWidget($player); - if(isset($chatCommands[1])) { - if($chatCommands[1] == ' ' || $chatCommands[1] == 'all') { + if (isset($chatCommands[1])) { + if ($chatCommands[1] == ' ' || $chatCommands[1] == 'all') { $this->maniaControl->mapManager->mapList->showMapList($player); - } elseif($chatCommands[1] == 'best') { + } elseif ($chatCommands[1] == 'best') { $this->showMapListKarma(true, $player); - } elseif($chatCommands[1] == 'worst') { + } elseif ($chatCommands[1] == 'worst') { $this->showMapListKarma(false, $player); - } elseif($chatCommands[1] == 'newest') { + } elseif ($chatCommands[1] == 'newest') { $this->showMapListDate(true, $player); - } elseif($chatCommands[1] == 'oldest') { + } elseif ($chatCommands[1] == 'oldest') { $this->showMapListDate(false, $player); - } elseif($chatCommands[1] == 'author') { - if(isset($chatCommands[2])) { + } elseif ($chatCommands[1] == 'author') { + if (isset($chatCommands[2])) { $this->showMaplistAuthor($chatCommands[2], $player); } else { $this->maniaControl->chat->sendError('There are no maps to show!', $player->login); @@ -362,69 +386,46 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb } } - /** - * Show the Player a List of Maps from the given Author - * @param string $author - * @param Player $player - */ - private function showMapListAuthor($author, Player $player) { - $maps = $this->maniaControl->mapManager->getMaps(); - $mapList = array(); - /** @var Map $map */ - foreach($maps as $map) { - if($map->authorLogin == $author) { - $mapList[] = $map; - } - } - - if(count($mapList) == 0) { - $this->maniaControl->chat->sendError('There are no maps to show!', $player->login); - return; - } - - $this->maniaControl->mapManager->mapList->showMapList($player, $mapList); - } - /** * Show a Karma based MapList * - * @param bool $best + * @param bool $best * @param Player $player */ private function showMapListKarma($best, Player $player) { /** @var \MCTeam\KarmaPlugin $karmaPlugin */ $karmaPlugin = $this->maniaControl->pluginManager->getPlugin(MapList::DEFAULT_KARMA_PLUGIN); - if($karmaPlugin) { - $maps = $this->maniaControl->mapManager->getMaps(); + if ($karmaPlugin) { + $maps = $this->maniaControl->mapManager->getMaps(); $mapList = array(); - foreach($maps as $map) { - if($map instanceof Map) { - if($this->maniaControl->settingManager->getSetting($karmaPlugin, $karmaPlugin::SETTING_NEWKARMA) === true) { - $karma = $karmaPlugin->getMapKarma($map); + foreach ($maps as $map) { + if ($map instanceof Map) { + if ($this->maniaControl->settingManager->getSetting($karmaPlugin, $karmaPlugin::SETTING_NEWKARMA) === true) { + $karma = $karmaPlugin->getMapKarma($map); $map->karma = round($karma * 100.); } else { $votes = $karmaPlugin->getMapVotes($map); - $min = 0; - $plus = 0; - foreach($votes as $vote) { - if(isset($vote->vote)) { - if($vote->vote != 0.5) { - if($vote->vote < 0.5) { - $min = $min+$vote->count; + $min = 0; + $plus = 0; + foreach ($votes as $vote) { + if (isset($vote->vote)) { + if ($vote->vote != 0.5) { + if ($vote->vote < 0.5) { + $min = $min + $vote->count; } else { - $plus = $plus+$vote->count; + $plus = $plus + $vote->count; } } } } - $map->karma = $plus-$min; + $map->karma = $plus - $min; } $mapList[] = $map; } } usort($mapList, array($this, 'sortByKarma')); - if($best) { + if ($best) { $mapList = array_reverse($mapList); } @@ -434,31 +435,20 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb } } - /** - * Helper Function to sort Maps by Karma - * - * @param Map $a - * @param Map $b - * @return mixed - */ - private function sortByKarma($a, $b) { - return ($a->karma - $b->karma); - } - /** * Show a Date based MapList * - * @param bool $newest + * @param bool $newest * @param Player $player */ private function showMapListDate($newest, Player $player) { $maps = $this->maniaControl->mapManager->getMaps(); - usort($maps, function($a, $b) { + usort($maps, function ($a, $b) { return ($a->index - $b->index); }); - if($newest) { + if ($newest) { $maps = array_reverse($maps); } @@ -474,4 +464,15 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb public function command_xList(array $chatCallback, Player $player) { $this->maniaControl->mapManager->mxList->showList($chatCallback, $player); } + + /** + * Helper Function to sort Maps by Karma + * + * @param Map $a + * @param Map $b + * @return mixed + */ + private function sortByKarma($a, $b) { + return ($a->karma - $b->karma); + } } diff --git a/application/core/Maps/MapList.php b/application/core/Maps/MapList.php index c364691b..dddb9c2a 100644 --- a/application/core/Maps/MapList.php +++ b/application/core/Maps/MapList.php @@ -2,7 +2,6 @@ namespace ManiaControl\Maps; -use MCTeam\CustomVotesPlugin; use FML\Controls\Control; use FML\Controls\Frame; use FML\Controls\Gauge; @@ -25,33 +24,34 @@ use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\Manialinks\ManialinkPageAnswerListener; use ManiaControl\Players\Player; use Maniaplanet\DedicatedServer\Xmlrpc\Exception; +use MCTeam\CustomVotesPlugin; use MCTeam\KarmaPlugin; /** * MapList Widget Class - * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class MapList implements ManialinkPageAnswerListener, CallbackListener { /* * Constants */ - const ACTION_UPDATE_MAP = 'MapList.UpdateMap'; - const ACTION_ERASE_MAP = 'MapList.EraseMap'; - const ACTION_SWITCH_MAP = 'MapList.SwitchMap'; - const ACTION_START_SWITCH_VOTE = 'MapList.StartMapSwitchVote'; - const ACTION_QUEUED_MAP = 'MapList.QueueMap'; - const ACTION_UNQUEUE_MAP = 'MapList.UnQueueMap'; - const ACTION_CHECK_UPDATE = 'MapList.CheckUpdate'; - const ACTION_CLEAR_MAPQUEUE = 'MapList.ClearMapQueue'; - const ACTION_PAGING_CHUNKS = 'MapList.PagingChunk.'; - const MAX_MAPS_PER_PAGE = 15; - const MAX_PAGES_PER_CHUNK = 2; - const DEFAULT_KARMA_PLUGIN = 'MCTeam\KarmaPlugin'; + const ACTION_UPDATE_MAP = 'MapList.UpdateMap'; + const ACTION_ERASE_MAP = 'MapList.EraseMap'; + const ACTION_SWITCH_MAP = 'MapList.SwitchMap'; + const ACTION_START_SWITCH_VOTE = 'MapList.StartMapSwitchVote'; + const ACTION_QUEUED_MAP = 'MapList.QueueMap'; + const ACTION_UNQUEUE_MAP = 'MapList.UnQueueMap'; + const ACTION_CHECK_UPDATE = 'MapList.CheckUpdate'; + const ACTION_CLEAR_MAPQUEUE = 'MapList.ClearMapQueue'; + const ACTION_PAGING_CHUNKS = 'MapList.PagingChunk.'; + const MAX_MAPS_PER_PAGE = 15; + const MAX_PAGES_PER_CHUNK = 2; + const DEFAULT_KARMA_PLUGIN = 'MCTeam\KarmaPlugin'; const DEFAULT_CUSTOM_VOTE_PLUGIN = 'MCTeam\CustomVotesPlugin'; - + /* * Private Properties */ @@ -61,12 +61,12 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Create a new MapList Instance - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - + // Register for Callbacks $this->maniaControl->callbackManager->registerCallbackListener(ManialinkManager::CB_MAIN_WINDOW_CLOSED, $this, 'closeWidget'); $this->maniaControl->callbackManager->registerCallbackListener(ManialinkManager::CB_MAIN_WINDOW_OPENED, $this, 'handleWidgetOpened'); @@ -75,15 +75,15 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $this->maniaControl->callbackManager->registerCallbackListener(MapManager::CB_MAPS_UPDATED, $this, 'updateWidget'); $this->maniaControl->callbackManager->registerCallbackListener(MapManager::CB_KARMA_UPDATED, $this, 'updateWidget'); $this->maniaControl->callbackManager->registerCallbackListener(Callbacks::BEGINMAP, $this, 'updateWidget'); - + $this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_CHECK_UPDATE, $this, 'checkUpdates'); $this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_CLEAR_MAPQUEUE, $this, 'clearMapQueue'); } /** * Clears the Map Queue - * - * @param array $chatCallback + * + * @param array $chatCallback * @param Player $player */ public function clearMapQueue(array $chatCallback, Player $player) { @@ -93,66 +93,66 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Check for Map Updates - * - * @param array $chatCallback + * + * @param array $chatCallback * @param Player $player */ public function checkUpdates(array $chatCallback, Player $player) { // Update Mx Infos $this->maniaControl->mapManager->mxManager->fetchManiaExchangeMapInformations(); - + // Reshow the Maplist $this->showMapList($player); } /** * Display a MapList on the Screen - * + * * @param Player $player - * @param array $maps - * @param int $chunk - * @param int $startPage + * @param array $maps + * @param int $chunk + * @param int $startPage */ public function showMapList(Player $player, $maps = null, $chunk = 0, $startPage = null) { - $width = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); + $width = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); $height = $this->maniaControl->manialinkManager->styleManager->getListWidgetsHeight(); - + $this->mapListShown[$player->login] = true; - $queueBuffer = $this->maniaControl->mapManager->mapQueue->getQueueBuffer(); - + $queueBuffer = $this->maniaControl->mapManager->mapQueue->getQueueBuffer(); + // Get Maps - $mapList = null; + $mapList = null; $pageCount = null; if (is_array($maps)) { - $mapList = array_slice($maps, $chunk, self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE); + $mapList = array_slice($maps, $chunk, self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE); $this->mapsInListShown[$player->login] = $maps; - $pageCount = ceil(count($maps) / self::MAX_MAPS_PER_PAGE); - } - else if (array_key_exists($player->login, $this->mapsInListShown)) { - $completeList = $this->mapsInListShown[$player->login]; + $pageCount = ceil(count($maps) / self::MAX_MAPS_PER_PAGE); + } else if (array_key_exists($player->login, $this->mapsInListShown)) { + $completeList = $this->mapsInListShown[$player->login]; $this->mapsInListShown[$player->login] = $completeList; - $mapList = array_slice($completeList, $chunk * self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE, self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE); - $pageCount = ceil(count($completeList) / self::MAX_MAPS_PER_PAGE); - } - else { - $mapList = $this->maniaControl->mapManager->getMaps($chunk * self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE, self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE); - $pageCount = ceil($this->maniaControl->mapManager->getMapsCount() / self::MAX_MAPS_PER_PAGE); + $mapList = array_slice($completeList, $chunk * self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE, self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE); + $pageCount = ceil(count($completeList) / self::MAX_MAPS_PER_PAGE); + } else { + $mapList = $this->maniaControl->mapManager->getMaps($chunk * self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE, self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE); + $pageCount = ceil($this->maniaControl->mapManager->getMapsCount() / self::MAX_MAPS_PER_PAGE); $this->mapsInListShown[$player->login] = $this->maniaControl->mapManager->getMaps(); } - + // Create ManiaLink $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); - $script = $maniaLink->getScript(); - $paging = new Paging(); + $script = $maniaLink->getScript(); + $paging = new Paging(); $script->addFeature($paging); - if (!is_null($pageCount)) $paging->setCustomMaxPageNumber($pageCount); + if (!is_null($pageCount)) { + $paging->setCustomMaxPageNumber($pageCount); + } $paging->setChunkActionAppendsPageNumber(true); $paging->setChunkActions(self::ACTION_PAGING_CHUNKS); - + // Main frame $frame = $this->maniaControl->manialinkManager->styleManager->getDefaultListFrame($script, $paging); $maniaLink->add($frame); - + // Admin Buttons if ($this->maniaControl->authenticationManager->checkPermission($player, MapQueue::SETTING_PERMISSION_CLEAR_MAPQUEUE)) { // Clear Map-Queue @@ -162,7 +162,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $label->setTextSize(1); $label->setPosition($width / 2 - 8, -$height / 2 + 9); $label->setHAlign(Control::RIGHT); - + $quad = new Quad_BgsPlayerCard(); $frame->add($quad); $quad->setPosition($width / 2 - 5, -$height / 2 + 9, 0.01); @@ -171,7 +171,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $quad->setSize(29, 4); $quad->setAction(self::ACTION_CLEAR_MAPQUEUE); } - + if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_CHECK_UPDATE)) { // Check Update $label = new Label_Button(); @@ -180,7 +180,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $label->setTextSize(1); $label->setPosition($width / 2 - 41, -$height / 2 + 9, 0.01); $label->setHAlign(Control::RIGHT); - + $quad = new Quad_BgsPlayerCard(); $frame->add($quad); $quad->setPosition($width / 2 - 37, -$height / 2 + 9, 0.01); @@ -188,7 +188,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $quad->setHAlign(Control::RIGHT); $quad->setSize(35, 4); $quad->setAction(self::ACTION_CHECK_UPDATE); - + $mxQuad = new Quad(); $frame->add($mxQuad); $mxQuad->setSize(3, 3); @@ -198,44 +198,41 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $mxQuad->setZ(0.01); $mxQuad->setAction(self::ACTION_CHECK_UPDATE); } - + // Headline $headFrame = new Frame(); $frame->add($headFrame); $headFrame->setY($height / 2 - 5); - $x = -$width / 2; - $array = array('Id' => $x + 5, 'Mx Id' => $x + 10, 'Map Name' => $x + 20, 'Author' => $x + 68, 'Karma' => $x + 115, - 'Actions' => $width / 2 - 15); + $x = -$width / 2; + $array = array('Id' => $x + 5, 'Mx Id' => $x + 10, 'Map Name' => $x + 20, 'Author' => $x + 68, 'Karma' => $x + 115, 'Actions' => $width / 2 - 15); $this->maniaControl->manialinkManager->labelLine($headFrame, $array); - + // Predefine description Label $descriptionLabel = $this->maniaControl->manialinkManager->styleManager->getDefaultDescriptionLabel(); $frame->add($descriptionLabel); - + $queuedMaps = $this->maniaControl->mapManager->mapQueue->getQueuedMapsRanking(); /** - * * @var KarmaPlugin $karmaPlugin */ $karmaPlugin = $this->maniaControl->pluginManager->getPlugin(self::DEFAULT_KARMA_PLUGIN); - $pageNumber = 1 + $chunk * self::MAX_PAGES_PER_CHUNK; + $pageNumber = 1 + $chunk * self::MAX_PAGES_PER_CHUNK; $startPageNumber = (is_int($startPage) ? $startPage : $pageNumber); $paging->setStartPageNumber($startPageNumber); - - $id = 1 + $chunk * self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE; - $y = $height / 2 - 10; + + $id = 1 + $chunk * self::MAX_PAGES_PER_CHUNK * self::MAX_MAPS_PER_PAGE; + $y = $height / 2 - 10; $pageFrames = array(); /** - * * @var Map $map */ - $currentMap = $this->maniaControl->mapManager->getCurrentMap(); - $mxIcon = $this->maniaControl->manialinkManager->iconManager->getIcon(IconManager::MX_ICON); - $mxIconHover = $this->maniaControl->manialinkManager->iconManager->getIcon(IconManager::MX_ICON_MOVER); - $mxIconGreen = $this->maniaControl->manialinkManager->iconManager->getIcon(IconManager::MX_ICON_GREEN); + $currentMap = $this->maniaControl->mapManager->getCurrentMap(); + $mxIcon = $this->maniaControl->manialinkManager->iconManager->getIcon(IconManager::MX_ICON); + $mxIconHover = $this->maniaControl->manialinkManager->iconManager->getIcon(IconManager::MX_ICON_MOVER); + $mxIconGreen = $this->maniaControl->manialinkManager->iconManager->getIcon(IconManager::MX_ICON_GREEN); $mxIconGreenHover = $this->maniaControl->manialinkManager->iconManager->getIcon(IconManager::MX_ICON_GREEN_MOVER); - + foreach ($mapList as $map) { if (!isset($pageFrame)) { $pageFrame = new Frame(); @@ -245,17 +242,17 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { } array_push($pageFrames, $pageFrame); $y = $height / 2 - 10; - + $paging->addPage($pageFrame, $pageNumber); $pageNumber++; } - + // Map Frame $mapFrame = new Frame(); $pageFrame->add($mapFrame); $mapFrame->setZ(0.1); $mapFrame->setY($y); - + if ($id % 2 != 0) { $lineQuad = new Quad_BgsPlayerCard(); $mapFrame->add($lineQuad); @@ -263,7 +260,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $lineQuad->setSubStyle($lineQuad::SUBSTYLE_BgPlayerCardBig); $lineQuad->setZ(0.001); } - + if ($currentMap === $map) { $currentQuad = new Quad_Icons64x64_1(); $mapFrame->add($currentQuad); @@ -272,11 +269,11 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $currentQuad->setSize(4, 4); $currentQuad->setSubStyle($currentQuad::SUBSTYLE_ArrowBlue); } - + $mxId = '-'; if (isset($map->mx->id)) { $mxId = $map->mx->id; - + $mxQuad = new Quad(); $mapFrame->add($mxQuad); $mxQuad->setSize(3, 3); @@ -287,7 +284,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $mxQuad->setZ(0.01); $description = 'View $<' . $map->name . '$> on Mania-Exchange'; $mxQuad->addTooltipLabelFeature($descriptionLabel, $description); - + if ($map->updateAvailable()) { $mxQuad = new Quad(); $mapFrame->add($mxQuad); @@ -299,30 +296,29 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $mxQuad->setZ(0.01); $description = 'Update for $<' . $map->name . '$> available on Mania-Exchange!'; $mxQuad->addTooltipLabelFeature($descriptionLabel, $description); - + // Update Button if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_ADD_MAP)) { $mxQuad->setAction(self::ACTION_UPDATE_MAP . '.' . $map->uid); } } } - + // Display Maps - $array = array($id => $x + 5, $mxId => $x + 10, Formatter::stripDirtyCodes($map->name) => $x + 20, $map->authorNick => $x + 68); + $array = array($id => $x + 5, $mxId => $x + 10, Formatter::stripDirtyCodes($map->name) => $x + 20, $map->authorNick => $x + 68); $labels = $this->maniaControl->manialinkManager->labelLine($mapFrame, $array); if (isset($labels[3])) { /** - * * @var Label $label */ - $label = $labels[3]; + $label = $labels[3]; $description = 'Click to checkout all maps by $<' . $map->authorLogin . '$>!'; $label->setAction(MapCommands::ACTION_SHOW_AUTHOR . $map->authorLogin); $label->addTooltipLabelFeature($descriptionLabel, $description); } - + // TODO action detailed map info including mx info - + // Map-Queue-Map-Label if (isset($queuedMaps[$map->uid])) { $label = new Label_Text(); @@ -333,20 +329,18 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $label->setTextSize(1.5); $label->setText($queuedMaps[$map->uid]); $label->setTextColor('fff'); - + // Checks if the Player who openend the Widget has queued the map $queuer = $this->maniaControl->mapManager->mapQueue->getQueuer($map->uid); if ($queuer->login == $player->login) { $description = 'Remove $<' . $map->name . '$> from the Map Queue'; $label->addTooltipLabelFeature($descriptionLabel, $description); $label->setAction(self::ACTION_UNQUEUE_MAP . '.' . $map->uid); - } - else { + } else { $description = '$<' . $map->name . '$> is on Map-Queue Position: ' . $queuedMaps[$map->uid]; $label->addTooltipLabelFeature($descriptionLabel, $description); } - } - else { + } else { // Map-Queue-Map-Button $queueLabel = new Label_Button(); $mapFrame->add($queueLabel); @@ -355,7 +349,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $queueLabel->setSize(3, 3); $queueLabel->setText('+'); - if(in_array($map->uid, $queueBuffer)) { + if (in_array($map->uid, $queueBuffer)) { if ($this->maniaControl->authenticationManager->checkPermission($player, MapQueue::SETTING_PERMISSION_CLEAR_MAPQUEUE)) { $queueLabel->setAction(self::ACTION_QUEUED_MAP . '.' . $map->uid); } @@ -369,7 +363,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $queueLabel->addTooltipLabelFeature($descriptionLabel, $description); } } - + if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_REMOVE_MAP)) { // erase map quad $eraseLabel = new Label_Button(); @@ -380,13 +374,13 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $eraseLabel->setTextSize(1); $eraseLabel->setText('x'); $eraseLabel->setTextColor('a00'); - + $confirmFrame = $this->buildConfirmFrame($maniaLink, $y, $id, $map->uid); $eraseLabel->addToggleFeature($confirmFrame); $description = 'Remove Map: $<' . $map->name . '$>'; $eraseLabel->addTooltipLabelFeature($descriptionLabel, $description); } - + if ($this->maniaControl->authenticationManager->checkPermission($player, MapManager::SETTING_PERMISSION_ADD_MAP)) { // Switch to map $switchLabel = new Label_Button(); @@ -397,14 +391,13 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $switchLabel->setTextSize(2); $switchLabel->setText('»'); $switchLabel->setTextColor('0f0'); - + $confirmFrame = $this->buildConfirmFrame($maniaLink, $y, $id); $switchLabel->addToggleFeature($confirmFrame); - + $description = 'Switch Directly to Map: $<' . $map->name . '$>'; $switchLabel->addTooltipLabelFeature($descriptionLabel, $description); - } - else if ($this->maniaControl->pluginManager->isPluginActive(self::DEFAULT_CUSTOM_VOTE_PLUGIN)) { + } else if ($this->maniaControl->pluginManager->isPluginActive(self::DEFAULT_CUSTOM_VOTE_PLUGIN)) { // Switch Map Voting $switchLabel = new Label_Button(); $mapFrame->add($switchLabel); @@ -414,35 +407,35 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $switchLabel->setTextSize(2); $switchLabel->setText('»'); $switchLabel->setTextColor('0f0'); - + $switchLabel->setAction(self::ACTION_START_SWITCH_VOTE . '.' . ($id - 1)); - + $description = 'Start Map-Switch Vote: $<' . $map->name . '$>'; $switchLabel->addTooltipLabelFeature($descriptionLabel, $description); } - + // Display Karma bar if ($karmaPlugin) { $karma = $karmaPlugin->getMapKarma($map); $votes = $karmaPlugin->getMapVotes($map); if (is_numeric($karma)) { - if($this->maniaControl->settingManager->getSetting($karmaPlugin, $karmaPlugin::SETTING_NEWKARMA)) { + if ($this->maniaControl->settingManager->getSetting($karmaPlugin, $karmaPlugin::SETTING_NEWKARMA)) { $karmaText = ' ' . round($karma * 100.) . '% (' . $votes['count'] . ')'; } else { - $min = 0; + $min = 0; $plus = 0; - foreach($votes as $vote) { - if(isset($vote->vote)) { - if($vote->vote != 0.5) { - if($vote->vote < 0.5) { - $min = $min+$vote->count; + foreach ($votes as $vote) { + if (isset($vote->vote)) { + if ($vote->vote != 0.5) { + if ($vote->vote < 0.5) { + $min = $min + $vote->count; } else { - $plus = $plus+$vote->count; + $plus = $plus + $vote->count; } } } } - $endKarma = $plus-$min; + $endKarma = $plus - $min; $karmaText = ' ' . $endKarma . ' (' . $votes['count'] . 'x / ' . round($karma * 100.) . '%)'; } @@ -456,7 +449,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $karmaGauge->setRatio($karma + 0.15 - $karma * 0.15); $karmaColor = ColorUtil::floatToStatusColor($karma); $karmaGauge->setColor($karmaColor . '9'); - + $karmaLabel = new Label(); $mapFrame->add($karmaLabel); $karmaLabel->setZ(2); @@ -468,46 +461,46 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $karmaLabel->setText($karmaText); } } - + $y -= 4; if ($id % self::MAX_MAPS_PER_PAGE == 0) { unset($pageFrame); } $id++; } - + $this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, 'MapList'); } /** * Builds the confirmation frame - * + * * @param ManiaLink $maniaLink - * @param $y - * @param $id - * @param bool $mapUid + * @param $y + * @param $id + * @param bool $mapUid * @return Frame */ public function buildConfirmFrame(Manialink $maniaLink, $y, $id, $mapUid = false) { - $width = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); - $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultMainWindowStyle(); + $width = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); + $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultMainWindowStyle(); $quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultMainWindowSubStyle(); - + $confirmFrame = new Frame(); $maniaLink->add($confirmFrame); $confirmFrame->setPosition($width / 2 + 6, $y); $confirmFrame->setVisible(false); - + $quad = new Quad(); $confirmFrame->add($quad); $quad->setStyles($quadStyle, $quadSubstyle); $quad->setSize(12, 4); - + $quad = new Quad_BgsPlayerCard(); $confirmFrame->add($quad); $quad->setSubStyle($quad::SUBSTYLE_BgCardSystem); $quad->setSize(11, 3.5); - + $label = new Label_Button(); $confirmFrame->add($label); $label->setAlign(Control::CENTER, Control::CENTER); @@ -515,20 +508,19 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $label->setTextSize(1); $label->setScale(0.90); $label->setX(-1.3); - + $buttLabel = new Label_Button(); $confirmFrame->add($buttLabel); $buttLabel->setPosition(3.2, 0.4, 0.2); $buttLabel->setSize(3, 3); $buttLabel->setAlign(Control::CENTER, Control::CENTER); - + if (!$mapUid) { $quad->setAction(self::ACTION_SWITCH_MAP . '.' . ($id - 1)); $buttLabel->setText('»'); $buttLabel->setTextColor('0f0'); $buttLabel->setTextSize(2); - } - else { + } else { $buttLabel->setTextSize(1); $buttLabel->setText('x'); $buttLabel->setTextColor('a00'); @@ -539,9 +531,9 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Unset the player if he opened another Main Widget - * + * * @param Player $player - * @param $openedWidget + * @param $openedWidget */ public function handleWidgetOpened(Player $player, $openedWidget) { // unset when another main widget got opened @@ -552,7 +544,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { /** * Closes the widget - * + * * @param \ManiaControl\Players\Player $player */ public function closeWidget(Player $player) { @@ -560,35 +552,24 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { unset($this->mapsInListShown[$player->login]); } - /** - * Closes the widget - * - * @param Player $player - */ - public function playerCloseWidget(Player $player) { - unset($this->mapListShown[$player->login]); - unset($this->mapsInListShown[$player->login]); - $this->maniaControl->manialinkManager->closeWidget($player); - } - /** * Handle ManialinkPageAnswer Callback - * + * * @param array $callback */ public function handleManialinkPageAnswer(array $callback) { - $actionId = $callback[1][2]; + $actionId = $callback[1][2]; $actionArray = explode('.', $actionId); - + if (count($actionArray) <= 2) { return; } - + $action = $actionArray[0] . '.' . $actionArray[1]; - $login = $callback[1][1]; + $login = $callback[1][1]; $player = $this->maniaControl->playerManager->getPlayer($login); - $mapId = (int) $actionArray[2]; - + $mapId = (int)$actionArray[2]; + switch ($action) { case self::ACTION_UPDATE_MAP: $mapUid = $actionArray[2]; @@ -602,51 +583,47 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { case self::ACTION_SWITCH_MAP: try { $this->maniaControl->client->jumpToMapIndex($mapId); - } - catch (Exception $e) { + } catch (Exception $e) { // TODO: is it even possible that an exception other than connection errors will be thrown? - remove try-catch? $this->maniaControl->chat->sendError("Error while Jumping to Map Index"); break; } $mapList = $this->maniaControl->mapManager->getMaps(); - $map = $mapList[$mapId]; - + $map = $mapList[$mapId]; + $message = '$<' . $player->nickname . '$> skipped to Map $z$<' . $map->name . '$>!'; $this->maniaControl->chat->sendSuccess($message); $this->maniaControl->log($message, true); - + $this->playerCloseWidget($player); break; case self::ACTION_START_SWITCH_VOTE: /** - * * @var $votesPlugin CustomVotesPlugin */ $votesPlugin = $this->maniaControl->pluginManager->getPlugin(self::DEFAULT_CUSTOM_VOTE_PLUGIN); - $mapList = $this->maniaControl->mapManager->getMaps(); - $map = $mapList[$mapId]; - + $mapList = $this->maniaControl->mapManager->getMaps(); + $map = $mapList[$mapId]; + $message = '$<' . $player->nickname . '$>$s started a vote to switch to $<' . $map->name . '$>!'; - + /** - * * @var Map $map */ $votesPlugin->defineVote('switchmap', "Goto " . $map->name, true, $message); - + $self = $this; - $votesPlugin->startVote($player, 'switchmap', function ($result) use(&$self, &$votesPlugin, &$map) { + $votesPlugin->startVote($player, 'switchmap', function ($result) use (&$self, &$votesPlugin, &$map) { $self->maniaControl->chat->sendInformation('$sVote Successfully -> Map switched!'); $votesPlugin->undefineVote('switchmap'); - + try { $index = $self->maniaControl->mapManager->getMapIndex($map); $self->maniaControl->client->jumpToMapIndex($index); - } - catch (Exception $e) { + } catch (Exception $e) { // TODO temp added 19.04.2014 $self->maniaControl->errorHandler->triggerDebugNotice("Exception line 557 MapList.php" . $e->getMessage()); - + $self->maniaControl->chat->sendError("Error while Switching Map"); } }); @@ -662,14 +639,25 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { default: if (substr($actionId, 0, strlen(self::ACTION_PAGING_CHUNKS)) === self::ACTION_PAGING_CHUNKS) { // Paging chunks - $neededPage = (int) substr($actionId, strlen(self::ACTION_PAGING_CHUNKS)); - $chunk = (int) ($neededPage / self::MAX_PAGES_PER_CHUNK - 0.5); + $neededPage = (int)substr($actionId, strlen(self::ACTION_PAGING_CHUNKS)); + $chunk = (int)($neededPage / self::MAX_PAGES_PER_CHUNK - 0.5); $this->showMapList($player, null, $chunk, $neededPage); } break; } } + /** + * Closes the widget + * + * @param Player $player + */ + public function playerCloseWidget(Player $player) { + unset($this->mapListShown[$player->login]); + unset($this->mapsInListShown[$player->login]); + $this->maniaControl->manialinkManager->closeWidget($player); + } + /** * Reopen the widget on Map Begin, MapListChanged, etc. */ @@ -679,8 +667,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $player = $this->maniaControl->playerManager->getPlayer($login); if ($player) { $this->showMapList($player); - } - else { + } else { unset($this->mapListShown[$login]); } } @@ -696,8 +683,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $player = $this->maniaControl->playerManager->getPlayer($login); if ($player) { $this->showMapList($player); - } - else { + } else { unset($this->mapListShown[$login]); } } diff --git a/application/core/Maps/MapManager.php b/application/core/Maps/MapManager.php index 10330158..326ae9e9 100644 --- a/application/core/Maps/MapManager.php +++ b/application/core/Maps/MapManager.php @@ -22,8 +22,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\StartIndexOutOfBoundException; /** * Manager for Maps * - * @author kremsy & steeffeen - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class MapManager implements CallbackListener { @@ -129,44 +129,26 @@ class MapManager implements CallbackListener { } /** - * Save a Map in the Database + * Update a Map from Mania Exchange * - * @param \ManiaControl\Maps\Map $map - * @return bool + * @param Player $admin + * @param string $uid */ - private function saveMap(Map &$map) { - //TODO saveMaps for whole maplist at once (usage of prepared statements) - $mysqli = $this->maniaControl->database->mysqli; - $mapQuery = "INSERT INTO `" . self::TABLE_MAPS . "` ( - `uid`, - `name`, - `authorLogin`, - `fileName`, - `environment`, - `mapType` - ) VALUES ( - ?, ?, ?, ?, ?, ? - ) ON DUPLICATE KEY UPDATE - `index` = LAST_INSERT_ID(`index`), - `fileName` = VALUES(`fileName`), - `environment` = VALUES(`environment`), - `mapType` = VALUES(`mapType`);"; + public function updateMap(Player $admin, $uid) { + $this->updateMapTimestamp($uid); - $mapStatement = $mysqli->prepare($mapQuery); - if ($mysqli->error) { - trigger_error($mysqli->error); - return false; + if (!isset($uid) || !isset($this->maps[$uid])) { + trigger_error("Error while updating Map, unknown UID: " . $uid); + $this->maniaControl->chat->sendError("Error while updating Map.", $admin->login); + return; } - $mapStatement->bind_param('ssssss', $map->uid, $map->rawName, $map->authorLogin, $map->fileName, $map->environment, $map->mapType); - $mapStatement->execute(); - if ($mapStatement->error) { - trigger_error($mapStatement->error); - $mapStatement->close(); - return false; - } - $map->index = $mapStatement->insert_id; - $mapStatement->close(); - return true; + + /** @var Map $map */ + $map = $this->maps[$uid]; + + $mxId = $map->mx->id; + $this->removeMap($admin, $uid, true, false); + $this->addMapFromMx($mxId, $admin->login, true); } /** @@ -198,29 +180,6 @@ class MapManager implements CallbackListener { return true; } - /** - * Update a Map from Mania Exchange - * - * @param Player $admin - * @param string $uid - */ - public function updateMap(Player $admin, $uid) { - $this->updateMapTimestamp($uid); - - if (!isset($uid) || !isset($this->maps[$uid])) { - trigger_error("Error while updating Map, unknown UID: " . $uid); - $this->maniaControl->chat->sendError("Error while updating Map.", $admin->login); - return; - } - - /** @var Map $map */ - $map = $this->maps[$uid]; - - $mxId = $map->mx->id; - $this->removeMap($admin, $uid, true, false); - $this->addMapFromMx($mxId, $admin->login, true); - } - /** * Remove a Map * @@ -247,7 +206,7 @@ class MapManager implements CallbackListener { // Remove map try { $this->maniaControl->client->removeMap($map->fileName); - } catch(MapNotInCurrentSelectionException $e) { + } catch (MapNotInCurrentSelectionException $e) { } @@ -273,330 +232,6 @@ class MapManager implements CallbackListener { unset($this->maps[$uid]); } - /** - * Restructures the Maplist - */ - public function restructureMapList() { - $currentIndex = $this->getMapIndex($this->currentMap); - - // No RestructureNeeded - if ($currentIndex < Maplist::MAX_MAPS_PER_PAGE - 1) { - return true; - } - - $lowerMapArray = array(); - $higherMapArray = array(); - - $i = 0; - foreach($this->maps as $map) { - if ($i < $currentIndex) { - $lowerMapArray[] = $map->fileName; - } else { - $higherMapArray[] = $map->fileName; - } - $i++; - } - - $mapArray = array_merge($higherMapArray, $lowerMapArray); - array_shift($mapArray); - - try { - $this->maniaControl->client->chooseNextMapList($mapArray); - } catch(Exception $e) { - trigger_error("Error while restructuring the Maplist. " . $e->getMessage()); - return false; - } - return true; - } - - /** - * Shuffles the MapList - * - * @param Player $admin - * @return bool - */ - public function shuffleMapList($admin = null) { - $shuffledMaps = $this->maps; - shuffle($shuffledMaps); - - $mapArray = array(); - - foreach($shuffledMaps as $map) { - /** - * @var Map $map - */ - $mapArray[] = $map->fileName; - } - - try { - $this->maniaControl->client->chooseNextMapList($mapArray); - } catch(Exception $e) { - //TODO temp added 19.04.2014 - $this->maniaControl->errorHandler->triggerDebugNotice("Exception line 331 MapManager" . $e->getMessage()); - trigger_error("Couldn't shuffle mapList. " . $e->getMessage()); - return false; - } - - $this->fetchCurrentMap(); - - if ($admin) { - $message = '$<' . $admin->nickname . '$> shuffled the Maplist!'; - $this->maniaControl->chat->sendSuccess($message); - $this->maniaControl->log($message, true); - } - - // Restructure if needed - $this->restructureMapList(); - return true; - } - - /** - * Initializes a Map - * - * @param $rpcMap - * @return Map - */ - public function initializeMap($rpcMap) { - $map = new Map($rpcMap); - $this->saveMap($map); - - /*$mapsDirectory = $this->maniaControl->server->getMapsDirectory(); - if (is_readable($mapsDirectory . $map->fileName)) { - $mapFetcher = new \GBXChallMapFetcher(true); - $mapFetcher->processFile($mapsDirectory . $map->fileName); - $map->authorNick = FORMATTER::stripDirtyCodes($mapFetcher->authorNick); - $map->authorEInfo = $mapFetcher->authorEInfo; - $map->authorZone = $mapFetcher->authorZone; - $map->comment = $mapFetcher->comment; - }*/ - return $map; - } - - /** - * Updates the full Map list, needed on Init, addMap and on ShuffleMaps - */ - private function updateFullMapList() { - $tempList = array(); - - try { - $i = 0; - while(true) { - $maps = $this->maniaControl->client->getMapList(150, $i); - - foreach($maps as $rpcMap) { - if (array_key_exists($rpcMap->uId, $this->maps)) { - // Map already exists, only update index - $tempList[$rpcMap->uId] = $this->maps[$rpcMap->uId]; - } else { // Insert Map Object - $map = $this->initializeMap($rpcMap); - $tempList[$map->uid] = $map; - } - } - - $i += 150; - } - } catch(StartIndexOutOfBoundException $e) { - } - - // restore Sorted MapList - $this->maps = $tempList; - - // Trigger own callback - $this->maniaControl->callbackManager->triggerCallback(self::CB_MAPS_UPDATED); - - // Write MapList - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_AUTOSAVE_MAPLIST)) { - try { - $this->maniaControl->client->saveMatchSettings($this->maniaControl->settingManager->getSetting($this, self::SETTING_MAPLIST_FILE)); - } catch(CouldNotWritePlaylistFileException $e) { - $this->maniaControl->log("Unable to write the playlist file, please checkout your MX-Folders File permissions!"); - } - } - } - - /** - * Freshly fetch current Map - * - * @return Map - */ - private function fetchCurrentMap() { - $rpcMap = $this->maniaControl->client->getCurrentMapInfo(); - - if (array_key_exists($rpcMap->uId, $this->maps)) { - $this->currentMap = $this->maps[$rpcMap->uId]; - $this->currentMap->nbCheckpoints = $rpcMap->nbCheckpoints; - $this->currentMap->nbLaps = $rpcMap->nbLaps; - return $this->currentMap; - } - - $this->currentMap = $this->initializeMap($rpcMap); - $this->maps[$this->currentMap->uid] = $this->currentMap; - return $this->currentMap; - } - - /** - * Handle OnInit callback - */ - public function handleOnInit() { - $this->updateFullMapList(); - $this->fetchCurrentMap(); - - // Restructure Maplist - $this->restructureMapList(); - } - - /** - * Handle AfterInit callback - */ - public function handleAfterInit() { - // Fetch MX infos - $this->mxManager->fetchManiaExchangeMapInformations(); - } - - /** - * Get Current Map - * - * @return Map currentMap - */ - public function getCurrentMap() { - if (!$this->currentMap) { - return $this->fetchCurrentMap(); - } - return $this->currentMap; - } - - /** - * Returns map By UID - * - * @param $uid - * @return Map array - */ - public function getMapByUid($uid) { - if (!isset($this->maps[$uid])) { - return null; - } - return $this->maps[$uid]; - } - - /** - * Handle BeginMap callback - * - * @param array $callback - */ - public function handleBeginMap(array $callback) { - if ($this->mapBegan) { - return; - } - $this->mapBegan = true; - $this->mapEnded = false; - - if (!isset($callback[1][0]["UId"])) { - $this->currentMap = $this->fetchCurrentMap(); - } else if (array_key_exists($callback[1][0]["UId"], $this->maps)) { - // Map already exists, only update index - $this->currentMap = $this->maps[$callback[1][0]["UId"]]; - if (!$this->currentMap->nbCheckpoints || !$this->currentMap->nbLaps) { - $rpcMap = $this->maniaControl->client->getCurrentMapInfo(); - $this->currentMap->nbLaps = $rpcMap->nbLaps; - $this->currentMap->nbCheckpoints = $rpcMap->nbCheckpoints; - } - } - - // Restructure MapList if id is over 15 - $this->restructureMapList(); - - // Update the mx of the map (for update checks, etc.) - $this->mxManager->fetchManiaExchangeMapInformations($this->currentMap); - - // Trigger own BeginMap callback ( - //TODO remove deprecated callback later - $this->maniaControl->callbackManager->triggerCallback(self::CB_BEGINMAP, $this->currentMap); - $this->maniaControl->callbackManager->triggerCallback(Callbacks::BEGINMAP, $this->currentMap); - } - - /** - * Handle Script BeginMap callback - * - * @param int $mapNumber - */ - public function handleScriptBeginMap($mapNumber) { - $this->handleBeginMap(array()); - } - - /** - * Handle EndMap Callback - * - * @param array $callback - */ - public function handleEndMap(array $callback) { - if ($this->mapEnded) { - return; - } - $this->mapEnded = true; - $this->mapBegan = false; - - // Trigger own EndMap callback - $this->maniaControl->callbackManager->triggerCallback(self::CB_ENDMAP, $this->currentMap); - //TODO remove deprecated callback later - $this->maniaControl->callbackManager->triggerCallback(Callbacks::ENDMAP, $this->currentMap); - } - - /** - * Handle Script EndMap Callback - * - * @param int $mapNumber - */ - public function handleScriptEndMap($mapNumber) { - $this->handleEndMap(array()); - } - - /** - * Handle Maps Modified Callback - * - * @param array $callback - */ - public function mapsModified(array $callback) { - $this->updateFullMapList(); - } - - /** - * Get all Maps - * - * @param int $offset - * @param int $length - * @return array - */ - public function getMaps($offset = null, $length = null) { - if ($offset === null) { - return array_values($this->maps); - } - if ($length === null) { - return array_slice($this->maps, $offset); - } - return array_slice($this->maps, $offset, $length); - } - - /** - * Get the Number of Maps - * - * @return int - */ - public function getMapsCount() { - return count($this->maps); - } - - /** - * Returns the MapIndex of a given map - * - * @param Map $map - * @internal param $uid - * @return mixed - */ - public function getMapIndex(Map $map) { - $maps = $this->getMaps(); - return array_search($map, $maps); - } - /** * Adds a Map from Mania Exchange * @@ -672,7 +307,7 @@ class MapManager implements CallbackListener { // Write map via write file method try { $this->maniaControl->client->writeFileFromString($relativeMapFileName, $file); - } catch(InvalidArgumentException $e) { + } catch (InvalidArgumentException $e) { if ($e->getMessage() == 'data are too big') { $this->maniaControl->chat->sendError("Map is too big for a remote save.", $login); return; @@ -684,7 +319,7 @@ class MapManager implements CallbackListener { // Check for valid map try { $this->maniaControl->client->checkMapForCurrentServerParams($relativeMapFileName); - } catch(MapNotCompatibleOrCompleteException $e) { + } catch (MapNotCompatibleOrCompleteException $e) { trigger_error("Couldn't check if map is valid ('{$relativeMapFileName}'). " . $e->getMessage()); $this->maniaControl->chat->sendError('Wrong MapType or not validated!', $login); return; @@ -719,5 +354,370 @@ class MapManager implements CallbackListener { $this->maniaControl->log($message, true); } } + + /** + * Returns map By UID + * + * @param $uid + * @return Map array + */ + public function getMapByUid($uid) { + if (!isset($this->maps[$uid])) { + return null; + } + return $this->maps[$uid]; + } + + /** + * Updates the full Map list, needed on Init, addMap and on ShuffleMaps + */ + private function updateFullMapList() { + $tempList = array(); + + try { + $i = 0; + while (true) { + $maps = $this->maniaControl->client->getMapList(150, $i); + + foreach ($maps as $rpcMap) { + if (array_key_exists($rpcMap->uId, $this->maps)) { + // Map already exists, only update index + $tempList[$rpcMap->uId] = $this->maps[$rpcMap->uId]; + } else { // Insert Map Object + $map = $this->initializeMap($rpcMap); + $tempList[$map->uid] = $map; + } + } + + $i += 150; + } + } catch (StartIndexOutOfBoundException $e) { + } + + // restore Sorted MapList + $this->maps = $tempList; + + // Trigger own callback + $this->maniaControl->callbackManager->triggerCallback(self::CB_MAPS_UPDATED); + + // Write MapList + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_AUTOSAVE_MAPLIST)) { + try { + $this->maniaControl->client->saveMatchSettings($this->maniaControl->settingManager->getSetting($this, self::SETTING_MAPLIST_FILE)); + } catch (CouldNotWritePlaylistFileException $e) { + $this->maniaControl->log("Unable to write the playlist file, please checkout your MX-Folders File permissions!"); + } + } + } + + /** + * Initializes a Map + * + * @param $rpcMap + * @return Map + */ + public function initializeMap($rpcMap) { + $map = new Map($rpcMap); + $this->saveMap($map); + + /*$mapsDirectory = $this->maniaControl->server->getMapsDirectory(); + if (is_readable($mapsDirectory . $map->fileName)) { + $mapFetcher = new \GBXChallMapFetcher(true); + $mapFetcher->processFile($mapsDirectory . $map->fileName); + $map->authorNick = FORMATTER::stripDirtyCodes($mapFetcher->authorNick); + $map->authorEInfo = $mapFetcher->authorEInfo; + $map->authorZone = $mapFetcher->authorZone; + $map->comment = $mapFetcher->comment; + }*/ + return $map; + } + + /** + * Save a Map in the Database + * + * @param \ManiaControl\Maps\Map $map + * @return bool + */ + private function saveMap(Map &$map) { + //TODO saveMaps for whole maplist at once (usage of prepared statements) + $mysqli = $this->maniaControl->database->mysqli; + $mapQuery = "INSERT INTO `" . self::TABLE_MAPS . "` ( + `uid`, + `name`, + `authorLogin`, + `fileName`, + `environment`, + `mapType` + ) VALUES ( + ?, ?, ?, ?, ?, ? + ) ON DUPLICATE KEY UPDATE + `index` = LAST_INSERT_ID(`index`), + `fileName` = VALUES(`fileName`), + `environment` = VALUES(`environment`), + `mapType` = VALUES(`mapType`);"; + + $mapStatement = $mysqli->prepare($mapQuery); + if ($mysqli->error) { + trigger_error($mysqli->error); + return false; + } + $mapStatement->bind_param('ssssss', $map->uid, $map->rawName, $map->authorLogin, $map->fileName, $map->environment, $map->mapType); + $mapStatement->execute(); + if ($mapStatement->error) { + trigger_error($mapStatement->error); + $mapStatement->close(); + return false; + } + $map->index = $mapStatement->insert_id; + $mapStatement->close(); + return true; + } + + /** + * Shuffles the MapList + * + * @param Player $admin + * @return bool + */ + public function shuffleMapList($admin = null) { + $shuffledMaps = $this->maps; + shuffle($shuffledMaps); + + $mapArray = array(); + + foreach ($shuffledMaps as $map) { + /** + * @var Map $map + */ + $mapArray[] = $map->fileName; + } + + try { + $this->maniaControl->client->chooseNextMapList($mapArray); + } catch (Exception $e) { + //TODO temp added 19.04.2014 + $this->maniaControl->errorHandler->triggerDebugNotice("Exception line 331 MapManager" . $e->getMessage()); + trigger_error("Couldn't shuffle mapList. " . $e->getMessage()); + return false; + } + + $this->fetchCurrentMap(); + + if ($admin) { + $message = '$<' . $admin->nickname . '$> shuffled the Maplist!'; + $this->maniaControl->chat->sendSuccess($message); + $this->maniaControl->log($message, true); + } + + // Restructure if needed + $this->restructureMapList(); + return true; + } + + /** + * Freshly fetch current Map + * + * @return Map + */ + private function fetchCurrentMap() { + $rpcMap = $this->maniaControl->client->getCurrentMapInfo(); + + if (array_key_exists($rpcMap->uId, $this->maps)) { + $this->currentMap = $this->maps[$rpcMap->uId]; + $this->currentMap->nbCheckpoints = $rpcMap->nbCheckpoints; + $this->currentMap->nbLaps = $rpcMap->nbLaps; + return $this->currentMap; + } + + $this->currentMap = $this->initializeMap($rpcMap); + $this->maps[$this->currentMap->uid] = $this->currentMap; + return $this->currentMap; + } + + /** + * Restructures the Maplist + */ + public function restructureMapList() { + $currentIndex = $this->getMapIndex($this->currentMap); + + // No RestructureNeeded + if ($currentIndex < Maplist::MAX_MAPS_PER_PAGE - 1) { + return true; + } + + $lowerMapArray = array(); + $higherMapArray = array(); + + $i = 0; + foreach ($this->maps as $map) { + if ($i < $currentIndex) { + $lowerMapArray[] = $map->fileName; + } else { + $higherMapArray[] = $map->fileName; + } + $i++; + } + + $mapArray = array_merge($higherMapArray, $lowerMapArray); + array_shift($mapArray); + + try { + $this->maniaControl->client->chooseNextMapList($mapArray); + } catch (Exception $e) { + trigger_error("Error while restructuring the Maplist. " . $e->getMessage()); + return false; + } + return true; + } + + /** + * Returns the MapIndex of a given map + * + * @param Map $map + * @internal param $uid + * @return mixed + */ + public function getMapIndex(Map $map) { + $maps = $this->getMaps(); + return array_search($map, $maps); + } + + /** + * Get all Maps + * + * @param int $offset + * @param int $length + * @return array + */ + public function getMaps($offset = null, $length = null) { + if ($offset === null) { + return array_values($this->maps); + } + if ($length === null) { + return array_slice($this->maps, $offset); + } + return array_slice($this->maps, $offset, $length); + } + + /** + * Handle OnInit callback + */ + public function handleOnInit() { + $this->updateFullMapList(); + $this->fetchCurrentMap(); + + // Restructure Maplist + $this->restructureMapList(); + } + + /** + * Handle AfterInit callback + */ + public function handleAfterInit() { + // Fetch MX infos + $this->mxManager->fetchManiaExchangeMapInformations(); + } + + /** + * Get Current Map + * + * @return Map currentMap + */ + public function getCurrentMap() { + if (!$this->currentMap) { + return $this->fetchCurrentMap(); + } + return $this->currentMap; + } + + /** + * Handle Script BeginMap callback + * + * @param int $mapNumber + */ + public function handleScriptBeginMap($mapNumber) { + $this->handleBeginMap(array()); + } + + /** + * Handle BeginMap callback + * + * @param array $callback + */ + public function handleBeginMap(array $callback) { + if ($this->mapBegan) { + return; + } + $this->mapBegan = true; + $this->mapEnded = false; + + if (!isset($callback[1][0]["UId"])) { + $this->currentMap = $this->fetchCurrentMap(); + } else if (array_key_exists($callback[1][0]["UId"], $this->maps)) { + // Map already exists, only update index + $this->currentMap = $this->maps[$callback[1][0]["UId"]]; + if (!$this->currentMap->nbCheckpoints || !$this->currentMap->nbLaps) { + $rpcMap = $this->maniaControl->client->getCurrentMapInfo(); + $this->currentMap->nbLaps = $rpcMap->nbLaps; + $this->currentMap->nbCheckpoints = $rpcMap->nbCheckpoints; + } + } + + // Restructure MapList if id is over 15 + $this->restructureMapList(); + + // Update the mx of the map (for update checks, etc.) + $this->mxManager->fetchManiaExchangeMapInformations($this->currentMap); + + // Trigger own BeginMap callback ( + //TODO remove deprecated callback later + $this->maniaControl->callbackManager->triggerCallback(self::CB_BEGINMAP, $this->currentMap); + $this->maniaControl->callbackManager->triggerCallback(Callbacks::BEGINMAP, $this->currentMap); + } + + /** + * Handle Script EndMap Callback + * + * @param int $mapNumber + */ + public function handleScriptEndMap($mapNumber) { + $this->handleEndMap(array()); + } + + /** + * Handle EndMap Callback + * + * @param array $callback + */ + public function handleEndMap(array $callback) { + if ($this->mapEnded) { + return; + } + $this->mapEnded = true; + $this->mapBegan = false; + + // Trigger own EndMap callback + $this->maniaControl->callbackManager->triggerCallback(self::CB_ENDMAP, $this->currentMap); + //TODO remove deprecated callback later + $this->maniaControl->callbackManager->triggerCallback(Callbacks::ENDMAP, $this->currentMap); + } + + /** + * Handle Maps Modified Callback + * + * @param array $callback + */ + public function mapsModified(array $callback) { + $this->updateFullMapList(); + } + + /** + * Get the Number of Maps + * + * @return int + */ + public function getMapsCount() { + return count($this->maps); + } // TODO: add local map by filename } diff --git a/application/core/Maps/MapQueue.php b/application/core/Maps/MapQueue.php index 81e93b75..eceec27b 100644 --- a/application/core/Maps/MapQueue.php +++ b/application/core/Maps/MapQueue.php @@ -14,9 +14,9 @@ use ManiaControl\Players\Player; /** * MapQueue Class * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class MapQueue implements CallbackListener, CommandListener { /* @@ -34,7 +34,7 @@ class MapQueue implements CallbackListener, CommandListener { const ADMIN_COMMAND_CLEAR_MAPQUEUE = 'clearmapqueue'; const ADMIN_COMMAND_CLEAR_JUKEBOX = 'clearjukebox'; - + /* * Private Properties */ @@ -75,7 +75,7 @@ class MapQueue implements CallbackListener, CommandListener { * Adds current map to buffer on startup */ public function handleAfterInit() { - $currentMap = $this->maniaControl->mapManager->getCurrentMap(); + $currentMap = $this->maniaControl->mapManager->getCurrentMap(); $this->buffer[] = $currentMap->uid; } @@ -90,6 +90,34 @@ class MapQueue implements CallbackListener, CommandListener { $this->clearMapQueue($admin); } + /** + * Clears the Map Queue + * + * @param $admin + */ + public function clearMapQueue($admin) { + if (!$this->maniaControl->authenticationManager->checkPermission($admin, self::SETTING_PERMISSION_CLEAR_MAPQUEUE)) { + $this->maniaControl->authenticationManager->sendNotAllowed($admin); + return; + } + + if (count($this->queuedMaps) == 0) { + $this->maniaControl->chat->sendError('$fa0There are no maps in the jukebox!', $admin->login); + return; + } + + $title = $this->maniaControl->authenticationManager->getAuthLevelName($admin->authLevel); + + //Destroy map - queue list + $this->queuedMaps = array(); + + $this->maniaControl->chat->sendInformation('$fa0' . $title . ' $<$fff' . $admin->nickname . '$> cleared the Queued-Map list!'); + $this->maniaControl->log($title . ' ' . Formatter::stripCodes($admin->nickname) . ' cleared the Queued-Map list!'); + + // Trigger callback + $this->maniaControl->callbackManager->triggerCallback(self::CB_MAPQUEUE_CHANGED, array('clear')); + } + /** * Handles the mapqueue/jukebox command * @@ -99,12 +127,12 @@ class MapQueue implements CallbackListener, CommandListener { public function command_MapQueue(array $chat, Player $player) { $chatCommands = explode(' ', $chat[1][2]); - if(isset($chatCommands[1])) { - if($chatCommands[1] == ' ' || $chatCommands[1] == 'list') { + if (isset($chatCommands[1])) { + if ($chatCommands[1] == ' ' || $chatCommands[1] == 'list') { $this->showMapQueue($player); - } elseif($chatCommands[1] == 'display') { + } elseif ($chatCommands[1] == 'display') { $this->showMapQueueManialink($player); - } elseif($chatCommands[1] == 'clear') { + } elseif ($chatCommands[1] == 'clear') { $this->clearMapQueue($player); } } else { @@ -118,15 +146,15 @@ class MapQueue implements CallbackListener, CommandListener { * @param $player */ public function showMapQueue($player) { - if(count($this->queuedMaps) == 0) { + if (count($this->queuedMaps) == 0) { $this->maniaControl->chat->sendError('$fa0There are no maps in the jukebox!', $player->login); return; } $message = '$fa0Upcoming maps in the Map-Queue:'; - $i = 1; - foreach($this->queuedMaps as $queuedMap) { - $message .= ' $<$fff'.$i.'$>. [$<$fff'.Formatter::stripCodes($queuedMap[1]->name).'$>]'; + $i = 1; + foreach ($this->queuedMaps as $queuedMap) { + $message .= ' $<$fff' . $i . '$>. [$<$fff' . Formatter::stripCodes($queuedMap[1]->name) . '$>]'; $i++; } @@ -139,13 +167,13 @@ class MapQueue implements CallbackListener, CommandListener { * @param $player */ public function showMapQueueManialink($player) { - if(count($this->queuedMaps) == 0) { + if (count($this->queuedMaps) == 0) { $this->maniaControl->chat->sendError('$fa0There are no maps in the jukebox!', $player->login); return; } $maps = array(); - foreach($this->queuedMaps as $queuedMap) { + foreach ($this->queuedMaps as $queuedMap) { $maps[] = $queuedMap[1]; } @@ -161,34 +189,6 @@ class MapQueue implements CallbackListener, CommandListener { return $this->buffer; } - /** - * Clears the Map Queue - * - * @param $admin - */ - public function clearMapQueue($admin) { - if (!$this->maniaControl->authenticationManager->checkPermission($admin, self::SETTING_PERMISSION_CLEAR_MAPQUEUE)) { - $this->maniaControl->authenticationManager->sendNotAllowed($admin); - return; - } - - if(count($this->queuedMaps) == 0) { - $this->maniaControl->chat->sendError('$fa0There are no maps in the jukebox!', $admin->login); - return; - } - - $title = $this->maniaControl->authenticationManager->getAuthLevelName($admin->authLevel); - - //Destroy map - queue list - $this->queuedMaps = array(); - - $this->maniaControl->chat->sendInformation('$fa0'. $title . ' $<$fff' . $admin->nickname . '$> cleared the Queued-Map list!'); - $this->maniaControl->log($title . ' ' . Formatter::stripCodes($admin->nickname) . ' cleared the Queued-Map list!'); - - // Trigger callback - $this->maniaControl->callbackManager->triggerCallback(self::CB_MAPQUEUE_CHANGED, array('clear')); - } - /** * Adds map as first map in queue (for /replay) * @@ -216,15 +216,13 @@ class MapQueue implements CallbackListener, CommandListener { //Check if player is allowed to add (another) map $admin = false; - if($this->maniaControl->authenticationManager->checkRight($player, 2) || - $this->maniaControl->authenticationManager->checkRight($player, 3) || - $this->maniaControl->authenticationManager->checkRight($player, 4)) { + if ($this->maniaControl->authenticationManager->checkRight($player, 2) || $this->maniaControl->authenticationManager->checkRight($player, 3) || $this->maniaControl->authenticationManager->checkRight($player, 4)) { $admin = true; } $mapsForPlayer = 0; - foreach($this->queuedMaps as $queuedMap) { - if($queuedMap[0]->login == $login) { + foreach ($this->queuedMaps as $queuedMap) { + if ($queuedMap[0]->login == $login) { $mapsForPlayer++; } } @@ -232,14 +230,14 @@ class MapQueue implements CallbackListener, CommandListener { $maxPlayer = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAPLIMIT_PLAYER); $maxAdmin = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAPLIMIT_ADMIN); - if($admin && $maxAdmin != -1) { - if($mapsForPlayer == $maxAdmin) { - $this->maniaControl->chat->sendError('You already have $<$fff'.$maxAdmin.'$> map(s) in the Map-Queue!', $login); + if ($admin && $maxAdmin != -1) { + if ($mapsForPlayer == $maxAdmin) { + $this->maniaControl->chat->sendError('You already have $<$fff' . $maxAdmin . '$> map(s) in the Map-Queue!', $login); return; } - } elseif(!$admin && $maxPlayer != -1) { - if($mapsForPlayer == $maxPlayer) { - $this->maniaControl->chat->sendError('You already have $<$fff'.$maxPlayer.'$> map(s) in the Map-Queue!', $login); + } elseif (!$admin && $maxPlayer != -1) { + if ($mapsForPlayer == $maxPlayer) { + $this->maniaControl->chat->sendError('You already have $<$fff' . $maxPlayer . '$> map(s) in the Map-Queue!', $login); return; } } @@ -252,7 +250,7 @@ class MapQueue implements CallbackListener, CommandListener { //TODO recently maps not able to add to queue-amps setting, and management // Check if map is in the buffer - if(in_array($uid, $this->buffer)) { + if (in_array($uid, $this->buffer)) { $this->maniaControl->chat->sendError('That map has recently been played!', $login); if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_CLEAR_MAPQUEUE)) { return; @@ -297,10 +295,10 @@ class MapQueue implements CallbackListener, CommandListener { */ public function endMap(Map $map) { $this->nextMap = null; - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_SKIP_MAP_ON_LEAVE) == TRUE) { + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_SKIP_MAP_ON_LEAVE) == true) { //Skip Map if requester has left - foreach($this->queuedMaps as $queuedMap) { + foreach ($this->queuedMaps as $queuedMap) { $player = $queuedMap[0]; //found player, so play this map @@ -308,7 +306,7 @@ class MapQueue implements CallbackListener, CommandListener { break; } - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_SKIP_MAPQUEUE_ADMIN) == FALSE) { + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_SKIP_MAPQUEUE_ADMIN) == false) { //Check if the queuer is a admin if ($player->authLevel > 0) { break; @@ -321,7 +319,7 @@ class MapQueue implements CallbackListener, CommandListener { //Player not found, so remove the map from the mapqueue array_shift($this->queuedMaps); - $this->maniaControl->chat->sendInformation('$fa0$<$fff' . $queuedMap[0]->name .'$> is skipped because $<' . $player->nickname . '$> left the game!'); + $this->maniaControl->chat->sendInformation('$fa0$<$fff' . $queuedMap[0]->name . '$> is skipped because $<' . $player->nickname . '$> left the game!'); } } @@ -332,7 +330,7 @@ class MapQueue implements CallbackListener, CommandListener { return; } $map = $this->nextMap[1]; - $this->maniaControl->chat->sendInformation('$fa0Next map will be $<$fff' . $map->name .'$> as requested by $<' . $this->nextMap[0]->nickname . '$>.'); + $this->maniaControl->chat->sendInformation('$fa0Next map will be $<$fff' . $map->name . '$> as requested by $<' . $this->nextMap[0]->nickname . '$>.'); $this->maniaControl->client->chooseNextMap($map->fileName); } @@ -343,11 +341,11 @@ class MapQueue implements CallbackListener, CommandListener { * @param Map $map */ public function beginMap(Map $map) { - if(in_array($map->uid, $this->buffer)) { + if (in_array($map->uid, $this->buffer)) { return; } - if(count($this->buffer) >= $this->maniaControl->settingManager->getSetting($this, self::SETTING_BUFFERSIZE)) { + if (count($this->buffer) >= $this->maniaControl->settingManager->getSetting($this, self::SETTING_BUFFERSIZE)) { array_shift($this->buffer); } @@ -370,7 +368,7 @@ class MapQueue implements CallbackListener, CommandListener { * @return array(Player $player, Map $map) */ public function getNextQueuedMap() { - foreach($this->queuedMaps as $queuedMap) { + foreach ($this->queuedMaps as $queuedMap) { //return the first Queued Map return $queuedMap; } @@ -385,7 +383,7 @@ class MapQueue implements CallbackListener, CommandListener { public function getQueuedMapsRanking() { $i = 1; $queuedMaps = array(); - foreach($this->queuedMaps as $queuedMap) { + foreach ($this->queuedMaps as $queuedMap) { $map = $queuedMap[1]; $queuedMaps[$map->uid] = $i; $i++; @@ -407,7 +405,7 @@ class MapQueue implements CallbackListener, CommandListener { * Dummy Function for testing */ public function printAllMaps() { - foreach($this->queuedMaps as $map) { + foreach ($this->queuedMaps as $map) { $map = $map[1]; var_dump($map->name); } diff --git a/application/core/Players/Player.php b/application/core/Players/Player.php index 46955506..ce405551 100644 --- a/application/core/Players/Player.php +++ b/application/core/Players/Player.php @@ -7,9 +7,9 @@ use ManiaControl\Formatter; /** * Player Model Class * - * @author kremsy & steeffeen - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class Player { /* @@ -72,7 +72,7 @@ class Player { $this->pid = $mpPlayer->playerId; $this->login = $mpPlayer->login; $this->nickname = Formatter::stripDirtyCodes($mpPlayer->nickName); - $this->rawNickname = $mpPlayer->nickName; + $this->rawNickname = $mpPlayer->nickName; $this->path = $mpPlayer->path; $this->language = $mpPlayer->language; $this->avatar = $mpPlayer->avatar['FileName']; diff --git a/application/core/Players/PlayerActions.php b/application/core/Players/PlayerActions.php index eaad80a9..2d9a7327 100644 --- a/application/core/Players/PlayerActions.php +++ b/application/core/Players/PlayerActions.php @@ -21,8 +21,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\PlayerNotIgnoredException; /** * Player Actions Class * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class PlayerActions { @@ -70,50 +70,6 @@ class PlayerActions { $this->maniaControl->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_FORCE_PLAYER_SPEC, AuthenticationManager::AUTH_LEVEL_MODERATOR); } - /** - * Force a Player to Play - * - * @param string $adminLogin - * @param string $targetLogin - * @param bool $userIsAbleToSelect - * @param bool $displayAnnouncement - * @internal param int $type - */ - public function forcePlayerToPlay($adminLogin, $targetLogin, $userIsAbleToSelect = true, $displayAnnouncement = true) { - $admin = $this->maniaControl->playerManager->getPlayer($adminLogin); - if (!$this->maniaControl->authenticationManager->checkPermission($admin, self::SETTING_PERMISSION_FORCE_PLAYER_PLAY)) { - $this->maniaControl->authenticationManager->sendNotAllowed($admin); - return; - } - $target = $this->maniaControl->playerManager->getPlayer($targetLogin); - if (!$target) { - return; - } - - try { - $this->maniaControl->client->forceSpectator($target->login, self::SPECTATOR_PLAYER); - } catch(FaultException $e) { - //TODO exception 'There are too many players' appeared 28.04.2014, wait for more before add to faultexception - $this->maniaControl->chat->sendException($e, $admin->login); - return; - } - - if ($userIsAbleToSelect) { - try { - $this->maniaControl->client->forceSpectator($target->login, self::SPECTATOR_USER_SELECTABLE); - } catch(Exception $e) { - $this->maniaControl->chat->sendException($e, $admin->login); - return; - } - } - - // Announce force - if ($displayAnnouncement) { - $chatMessage = '$<' . $admin->nickname . '$> forced $<' . $target->nickname . '$> to Play!'; - $this->maniaControl->chat->sendInformation($chatMessage); - } - } - /** * Force a Player to a certain Team * @@ -138,7 +94,7 @@ class PlayerActions { try { $this->maniaControl->client->forcePlayerTeam($target->login, $teamId); - } catch(NotInTeamModeException $e) { + } catch (NotInTeamModeException $e) { $this->forcePlayerToPlay($adminLogin, $targetLogin); return; } @@ -157,6 +113,50 @@ class PlayerActions { $this->maniaControl->log($chatMessage, true); } + /** + * Force a Player to Play + * + * @param string $adminLogin + * @param string $targetLogin + * @param bool $userIsAbleToSelect + * @param bool $displayAnnouncement + * @internal param int $type + */ + public function forcePlayerToPlay($adminLogin, $targetLogin, $userIsAbleToSelect = true, $displayAnnouncement = true) { + $admin = $this->maniaControl->playerManager->getPlayer($adminLogin); + if (!$this->maniaControl->authenticationManager->checkPermission($admin, self::SETTING_PERMISSION_FORCE_PLAYER_PLAY)) { + $this->maniaControl->authenticationManager->sendNotAllowed($admin); + return; + } + $target = $this->maniaControl->playerManager->getPlayer($targetLogin); + if (!$target) { + return; + } + + try { + $this->maniaControl->client->forceSpectator($target->login, self::SPECTATOR_PLAYER); + } catch (FaultException $e) { + //TODO exception 'There are too many players' appeared 28.04.2014, wait for more before add to faultexception + $this->maniaControl->chat->sendException($e, $admin->login); + return; + } + + if ($userIsAbleToSelect) { + try { + $this->maniaControl->client->forceSpectator($target->login, self::SPECTATOR_USER_SELECTABLE); + } catch (Exception $e) { + $this->maniaControl->chat->sendException($e, $admin->login); + return; + } + } + + // Announce force + if ($displayAnnouncement) { + $chatMessage = '$<' . $admin->nickname . '$> forced $<' . $target->nickname . '$> to Play!'; + $this->maniaControl->chat->sendInformation($chatMessage); + } + } + /** * Force a Player to Spectator * @@ -179,7 +179,7 @@ class PlayerActions { try { $this->maniaControl->client->forceSpectator($target->login, $spectatorState); - } catch(Exception $e) { + } catch (Exception $e) { $this->maniaControl->chat->sendException($e, $admin->login); return; } @@ -193,7 +193,7 @@ class PlayerActions { // Free player slot try { $this->maniaControl->client->spectatorReleasePlayerSlot($target->login); - } catch(PlayerIsNotSpectatorException $e) { + } catch (PlayerIsNotSpectatorException $e) { } } } @@ -217,9 +217,9 @@ class PlayerActions { return; } - try{ + try { $this->maniaControl->client->unIgnore($targetLogin); - }catch(PlayerNotIgnoredException $e){ + } catch (PlayerNotIgnoredException $e) { $this->maniaControl->chat->sendError("Player is not ignored!"); return; } @@ -249,9 +249,9 @@ class PlayerActions { return; } - try{ + try { $this->maniaControl->client->ignore($targetLogin); - }catch(PlayerAlreadyIgnoredException $e){ + } catch (PlayerAlreadyIgnoredException $e) { $this->maniaControl->chat->sendError("Player already ignored!"); return; } @@ -322,7 +322,7 @@ class PlayerActions { $label->setTextColor('f00'); $y = $height / 2 - 15; - foreach($message as $line) { + foreach ($message as $line) { // Message lines $label = new Label_Text(); $frame->add($label); @@ -368,7 +368,7 @@ class PlayerActions { } else { $this->maniaControl->client->kick($target->login, $message); } - } catch(Exception $e) { + } catch (Exception $e) { $this->maniaControl->chat->sendException($e, $admin->login); return; } @@ -495,7 +495,7 @@ class PlayerActions { */ public function isPlayerMuted($login) { $ignoreList = $this->maniaControl->client->getIgnoreList(100, 0); - foreach($ignoreList as $ignoredPlayers) { + foreach ($ignoreList as $ignoredPlayers) { if ($ignoredPlayers->login == $login) { return true; } diff --git a/application/core/Players/PlayerCommands.php b/application/core/Players/PlayerCommands.php index 3642aeea..efd95ec8 100644 --- a/application/core/Players/PlayerCommands.php +++ b/application/core/Players/PlayerCommands.php @@ -15,9 +15,9 @@ use Maniaplanet\DedicatedServer\Xmlrpc\Exception; /** * Class offering various Admin Commands related to Players * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class PlayerCommands implements CommandListener, ManialinkPageAnswerListener, CallbackListener { /* @@ -74,7 +74,7 @@ class PlayerCommands implements CommandListener, ManialinkPageAnswerListener, Ca /** * Handle TeamStatusChanged - * + * * @param bool $teamMode */ public function teamStatusChanged($teamMode) { @@ -103,7 +103,7 @@ class PlayerCommands implements CommandListener, ManialinkPageAnswerListener, Ca try { $this->maniaControl->client->autoTeamBalance(); - } catch(Exception $e) { + } catch (Exception $e) { $this->maniaControl->errorHandler->triggerDebugNotice("PlayerCommands Debug Line 112: " . $e->getMessage()); // TODO: only catch 'not in team mode' exception - throw others (like connection error) $this->maniaControl->chat->sendError('Error occurred: ' . $e->getMessage(), $player->login); diff --git a/application/core/Players/PlayerDataManager.php b/application/core/Players/PlayerDataManager.php index 23fd34e6..bcf0fdc9 100644 --- a/application/core/Players/PlayerDataManager.php +++ b/application/core/Players/PlayerDataManager.php @@ -8,8 +8,8 @@ use ManiaControl\ManiaControl; /** * Player Data Manager * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class PlayerDataManager { @@ -42,6 +42,80 @@ class PlayerDataManager { $this->storeMetaData(); } + /** + * Initialize necessary database tables + * + * @return bool + */ + private function initTables() { + $mysqli = $this->maniaControl->database->mysqli; + $defaultType = "'" . self::TYPE_STRING . "'"; + $typeSet = $defaultType . ",'" . self::TYPE_INT . "','" . self::TYPE_REAL . "','" . self::TYPE_BOOL . "','" . self::TYPE_ARRAY . "'"; + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERDATAMETADATA . "` ( + `dataId` int(11) NOT NULL AUTO_INCREMENT, + `class` varchar(100) NOT NULL, + `dataName` varchar(100) NOT NULL, + `type` set({$typeSet}) NOT NULL DEFAULT {$defaultType}, + `defaultValue` varchar(150) NOT NULL, + `description` varchar(150) NOT NULL, + PRIMARY KEY (`dataId`), + UNIQUE KEY `name` (`class`, `dataName`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Player-Data MetaData' AUTO_INCREMENT=1;"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; + } + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error, E_USER_ERROR); + return false; + } + $statement->close(); + + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERDATA . "` ( + `index` int(11) NOT NULL AUTO_INCREMENT, + `serverIndex` int(11) NOT NULL, + `playerId` int(11) NOT NULL, + `dataId` int(11) NOT NULL, + `value` varchar(150) NOT NULL, + `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`index`), + UNIQUE KEY `unique` (`dataId`,`playerId`,`serverIndex`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Player Data' AUTO_INCREMENT=1;"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; + } + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error, E_USER_ERROR); + return false; + } + $statement->close(); + return true; + } + + /** + * Store Meta Data from the Database in the Ram + */ + private function storeMetaData() { + $mysqli = $this->maniaControl->database->mysqli; + + $query = "SELECT * FROM `" . self::TABLE_PLAYERDATAMETADATA . "`;"; + $result = $mysqli->query($query); + if (!$result) { + trigger_error($mysqli->error); + return; + } + + while ($row = $result->fetch_object()) { + $this->metaData[$row->class . $row->dataName] = $row; + } + $result->close(); + } + /** * Destroys the stored PlayerData (Method get called by PlayerManager, so don't call it anywhere else) * @@ -95,31 +169,55 @@ class PlayerDataManager { } /** - * Store Meta Data from the Database in the Ram + * Get Class Name of a Parameter + * + * @param mixed $param + * @return string */ - private function storeMetaData() { - $mysqli = $this->maniaControl->database->mysqli; - - $query = "SELECT * FROM `" . self::TABLE_PLAYERDATAMETADATA . "`;"; - $result = $mysqli->query($query); - if (!$result) { - trigger_error($mysqli->error); - return; + private function getClassName($param) { + if (is_object($param)) { + return get_class($param); } - - while($row = $result->fetch_object()) { - $this->metaData[$row->class . $row->dataName] = $row; + if (is_string($param)) { + return $param; } - $result->close(); + trigger_error('Invalid class param. ' . $param); + return (string)$param; + } + + /** + * Get Type of a Parameter + * + * @param mixed $param + * @return string + */ + private function getType($param) { + if (is_int($param)) { + return self::TYPE_INT; + } + if (is_real($param)) { + return self::TYPE_REAL; + } + if (is_bool($param)) { + return self::TYPE_BOOL; + } + if (is_string($param)) { + return self::TYPE_STRING; + } + if (is_array($param)) { + return self::TYPE_ARRAY; + } + trigger_error('Unsupported setting type. ' . print_r($param, true)); + return null; } /** * Gets the Player Data * - * @param mixed $object - * @param string $dataName - * @param Player $player - * @param int $serverIndex + * @param mixed $object + * @param string $dataName + * @param Player $player + * @param int $serverIndex * @return mixed|null */ public function getPlayerData($object, $dataName, Player $player, $serverIndex = -1) { @@ -172,10 +270,10 @@ class PlayerDataManager { /** * Set a PlayerData to a specific defined statMetaData * - * @param mixed $object - * @param string $dataName - * @param Player $player - * @param mixed $value + * @param mixed $object + * @param string $dataName + * @param Player $player + * @param mixed $value * @param int $serverIndex (let it empty if its global) * @return bool */ @@ -237,87 +335,6 @@ class PlayerDataManager { return null; } - /** - * Initialize necessary database tables - * - * @return bool - */ - private function initTables() { - $mysqli = $this->maniaControl->database->mysqli; - $defaultType = "'" . self::TYPE_STRING . "'"; - $typeSet = $defaultType . ",'" . self::TYPE_INT . "','" . self::TYPE_REAL . "','" . self::TYPE_BOOL . "','" . self::TYPE_ARRAY . "'"; - $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERDATAMETADATA . "` ( - `dataId` int(11) NOT NULL AUTO_INCREMENT, - `class` varchar(100) NOT NULL, - `dataName` varchar(100) NOT NULL, - `type` set({$typeSet}) NOT NULL DEFAULT {$defaultType}, - `defaultValue` varchar(150) NOT NULL, - `description` varchar(150) NOT NULL, - PRIMARY KEY (`dataId`), - UNIQUE KEY `name` (`class`, `dataName`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Player-Data MetaData' AUTO_INCREMENT=1;"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); - return false; - } - $statement->execute(); - if ($statement->error) { - trigger_error($statement->error, E_USER_ERROR); - return false; - } - $statement->close(); - - $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLAYERDATA . "` ( - `index` int(11) NOT NULL AUTO_INCREMENT, - `serverIndex` int(11) NOT NULL, - `playerId` int(11) NOT NULL, - `dataId` int(11) NOT NULL, - `value` varchar(150) NOT NULL, - `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`index`), - UNIQUE KEY `unique` (`dataId`,`playerId`,`serverIndex`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Player Data' AUTO_INCREMENT=1;"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); - return false; - } - $statement->execute(); - if ($statement->error) { - trigger_error($statement->error, E_USER_ERROR); - return false; - } - $statement->close(); - return true; - } - - /** - * Get Type of a Parameter - * - * @param mixed $param - * @return string - */ - private function getType($param) { - if (is_int($param)) { - return self::TYPE_INT; - } - if (is_real($param)) { - return self::TYPE_REAL; - } - if (is_bool($param)) { - return self::TYPE_BOOL; - } - if (is_string($param)) { - return self::TYPE_STRING; - } - if (is_array($param)) { - return self::TYPE_ARRAY; - } - trigger_error('Unsupported setting type. ' . print_r($param, true)); - return null; - } - /** * Cast a Setting to the given Type * @@ -344,21 +361,4 @@ class PlayerDataManager { trigger_error('Unsupported setting type. ' . print_r($type, true)); return $value; } - - /** - * Get Class Name of a Parameter - * - * @param mixed $param - * @return string - */ - private function getClassName($param) { - if (is_object($param)) { - return get_class($param); - } - if (is_string($param)) { - return $param; - } - trigger_error('Invalid class param. ' . $param); - return (string)$param; - } } \ No newline at end of file diff --git a/application/core/Players/PlayerDetailed.php b/application/core/Players/PlayerDetailed.php index 41415d7d..c0162271 100644 --- a/application/core/Players/PlayerDetailed.php +++ b/application/core/Players/PlayerDetailed.php @@ -19,9 +19,9 @@ use Maniaplanet\DedicatedServer\Structures\Player; /** * Player Detailed Page * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class PlayerDetailed { /* @@ -230,7 +230,7 @@ class PlayerDetailed { $x = -$this->width / 2 + 52; $id = 1; - foreach($playerStats as $stat) { + foreach ($playerStats as $stat) { $statProperties = $stat[0]; $value = $stat[1]; diff --git a/application/core/Players/PlayerList.php b/application/core/Players/PlayerList.php index 70a38009..1c5536e2 100644 --- a/application/core/Players/PlayerList.php +++ b/application/core/Players/PlayerList.php @@ -2,8 +2,6 @@ namespace ManiaControl\Players; -use Maniaplanet\DedicatedServer\Structures\Player; -use MCTeam\CustomVotesPlugin; use FML\Controls\Control; use FML\Controls\Frame; use FML\Controls\Labels\Label_Button; @@ -24,14 +22,16 @@ use ManiaControl\Formatter; use ManiaControl\ManiaControl; use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\Manialinks\ManialinkPageAnswerListener; +use Maniaplanet\DedicatedServer\Structures\Player; use Maniaplanet\DedicatedServer\Xmlrpc\LoginUnknownException; use Maniaplanet\DedicatedServer\Xmlrpc\PlayerIsNotSpectatorException; +use MCTeam\CustomVotesPlugin; /** * PlayerList Widget Class * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, TimerListener { @@ -97,6 +97,39 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $this->playersListShown[$player->login] = $showStatus; } + /** + * Unset the player if he opened another Main Widget + * + * @param Player $player + * @param $openedWidget + */ + public function handleWidgetOpened(Player $player, $openedWidget) { + //unset when another main widget got opened + if ($openedWidget != 'PlayerList') { + unset($this->playersListShown[$player->login]); + } + } + + /** + * Closes the widget + * + * @param Player $player + */ + public function closeWidget(Player $player) { + unset($this->playersListShown[$player->login]); + } + + /** + * Closes the player advanced widget widget + * + * @param array $callback + * @param Player $player + */ + public function closePlayerAdvancedWidget(array $callback, Player $player) { + $this->playersListShown[$player->login] = self::SHOWN_MAIN_WINDOW; + $this->showPlayerList($player); // overwrite the manialink + } + /** * Show the PlayerList Widget to the Player * @@ -116,8 +149,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer //create manialink $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); $script = $maniaLink->getScript(); - $paging = new Paging(); - $script->addFeature($paging); + $paging = new Paging(); + $script->addFeature($paging); // Main frame $frame = $this->maniaControl->manialinkManager->styleManager->getDefaultListFrame($script, $pagesId); @@ -145,7 +178,7 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $i = 1; $y = $height / 2 - 10; $pageFrames = array(); - foreach($players as $listPlayer) { + foreach ($players as $listPlayer) { /** @var Player $listPlayer * */ if (!isset($pageFrame)) { $pageFrame = new Frame(); @@ -155,7 +188,7 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer } array_push($pageFrames, $pageFrame); $y = $height / 2 - 10; - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); } $path = $listPlayer->getProvince(); @@ -194,7 +227,7 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $teamQuad->setZ(0.1); $teamQuad->setSize(3.8, 3.8); - switch($listPlayer->teamId) { + switch ($listPlayer->teamId) { case 0: $teamQuad->setSubStyle($teamQuad::SUBSTYLE_1); break; @@ -222,7 +255,7 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $countryQuad->setSize(4, 4); $countryQuad->setZ(1); - $countryQuad->addTooltipLabelFeature($descriptionLabel, '$<' . $listPlayer->nickname . '$> from ' . $listPlayer->path); + $countryQuad->addTooltipLabelFeature($descriptionLabel, '$<' . $listPlayer->nickname . '$> from ' . $listPlayer->path); } // Level Quad @@ -241,8 +274,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $rightLabel->setText($this->maniaControl->authenticationManager->getAuthLevelAbbreviation($listPlayer->authLevel)); $rightLabel->setTextColor("fff"); - $description = $this->maniaControl->authenticationManager->getAuthLevelName($listPlayer) . " " . $listPlayer->nickname; - $rightLabel->addTooltipLabelFeature($descriptionLabel, $description); + $description = $this->maniaControl->authenticationManager->getAuthLevelName($listPlayer) . " " . $listPlayer->nickname; + $rightLabel->addTooltipLabelFeature($descriptionLabel, $description); // Player Statistics $playerQuad = new Quad_Icons64x64_1(); @@ -252,8 +285,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $playerQuad->setSubStyle($playerQuad::SUBSTYLE_TrackInfo); $playerQuad->setSize(2.7, 2.7); $playerQuad->setAction(self::ACTION_OPEN_PLAYER_DETAILED . "." . $listPlayer->login); - $description = 'View Statistics of $<'.$listPlayer->nickname. '$>'; - $playerQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'View Statistics of $<' . $listPlayer->nickname . '$>'; + $playerQuad->addTooltipLabelFeature($descriptionLabel, $description); // Camera Quad $playerQuad = new Quad_UIConstruction_Buttons(); @@ -262,8 +295,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $playerQuad->setZ(3); $playerQuad->setSubStyle($playerQuad::SUBSTYLE_Camera); $playerQuad->setSize(3.8, 3.8); - $description = 'Spectate $<'.$listPlayer->nickname.'$>'; - $playerQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Spectate $<' . $listPlayer->nickname . '$>'; + $playerQuad->addTooltipLabelFeature($descriptionLabel, $description); $playerQuad->setAction(self::ACTION_SPECTATE_PLAYER . "." . $listPlayer->login); // Player Profile Quad @@ -273,11 +306,11 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $playerQuad->setZ(3); $playerQuad->setSubStyle($playerQuad::SUBSTYLE_Author); $playerQuad->setSize(3.8, 3.8); - $playerQuad->addPlayerProfileFeature($listPlayer->login); + $playerQuad->addPlayerProfileFeature($listPlayer->login); // Description Label - $description = 'View Player Profile of $<' . $listPlayer->nickname.'$>'; - $playerQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'View Player Profile of $<' . $listPlayer->nickname . '$>'; + $playerQuad->addTooltipLabelFeature($descriptionLabel, $description); if ($this->maniaControl->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_MODERATOR)) { // Further Player actions Quad @@ -290,8 +323,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $playerQuad->setAction(self::ACTION_PLAYER_ADV . "." . $listPlayer->login); // Description Label - $description = 'Advanced Player Actions for $<' . $listPlayer->nickname.'$>'; - $playerQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Advanced Player Actions for $<' . $listPlayer->nickname . '$>'; + $playerQuad->addTooltipLabelFeature($descriptionLabel, $description); } if ($this->maniaControl->server->isTeamMode()) { @@ -306,8 +339,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $redQuad->setAction(self::ACTION_FORCE_RED . "." . $listPlayer->login); // Force to Red-Team Description Label - $description = 'Force $<' . $listPlayer->nickname . '$> to Red Team!'; - $redQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Force $<' . $listPlayer->nickname . '$> to Red Team!'; + $redQuad->addTooltipLabelFeature($descriptionLabel, $description); // Force to Blue-Team Quad $blueQuad = new Quad_Emblems(); @@ -319,8 +352,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $blueQuad->setAction(self::ACTION_FORCE_BLUE . "." . $listPlayer->login); // Force to Blue-Team Description Label - $description = 'Force $<' . $listPlayer->nickname . '$> to Blue Team!'; - $blueQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Force $<' . $listPlayer->nickname . '$> to Blue Team!'; + $blueQuad->addTooltipLabelFeature($descriptionLabel, $description); } else if ($this->maniaControl->pluginManager->isPluginActive(self::DEFAULT_CUSTOM_VOTE_PLUGIN)) { // Kick Player Vote @@ -332,8 +365,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $kickQuad->setSize(3.8, 3.8); $kickQuad->setAction(self::ACTION_KICK_PLAYER_VOTE . "." . $listPlayer->login); - $description = 'Start a Kick Vote on $<' . $listPlayer->nickname . '$>!'; - $kickQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Start a Kick Vote on $<' . $listPlayer->nickname . '$>!'; + $kickQuad->addTooltipLabelFeature($descriptionLabel, $description); } } else { if ($this->maniaControl->authenticationManager->checkPermission($player, PlayerActions::SETTING_PERMISSION_FORCE_PLAYER_PLAY)) { @@ -346,8 +379,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $playQuad->setSize(3.8, 3.8); $playQuad->setAction(self::ACTION_FORCE_PLAY . "." . $listPlayer->login); - $description = 'Force $<' . $listPlayer->nickname . '$> to Play!'; - $playQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Force $<' . $listPlayer->nickname . '$> to Play!'; + $playQuad->addTooltipLabelFeature($descriptionLabel, $description); } } @@ -362,8 +395,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $spectatorQuad->setAction(self::ACTION_FORCE_SPEC . "." . $listPlayer->login); // Force to Spectator Description Label - $description = 'Force $<' . $listPlayer->nickname . '$> to Spectator!'; - $spectatorQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Force $<' . $listPlayer->nickname . '$> to Spectator!'; + $spectatorQuad->addTooltipLabelFeature($descriptionLabel, $description); } else if ($this->maniaControl->pluginManager->isPluginActive(self::DEFAULT_CUSTOM_VOTE_PLUGIN)) { // Force to Spectator Quad $spectatorQuad = new Quad_BgRaceScore2(); @@ -375,8 +408,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $spectatorQuad->setAction(self::ACTION_FORCE_SPEC_VOTE . "." . $listPlayer->login); // Force to Spectator Description Label - $description = 'Start a Vote to force $<' . $listPlayer->nickname . '$> to Spectator!'; - $spectatorQuad->addTooltipLabelFeature($descriptionLabel, $description); + $description = 'Start a Vote to force $<' . $listPlayer->nickname . '$> to Spectator!'; + $spectatorQuad->addTooltipLabelFeature($descriptionLabel, $description); } $y -= 4; @@ -396,20 +429,6 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, 'PlayerList'); } - /** - * Displays the Advanced Player Window - * - * @param Player $caller - * @param $login - */ - public function advancedPlayerWidget(Player $caller, $login) { - // Set status to target player login - $this->playersListShown[$caller->login] = $login; - - // Reopen playerlist - $this->showPlayerList($caller); - } - /** * Extra window with special actions on players like warn,kick, ban, authorization levels... * @@ -610,39 +629,6 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer return $frame; } - /** - * Unset the player if he opened another Main Widget - * - * @param Player $player - * @param $openedWidget - */ - public function handleWidgetOpened(Player $player, $openedWidget) { - //unset when another main widget got opened - if ($openedWidget != 'PlayerList') { - unset($this->playersListShown[$player->login]); - } - } - - /** - * Closes the widget - * - * @param Player $player - */ - public function closeWidget(Player $player) { - unset($this->playersListShown[$player->login]); - } - - /** - * Closes the player advanced widget widget - * - * @param array $callback - * @param Player $player - */ - public function closePlayerAdvancedWidget(array $callback, Player $player) { - $this->playersListShown[$player->login] = self::SHOWN_MAIN_WINDOW; - $this->showPlayerList($player); // overwrite the manialink - } - /** * Called on ManialinkPageAnswer * @@ -659,12 +645,12 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $adminLogin = $callback[1][1]; $targetLogin = $actionArray[2]; - switch($action) { + switch ($action) { case self::ACTION_SPECTATE_PLAYER: try { $this->maniaControl->client->forceSpectator($adminLogin, PlayerActions::SPECTATOR_BUT_KEEP_SELECTABLE); $this->maniaControl->client->forceSpectatorTarget($adminLogin, $targetLogin, 1); - } catch(PlayerIsNotSpectatorException $e) { + } catch (PlayerIsNotSpectatorException $e) { } break; case self::ACTION_OPEN_PLAYER_DETAILED: @@ -736,7 +722,7 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer try { $self->maniaControl->client->forceSpectator($target->login, PlayerActions::SPECTATOR_BUT_KEEP_SELECTABLE); $self->maniaControl->client->spectatorReleasePlayerSlot($target->login); - } catch(PlayerIsNotSpectatorException $e) { + } catch (PlayerIsNotSpectatorException $e) { } }); break; @@ -760,20 +746,34 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $message = '$39F You got kicked due a Public vote!$z '; try { $self->maniaControl->client->kick($target->login, $message); - } catch(LoginUnknownException $e) { + } catch (LoginUnknownException $e) { } }); break; } } + /** + * Displays the Advanced Player Window + * + * @param Player $caller + * @param $login + */ + public function advancedPlayerWidget(Player $caller, $login) { + // Set status to target player login + $this->playersListShown[$caller->login] = $login; + + // Reopen playerlist + $this->showPlayerList($caller); + } + /** * Reopen the widget on PlayerInfoChanged / Player Connect and Disconnect * * @param Player $player */ public function updateWidget(Player $player) { - foreach($this->playersListShown as $login => $shown) { + foreach ($this->playersListShown as $login => $shown) { if (!$shown) { continue; } diff --git a/application/core/Players/PlayerManager.php b/application/core/Players/PlayerManager.php index 4f59cfa0..2061a974 100644 --- a/application/core/Players/PlayerManager.php +++ b/application/core/Players/PlayerManager.php @@ -14,8 +14,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\LoginUnknownException; /** * Class managing Players * - * @author kremsy & steeffeen - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class PlayerManager implements CallbackListener, TimerListener { @@ -112,7 +112,7 @@ class PlayerManager implements CallbackListener, TimerListener { public function onInit() { // Add all players $players = $this->maniaControl->client->getPlayerList(300, 0, 2); - foreach($players as $playerItem) { + foreach ($players as $playerItem) { if ($playerItem->playerId <= 0) { continue; } @@ -141,183 +141,6 @@ class PlayerManager implements CallbackListener, TimerListener { } } - /** - * Handle playerConnect callback - * - * @param array $callback - */ - public function playerConnect(array $callback) { - $login = $callback[1][0]; - try { - $playerInfo = $this->maniaControl->client->getDetailedPlayerInfo($login); - $player = new Player($playerInfo); - - $this->addPlayer($player); - } catch(LoginUnknownException $e) { - } - } - - /** - * Handle playerDisconnect callback - * - * @param array $callback - */ - public function playerDisconnect(array $callback) { - $login = $callback[1][0]; - $player = $this->removePlayer($login); - if (!$player) { - return; - } - - // Trigger own callback - $this->maniaControl->callbackManager->triggerCallback(self::CB_PLAYERDISCONNECT, $player); - - if ($player->isFakePlayer()) { - return; - } - - $played = Formatter::formatTimeH(time() - $player->joinTime); - $logMessage = "Player left: {$player->login} / {$player->nickname} Playtime: {$played}"; - $this->maniaControl->log(Formatter::stripCodes($logMessage)); - - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_JOIN_LEAVE_MESSAGES)) { - $this->maniaControl->chat->sendChat('$0f0$<$fff' . $player->nickname . '$> has left the game'); - } - - //Destroys stored PlayerData, after all Disconnect Callbacks got Handled - $this->playerDataManager->destroyPlayerData($player); - } - - /** - * Update PlayerInfo - * - * @param array $callback - */ - public function playerInfoChanged(array $callback) { - $player = $this->getPlayer($callback[1][0]['Login']); - if (!$player) { - return; - } - - $player->ladderRank = $callback[1][0]["LadderRanking"]; - $player->teamId = $callback[1][0]["TeamId"]; - - //Check if the Player is in a Team, to notify if its a TeamMode or not - if ($player->teamId != -1) { - $this->maniaControl->server->setTeamMode(true); - } - - $prevJoinState = $player->hasJoinedGame; - - $player->updatePlayerFlags($callback[1][0]["Flags"]); - $player->updateSpectatorStatus($callback[1][0]["SpectatorStatus"]); - - //Check if Player finished joining the game - if ($player->hasJoinedGame && !$prevJoinState) { - - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_JOIN_LEAVE_MESSAGES) && !$player->isFakePlayer()) { - $string = array(0 => '$0f0Player', 1 => '$0f0Moderator', 2 => '$0f0Admin', 3 => '$0f0SuperAdmin', 4 => '$0f0MasterAdmin'); - $chatMessage = '$0f0' . $string[$player->authLevel] . ' $<$fff' . $player->nickname . '$> Nation: $<$fff' . $player->getCountry() . '$> joined!'; - $this->maniaControl->chat->sendChat($chatMessage); - $this->maniaControl->chat->sendInformation('This server uses ManiaControl v' . ManiaControl::VERSION . '!', $player->login); - } - - $logMessage = "Player joined: {$player->login} / " . Formatter::stripCodes($player->nickname) . " Nation: " . $player->getCountry() . " IP: {$player->ipAddress}"; - $this->maniaControl->log($logMessage); - - // Increment the Player Join Count - $this->maniaControl->statisticManager->incrementStat(self::STAT_JOIN_COUNT, $player, $this->maniaControl->server->index); - - // Trigger own PlayerJoined callback - $this->maniaControl->callbackManager->triggerCallback(self::CB_PLAYERCONNECT, $player); - - } - - // Trigger own callback - $this->maniaControl->callbackManager->triggerCallback(self::CB_PLAYERINFOCHANGED, $player); - } - - - /** - * Get all Players - * - * @return array - */ - public function getPlayers() { - return $this->players; - } - - /** - * Gets the Count of all Player - * - * @return int - */ - public function getPlayerCount() { - $count = 0; - foreach($this->players as $player) { - /** @var Player $player */ - if (!$player->isSpectator) { - $count++; - } - } - return $count; - } - - /** - * Gets the Count of all Spectators - * - * @return int - */ - public function getSpectatorCount() { - $count = 0; - foreach($this->players as $player) { - /** @var Player $player */ - if ($player->isSpectator) { - $count++; - } - } - return $count; - } - - /** - * Gets a Player by his index - * - * @param $index - * @param bool $connectedPlayersOnly - * @return Player|null - */ - public function getPlayerByIndex($index, $connectedPlayersOnly = false) { - foreach($this->players as $player) { - /** @var Player $player */ - if ($player->index == $index) { - return $player; - } - } - - if ($connectedPlayersOnly) { - return null; - } - //Player is not online -> get Player from Database - return $this->getPlayerFromDatabaseByIndex($index); - } - - /** - * Get a Player by Login - * - * @param string $login - * @param bool $connectedPlayersOnly - * @return Player - */ - public function getPlayer($login, $connectedPlayersOnly = false) { - if (!isset($this->players[$login])) { - if ($connectedPlayersOnly) { - return null; - } - return $this->getPlayerFromDatabaseByLogin($login); - } - return $this->players[$login]; - } - /** * Add a player * @@ -330,99 +153,6 @@ class PlayerManager implements CallbackListener, TimerListener { return true; } - /** - * Remove a Player - * - * @param string $login - * @param bool $savePlayedTime - * @return Player $player - */ - private function removePlayer($login, $savePlayedTime = true) { - if (!isset($this->players[$login])) { - return null; - } - $player = $this->players[$login]; - unset($this->players[$login]); - if ($savePlayedTime) { - $this->updatePlayedTime($player); - } - return $player; - } - - - /** - * Get's a Player out of the database - * - * @param $playerIndex - * @return Player $player - */ - private function getPlayerFromDatabaseByIndex($playerIndex) { - $mysqli = $this->maniaControl->database->mysqli; - - if (!is_numeric($playerIndex)) { - return null; - } - - $query = "SELECT * FROM `" . self::TABLE_PLAYERS . "` WHERE `index` = " . $playerIndex . ";"; - $result = $mysqli->query($query); - if (!$result) { - trigger_error($mysqli->error); - return null; - } - - $row = $result->fetch_object(); - $result->close(); - - if (!isset($row)) { - return null; - } - - $player = new Player(null); - $player->index = $playerIndex; - $player->login = $row->login; - $player->rawNickname = $row->nickname; - $player->nickname = Formatter::stripDirtyCodes($player->rawNickname); - $player->path = $row->path; - $player->authLevel = $row->authLevel; - - return $player; - } - - - /** - * Get a Player from the Database - * - * @param string $playerLogin - * @return Player - */ - private function getPlayerFromDatabaseByLogin($playerLogin) { - $mysqli = $this->maniaControl->database->mysqli; - - $query = "SELECT * FROM `" . self::TABLE_PLAYERS . "` WHERE `login` LIKE '" . $mysqli->escape_string($playerLogin) . "';"; - $result = $mysqli->query($query); - if (!$result) { - trigger_error($mysqli->error); - return null; - } - - $row = $result->fetch_object(); - $result->close(); - - if (!isset($row)) { - return null; - } - - $player = new Player(null); - $player->index = $row->index; - $player->login = $row->login; - $player->rawNickname = $row->nickname; - $player->nickname = Formatter::stripDirtyCodes($player->rawNickname); - $player->path = $row->path; - $player->authLevel = $row->authLevel; - - return $player; - } - /** * Save player in Database and fill up Object Properties * @@ -481,6 +211,72 @@ class PlayerManager implements CallbackListener, TimerListener { return true; } + /** + * Handle playerConnect callback + * + * @param array $callback + */ + public function playerConnect(array $callback) { + $login = $callback[1][0]; + try { + $playerInfo = $this->maniaControl->client->getDetailedPlayerInfo($login); + $player = new Player($playerInfo); + + $this->addPlayer($player); + } catch (LoginUnknownException $e) { + } + } + + /** + * Handle playerDisconnect callback + * + * @param array $callback + */ + public function playerDisconnect(array $callback) { + $login = $callback[1][0]; + $player = $this->removePlayer($login); + if (!$player) { + return; + } + + // Trigger own callback + $this->maniaControl->callbackManager->triggerCallback(self::CB_PLAYERDISCONNECT, $player); + + if ($player->isFakePlayer()) { + return; + } + + $played = Formatter::formatTimeH(time() - $player->joinTime); + $logMessage = "Player left: {$player->login} / {$player->nickname} Playtime: {$played}"; + $this->maniaControl->log(Formatter::stripCodes($logMessage)); + + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_JOIN_LEAVE_MESSAGES)) { + $this->maniaControl->chat->sendChat('$0f0$<$fff' . $player->nickname . '$> has left the game'); + } + + //Destroys stored PlayerData, after all Disconnect Callbacks got Handled + $this->playerDataManager->destroyPlayerData($player); + } + + /** + * Remove a Player + * + * @param string $login + * @param bool $savePlayedTime + * @return Player $player + */ + private function removePlayer($login, $savePlayedTime = true) { + if (!isset($this->players[$login])) { + return null; + } + $player = $this->players[$login]; + unset($this->players[$login]); + if ($savePlayedTime) { + $this->updatePlayedTime($player); + } + return $player; + } + /** * Update total played time of the player * @@ -495,4 +291,205 @@ class PlayerManager implements CallbackListener, TimerListener { return $this->maniaControl->statisticManager->insertStat(self::STAT_SERVERTIME, $player, $this->maniaControl->server->index, $playedTime); } + + /** + * Update PlayerInfo + * + * @param array $callback + */ + public function playerInfoChanged(array $callback) { + $player = $this->getPlayer($callback[1][0]['Login']); + if (!$player) { + return; + } + + $player->ladderRank = $callback[1][0]["LadderRanking"]; + $player->teamId = $callback[1][0]["TeamId"]; + + //Check if the Player is in a Team, to notify if its a TeamMode or not + if ($player->teamId != -1) { + $this->maniaControl->server->setTeamMode(true); + } + + $prevJoinState = $player->hasJoinedGame; + + $player->updatePlayerFlags($callback[1][0]["Flags"]); + $player->updateSpectatorStatus($callback[1][0]["SpectatorStatus"]); + + //Check if Player finished joining the game + if ($player->hasJoinedGame && !$prevJoinState) { + + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_JOIN_LEAVE_MESSAGES) && !$player->isFakePlayer()) { + $string = array(0 => '$0f0Player', 1 => '$0f0Moderator', 2 => '$0f0Admin', 3 => '$0f0SuperAdmin', 4 => '$0f0MasterAdmin'); + $chatMessage = '$0f0' . $string[$player->authLevel] . ' $<$fff' . $player->nickname . '$> Nation: $<$fff' . $player->getCountry() . '$> joined!'; + $this->maniaControl->chat->sendChat($chatMessage); + $this->maniaControl->chat->sendInformation('This server uses ManiaControl v' . ManiaControl::VERSION . '!', $player->login); + } + + $logMessage = "Player joined: {$player->login} / " . Formatter::stripCodes($player->nickname) . " Nation: " . $player->getCountry() . " IP: {$player->ipAddress}"; + $this->maniaControl->log($logMessage); + + // Increment the Player Join Count + $this->maniaControl->statisticManager->incrementStat(self::STAT_JOIN_COUNT, $player, $this->maniaControl->server->index); + + // Trigger own PlayerJoined callback + $this->maniaControl->callbackManager->triggerCallback(self::CB_PLAYERCONNECT, $player); + + } + + // Trigger own callback + $this->maniaControl->callbackManager->triggerCallback(self::CB_PLAYERINFOCHANGED, $player); + } + + /** + * Get a Player by Login + * + * @param string $login + * @param bool $connectedPlayersOnly + * @return Player + */ + public function getPlayer($login, $connectedPlayersOnly = false) { + if (!isset($this->players[$login])) { + if ($connectedPlayersOnly) { + return null; + } + return $this->getPlayerFromDatabaseByLogin($login); + } + return $this->players[$login]; + } + + /** + * Get a Player from the Database + * + * @param string $playerLogin + * @return Player + */ + private function getPlayerFromDatabaseByLogin($playerLogin) { + $mysqli = $this->maniaControl->database->mysqli; + + $query = "SELECT * FROM `" . self::TABLE_PLAYERS . "` WHERE `login` LIKE '" . $mysqli->escape_string($playerLogin) . "';"; + $result = $mysqli->query($query); + if (!$result) { + trigger_error($mysqli->error); + return null; + } + + $row = $result->fetch_object(); + $result->close(); + + if (!isset($row)) { + return null; + } + + $player = new Player(null); + $player->index = $row->index; + $player->login = $row->login; + $player->rawNickname = $row->nickname; + $player->nickname = Formatter::stripDirtyCodes($player->rawNickname); + $player->path = $row->path; + $player->authLevel = $row->authLevel; + + return $player; + } + + /** + * Get all Players + * + * @return array + */ + public function getPlayers() { + return $this->players; + } + + /** + * Gets the Count of all Player + * + * @return int + */ + public function getPlayerCount() { + $count = 0; + foreach ($this->players as $player) { + /** @var Player $player */ + if (!$player->isSpectator) { + $count++; + } + } + return $count; + } + + /** + * Gets the Count of all Spectators + * + * @return int + */ + public function getSpectatorCount() { + $count = 0; + foreach ($this->players as $player) { + /** @var Player $player */ + if ($player->isSpectator) { + $count++; + } + } + return $count; + } + + /** + * Gets a Player by his index + * + * @param $index + * @param bool $connectedPlayersOnly + * @return Player|null + */ + public function getPlayerByIndex($index, $connectedPlayersOnly = false) { + foreach ($this->players as $player) { + /** @var Player $player */ + if ($player->index == $index) { + return $player; + } + } + + if ($connectedPlayersOnly) { + return null; + } + //Player is not online -> get Player from Database + return $this->getPlayerFromDatabaseByIndex($index); + } + + /** + * Get's a Player out of the database + * + * @param $playerIndex + * @return Player $player + */ + private function getPlayerFromDatabaseByIndex($playerIndex) { + $mysqli = $this->maniaControl->database->mysqli; + + if (!is_numeric($playerIndex)) { + return null; + } + + $query = "SELECT * FROM `" . self::TABLE_PLAYERS . "` WHERE `index` = " . $playerIndex . ";"; + $result = $mysqli->query($query); + if (!$result) { + trigger_error($mysqli->error); + return null; + } + + $row = $result->fetch_object(); + $result->close(); + + if (!isset($row)) { + return null; + } + + $player = new Player(null); + $player->index = $playerIndex; + $player->login = $row->login; + $player->rawNickname = $row->nickname; + $player->nickname = Formatter::stripDirtyCodes($player->rawNickname); + $player->path = $row->path; + $player->authLevel = $row->authLevel; + + return $player; + } } diff --git a/application/core/Server/Config.php b/application/core/Server/Config.php index 85598c05..bd591165 100644 --- a/application/core/Server/Config.php +++ b/application/core/Server/Config.php @@ -5,9 +5,9 @@ namespace ManiaControl\Server; /** * Model Class holding the Server Config * - * @author steeffeen - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class Config { /* @@ -22,17 +22,17 @@ class Config { /** * Create a new Server Config Instance * - * @param string $id Config Id - * @param string $host Server Ip - * @param string $port Server Port + * @param string $id Config Id + * @param string $host Server Ip + * @param string $port Server Port * @param string $login XmlRpc Login - * @param string $pass XmlRpc Password + * @param string $pass XmlRpc Password */ public function __construct($id = null, $host = null, $port = null, $login = null, $pass = null) { - $this->id = $id; - $this->host = $host; - $this->port = $port; + $this->id = $id; + $this->host = $host; + $this->port = $port; $this->login = $login; - $this->pass = $pass; + $this->pass = $pass; } } diff --git a/application/core/Server/RankingManager.php b/application/core/Server/RankingManager.php index 3c854f24..845f34f3 100644 --- a/application/core/Server/RankingManager.php +++ b/application/core/Server/RankingManager.php @@ -11,8 +11,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\NotInScriptModeException; /** * Class managing Rankings * - * @author kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class RankingManager implements CallbackListener { @@ -42,20 +42,10 @@ class RankingManager implements CallbackListener { public function onInit() { try { $this->maniaControl->client->triggerModeScriptEvent('LibXmlRpc_GetRankings', ''); - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { } } - /** - * Get Rankings - * - * @return array - */ - public function getRankings() { - return $this->rankings; - } - - /** * Handle stats on callbacks (never call this Method) * @@ -65,7 +55,7 @@ class RankingManager implements CallbackListener { $callbackName = $callback[1][0]; //TODO not tested in TrackMania - switch($callbackName) { + switch ($callbackName) { case 'updateRankings': $this->updateRankings($callback[1][1][0]); break; @@ -89,7 +79,7 @@ class RankingManager implements CallbackListener { } $scores = explode(';', $data); - foreach($scores as $player) { + foreach ($scores as $player) { if (strpos($player, ':') !== false) { $tmp = explode(':', $player); $this->rankings[$tmp[0]] = $tmp[1]; @@ -101,6 +91,15 @@ class RankingManager implements CallbackListener { $this->maniaControl->callbackManager->triggerCallback(Callbacks::RANKINGSUPDATED, $this->getRankings()); } + /** + * Get Rankings + * + * @return array + */ + public function getRankings() { + return $this->rankings; + } + /** * Get the Current Leading Players (as Login Array) * @@ -109,7 +108,7 @@ class RankingManager implements CallbackListener { public function getLeaders() { $leaders = array(); $prev = -1; - foreach($this->rankings as $score) { + foreach ($this->rankings as $score) { if ($prev != -1 && $prev < $score) { return $leaders; } diff --git a/application/core/Server/Server.php b/application/core/Server/Server.php index 787d47a3..61036c37 100644 --- a/application/core/Server/Server.php +++ b/application/core/Server/Server.php @@ -4,29 +4,28 @@ namespace ManiaControl\Server; use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackManager; +use ManiaControl\CommandLineHelper; use ManiaControl\ManiaControl; use Maniaplanet\DedicatedServer\Xmlrpc\Exception; -use ManiaControl\CommandLineHelper; /** * Class providing Access to the connected ManiaPlanet Server - * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class Server implements CallbackListener { /* * Constants */ - const TABLE_SERVERS = 'mc_servers'; + const TABLE_SERVERS = 'mc_servers'; const CB_TEAM_MODE_CHANGED = 'ServerCallback.TeamModeChanged'; - + /* * Public Properties */ /** - * * @var Config $config */ public $config = null; @@ -40,7 +39,7 @@ class Server implements CallbackListener { public $serverCommands = null; public $usageReporter = null; public $rankingManager = null; - + /* * Private Properties */ @@ -49,28 +48,55 @@ class Server implements CallbackListener { /** * Construct a new Server - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; $this->initTables(); - + $this->serverCommands = new ServerCommands($maniaControl); - $this->usageReporter = new UsageReporter($maniaControl); + $this->usageReporter = new UsageReporter($maniaControl); $this->rankingManager = new RankingManager($maniaControl); - + // Register for callbacks $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_ONINIT, $this, 'onInit'); } + /** + * Initialize necessary Database Tables + * + * @return bool + */ + private function initTables() { + $mysqli = $this->maniaControl->database->mysqli; + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_SERVERS . "` ( + `index` int(11) NOT NULL AUTO_INCREMENT, + `login` varchar(100) NOT NULL, + PRIMARY KEY (`index`), + UNIQUE KEY `login` (`login`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Servers' AUTO_INCREMENT=1;"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; + } + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error, E_USER_ERROR); + return false; + } + $statement->close(); + return true; + } + /** * Load the Server Configuration from the Config XML */ public function loadConfig() { // Server id parameter $serverId = CommandLineHelper::getParameter('-id'); - + // Xml server tag with given id $serverTag = null; if ($serverId) { @@ -81,8 +107,7 @@ class Server implements CallbackListener { if (!$serverTag) { trigger_error("No Server configured with the ID '{$serverId}'!", E_USER_ERROR); } - } - else { + } else { $serverTags = $this->maniaControl->config->xpath('server'); if ($serverTags) { $serverTag = $serverTags[0]; @@ -91,62 +116,92 @@ class Server implements CallbackListener { trigger_error('No Server configured!', E_USER_ERROR); } } - + // Host $host = $serverTag->xpath('host'); if ($host) { - $host = (string) $host[0]; + $host = (string)$host[0]; } if (!$host) { trigger_error("Invalid server configuration (host).", E_USER_ERROR); } - + // Port $port = $serverTag->xpath('port'); if ($port) { - $port = (string) $port[0]; + $port = (string)$port[0]; } if (!$port) { trigger_error("Invalid server configuration (port).", E_USER_ERROR); } - + // Login $login = $serverTag->xpath('login'); if ($login) { - $login = (string) $login[0]; + $login = (string)$login[0]; } if (!$login) { trigger_error("Invalid server configuration (login).", E_USER_ERROR); } - + // Password $pass = $serverTag->xpath('pass'); if ($pass) { - $pass = (string) $pass[0]; + $pass = (string)$pass[0]; } if (!$pass) { trigger_error("Invalid server configuration (password).", E_USER_ERROR); } - + // Create config object $this->config = new Config($serverId, $host, $port, $login, $pass); } + /** + * Gets all Servers from the Database + * + * @return array + */ + public function getAllServers() { + $mysqli = $this->maniaControl->database->mysqli; + $query = "SELECT * FROM `" . self::TABLE_SERVERS . "`"; + $result = $mysqli->query($query); + if (!$result) { + trigger_error($mysqli->error); + return array(); + } + + $servers = array(); + while ($row = $result->fetch_object()) { + array_push($servers, $row); + } + $result->close(); + + return $servers; + } + + /** + * Handle OnInit Callback + */ + public function onInit() { + $this->updateProperties(); + } + /** * Refetch the Server Properties */ private function updateProperties() { // System info - $systemInfo = $this->maniaControl->client->getSystemInfo(); - $this->ip = $systemInfo->publishedIp; - $this->port = $systemInfo->port; + $systemInfo = $this->maniaControl->client->getSystemInfo(); + $this->ip = $systemInfo->publishedIp; + $this->port = $systemInfo->port; $this->p2pPort = $systemInfo->p2PPort; - $this->login = $systemInfo->serverLogin; + $this->login = $systemInfo->serverLogin; $this->titleId = $systemInfo->titleId; - + // Database index - $mysqli = $this->maniaControl->database->mysqli; - $query = "INSERT INTO `" . self::TABLE_SERVERS . "` ( + $mysqli = $this->maniaControl->database->mysqli; + $query = "INSERT INTO `" . self::TABLE_SERVERS . "` ( `login` ) VALUES ( ? @@ -168,72 +223,15 @@ class Server implements CallbackListener { $statement->close(); } - /** - * Initialize necessary Database Tables - * - * @return bool - */ - private function initTables() { - $mysqli = $this->maniaControl->database->mysqli; - $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_SERVERS . "` ( - `index` int(11) NOT NULL AUTO_INCREMENT, - `login` varchar(100) NOT NULL, - PRIMARY KEY (`index`), - UNIQUE KEY `login` (`login`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Servers' AUTO_INCREMENT=1;"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); - return false; - } - $statement->execute(); - if ($statement->error) { - trigger_error($statement->error, E_USER_ERROR); - return false; - } - $statement->close(); - return true; - } - - /** - * Gets all Servers from the Database - * - * @return array - */ - public function getAllServers() { - $mysqli = $this->maniaControl->database->mysqli; - $query = "SELECT * FROM `" . self::TABLE_SERVERS . "`"; - $result = $mysqli->query($query); - if (!$result) { - trigger_error($mysqli->error); - return array(); - } - - $servers = array(); - while ($row = $result->fetch_object()) { - array_push($servers, $row); - } - $result->close(); - - return $servers; - } - - /** - * Handle OnInit Callback - */ - public function onInit() { - $this->updateProperties(); - } - /** * Set if the Server Runs a Team-Mode or not - * + * * @param bool $teamMode */ public function setTeamMode($teamMode = true) { - $oldStatus = $this->teamMode; + $oldStatus = $this->teamMode; $this->teamMode = $teamMode; - + // Trigger callback if ($oldStatus != $this->teamMode) { $this->maniaControl->callbackManager->triggerCallback(self::CB_TEAM_MODE_CHANGED, $teamMode); @@ -242,28 +240,16 @@ class Server implements CallbackListener { /** * Check if the Server Runs a TeamMode - * + * * @return bool */ public function isTeamMode() { return $this->teamMode; } - /** - * Fetch Game Data Directory - * - * @return string - */ - public function getDataDirectory() { - if ($this->dataDirectory == '') { - $this->dataDirectory = $this->maniaControl->client->gameDataDirectory(); - } - return $this->dataDirectory; - } - /** * Fetch Maps Directory - * + * * @return string */ public function getMapsDirectory() { @@ -274,9 +260,87 @@ class Server implements CallbackListener { return "{$dataDirectory}Maps/"; } + /** + * Fetch Game Data Directory + * + * @return string + */ + public function getDataDirectory() { + if ($this->dataDirectory == '') { + $this->dataDirectory = $this->maniaControl->client->gameDataDirectory(); + } + return $this->dataDirectory; + } + + /** + * Get Server Player Info + * + * @return \Maniaplanet\DedicatedServer\Structures\Player + */ + public function getInfo() { + return $this->maniaControl->client->getMainServerPlayerInfo(); + } + + /** + * Retrieve Validation Replay for the given Player + * + * @param $login + * @return string + */ + public function getValidationReplay($login) { + try { + $replay = $this->maniaControl->client->getValidationReplay($login); + } catch (Exception $e) { + // TODO temp added 19.04.2014 + $this->maniaControl->errorHandler->triggerDebugNotice("Exception line 330 Server.php" . $e->getMessage()); + + trigger_error("Couldn't get validation replay of '{$login}'. " . $e->getMessage()); + return null; + } + return $replay; + } + + /** + * Retrieve Ghost Replay for the given Player + * + * @param $login + * @return string + */ + public function getGhostReplay($login) { + $dataDir = $this->getDataDirectory(); + if (!$this->checkAccess($dataDir)) { + return null; + } + + // Build file name + $map = $this->maniaControl->mapManager->getCurrentMap(); + $gameMode = $this->getGameMode(); + $time = time(); + $fileName = "GhostReplays/Ghost.{$login}.{$gameMode}.{$time}.{$map->uid}.Replay.Gbx"; + + // Save ghost replay + try { + $this->maniaControl->client->saveBestGhostsReplay($login, $fileName); + } catch (Exception $e) { + // TODO temp added 19.04.2014 + $this->maniaControl->errorHandler->triggerDebugNotice("Exception line 360 Server.php" . $e->getMessage()); + + trigger_error("Couldn't save ghost replay. " . $e->getMessage()); + return null; + } + + // Load replay file + $ghostReplay = file_get_contents("{$dataDir}Replays/{$fileName}"); + if (!$ghostReplay) { + trigger_error("Couldn't retrieve saved ghost replay."); + return null; + } + return $ghostReplay; + } + /** * Checks if ManiaControl has Access to the given Directory - * + * * @param string $directory * @return bool */ @@ -287,27 +351,17 @@ class Server implements CallbackListener { return (is_dir($directory) && is_writable($directory)); } - /** - * Get Server Player Info - * - * @return \Maniaplanet\DedicatedServer\Structures\Player - */ - public function getInfo() { - return $this->maniaControl->client->getMainServerPlayerInfo(); - } - /** * Fetch current Game Mode - * + * * @param bool $stringValue - * @param int $parseValue + * @param int $parseValue * @return int | string */ public function getGameMode($stringValue = false, $parseValue = null) { if (is_int($parseValue)) { $gameMode = $parseValue; - } - else { + } else { $gameMode = $this->maniaControl->client->getGameMode(); } if ($stringValue) { @@ -333,68 +387,9 @@ class Server implements CallbackListener { return $gameMode; } - /** - * Retrieve Validation Replay for the given Player - * - * @param $login - * @return string - */ - public function getValidationReplay($login) { - try { - $replay = $this->maniaControl->client->getValidationReplay($login); - } - catch (Exception $e) { - // TODO temp added 19.04.2014 - $this->maniaControl->errorHandler->triggerDebugNotice("Exception line 330 Server.php" . $e->getMessage()); - - trigger_error("Couldn't get validation replay of '{$login}'. " . $e->getMessage()); - return null; - } - return $replay; - } - - /** - * Retrieve Ghost Replay for the given Player - * - * @param $login - * @return string - */ - public function getGhostReplay($login) { - $dataDir = $this->getDataDirectory(); - if (!$this->checkAccess($dataDir)) { - return null; - } - - // Build file name - $map = $this->maniaControl->mapManager->getCurrentMap(); - $gameMode = $this->getGameMode(); - $time = time(); - $fileName = "GhostReplays/Ghost.{$login}.{$gameMode}.{$time}.{$map->uid}.Replay.Gbx"; - - // Save ghost replay - try { - $this->maniaControl->client->saveBestGhostsReplay($login, $fileName); - } - catch (Exception $e) { - // TODO temp added 19.04.2014 - $this->maniaControl->errorHandler->triggerDebugNotice("Exception line 360 Server.php" . $e->getMessage()); - - trigger_error("Couldn't save ghost replay. " . $e->getMessage()); - return null; - } - - // Load replay file - $ghostReplay = file_get_contents("{$dataDir}Replays/{$fileName}"); - if (!$ghostReplay) { - trigger_error("Couldn't retrieve saved ghost replay."); - return null; - } - return $ghostReplay; - } - /** * Wait for the Server to have the given Status - * + * * @param int $statusCode * @return bool */ @@ -405,9 +400,9 @@ class Server implements CallbackListener { return true; } // Server not yet in given status - Wait for it... - $waitBegin = time(); + $waitBegin = time(); $maxWaitTime = 50; - $lastStatus = $response->name; + $lastStatus = $response->name; $this->maniaControl->log("Waiting for server to reach status {$statusCode}..."); $this->maniaControl->log("Current Status: {$lastStatus}"); while ($response->code !== 4) { diff --git a/application/core/Server/ServerCommands.php b/application/core/Server/ServerCommands.php index 5465eaa9..a4041819 100644 --- a/application/core/Server/ServerCommands.php +++ b/application/core/Server/ServerCommands.php @@ -18,8 +18,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\NotInScriptModeException; /** * Class offering various Commands related to the Dedicated Server * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ServerCommands implements CallbackListener, CommandListener, ManialinkPageAnswerListener, TimerListener { @@ -106,11 +106,11 @@ class ServerCommands implements CallbackListener, CommandListener, ManialinkPage //Check if Pause exists in current GameMode try { $scriptInfos = $this->maniaControl->client->getModeScriptInfo(); - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { return; } $pauseExists = false; - foreach($scriptInfos->commandDescs as $param) { + foreach ($scriptInfos->commandDescs as $param) { if ($param->name == "Command_ForceWarmUp") { $pauseExists = true; break; @@ -161,7 +161,7 @@ class ServerCommands implements CallbackListener, CommandListener, ManialinkPage try { $this->maniaControl->client->triggerModeScriptEvent('WarmUp_Extend', '10'); - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { return; } @@ -182,7 +182,7 @@ class ServerCommands implements CallbackListener, CommandListener, ManialinkPage try { $this->maniaControl->client->triggerModeScriptEvent('WarmUp_Stop', ''); - } catch(NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { return; } @@ -192,7 +192,7 @@ class ServerCommands implements CallbackListener, CommandListener, ManialinkPage /** * Pause the current game * - * @param array $callback + * @param array $callback * @param Player $player */ public function setPause(array $callback, Player $player) { @@ -201,8 +201,8 @@ class ServerCommands implements CallbackListener, CommandListener, ManialinkPage return; } try { - $this->maniaControl->client->sendModeScriptCommands(array('Command_ForceWarmUp' => True)); - } catch(NotInScriptModeException $e) { + $this->maniaControl->client->sendModeScriptCommands(array('Command_ForceWarmUp' => true)); + } catch (NotInScriptModeException $e) { return; } @@ -232,6 +232,16 @@ class ServerCommands implements CallbackListener, CommandListener, ManialinkPage } } + /** + * Perform server shutdown + * + * @param string $login + */ + private function shutdownServer($login = '#') { + $this->maniaControl->client->stopServer(); + $this->maniaControl->quit("Server shutdown requested by '{$login}'"); + } + /** * Handle //systeminfo command * @@ -411,14 +421,4 @@ class ServerCommands implements CallbackListener, CommandListener, ManialinkPage $this->maniaControl->client->setMaxSpectators($amount); $this->maniaControl->chat->sendSuccess("Changed max spectators to: {$amount}", $player->login); } - - /** - * Perform server shutdown - * - * @param string $login - */ - private function shutdownServer($login = '#') { - $this->maniaControl->client->stopServer(); - $this->maniaControl->quit("Server shutdown requested by '{$login}'"); - } } diff --git a/application/core/Server/UsageReporter.php b/application/core/Server/UsageReporter.php index ce99517d..feed6914 100644 --- a/application/core/Server/UsageReporter.php +++ b/application/core/Server/UsageReporter.php @@ -11,9 +11,9 @@ use Maniaplanet\DedicatedServer\Xmlrpc\Exception; /** * Class reporting ManiaControl Usage for the Server * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class UsageReporter implements TimerListener { /* @@ -58,9 +58,9 @@ class UsageReporter implements TimerListener { $properties['TitleId'] = $this->maniaControl->server->titleId; $properties['ServerName'] = Formatter::stripDirtyCodes($this->maniaControl->client->getServerName()); - $properties['PlayerCount'] = $this->maniaControl->playerManager->getPlayerCount(); - $properties['MemoryUsage'] = memory_get_usage(); - $properties['MemoryPeakUsage'] = memory_get_peak_usage(); + $properties['PlayerCount'] = $this->maniaControl->playerManager->getPlayerCount(); + $properties['MemoryUsage'] = memory_get_usage(); + $properties['MemoryPeakUsage'] = memory_get_peak_usage(); $maxPlayers = $this->maniaControl->client->getMaxPlayers(); $properties['MaxPlayers'] = $maxPlayers["CurrentValue"]; @@ -68,7 +68,7 @@ class UsageReporter implements TimerListener { try { $scriptName = $this->maniaControl->client->getScriptName(); $properties['ScriptName'] = $scriptName["CurrentValue"]; - } catch(Exception $e) { + } catch (Exception $e) { if ($e->getMessage() == 'Not in script mode.') { $properties['ScriptName'] = ''; } else { @@ -79,7 +79,7 @@ class UsageReporter implements TimerListener { $activePlugins = array(); if (is_array($this->maniaControl->pluginManager->getActivePlugins())) { - foreach($this->maniaControl->pluginManager->getActivePlugins() as $plugin) { + foreach ($this->maniaControl->pluginManager->getActivePlugins() as $plugin) { /** @var Plugin $plugin */ if (!is_null($plugin::getId()) && is_numeric($plugin::getId())) { $activePlugins[] = $plugin::getId(); @@ -93,7 +93,7 @@ class UsageReporter implements TimerListener { $info = base64_encode($json); $self = $this; - $this->maniaControl->fileReader->loadFile(ManiaControl::URL_WEBSERVICE . "/usagereport?info=" . urlencode($info), function ($response, $error) use(&$self){ + $this->maniaControl->fileReader->loadFile(ManiaControl::URL_WEBSERVICE . "/usagereport?info=" . urlencode($info), function ($response, $error) use (&$self) { $response = json_decode($response); if ($error || !$response) { $self->maniaControl->log("Error while Sending data: " . $error); diff --git a/application/core/Settings/SettingManager.php b/application/core/Settings/SettingManager.php index e8c5ce6a..a9d2a60c 100644 --- a/application/core/Settings/SettingManager.php +++ b/application/core/Settings/SettingManager.php @@ -9,23 +9,23 @@ use ManiaControl\Plugins\PluginManager; /** * Class managing Settings and Configurations - * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class SettingManager implements CallbackListener { /* * Constants */ - const TABLE_SETTINGS = 'mc_settings'; - const TYPE_STRING = 'string'; - const TYPE_INT = 'int'; - const TYPE_REAL = 'real'; - const TYPE_BOOL = 'bool'; - const TYPE_ARRAY = 'array'; + const TABLE_SETTINGS = 'mc_settings'; + const TYPE_STRING = 'string'; + const TYPE_INT = 'int'; + const TYPE_REAL = 'real'; + const TYPE_BOOL = 'bool'; + const TYPE_ARRAY = 'array'; const CB_SETTINGS_CHANGED = 'SettingManager.SettingsChanged'; - + /* * Private Properties */ @@ -35,32 +35,25 @@ class SettingManager implements CallbackListener { /** * Construct a new Setting Manager - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; $this->initTables(); - + $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_AFTERINIT, $this, 'handleAfterInit'); } - /** - * Handle After Init Callback - */ - public function handleAfterInit() { - $this->deleteUnusedSettings(); - } - /** * Initialize necessary Database Tables - * + * * @return bool */ private function initTables() { - $mysqli = $this->maniaControl->database->mysqli; - $defaultType = "'" . self::TYPE_STRING . "'"; - $typeSet = $defaultType . ",'" . self::TYPE_INT . "','" . self::TYPE_REAL . "','" . self::TYPE_BOOL . "','" . self::TYPE_ARRAY . "'"; + $mysqli = $this->maniaControl->database->mysqli; + $defaultType = "'" . self::TYPE_STRING . "'"; + $typeSet = $defaultType . ",'" . self::TYPE_INT . "','" . self::TYPE_REAL . "','" . self::TYPE_BOOL . "','" . self::TYPE_ARRAY . "'"; $settingTableQuery = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_SETTINGS . "` ( `index` int(11) NOT NULL AUTO_INCREMENT, `class` varchar(100) NOT NULL, @@ -72,121 +65,63 @@ class SettingManager implements CallbackListener { PRIMARY KEY (`index`), UNIQUE KEY `settingId` (`class`,`setting`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Settings and Configurations' AUTO_INCREMENT=1;"; - $result = $mysqli->query($settingTableQuery); + $result = $mysqli->query($settingTableQuery); if ($mysqli->error) { trigger_error($mysqli->error, E_USER_ERROR); } - + return $result; } /** - * Get Class Name of a Parameter - * - * @param mixed $param - * @return string + * Handle After Init Callback */ - private function getClassName($param) { - if (is_object($param)) { - return get_class($param); - } - if (is_string($param)) { - return $param; - } - trigger_error('Invalid class param. ' . $param); - return (string) $param; + public function handleAfterInit() { + $this->deleteUnusedSettings(); } /** - * Get Type of a Parameter - * - * @param mixed $param - * @return string + * Delete all unused Settings that haven't been initialized during the current Startup + * + * @return bool */ - private function getType($param) { - if (is_int($param)) { - return self::TYPE_INT; + private function deleteUnusedSettings() { + $mysqli = $this->maniaControl->database->mysqli; + $settingQuery = "DELETE FROM `" . self::TABLE_SETTINGS . "` + WHERE `changed` < NOW() - INTERVAL 1 HOUR;"; + $settingStatement = $mysqli->prepare($settingQuery); + if ($mysqli->error) { + trigger_error($mysqli->error); + return false; } - if (is_real($param)) { - return self::TYPE_REAL; + $success = $settingStatement->execute(); + if ($settingStatement->error) { + trigger_error($settingStatement->error); + $settingStatement->close(); + return false; } - if (is_bool($param)) { - return self::TYPE_BOOL; - } - if (is_string($param)) { - return self::TYPE_STRING; - } - if (is_array($param)) { - return self::TYPE_ARRAY; - } - trigger_error('Unsupported setting type. ' . print_r($param, true)); - return null; - } - - /** - * Cast a Setting to the given Type - * - * @param string $type - * @param mixed $value - * @return mixed - */ - private function castSetting($type, $value) { - if ($type === self::TYPE_INT) { - return (int) $value; - } - if ($type === self::TYPE_REAL) { - return (float) $value; - } - if ($type === self::TYPE_BOOL) { - return (bool) $value; - } - if ($type === self::TYPE_STRING) { - return (string) $value; - } - if ($type === self::TYPE_ARRAY) { - return explode($this->arrayDelimiter, $value); - } - trigger_error('Unsupported setting type. ' . print_r($type, true)); - return $value; - } - - /** - * Format a Setting for saving it to the Database - * - * @param mixed $value - * @param string $type - * @return mixed - */ - private function formatSetting($value, $type = null) { - if ($type === null) { - $type = $this->getType($value); - } - if ($type === self::TYPE_ARRAY) { - return implode($this->arrayDelimiter, $value); - } - if ($type === self::TYPE_BOOL) { - return ($value ? 1 : 0); - } - return $value; + $settingStatement->close(); + $this->storedSettings = array(); + return $success; } /** * Initialize a Setting for the given Object - * - * @param mixed $object + * + * @param mixed $object * @param string $settingName - * @param mixed $default + * @param mixed $default * @return bool */ public function initSetting($object, $settingName, $default) { if (is_null($default) || is_object($default)) { return false; } - $className = $this->getClassName($object); - $type = $this->getType($default); - $default = $this->formatSetting($default, $type); - $mysqli = $this->maniaControl->database->mysqli; - $settingQuery = "INSERT INTO `" . self::TABLE_SETTINGS . "` ( + $className = $this->getClassName($object); + $type = $this->getType($default); + $default = $this->formatSetting($default, $type); + $mysqli = $this->maniaControl->database->mysqli; + $settingQuery = "INSERT INTO `" . self::TABLE_SETTINGS . "` ( `class`, `setting`, `type`, @@ -217,18 +152,81 @@ class SettingManager implements CallbackListener { return $success; } + /** + * Get Class Name of a Parameter + * + * @param mixed $param + * @return string + */ + private function getClassName($param) { + if (is_object($param)) { + return get_class($param); + } + if (is_string($param)) { + return $param; + } + trigger_error('Invalid class param. ' . $param); + return (string)$param; + } + + /** + * Get Type of a Parameter + * + * @param mixed $param + * @return string + */ + private function getType($param) { + if (is_int($param)) { + return self::TYPE_INT; + } + if (is_real($param)) { + return self::TYPE_REAL; + } + if (is_bool($param)) { + return self::TYPE_BOOL; + } + if (is_string($param)) { + return self::TYPE_STRING; + } + if (is_array($param)) { + return self::TYPE_ARRAY; + } + trigger_error('Unsupported setting type. ' . print_r($param, true)); + return null; + } + + /** + * Format a Setting for saving it to the Database + * + * @param mixed $value + * @param string $type + * @return mixed + */ + private function formatSetting($value, $type = null) { + if ($type === null) { + $type = $this->getType($value); + } + if ($type === self::TYPE_ARRAY) { + return implode($this->arrayDelimiter, $value); + } + if ($type === self::TYPE_BOOL) { + return ($value ? 1 : 0); + } + return $value; + } + /** * Get a Setting by its Index - * - * @param int $settingIndex + * + * @param int $settingIndex * @param mixed $default * @return mixed */ public function getSettingByIndex($settingIndex, $default = false) { - $mysqli = $this->maniaControl->database->mysqli; + $mysqli = $this->maniaControl->database->mysqli; $settingQuery = "SELECT * FROM `" . self::TABLE_SETTINGS . "` WHERE `index` = {$settingIndex};"; - $result = $mysqli->query($settingQuery); + $result = $mysqli->query($settingQuery); if (!$result) { trigger_error($mysqli->error); return null; @@ -244,22 +242,22 @@ class SettingManager implements CallbackListener { /** * Get Setting by Name for the given Object - * - * @param mixed $object + * + * @param mixed $object * @param string $settingName - * @param mixed $default + * @param mixed $default * @return mixed */ public function getSetting($object, $settingName, $default = null) { $className = $this->getClassName($object); - + // Check if setting is already in the ram if (isset($this->storedSettings[$className . $settingName])) { return $this->storedSettings[$className . $settingName]; } - - $mysqli = $this->maniaControl->database->mysqli; - $settingQuery = "SELECT `type`, `value` FROM `" . self::TABLE_SETTINGS . "` + + $mysqli = $this->maniaControl->database->mysqli; + $settingQuery = "SELECT `type`, `value` FROM `" . self::TABLE_SETTINGS . "` WHERE `class` = ? AND `setting` = ?;"; $settingStatement = $mysqli->prepare($settingQuery); @@ -283,7 +281,7 @@ class SettingManager implements CallbackListener { $settingStatement->free_result(); $settingStatement->close(); $setting = $this->castSetting($type, $value); - + // Store setting in the ram $this->storedSettings[$className . $settingName] = $setting; return $setting; @@ -291,17 +289,17 @@ class SettingManager implements CallbackListener { /** * Set a Setting for the given Object - * - * @param mixed $object + * + * @param mixed $object * @param string $settingName - * @param mixed $value + * @param mixed $value * @return bool */ public function setSetting($object, $settingName, $value) { $className = $this->getClassName($object); - - $mysqli = $this->maniaControl->database->mysqli; - $settingQuery = "UPDATE `" . self::TABLE_SETTINGS . "` + + $mysqli = $this->maniaControl->database->mysqli; + $settingQuery = "UPDATE `" . self::TABLE_SETTINGS . "` SET `value` = ? WHERE `class` = ? AND `setting` = ?;"; @@ -319,25 +317,52 @@ class SettingManager implements CallbackListener { return false; } $settingStatement->close(); - + $this->storedSettings[$className . $settingName] = $value; - + // Trigger settings changed Callback $this->maniaControl->callbackManager->triggerCallback(self::CB_SETTINGS_CHANGED, $className, $settingName, $value); return $success; } + /** + * Cast a Setting to the given Type + * + * @param string $type + * @param mixed $value + * @return mixed + */ + private function castSetting($type, $value) { + if ($type === self::TYPE_INT) { + return (int)$value; + } + if ($type === self::TYPE_REAL) { + return (float)$value; + } + if ($type === self::TYPE_BOOL) { + return (bool)$value; + } + if ($type === self::TYPE_STRING) { + return (string)$value; + } + if ($type === self::TYPE_ARRAY) { + return explode($this->arrayDelimiter, $value); + } + trigger_error('Unsupported setting type. ' . print_r($type, true)); + return $value; + } + /** * Reset a Setting to its default Value - * - * @param mixed $object + * + * @param mixed $object * @param string $settingName * @return bool */ public function resetSetting($object, $settingName) { - $className = $this->getClassName($object); - $mysqli = $this->maniaControl->database->mysqli; - $settingQuery = "UPDATE `" . self::TABLE_SETTINGS . "` + $className = $this->getClassName($object); + $mysqli = $this->maniaControl->database->mysqli; + $settingQuery = "UPDATE `" . self::TABLE_SETTINGS . "` SET `value` = `default` WHERE `class` = ? AND `setting` = ?;"; @@ -362,15 +387,15 @@ class SettingManager implements CallbackListener { /** * Delete a Setting - * - * @param mixed $object + * + * @param mixed $object * @param string $settingName * @return bool */ public function deleteSetting($object, $settingName) { - $className = $this->getClassName($object); - $mysqli = $this->maniaControl->database->mysqli; - $settingQuery = "DELETE FROM `" . self::TABLE_SETTINGS . "` + $className = $this->getClassName($object); + $mysqli = $this->maniaControl->database->mysqli; + $settingQuery = "DELETE FROM `" . self::TABLE_SETTINGS . "` WHERE `class` = ? AND `setting` = ?;"; $settingStatement = $mysqli->prepare($settingQuery); @@ -394,16 +419,16 @@ class SettingManager implements CallbackListener { /** * Get all Settings for the given Class - * + * * @param mixed $object * @return array */ public function getSettingsByClass($object) { $className = $this->getClassName($object); - $mysqli = $this->maniaControl->database->mysqli; - $query = "SELECT * FROM `" . self::TABLE_SETTINGS . "` WHERE `class` = '" . $mysqli->escape_string($className) . "' + $mysqli = $this->maniaControl->database->mysqli; + $query = "SELECT * FROM `" . self::TABLE_SETTINGS . "` WHERE `class` = '" . $mysqli->escape_string($className) . "' ORDER BY `setting` ASC;"; - $result = $mysqli->query($query); + $result = $mysqli->query($query); if ($mysqli->error) { trigger_error($mysqli->error); return null; @@ -418,12 +443,12 @@ class SettingManager implements CallbackListener { /** * Get all settings - * + * * @return array */ public function getSettings() { $mysqli = $this->maniaControl->database->mysqli; - $query = "SELECT * FROM `" . self::TABLE_SETTINGS . "` + $query = "SELECT * FROM `" . self::TABLE_SETTINGS . "` ORDER BY `class` ASC, `setting` ASC;"; $result = $mysqli->query($query); if ($mysqli->error) { @@ -446,7 +471,7 @@ class SettingManager implements CallbackListener { */ public function getSettingClasses($hidePluginClasses = false) { $mysqli = $this->maniaControl->database->mysqli; - $query = "SELECT DISTINCT `class` FROM `" . self::TABLE_SETTINGS . "` + $query = "SELECT DISTINCT `class` FROM `" . self::TABLE_SETTINGS . "` ORDER BY `class` ASC;"; $result = $mysqli->query($query); if ($mysqli->error) { @@ -462,29 +487,4 @@ class SettingManager implements CallbackListener { $result->free(); return $settingClasses; } - - /** - * Delete all unused Settings that haven't been initialized during the current Startup - * - * @return bool - */ - private function deleteUnusedSettings() { - $mysqli = $this->maniaControl->database->mysqli; - $settingQuery = "DELETE FROM `" . self::TABLE_SETTINGS . "` - WHERE `changed` < NOW() - INTERVAL 1 HOUR;"; - $settingStatement = $mysqli->prepare($settingQuery); - if ($mysqli->error) { - trigger_error($mysqli->error); - return false; - } - $success = $settingStatement->execute(); - if ($settingStatement->error) { - trigger_error($settingStatement->error); - $settingStatement->close(); - return false; - } - $settingStatement->close(); - $this->storedSettings = array(); - return $success; - } } diff --git a/application/core/Statistics/SimpleStatsList.php b/application/core/Statistics/SimpleStatsList.php index 843af240..a4fdc687 100644 --- a/application/core/Statistics/SimpleStatsList.php +++ b/application/core/Statistics/SimpleStatsList.php @@ -23,10 +23,10 @@ use ManiaControl\Players\PlayerManager; /** * Simple Stats List Class - * - * @author kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, CommandListener { /* @@ -82,17 +82,6 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, $this->registerStat(StatisticManager::SPECIAL_STAT_HITS_PH, 85, "H/h", 15, StatisticManager::STAT_TYPE_FLOAT); } - /** - * Show the stat List - * - * @param array $callback - * @param Player $player - */ - public function command_ShowStatsList(array $callback, Player $player) { - $this->showStatsList($player); - } - - /** * Register a Certain Stat * @@ -111,6 +100,15 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, $this->statsWidth += $width; } + /** + * Show the stat List + * + * @param array $callback + * @param Player $player + */ + public function command_ShowStatsList(array $callback, Player $player) { + $this->showStatsList($player); + } /** * Show the StatsList Widget to the Player @@ -174,7 +172,7 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, //Compute Headline $x = $xStart + 55; $statRankings = array(); - foreach($this->statArray as $key => $stat) { + foreach ($this->statArray as $key => $stat) { $ranking = $this->maniaControl->statisticManager->getStatsRanking($stat["Name"]); if (!empty($ranking)) { $statRankings[$stat["Name"]] = $ranking; @@ -189,16 +187,16 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, //Description Label $i = 2; - foreach($this->statArray as $statArray) { + foreach ($this->statArray as $statArray) { if (!isset($labels[$i])) { break; } /** @var Label_Text $label [] */ - $label = $labels[$i]; + $label = $labels[$i]; $label->setAction(self::ACTION_SORT_STATS . '.' . $statArray["Name"]); - $label->addTooltipLabelFeature($descriptionLabel, '$o '.$statArray["Name"]); + $label->addTooltipLabelFeature($descriptionLabel, '$o ' . $statArray["Name"]); $i++; } @@ -214,7 +212,7 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, return; } - foreach($statRankings[$order] as $playerId => $value) { + foreach ($statRankings[$order] as $playerId => $value) { $listPlayer = $this->maniaControl->playerManager->getPlayerByIndex($playerId); if ($i == 15) { break; @@ -235,7 +233,7 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, $displayArray = array(); - foreach($this->statArray as $stat) { + foreach ($this->statArray as $stat) { $statValue = 0; if (isset($statRankings[$stat['Name']][$playerId])) { $statValue = $statRankings[$stat['Name']][$playerId]; @@ -254,7 +252,7 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, $x = $xStart + 55; - foreach($displayArray as $key => $array) { + foreach ($displayArray as $key => $array) { $label = new Label_Text(); $playerFrame->add($label); $label->setHAlign($hAlign); @@ -263,7 +261,7 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, $label->setTextSize($textSize); $label->setText($array['Value']); $label->setTextColor($textColor); - $label->addTooltipLabelFeature($descriptionLabel, '$o '.$key); + $label->addTooltipLabelFeature($descriptionLabel, '$o ' . $key); $x += $array['Width']; } @@ -301,7 +299,7 @@ class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener, $action = $actionArray[0] . "." . $actionArray[1]; - switch($action) { + switch ($action) { case self::ACTION_SORT_STATS: $playerLogin = $callback[1][1]; $player = $this->maniaControl->playerManager->getPlayer($playerLogin); diff --git a/application/core/Statistics/StatisticCollector.php b/application/core/Statistics/StatisticCollector.php index 61227105..a681c950 100644 --- a/application/core/Statistics/StatisticCollector.php +++ b/application/core/Statistics/StatisticCollector.php @@ -11,9 +11,9 @@ use ManiaControl\Players\PlayerManager; /** * Statistic Collector Class * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class StatisticCollector implements CallbackListener { /* @@ -115,93 +115,12 @@ class StatisticCollector implements CallbackListener { $leaders = $this->maniaControl->server->rankingManager->getLeaders(); - foreach($leaders as $leaderLogin) { + foreach ($leaders as $leaderLogin) { $leader = $this->maniaControl->playerManager->getPlayer($leaderLogin); $this->maniaControl->statisticManager->incrementStat(self::STAT_MAP_WINS, $leader); } } - /** - * Handle Player Shots - * - * @param string $login - * @param int $weaponNumber - */ - private function handleOnShoot($login, $weaponNumber) { - if (!isset($this->onShootArray[$login])) { - $this->onShootArray[$login] = array(self::WEAPON_ROCKET => 0, self::WEAPON_ARROW => 0, self::WEAPON_NUCLEUS => 0, self::WEAPON_LASER => 0); - $this->onShootArray[$login][$weaponNumber]++; - } else { - $this->onShootArray[$login][$weaponNumber]++; - } - - //Write Shoot Data into database - if (array_sum($this->onShootArray[$login]) > $this->maniaControl->settingManager->getSetting($this, self::SETTING_ON_SHOOT_PRESTORE)) { - $player = $this->maniaControl->playerManager->getPlayer($login); - - $rocketShots = $this->onShootArray[$login][self::WEAPON_ROCKET]; - $laserShots = $this->onShootArray[$login][self::WEAPON_LASER]; - $arrowShots = $this->onShootArray[$login][self::WEAPON_ARROW]; - $nucleusShots = $this->onShootArray[$login][self::WEAPON_NUCLEUS]; - - if ($rocketShots > 0) { - $this->maniaControl->statisticManager->insertStat(self::STAT_ROCKET_SHOT, $player, $this->maniaControl->server->index, $rocketShots); - $this->onShootArray[$login][self::WEAPON_ROCKET] = 0; - } - if ($laserShots > 0) { - $this->maniaControl->statisticManager->insertStat(self::STAT_LASER_SHOT, $player, $this->maniaControl->server->index, $laserShots); - $this->onShootArray[$login][self::WEAPON_LASER] = 0; - } - if ($arrowShots > 0) { - $this->maniaControl->statisticManager->insertStat(self::STAT_ARROW_SHOT, $player, $this->maniaControl->server->index, $arrowShots); - $this->onShootArray[$login][self::WEAPON_ARROW] = 0; - } - if ($nucleusShots > 0) { - $this->maniaControl->statisticManager->insertStat(self::STAT_NUCLEUS_SHOT, $player, $this->maniaControl->server->index, $nucleusShots); - $this->onShootArray[$login][self::WEAPON_NUCLEUS] = 0; - } - - $this->maniaControl->statisticManager->insertStat(self::STAT_ON_SHOOT, $player, $this->maniaControl->server->index, $rocketShots + $laserShots + $arrowShots + $nucleusShots); - } - } - - /** - * Get the Weapon stat - * - * @param int $weaponNumber - * @param bool $shot - * @return string - */ - private function getWeaponStat($weaponNumber, $shot = true) { - if ($shot) { - switch($weaponNumber) { - case self::WEAPON_ROCKET: - return self::STAT_ROCKET_SHOT; - case self::WEAPON_LASER: - return self::STAT_LASER_SHOT; - case self::WEAPON_ARROW: - return self::STAT_ARROW_SHOT; - case self::WEAPON_NUCLEUS: - return self::STAT_NUCLEUS_SHOT; - default: - return -1; - } - } else { - switch($weaponNumber) { - case self::WEAPON_ROCKET: - return self::STAT_ROCKET_HIT; - case self::WEAPON_LASER: - return self::STAT_LASER_HIT; - case self::WEAPON_ARROW: - return self::STAT_ARROW_HIT; - case self::WEAPON_NUCLEUS: - return self::STAT_NUCLEUS_HIT; - default: - return -1; - } - } - } - /** * Insert OnShoot Statistic when a player leaves * @@ -240,7 +159,7 @@ class StatisticCollector implements CallbackListener { $callbackName = $callback[1][0]; - switch($callbackName) { + switch ($callbackName) { case 'LibXmlRpc_OnShoot': $this->handleOnShoot($callback[1][1][0], $callback[1][1][1]); break; @@ -263,7 +182,7 @@ class StatisticCollector implements CallbackListener { case 'LibXmlRpc_OnCapture': $logins = $callback[1][1][0]; $logins = explode(';', $logins); - foreach($logins as $login) { + foreach ($logins as $login) { $player = $this->maniaControl->playerManager->getPlayer($login); if (!$player) { continue; @@ -335,11 +254,92 @@ class StatisticCollector implements CallbackListener { $paramsObject = json_decode($callback[1][1]); $durationTime = (int)(($paramsObject->EndTime - $paramsObject->StartTime) / 1000); $scoresTable = $paramsObject->ScoresTable; - foreach($scoresTable as $score) { + foreach ($scoresTable as $score) { $player = $this->maniaControl->playerManager->getPlayer($score->Login); $this->maniaControl->statisticManager->insertStat(self::STAT_PLAYTIME, $player, -1, $durationTime); } break; } } + + /** + * Handle Player Shots + * + * @param string $login + * @param int $weaponNumber + */ + private function handleOnShoot($login, $weaponNumber) { + if (!isset($this->onShootArray[$login])) { + $this->onShootArray[$login] = array(self::WEAPON_ROCKET => 0, self::WEAPON_ARROW => 0, self::WEAPON_NUCLEUS => 0, self::WEAPON_LASER => 0); + $this->onShootArray[$login][$weaponNumber]++; + } else { + $this->onShootArray[$login][$weaponNumber]++; + } + + //Write Shoot Data into database + if (array_sum($this->onShootArray[$login]) > $this->maniaControl->settingManager->getSetting($this, self::SETTING_ON_SHOOT_PRESTORE)) { + $player = $this->maniaControl->playerManager->getPlayer($login); + + $rocketShots = $this->onShootArray[$login][self::WEAPON_ROCKET]; + $laserShots = $this->onShootArray[$login][self::WEAPON_LASER]; + $arrowShots = $this->onShootArray[$login][self::WEAPON_ARROW]; + $nucleusShots = $this->onShootArray[$login][self::WEAPON_NUCLEUS]; + + if ($rocketShots > 0) { + $this->maniaControl->statisticManager->insertStat(self::STAT_ROCKET_SHOT, $player, $this->maniaControl->server->index, $rocketShots); + $this->onShootArray[$login][self::WEAPON_ROCKET] = 0; + } + if ($laserShots > 0) { + $this->maniaControl->statisticManager->insertStat(self::STAT_LASER_SHOT, $player, $this->maniaControl->server->index, $laserShots); + $this->onShootArray[$login][self::WEAPON_LASER] = 0; + } + if ($arrowShots > 0) { + $this->maniaControl->statisticManager->insertStat(self::STAT_ARROW_SHOT, $player, $this->maniaControl->server->index, $arrowShots); + $this->onShootArray[$login][self::WEAPON_ARROW] = 0; + } + if ($nucleusShots > 0) { + $this->maniaControl->statisticManager->insertStat(self::STAT_NUCLEUS_SHOT, $player, $this->maniaControl->server->index, $nucleusShots); + $this->onShootArray[$login][self::WEAPON_NUCLEUS] = 0; + } + + $this->maniaControl->statisticManager->insertStat(self::STAT_ON_SHOOT, $player, $this->maniaControl->server->index, $rocketShots + $laserShots + $arrowShots + $nucleusShots); + } + } + + /** + * Get the Weapon stat + * + * @param int $weaponNumber + * @param bool $shot + * @return string + */ + private function getWeaponStat($weaponNumber, $shot = true) { + if ($shot) { + switch ($weaponNumber) { + case self::WEAPON_ROCKET: + return self::STAT_ROCKET_SHOT; + case self::WEAPON_LASER: + return self::STAT_LASER_SHOT; + case self::WEAPON_ARROW: + return self::STAT_ARROW_SHOT; + case self::WEAPON_NUCLEUS: + return self::STAT_NUCLEUS_SHOT; + default: + return -1; + } + } else { + switch ($weaponNumber) { + case self::WEAPON_ROCKET: + return self::STAT_ROCKET_HIT; + case self::WEAPON_LASER: + return self::STAT_LASER_HIT; + case self::WEAPON_ARROW: + return self::STAT_ARROW_HIT; + case self::WEAPON_NUCLEUS: + return self::STAT_NUCLEUS_HIT; + default: + return -1; + } + } + } } \ No newline at end of file diff --git a/application/core/Statistics/StatisticManager.php b/application/core/Statistics/StatisticManager.php index 7b9e06d9..59201ff3 100644 --- a/application/core/Statistics/StatisticManager.php +++ b/application/core/Statistics/StatisticManager.php @@ -8,9 +8,9 @@ use ManiaControl\Players\Player; /** * Statistic Manager Class * - * @author steeffeen & kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class StatisticManager { /* @@ -59,229 +59,55 @@ class StatisticManager { } /** - * Get the value of an statistic + * Initialize necessary database tables * - * @param $statName - * @param $playerId - * @param int $serverIndex - * @return int + * @return bool */ - public function getStatisticData($statName, $playerId, $serverIndex = -1) { - //Handle Special Stats - switch($statName) { - case self::SPECIAL_STAT_KD_RATIO: - $kills = $this->getStatisticData(StatisticCollector::STAT_ON_KILL, $playerId, $serverIndex); - $deaths = $this->getStatisticData(StatisticCollector::STAT_ON_DEATH, $playerId, $serverIndex); - if ($deaths == 0) { - return -1; - } - return intval($kills) / intval($deaths); - case self::SPECIAL_STAT_HITS_PH: - $hits = $this->getStatisticData(StatisticCollector::STAT_ON_HIT, $playerId, $serverIndex); - $time = $this->getStatisticData(StatisticCollector::STAT_PLAYTIME, $playerId, $serverIndex); - if ($time == 0) { - return -1; - } - return intval($hits) / (intval($time) / 3600); - case self::SPECIAL_STAT_ARROW_ACC: - $hits = $this->getStatisticData(StatisticCollector::STAT_ARROW_HIT, $playerId, $serverIndex); - $shots = $this->getStatisticData(StatisticCollector::STAT_ARROW_SHOT, $playerId, $serverIndex); - if ($shots == 0) { - return -1; - } - return intval($hits) / intval($shots); - case self::SPECIAL_STAT_LASER_ACC: - $hits = $this->getStatisticData(StatisticCollector::STAT_LASER_HIT, $playerId, $serverIndex); - $shots = $this->getStatisticData(StatisticCollector::STAT_LASER_SHOT, $playerId, $serverIndex); - if ($shots == 0) { - return -1; - } - return intval($hits) / intval($shots); - case self::SPECIAL_STAT_NUCLEUS_ACC: - $hits = $this->getStatisticData(StatisticCollector::STAT_NUCLEUS_HIT, $playerId, $serverIndex); - $shots = $this->getStatisticData(StatisticCollector::STAT_NUCLEUS_SHOT, $playerId, $serverIndex); - if ($shots == 0) { - return -1; - } - return intval($hits) / intval($shots); - case self::SPECIAL_STAT_ROCKET_ACC: - $hits = $this->getStatisticData(StatisticCollector::STAT_ROCKET_HIT, $playerId, $serverIndex); - $shots = $this->getStatisticData(StatisticCollector::STAT_ROCKET_SHOT, $playerId, $serverIndex); - if ($shots == 0) { - return -1; - } - return intval($hits) / intval($shots); + private function initTables() { + $mysqli = $this->maniaControl->database->mysqli; + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_STATMETADATA . "` ( + `index` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL, + `type` int(5) NOT NULL, + `description` varchar(150) NOT NULL, + PRIMARY KEY (`index`), + UNIQUE KEY `name` (`name`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Statistics Meta Data' AUTO_INCREMENT=1;"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; } - - $mysqli = $this->maniaControl->database->mysqli; - $statId = $this->getStatId($statName); - - if (!$statId) return -1; - - if ($serverIndex == -1) { - $query = "SELECT SUM(value) as value FROM `" . self::TABLE_STATISTICS . "` WHERE `statId` = " . $statId . " AND `playerId` = " . $playerId . ";"; - } else { - $query = "SELECT value FROM `" . self::TABLE_STATISTICS . "` WHERE `statId` = " . $statId . " AND `playerId` = " . $playerId . " AND `serverIndex` = '" . $serverIndex . "';"; + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error, E_USER_ERROR); + return false; } + $statement->close(); - $result = $mysqli->query($query); - if (!$result) { - trigger_error($mysqli->error); - return -1; + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_STATISTICS . "` ( + `index` int(11) NOT NULL AUTO_INCREMENT, + `serverIndex` int(11) NOT NULL, + `playerId` int(11) NOT NULL, + `statId` int(11) NOT NULL, + `value` int(20) NOT NULL DEFAULT '0', + PRIMARY KEY (`index`), + UNIQUE KEY `unique` (`statId`,`playerId`,`serverIndex`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Statistics' AUTO_INCREMENT=1;"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; } - - $row = $result->fetch_object(); - - $result->close(); - return $row->value; + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error, E_USER_ERROR); + return false; + } + $statement->close(); + return true; } - /** - * Get All statistics ordered by an given name - * - * @param string $statName - * @param $serverIndex - * @param $minValue - * @internal param $orderedBy - * @return array - */ - public function getStatsRanking($statName = '', $serverIndex = -1, $minValue = -1) { - if (isset($this->specialStats[$statName])) { - return $this->getStatsRankingOfSpecialStat($statName, $serverIndex); - } - - $mysqli = $this->maniaControl->database->mysqli; - $statId = $this->getStatId($statName); - - if ($minValue == -1) { - $query = "SELECT playerId, serverIndex, value FROM `" . self::TABLE_STATISTICS . "` WHERE statId = " . $statId . " ORDER BY value DESC;"; - } else { - $query = "SELECT playerId, serverIndex, value FROM `" . self::TABLE_STATISTICS . "` WHERE statId = " . $statId . " AND value >= " . $minValue . " ORDER BY value DESC;"; - } - - $result = $mysqli->query($query); - if (!$result) { - trigger_error($mysqli->error); - return null; - } - - $stats = array(); - while($row = $result->fetch_object()) { - if ($serverIndex == -1) { - if (!isset($stats[$row->playerId])) { - $stats[$row->playerId] = $row->value; - } else { - $stats[$row->playerId] += $row->value; - } - } else if ($serverIndex == $row->serverIndex) { - $stats[$row->playerId] = $row->value; - } - } - - arsort($stats); - $result->close(); - return $stats; - } - - /** - * Gets The Ranking of an Special Stat - * - * @param string $statName - * @param $serverIndex - * @return array - */ - public function getStatsRankingOfSpecialStat($statName = '', $serverIndex = -1) { - $statsArray = array(); - switch($statName) { - case self::SPECIAL_STAT_KD_RATIO: - $kills = $this->getStatsRanking(StatisticCollector::STAT_ON_KILL, $serverIndex); - $deaths = $this->getStatsRanking(StatisticCollector::STAT_ON_DEATH, $serverIndex); - if(!$kills || !$deaths){ - return array(); - } - foreach($deaths as $key => $death) { - if ($death == 0 || !isset($kills[$key])) { - continue; - } - $statsArray[$key] = intval($kills[$key]) / intval($death); - } - arsort($statsArray); - break; - case self::SPECIAL_STAT_HITS_PH: - $hits = $this->getStatsRanking(StatisticCollector::STAT_ON_HIT, $serverIndex); - $times = $this->getStatsRanking(StatisticCollector::STAT_PLAYTIME, $serverIndex); - if(!$hits || !$times){ - return array(); - } - foreach($times as $key => $time) { - if ($time == 0 || !isset($hits[$key])) { - continue; - } - $statsArray[$key] = intval($hits[$key]) / (intval($time) / 3600); - } - arsort($statsArray); - break; - case self::SPECIAL_STAT_ARROW_ACC: - $hits = $this->getStatsRanking(StatisticCollector::STAT_ARROW_HIT, $serverIndex); - $shots = $this->getStatsRanking(StatisticCollector::STAT_ARROW_SHOT, $serverIndex); - if(!$hits || !$shots){ - return array(); - } - foreach($shots as $key => $shot) { - if ($shot == 0 || !isset($hits[$key])) { - continue; - } - $statsArray[$key] = intval($hits[$key]) / (intval($shot)); - } - arsort($statsArray); - break; - case self::SPECIAL_STAT_LASER_ACC: - $hits = $this->getStatsRanking(StatisticCollector::STAT_LASER_HIT, $serverIndex); - $shots = $this->getStatsRanking(StatisticCollector::STAT_LASER_SHOT, $serverIndex); - if(!$hits || !$shots){ - return array(); - } - foreach($shots as $key => $shot) { - if ($shot == 0 || !isset($hits[$key])) { - continue; - } - $statsArray[$key] = intval($hits[$key]) / (intval($shot)); - } - arsort($statsArray); - break; - case self::SPECIAL_STAT_ROCKET_ACC: - $hits = $this->getStatsRanking(StatisticCollector::STAT_ROCKET_HIT, $serverIndex); - $shots = $this->getStatsRanking(StatisticCollector::STAT_ROCKET_SHOT, $serverIndex); - if(!$hits || !$shots){ - return array(); - } - foreach($shots as $key => $shot) { - if ($shot == 0 || !isset($hits[$key])) { - continue; - } - $statsArray[$key] = intval($hits[$key]) / (intval($shot)); - } - arsort($statsArray); - break; - case self::SPECIAL_STAT_NUCLEUS_ACC: - $hits = $this->getStatsRanking(StatisticCollector::STAT_NUCLEUS_HIT, $serverIndex); - $shots = $this->getStatsRanking(StatisticCollector::STAT_NUCLEUS_SHOT, $serverIndex); - if(!$hits || !$shots){ - return array(); - } - foreach($shots as $key => $shot) { - if ($shot == 0 || !isset($hits[$key])) { - continue; - } - $statsArray[$key] = intval($hits[$key]) / (intval($shot)); - } - arsort($statsArray); - break; - } - return $statsArray; - } - - /** * Store Stats Meta Data from the Database */ @@ -295,13 +121,13 @@ class StatisticManager { return; } - while($row = $result->fetch_object()) { + while ($row = $result->fetch_object()) { $this->stats[$row->name] = $row; } $result->close(); - + // TODO: own model class - + //Define Special Stat Kill / Death Ratio $stat = new \stdClass(); $stat->name = self::SPECIAL_STAT_KD_RATIO; @@ -339,6 +165,151 @@ class StatisticManager { $this->specialStats[self::SPECIAL_STAT_ROCKET_ACC] = $stat; } + /** + * Get All statistics ordered by an given name + * + * @param string $statName + * @param $serverIndex + * @param $minValue + * @internal param $orderedBy + * @return array + */ + public function getStatsRanking($statName = '', $serverIndex = -1, $minValue = -1) { + if (isset($this->specialStats[$statName])) { + return $this->getStatsRankingOfSpecialStat($statName, $serverIndex); + } + + $mysqli = $this->maniaControl->database->mysqli; + $statId = $this->getStatId($statName); + + if ($minValue == -1) { + $query = "SELECT playerId, serverIndex, value FROM `" . self::TABLE_STATISTICS . "` WHERE statId = " . $statId . " ORDER BY value DESC;"; + } else { + $query = "SELECT playerId, serverIndex, value FROM `" . self::TABLE_STATISTICS . "` WHERE statId = " . $statId . " AND value >= " . $minValue . " ORDER BY value DESC;"; + } + + $result = $mysqli->query($query); + if (!$result) { + trigger_error($mysqli->error); + return null; + } + + $stats = array(); + while ($row = $result->fetch_object()) { + if ($serverIndex == -1) { + if (!isset($stats[$row->playerId])) { + $stats[$row->playerId] = $row->value; + } else { + $stats[$row->playerId] += $row->value; + } + } else if ($serverIndex == $row->serverIndex) { + $stats[$row->playerId] = $row->value; + } + } + + arsort($stats); + $result->close(); + return $stats; + } + + /** + * Gets The Ranking of an Special Stat + * + * @param string $statName + * @param $serverIndex + * @return array + */ + public function getStatsRankingOfSpecialStat($statName = '', $serverIndex = -1) { + $statsArray = array(); + switch ($statName) { + case self::SPECIAL_STAT_KD_RATIO: + $kills = $this->getStatsRanking(StatisticCollector::STAT_ON_KILL, $serverIndex); + $deaths = $this->getStatsRanking(StatisticCollector::STAT_ON_DEATH, $serverIndex); + if (!$kills || !$deaths) { + return array(); + } + foreach ($deaths as $key => $death) { + if ($death == 0 || !isset($kills[$key])) { + continue; + } + $statsArray[$key] = intval($kills[$key]) / intval($death); + } + arsort($statsArray); + break; + case self::SPECIAL_STAT_HITS_PH: + $hits = $this->getStatsRanking(StatisticCollector::STAT_ON_HIT, $serverIndex); + $times = $this->getStatsRanking(StatisticCollector::STAT_PLAYTIME, $serverIndex); + if (!$hits || !$times) { + return array(); + } + foreach ($times as $key => $time) { + if ($time == 0 || !isset($hits[$key])) { + continue; + } + $statsArray[$key] = intval($hits[$key]) / (intval($time) / 3600); + } + arsort($statsArray); + break; + case self::SPECIAL_STAT_ARROW_ACC: + $hits = $this->getStatsRanking(StatisticCollector::STAT_ARROW_HIT, $serverIndex); + $shots = $this->getStatsRanking(StatisticCollector::STAT_ARROW_SHOT, $serverIndex); + if (!$hits || !$shots) { + return array(); + } + foreach ($shots as $key => $shot) { + if ($shot == 0 || !isset($hits[$key])) { + continue; + } + $statsArray[$key] = intval($hits[$key]) / (intval($shot)); + } + arsort($statsArray); + break; + case self::SPECIAL_STAT_LASER_ACC: + $hits = $this->getStatsRanking(StatisticCollector::STAT_LASER_HIT, $serverIndex); + $shots = $this->getStatsRanking(StatisticCollector::STAT_LASER_SHOT, $serverIndex); + if (!$hits || !$shots) { + return array(); + } + foreach ($shots as $key => $shot) { + if ($shot == 0 || !isset($hits[$key])) { + continue; + } + $statsArray[$key] = intval($hits[$key]) / (intval($shot)); + } + arsort($statsArray); + break; + case self::SPECIAL_STAT_ROCKET_ACC: + $hits = $this->getStatsRanking(StatisticCollector::STAT_ROCKET_HIT, $serverIndex); + $shots = $this->getStatsRanking(StatisticCollector::STAT_ROCKET_SHOT, $serverIndex); + if (!$hits || !$shots) { + return array(); + } + foreach ($shots as $key => $shot) { + if ($shot == 0 || !isset($hits[$key])) { + continue; + } + $statsArray[$key] = intval($hits[$key]) / (intval($shot)); + } + arsort($statsArray); + break; + case self::SPECIAL_STAT_NUCLEUS_ACC: + $hits = $this->getStatsRanking(StatisticCollector::STAT_NUCLEUS_HIT, $serverIndex); + $shots = $this->getStatsRanking(StatisticCollector::STAT_NUCLEUS_SHOT, $serverIndex); + if (!$hits || !$shots) { + return array(); + } + foreach ($shots as $key => $shot) { + if ($shot == 0 || !isset($hits[$key])) { + continue; + } + $statsArray[$key] = intval($hits[$key]) / (intval($shot)); + } + arsort($statsArray); + break; + } + return $statsArray; + } + /** * Return the Stat Id * @@ -363,13 +334,13 @@ class StatisticManager { public function getAllPlayerStats(Player $player, $serverIndex = -1) { // TODO improve performance of the foreach $playerStats = array(); - foreach($this->stats as $stat) { + foreach ($this->stats as $stat) { $value = $this->getStatisticData($stat->name, $player->index, $serverIndex); $playerStats[$stat->name] = array($stat, $value); } - foreach($this->specialStats as $stat) { - switch($stat->name) { + foreach ($this->specialStats as $stat) { + switch ($stat->name) { case self::SPECIAL_STAT_KD_RATIO: if (!isset($playerStats[StatisticCollector::STAT_ON_KILL]) || !isset($playerStats[StatisticCollector::STAT_ON_DEATH])) { continue; @@ -441,6 +412,98 @@ class StatisticManager { return $playerStats; } + /** + * Get the value of an statistic + * + * @param $statName + * @param $playerId + * @param int $serverIndex + * @return int + */ + public function getStatisticData($statName, $playerId, $serverIndex = -1) { + //Handle Special Stats + switch ($statName) { + case self::SPECIAL_STAT_KD_RATIO: + $kills = $this->getStatisticData(StatisticCollector::STAT_ON_KILL, $playerId, $serverIndex); + $deaths = $this->getStatisticData(StatisticCollector::STAT_ON_DEATH, $playerId, $serverIndex); + if ($deaths == 0) { + return -1; + } + return intval($kills) / intval($deaths); + case self::SPECIAL_STAT_HITS_PH: + $hits = $this->getStatisticData(StatisticCollector::STAT_ON_HIT, $playerId, $serverIndex); + $time = $this->getStatisticData(StatisticCollector::STAT_PLAYTIME, $playerId, $serverIndex); + if ($time == 0) { + return -1; + } + return intval($hits) / (intval($time) / 3600); + case self::SPECIAL_STAT_ARROW_ACC: + $hits = $this->getStatisticData(StatisticCollector::STAT_ARROW_HIT, $playerId, $serverIndex); + $shots = $this->getStatisticData(StatisticCollector::STAT_ARROW_SHOT, $playerId, $serverIndex); + if ($shots == 0) { + return -1; + } + return intval($hits) / intval($shots); + case self::SPECIAL_STAT_LASER_ACC: + $hits = $this->getStatisticData(StatisticCollector::STAT_LASER_HIT, $playerId, $serverIndex); + $shots = $this->getStatisticData(StatisticCollector::STAT_LASER_SHOT, $playerId, $serverIndex); + if ($shots == 0) { + return -1; + } + return intval($hits) / intval($shots); + case self::SPECIAL_STAT_NUCLEUS_ACC: + $hits = $this->getStatisticData(StatisticCollector::STAT_NUCLEUS_HIT, $playerId, $serverIndex); + $shots = $this->getStatisticData(StatisticCollector::STAT_NUCLEUS_SHOT, $playerId, $serverIndex); + if ($shots == 0) { + return -1; + } + return intval($hits) / intval($shots); + case self::SPECIAL_STAT_ROCKET_ACC: + $hits = $this->getStatisticData(StatisticCollector::STAT_ROCKET_HIT, $playerId, $serverIndex); + $shots = $this->getStatisticData(StatisticCollector::STAT_ROCKET_SHOT, $playerId, $serverIndex); + if ($shots == 0) { + return -1; + } + return intval($hits) / intval($shots); + } + + $mysqli = $this->maniaControl->database->mysqli; + $statId = $this->getStatId($statName); + + if (!$statId) { + return -1; + } + + if ($serverIndex == -1) { + $query = "SELECT SUM(value) as value FROM `" . self::TABLE_STATISTICS . "` WHERE `statId` = " . $statId . " AND `playerId` = " . $playerId . ";"; + } else { + $query = "SELECT value FROM `" . self::TABLE_STATISTICS . "` WHERE `statId` = " . $statId . " AND `playerId` = " . $playerId . " AND `serverIndex` = '" . $serverIndex . "';"; + } + + $result = $mysqli->query($query); + if (!$result) { + trigger_error($mysqli->error); + return -1; + } + + $row = $result->fetch_object(); + + $result->close(); + return $row->value; + } + + /** + * Increments a Statistic by one + * + * @param string $statName + * @param Player $player + * @param int $serverIndex + * @return bool + */ + public function incrementStat($statName, Player $player, $serverIndex = -1) { + return $this->insertStat($statName, $player, $serverIndex, 1); + } + /** * Inserts a Stat into the database * @@ -496,18 +559,6 @@ class StatisticManager { return true; } - /** - * Increments a Statistic by one - * - * @param string $statName - * @param Player $player - * @param int $serverIndex - * @return bool - */ - public function incrementStat($statName, Player $player, $serverIndex = -1) { - return $this->insertStat($statName, $player, $serverIndex, 1); - } - /** * Defines a Stat * @@ -542,54 +593,4 @@ class StatisticManager { $statement->close(); return true; } - - /** - * Initialize necessary database tables - * - * @return bool - */ - private function initTables() { - $mysqli = $this->maniaControl->database->mysqli; - $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_STATMETADATA . "` ( - `index` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(100) NOT NULL, - `type` int(5) NOT NULL, - `description` varchar(150) NOT NULL, - PRIMARY KEY (`index`), - UNIQUE KEY `name` (`name`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Statistics Meta Data' AUTO_INCREMENT=1;"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); - return false; - } - $statement->execute(); - if ($statement->error) { - trigger_error($statement->error, E_USER_ERROR); - return false; - } - $statement->close(); - - $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_STATISTICS . "` ( - `index` int(11) NOT NULL AUTO_INCREMENT, - `serverIndex` int(11) NOT NULL, - `playerId` int(11) NOT NULL, - `statId` int(11) NOT NULL, - `value` int(20) NOT NULL DEFAULT '0', - PRIMARY KEY (`index`), - UNIQUE KEY `unique` (`statId`,`playerId`,`serverIndex`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Statistics' AUTO_INCREMENT=1;"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); - return false; - } - $statement->execute(); - if ($statement->error) { - trigger_error($statement->error, E_USER_ERROR); - return false; - } - $statement->close(); - return true; - } } diff --git a/application/core/Update/PluginUpdateData.php b/application/core/Update/PluginUpdateData.php index 9d1dc618..4de4d8e5 100644 --- a/application/core/Update/PluginUpdateData.php +++ b/application/core/Update/PluginUpdateData.php @@ -4,10 +4,10 @@ namespace ManiaControl\Update; /** * Plugin Update Data Structure - * - * @author ManiaControl Team - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class PluginUpdateData { /* @@ -24,25 +24,25 @@ class PluginUpdateData { /** * Construct new Plugin Update Data - * + * * @param object $updateData */ public function __construct($updateData) { - $this->pluginId = $updateData->id; - $this->pluginName = $updateData->name; - $this->pluginAuthor = $updateData->author; + $this->pluginId = $updateData->id; + $this->pluginName = $updateData->name; + $this->pluginAuthor = $updateData->author; $this->pluginDescription = $updateData->description; if ($updateData->currentVersion) { - $this->id = $updateData->currentVersion->id; + $this->id = $updateData->currentVersion->id; $this->version = $updateData->currentVersion->version; $this->zipfile = $updateData->currentVersion->zipfile; - $this->url = $updateData->currentVersion->url; + $this->url = $updateData->currentVersion->url; } } /** * Check if the Plugin Update Data is newer than the given Plugin Version - * + * * @param float $version * @return bool */ diff --git a/application/core/Update/PluginUpdateManager.php b/application/core/Update/PluginUpdateManager.php index 487cfc12..68533960 100644 --- a/application/core/Update/PluginUpdateManager.php +++ b/application/core/Update/PluginUpdateManager.php @@ -6,21 +6,21 @@ use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackManager; use ManiaControl\Callbacks\TimerListener; use ManiaControl\Commands\CommandListener; +use ManiaControl\Files\BackupUtil; use ManiaControl\Files\FileUtil; use ManiaControl\ManiaControl; use ManiaControl\Players\Player; use ManiaControl\Plugins\Plugin; use ManiaControl\Plugins\PluginInstallMenu; -use ManiaControl\Plugins\PluginMenu; use ManiaControl\Plugins\PluginManager; -use ManiaControl\Files\BackupUtil; +use ManiaControl\Plugins\PluginMenu; /** * Manager checking for ManiaControl Plugin Updates - * - * @author ManiaControl Team - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class PluginUpdateManager implements CallbackListener, CommandListener, TimerListener { /* @@ -30,15 +30,15 @@ class PluginUpdateManager implements CallbackListener, CommandListener, TimerLis /** * Create a new Plugin Update Manager - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - + // Register for callbacks $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); - + // Register for chat commands $this->maniaControl->commandManager->registerCommandListener('checkpluginsupdate', $this, 'handle_CheckPluginsUpdate', true, 'Check for Plugin Updates.'); $this->maniaControl->commandManager->registerCommandListener('pluginsupdate', $this, 'handle_PluginsUpdate', true, 'Perform the Plugin Updates.'); @@ -46,8 +46,8 @@ class PluginUpdateManager implements CallbackListener, CommandListener, TimerLis /** * Handle //checkpluginsupdate command - * - * @param array $chatCallback + * + * @param array $chatCallback * @param Player $player */ public function handle_CheckPluginsUpdate(array $chatCallback, Player $player) { @@ -55,14 +55,98 @@ class PluginUpdateManager implements CallbackListener, CommandListener, TimerLis $this->maniaControl->authenticationManager->sendNotAllowed($player); return; } - + $this->checkPluginsUpdate($player); } + /** + * Check if there are Outdated Plugins installed + * + * @param Player $player + */ + public function checkPluginsUpdate(Player $player = null) { + $message = 'Checking Plugins for newer Versions...'; + if ($player) { + $this->maniaControl->chat->sendInformation($message, $player); + } + $this->maniaControl->log($message); + + $self = $this; + $this->maniaControl->pluginManager->fetchPluginList(function ($data, $error) use (&$self, &$player) { + + if (!$data || $error) { + $message = 'Error while checking Plugins for newer Versions!'; + if ($player) { + $self->maniaControl->chat->sendError($message, $player); + } + $self->maniaControl->log($message); + return; + } + + $pluginsData = $self->parsePluginsData($data); + $pluginClasses = $self->maniaControl->pluginManager->getPluginClasses(); + $pluginUpdates = array(); + + foreach ($pluginClasses as $pluginClass) { + /** + * @var Plugin $pluginClass + */ + $pluginId = $pluginClass::getId(); + if (!isset($pluginsData[$pluginId])) { + continue; + } + /** @var PluginUpdateData $pluginData */ + $pluginData = $pluginsData[$pluginId]; + $pluginVersion = $pluginClass::getVersion(); + if ($pluginData->isNewerThan($pluginVersion)) { + $pluginUpdates[$pluginId] = $pluginData; + $message = "There is an Update of '{$pluginData->pluginName}' available! ('{$pluginClass}' - Version {$pluginData->version})"; + if ($player) { + $self->maniaControl->chat->sendSuccess($message, $player); + } + $self->maniaControl->log($message); + } + } + + if (empty($pluginUpdates)) { + $message = 'Plugins Update Check completed: All Plugins are up-to-date!'; + if ($player) { + $self->maniaControl->chat->sendSuccess($message, $player); + } + $self->maniaControl->log($message); + } else { + $updatesCount = count($pluginUpdates); + $message = "Plugins Update Check completed: There are {$updatesCount} Updates available!"; + if ($player) { + $self->maniaControl->chat->sendSuccess($message, $player); + } + $self->maniaControl->log($message); + } + }); + } + + /** + * Get an Array of Plugin Update Data from the given Web Service Result + * + * @param mixed $webServiceResult + * @return mixed + */ + public function parsePluginsData($webServiceResult) { + if (!$webServiceResult || !is_array($webServiceResult)) { + return false; + } + $pluginsData = array(); + foreach ($webServiceResult as $pluginResult) { + $pluginData = new PluginUpdateData($pluginResult); + $pluginsData[$pluginData->pluginId] = $pluginData; + } + return $pluginsData; + } + /** * Handle //pluginsupdate command - * - * @param array $chatCallback + * + * @param array $chatCallback * @param Player $player */ public function handle_PluginsUpdate(array $chatCallback, Player $player) { @@ -70,48 +154,200 @@ class PluginUpdateManager implements CallbackListener, CommandListener, TimerLis $this->maniaControl->authenticationManager->sendNotAllowed($player); return; } - + $this->performPluginsUpdate($player); } + /** + * Perform an Update of all outdated Plugins + * + * @param Player $player + */ + public function performPluginsUpdate(Player $player = null) { + $pluginsUpdates = $this->getPluginsUpdates(); + if (empty($pluginsUpdates)) { + $message = 'There are no Plugin Updates available!'; + if ($player) { + $this->maniaControl->chat->sendInformation($message, $player); + } + $this->maniaControl->log($message); + return; + } + + $message = "Starting Plugins Updating..."; + if ($player) { + $this->maniaControl->chat->sendInformation($message, $player); + } + $this->maniaControl->log($message); + + $performBackup = $this->maniaControl->settingManager->getSetting($this->maniaControl->updateManager, UpdateManager::SETTING_PERFORM_BACKUPS); + if ($performBackup && !BackupUtil::performPluginsBackup()) { + $message = 'Creating Backup before Plugins Update failed!'; + if ($player) { + $this->maniaControl->chat->sendError($message, $player); + } + $this->maniaControl->log($message); + } + + foreach ($pluginsUpdates as $pluginUpdateData) { + $this->installPlugin($pluginUpdateData, $player, true); + } + } + + /** + * Check for Plugin Updates + * + * @return mixed + */ + public function getPluginsUpdates() { + $url = ManiaControl::URL_WEBSERVICE . 'plugins'; + $dataJson = FileUtil::loadFile($url); + $pluginData = json_decode($dataJson); + if (!$pluginData || empty($pluginData)) { + return false; + } + + $pluginsUpdates = $this->parsePluginsData($pluginData); + + $updates = array(); + $pluginClasses = $this->maniaControl->pluginManager->getPluginClasses(); + foreach ($pluginClasses as $pluginClass) { + /** + * @var Plugin $pluginClass + */ + $pluginId = $pluginClass::getId(); + if (isset($pluginsUpdates[$pluginId])) { + /** @var PluginUpdateData $pluginUpdateData */ + $pluginUpdateData = $pluginsUpdates[$pluginId]; + $pluginVersion = $pluginClass::getVersion(); + if ($pluginUpdateData->isNewerThan($pluginVersion)) { + $updates[$pluginId] = $pluginUpdateData; + } + } + } + + if (empty($updates)) { + return false; + } + return $updates; + } + + /** + * Load the given Plugin Update Data + * + * @param PluginUpdateData $pluginUpdateData + * @param Player $player + * @param bool $update + */ + private function installPlugin(PluginUpdateData $pluginUpdateData, Player $player = null, $update = false) { + $self = $this; + $this->maniaControl->fileReader->loadFile($pluginUpdateData->url, function ($updateFileContent, $error) use (&$self, &$pluginUpdateData, &$player, &$update) { + $actionNoun = ($update ? 'Update' : 'Install'); + $actionVerb = ($update ? 'Updating' : 'Installing'); + $actionVerbDone = ($update ? 'updated' : 'installed'); + + $message = "Now {$actionVerb} '{$pluginUpdateData->pluginName}'..."; + if ($player) { + $self->maniaControl->chat->sendInformation($message, $player); + } + $self->maniaControl->log($message); + + $tempDir = FileUtil::getTempFolder(); + $updateFileName = $tempDir . $pluginUpdateData->zipfile; + + $bytes = file_put_contents($updateFileName, $updateFileContent); + if (!$bytes || $bytes <= 0) { + $message = "Plugin {$actionNoun} failed: Couldn't save {$actionNoun} Zip!"; + if ($player) { + $self->maniaControl->chat->sendError($message, $player); + } + trigger_error($message); + return; + } + + $zip = new \ZipArchive(); + $result = $zip->open($updateFileName); + if ($result !== true) { + $message = "Plugin {$actionNoun} failed: Couldn't open {$actionNoun} Zip! ({$result})"; + if ($player) { + $self->maniaControl->chat->sendError($message, $player); + } + trigger_error($message); + return; + } + + $zip->extractTo(ManiaControlDir . '/plugins/'); + $zip->close(); + unlink($updateFileName); + FileUtil::removeTempFolder(); + + $messageExtra = ''; + if ($update) { + $messageExtra = ' (Restart ManiaControl to load the new Version!)'; + } + $message = "Successfully {$actionVerbDone} '{$pluginUpdateData->pluginName}'!{$messageExtra}"; + if ($player) { + $self->maniaControl->chat->sendSuccess($message, $player); + } + $self->maniaControl->log($message); + + if (!$update) { + $newPluginClasses = $self->maniaControl->pluginManager->loadPlugins(); + if (empty($newPluginClasses)) { + $message = "Loading fresh installed Plugin '{$pluginUpdateData->pluginName}' failed!"; + if ($player) { + $self->maniaControl->chat->sendError($message, $player); + } + $self->maniaControl->log($message); + } else { + $message = "Successfully loaded fresh installed Plugin '{$pluginUpdateData->pluginName}'!"; + if ($player) { + $self->maniaControl->chat->sendSuccess($message, $player); + } + $self->maniaControl->log($message); + + $menuId = $self->maniaControl->configurator->getMenuId('Install Plugins'); + $self->maniaControl->configurator->reopenMenu($player, $menuId); + } + } + }); + } + /** * Handle PlayerManialinkPageAnswer callback - * + * * @param array $callback */ public function handleManialinkPageAnswer(array $callback) { $actionId = $callback[1][2]; - $update = (strpos($actionId, PluginMenu::ACTION_PREFIX_UPDATEPLUGIN) === 0); - $install = (strpos($actionId, PluginInstallMenu::ACTION_PREFIX_INSTALLPLUGIN) === 0); + $update = (strpos($actionId, PluginMenu::ACTION_PREFIX_UPDATEPLUGIN) === 0); + $install = (strpos($actionId, PluginInstallMenu::ACTION_PREFIX_INSTALLPLUGIN) === 0); if (!$update && !$install) { return; } - - $login = $callback[1][1]; + + $login = $callback[1][1]; $player = $this->maniaControl->playerManager->getPlayer($login); - + if ($update) { $pluginClass = substr($actionId, strlen(PluginMenu::ACTION_PREFIX_UPDATEPLUGIN)); if ($pluginClass == 'All') { $this->performPluginsUpdate($player); - } - else { + } else { $pluginUpdateData = $this->getPluginUpdate($pluginClass); if ($pluginUpdateData) { $this->installPlugin($pluginUpdateData, $player, true); - } - else { + } else { $message = 'Error loading Plugin Update Data!'; $this->maniaControl->chat->sendError($message, $player); } } - } - else { + } else { $pluginId = substr($actionId, strlen(PluginInstallMenu::ACTION_PREFIX_INSTALLPLUGIN)); - - $url = ManiaControl::URL_WEBSERVICE . 'plugins?id=' . $pluginId; + + $url = ManiaControl::URL_WEBSERVICE . 'plugins?id=' . $pluginId; $self = $this; - $this->maniaControl->fileReader->loadFile($url, function ($data, $error) use(&$self, &$player) { + $this->maniaControl->fileReader->loadFile($url, function ($data, $error) use (&$self, &$player) { if ($error || !$data) { $message = "Error loading Plugin Install Data! {$error}"; $self->maniaControl->chat->sendError($message, $player); @@ -129,273 +365,29 @@ class PluginUpdateManager implements CallbackListener, CommandListener, TimerLis } } - /** - * Check if there are Outdated Plugins installed - * - * @param Player $player - */ - public function checkPluginsUpdate(Player $player = null) { - $message = 'Checking Plugins for newer Versions...'; - if ($player) { - $this->maniaControl->chat->sendInformation($message, $player); - } - $this->maniaControl->log($message); - - $self = $this; - $this->maniaControl->pluginManager->fetchPluginList(function ($data, $error) use(&$self, &$player) { - - if (!$data || $error) { - $message = 'Error while checking Plugins for newer Versions!'; - if ($player) { - $self->maniaControl->chat->sendError($message, $player); - } - $self->maniaControl->log($message); - return; - } - - $pluginsData = $self->parsePluginsData($data); - $pluginClasses = $self->maniaControl->pluginManager->getPluginClasses(); - $pluginUpdates = array(); - - foreach ($pluginClasses as $pluginClass) { - /** - * - * @var Plugin $pluginClass - */ - $pluginId = $pluginClass::getId(); - if (!isset($pluginsData[$pluginId])) { - continue; - } - /** @var PluginUpdateData $pluginData */ - $pluginData = $pluginsData[$pluginId]; - $pluginVersion = $pluginClass::getVersion(); - if ($pluginData->isNewerThan($pluginVersion)) { - $pluginUpdates[$pluginId] = $pluginData; - $message = "There is an Update of '{$pluginData->pluginName}' available! ('{$pluginClass}' - Version {$pluginData->version})"; - if ($player) { - $self->maniaControl->chat->sendSuccess($message, $player); - } - $self->maniaControl->log($message); - } - } - - if (empty($pluginUpdates)) { - $message = 'Plugins Update Check completed: All Plugins are up-to-date!'; - if ($player) { - $self->maniaControl->chat->sendSuccess($message, $player); - } - $self->maniaControl->log($message); - } - else { - $updatesCount = count($pluginUpdates); - $message = "Plugins Update Check completed: There are {$updatesCount} Updates available!"; - if ($player) { - $self->maniaControl->chat->sendSuccess($message, $player); - } - $self->maniaControl->log($message); - } - }); - } - - /** - * Perform an Update of all outdated Plugins - * - * @param Player $player - */ - public function performPluginsUpdate(Player $player = null) { - $pluginsUpdates = $this->getPluginsUpdates(); - if (empty($pluginsUpdates)) { - $message = 'There are no Plugin Updates available!'; - if ($player) { - $this->maniaControl->chat->sendInformation($message, $player); - } - $this->maniaControl->log($message); - return; - } - - $message = "Starting Plugins Updating..."; - if ($player) { - $this->maniaControl->chat->sendInformation($message, $player); - } - $this->maniaControl->log($message); - - $performBackup = $this->maniaControl->settingManager->getSetting($this->maniaControl->updateManager, UpdateManager::SETTING_PERFORM_BACKUPS); - if ($performBackup && !BackupUtil::performPluginsBackup()) { - $message = 'Creating Backup before Plugins Update failed!'; - if ($player) { - $this->maniaControl->chat->sendError($message, $player); - } - $this->maniaControl->log($message); - } - - foreach ($pluginsUpdates as $pluginUpdateData) { - $this->installPlugin($pluginUpdateData, $player, true); - } - } - /** * Check given Plugin Class for Update - * + * * @param string $pluginClass * @return mixed */ public function getPluginUpdate($pluginClass) { $pluginClass = PluginManager::getPluginClass($pluginClass); /** - * * @var Plugin $pluginClass */ - $pluginId = $pluginClass::getId(); - $url = ManiaControl::URL_WEBSERVICE . 'plugins?id=' . $pluginId; - $dataJson = FileUtil::loadFile($url); + $pluginId = $pluginClass::getId(); + $url = ManiaControl::URL_WEBSERVICE . 'plugins?id=' . $pluginId; + $dataJson = FileUtil::loadFile($url); $pluginVersions = json_decode($dataJson); if (!$pluginVersions || !isset($pluginVersions[0])) { return false; } $pluginUpdateData = new PluginUpdateData($pluginVersions[0]); - $pluginVersion = $pluginClass::getVersion(); + $pluginVersion = $pluginClass::getVersion(); if ($pluginUpdateData->isNewerThan($pluginVersion)) { return $pluginUpdateData; } return false; } - - /** - * Get an Array of Plugin Update Data from the given Web Service Result - * - * @param mixed $webServiceResult - * @return mixed - */ - public function parsePluginsData($webServiceResult) { - if (!$webServiceResult || !is_array($webServiceResult)) { - return false; - } - $pluginsData = array(); - foreach ($webServiceResult as $pluginResult) { - $pluginData = new PluginUpdateData($pluginResult); - $pluginsData[$pluginData->pluginId] = $pluginData; - } - return $pluginsData; - } - - /** - * Check for Plugin Updates - * - * @return mixed - */ - public function getPluginsUpdates() { - $url = ManiaControl::URL_WEBSERVICE . 'plugins'; - $dataJson = FileUtil::loadFile($url); - $pluginData = json_decode($dataJson); - if (!$pluginData || empty($pluginData)) { - return false; - } - - $pluginsUpdates = $this->parsePluginsData($pluginData); - - $updates = array(); - $pluginClasses = $this->maniaControl->pluginManager->getPluginClasses(); - foreach ($pluginClasses as $pluginClass) { - /** - * - * @var Plugin $pluginClass - */ - $pluginId = $pluginClass::getId(); - if (isset($pluginsUpdates[$pluginId])) { - /** @var PluginUpdateData $pluginUpdateData */ - $pluginUpdateData = $pluginsUpdates[$pluginId]; - $pluginVersion = $pluginClass::getVersion(); - if ($pluginUpdateData->isNewerThan($pluginVersion)) { - $updates[$pluginId] = $pluginUpdateData; - } - } - } - - if (empty($updates)) { - return false; - } - return $updates; - } - - /** - * Load the given Plugin Update Data - * - * @param PluginUpdateData $pluginUpdateData - * @param Player $player - * @param bool $update - */ - private function installPlugin(PluginUpdateData $pluginUpdateData, Player $player = null, $update = false) { - $self = $this; - $this->maniaControl->fileReader->loadFile($pluginUpdateData->url, function ($updateFileContent, $error) use(&$self, &$pluginUpdateData, &$player, &$update) { - $actionNoun = ($update ? 'Update' : 'Install'); - $actionVerb = ($update ? 'Updating' : 'Installing'); - $actionVerbDone = ($update ? 'updated' : 'installed'); - - $message = "Now {$actionVerb} '{$pluginUpdateData->pluginName}'..."; - if ($player) { - $self->maniaControl->chat->sendInformation($message, $player); - } - $self->maniaControl->log($message); - - $tempDir = FileUtil::getTempFolder(); - $updateFileName = $tempDir . $pluginUpdateData->zipfile; - - $bytes = file_put_contents($updateFileName, $updateFileContent); - if (!$bytes || $bytes <= 0) { - $message = "Plugin {$actionNoun} failed: Couldn't save {$actionNoun} Zip!"; - if ($player) { - $self->maniaControl->chat->sendError($message, $player); - } - trigger_error($message); - return; - } - - $zip = new \ZipArchive(); - $result = $zip->open($updateFileName); - if ($result !== true) { - $message = "Plugin {$actionNoun} failed: Couldn't open {$actionNoun} Zip! ({$result})"; - if ($player) { - $self->maniaControl->chat->sendError($message, $player); - } - trigger_error($message); - return; - } - - $zip->extractTo(ManiaControlDir . '/plugins/'); - $zip->close(); - unlink($updateFileName); - FileUtil::removeTempFolder(); - - $messageExtra = ''; - if ($update) { - $messageExtra = ' (Restart ManiaControl to load the new Version!)'; - } - $message = "Successfully {$actionVerbDone} '{$pluginUpdateData->pluginName}'!{$messageExtra}"; - if ($player) { - $self->maniaControl->chat->sendSuccess($message, $player); - } - $self->maniaControl->log($message); - - if (!$update) { - $newPluginClasses = $self->maniaControl->pluginManager->loadPlugins(); - if (empty($newPluginClasses)) { - $message = "Loading fresh installed Plugin '{$pluginUpdateData->pluginName}' failed!"; - if ($player) { - $self->maniaControl->chat->sendError($message, $player); - } - $self->maniaControl->log($message); - } - else { - $message = "Successfully loaded fresh installed Plugin '{$pluginUpdateData->pluginName}'!"; - if ($player) { - $self->maniaControl->chat->sendSuccess($message, $player); - } - $self->maniaControl->log($message); - - $menuId = $self->maniaControl->configurator->getMenuId('Install Plugins'); - $self->maniaControl->configurator->reopenMenu($player, $menuId); - } - } - }); - } } diff --git a/application/core/Update/UpdateData.php b/application/core/Update/UpdateData.php index 99b0ee04..e309a74f 100644 --- a/application/core/Update/UpdateData.php +++ b/application/core/Update/UpdateData.php @@ -4,10 +4,10 @@ namespace ManiaControl\Update; /** * Update Data Structure - * - * @author ManiaControl Team - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class UpdateData { /* @@ -21,20 +21,20 @@ class UpdateData { /** * Construct new Update Data - * + * * @param object $updateData */ public function __construct($updateData) { - $this->version = $updateData->version; - $this->channel = $updateData->channel; - $this->url = $updateData->url; - $this->releaseDate = $updateData->release_date; + $this->version = $updateData->version; + $this->channel = $updateData->channel; + $this->url = $updateData->url; + $this->releaseDate = $updateData->release_date; $this->minDedicatedBuild = $updateData->min_dedicated_build; } /** * Check if the Update Data is newer than the given Date - * + * * @param string $compareDate * @return bool */ diff --git a/application/core/Update/UpdateManager.php b/application/core/Update/UpdateManager.php index 8d81d322..5266e263 100644 --- a/application/core/Update/UpdateManager.php +++ b/application/core/Update/UpdateManager.php @@ -6,45 +6,44 @@ use ManiaControl\Admin\AuthenticationManager; use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\TimerListener; use ManiaControl\Commands\CommandListener; +use ManiaControl\Files\BackupUtil; use ManiaControl\Files\FileUtil; use ManiaControl\ManiaControl; use ManiaControl\Players\Player; use ManiaControl\Players\PlayerManager; -use ManiaControl\Files\BackupUtil; /** * Manager checking for ManiaControl Core Updates - * - * @author ManiaControl Team - * @copyright ManiaControl Copyright © 2014 ManiaControl Team - * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class UpdateManager implements CallbackListener, CommandListener, TimerListener { /* * Constants */ - const SETTING_ENABLEUPDATECHECK = 'Enable Automatic Core Update Check'; - const SETTING_UPDATECHECK_INTERVAL = 'Core Update Check Interval (Hours)'; - const SETTING_UPDATECHECK_CHANNEL = 'Core Update Channel (release, beta, nightly)'; - const SETTING_PERFORM_BACKUPS = 'Perform Backup before Updating'; - const SETTING_AUTO_UPDATE = 'Perform update automatically'; - const SETTING_PERMISSION_UPDATE = 'Update Core'; + const SETTING_ENABLEUPDATECHECK = 'Enable Automatic Core Update Check'; + const SETTING_UPDATECHECK_INTERVAL = 'Core Update Check Interval (Hours)'; + const SETTING_UPDATECHECK_CHANNEL = 'Core Update Channel (release, beta, nightly)'; + const SETTING_PERFORM_BACKUPS = 'Perform Backup before Updating'; + const SETTING_AUTO_UPDATE = 'Perform update automatically'; + const SETTING_PERMISSION_UPDATE = 'Update Core'; const SETTING_PERMISSION_UPDATECHECK = 'Check Core Update'; - const CHANNEL_RELEASE = 'release'; - const CHANNEL_BETA = 'beta'; - const CHANNEL_NIGHTLY = 'nightly'; - + const CHANNEL_RELEASE = 'release'; + const CHANNEL_BETA = 'beta'; + const CHANNEL_NIGHTLY = 'nightly'; + /* * Public Properties */ public $pluginUpdateManager = null; - + /* * Private Properties */ private $maniaControl = null; /** - * * @var UpdateData $coreUpdateData */ private $coreUpdateData = null; @@ -52,47 +51,40 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener /** * Create a new Update Manager - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - + // Init settings $this->maniaControl->settingManager->initSetting($this, self::SETTING_ENABLEUPDATECHECK, true); $this->maniaControl->settingManager->initSetting($this, self::SETTING_AUTO_UPDATE, true); $this->maniaControl->settingManager->initSetting($this, self::SETTING_UPDATECHECK_INTERVAL, 1); $this->maniaControl->settingManager->initSetting($this, self::SETTING_UPDATECHECK_CHANNEL, self::CHANNEL_BETA); $this->maniaControl->settingManager->initSetting($this, self::SETTING_PERFORM_BACKUPS, true); - + // Register for callbacks $updateInterval = $this->maniaControl->settingManager->getSetting($this, self::SETTING_UPDATECHECK_INTERVAL); $this->maniaControl->timerManager->registerTimerListening($this, 'hourlyUpdateCheck', 1000 * 60 * 60 * $updateInterval); $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerJoined'); $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'handlePlayerDisconnect'); - + // define Permissions $this->maniaControl->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_UPDATE, AuthenticationManager::AUTH_LEVEL_ADMIN); $this->maniaControl->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_UPDATECHECK, AuthenticationManager::AUTH_LEVEL_MODERATOR); - + // Register for chat commands $this->maniaControl->commandManager->registerCommandListener('checkupdate', $this, 'handle_CheckUpdate', true, 'Checks if there is a core update.'); $this->maniaControl->commandManager->registerCommandListener('coreupdate', $this, 'handle_CoreUpdate', true, 'Performs the core update.'); - + // Plugin update manager $this->pluginUpdateManager = new PluginUpdateManager($maniaControl); } - /** - * Start an Update Check - */ - public function checkUpdate() { - $this->checkCoreUpdateAsync(array($this, 'handleUpdateCheck')); - } - /** * Perform Hourly Update Check - * + * * @param $time */ public function hourlyUpdateCheck($time) { @@ -104,9 +96,59 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener $this->checkUpdate(); } + /** + * Set Core Update Data + * + * @param UpdateData $coreUpdateData + */ + public function setCoreUpdateData(UpdateData $coreUpdateData = null) { + $this->coreUpdateData = $coreUpdateData; + } + + /** + * Start an Update Check + */ + public function checkUpdate() { + $this->checkCoreUpdateAsync(array($this, 'handleUpdateCheck')); + } + + /** + * Checks a Core Update asynchronously + * + * @param callable $function + */ + private function checkCoreUpdateAsync($function) { + $updateChannel = $this->getCurrentUpdateChannelSetting(); + $url = ManiaControl::URL_WEBSERVICE . 'versions?current=1&channel=' . $updateChannel; + + $this->maniaControl->fileReader->loadFile($url, function ($dataJson, $error) use (&$function) { + $versions = json_decode($dataJson); + if (!$versions || !isset($versions[0])) { + call_user_func($function, null); + } else { + $updateData = new UpdateData($versions[0]); + call_user_func($function, $updateData); + } + }); + } + + /** + * Retrieve the Update Channel Setting + * + * @return string + */ + private function getCurrentUpdateChannelSetting() { + $updateChannel = $this->maniaControl->settingManager->getSetting($this, self::SETTING_UPDATECHECK_CHANNEL); + $updateChannel = strtolower($updateChannel); + if (!in_array($updateChannel, array(self::CHANNEL_RELEASE, self::CHANNEL_BETA, self::CHANNEL_NIGHTLY))) { + $updateChannel = self::CHANNEL_RELEASE; + } + return $updateChannel; + } + /** * Handle the fetched Update Data - * + * * @param UpdateData $updateData */ public function handleUpdateCheck(UpdateData $updateData) { @@ -119,21 +161,20 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener $this->maniaControl->log("Please update Your Server to '{$updateData->minDedicatedBuild}' in order to receive further Updates!"); return; } - + if ($this->isNightlyUpdateChannel()) { $this->maniaControl->log("New Nightly Build ({$updateData->releaseDate}) available!"); - } - else { + } else { $this->maniaControl->log("New ManiaControl Version {$updateData->version} available!"); } $this->setCoreUpdateData($updateData); - + $this->checkAutoUpdate(); } /** * Check if the given Update Data has a new Version and fits for the Server - * + * * @param UpdateData $updateData * @return bool */ @@ -142,20 +183,48 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener // Data corrupted return false; } - + $isNightly = $this->isNightlyUpdateChannel(); $buildDate = $this->getNightlyBuildDate(); - + if ($isNightly || $buildDate) { return $updateData->isNewerThan($buildDate); } - + return ($updateData->version > ManiaControl::VERSION); } + /** + * Check if ManiaControl is running the Nightly Update Channel + * + * @param string $updateChannel + * @return bool + */ + public function isNightlyUpdateChannel($updateChannel = null) { + if (!$updateChannel) { + $updateChannel = $this->getCurrentUpdateChannelSetting(); + } + return ($updateChannel === self::CHANNEL_NIGHTLY); + } + + /** + * Get the Build Date of the local Nightly Build Version + * + * @return string + */ + public function getNightlyBuildDate() { + if (!$this->currentBuildDate) { + $nightlyBuildDateFile = ManiaControlDir . '/core/nightly_build.txt'; + if (file_exists($nightlyBuildDateFile)) { + $this->currentBuildDate = file_get_contents($nightlyBuildDateFile); + } + } + return $this->currentBuildDate; + } + /** * Check if the Update Data is compatible with the Server - * + * * @param UpdateData $updateData * @return bool */ @@ -164,56 +233,16 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener // Data corrupted return false; } - + $version = $this->maniaControl->client->getVersion(); if ($updateData->minDedicatedBuild > $version->build) { // Server not compatible return false; } - + return true; } - /** - * Set Core Update Data - * - * @param UpdateData $coreUpdateData - */ - public function setCoreUpdateData(UpdateData $coreUpdateData = null) { - $this->coreUpdateData = $coreUpdateData; - } - - /** - * Handle ManiaControl PlayerJoined callback - * - * @param Player $player - */ - public function handlePlayerJoined(Player $player) { - if (!$this->coreUpdateData) { - return; - } - // Announce available update - if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_UPDATE)) { - return; - } - - if ($this->isNightlyUpdateChannel()) { - $this->maniaControl->chat->sendSuccess('New Nightly Build (' . $this->coreUpdateData->releaseDate . ') available!', $player->login); - } - else { - $this->maniaControl->chat->sendInformation('New ManiaControl Version ' . $this->coreUpdateData->version . ' available!', $player->login); - } - } - - /** - * Handle Player Disconnect Callback - * - * @param Player $player - */ - public function handlePlayerDisconnect(Player $player) { - $this->checkAutoUpdate(); - } - /** * Check if an automatic Update should be performed */ @@ -231,145 +260,13 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener // Server not empty return; } - + $this->performCoreUpdate(); } - /** - * Handle //checkupdate command - * - * @param array $chatCallback - * @param Player $player - */ - public function handle_CheckUpdate(array $chatCallback, Player $player) { - if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_UPDATECHECK)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return; - } - - $self = $this; - $this->checkCoreUpdateAsync(function (UpdateData $updateData = null) use(&$self, &$player) { - if (!$self->checkUpdateData($updateData)) { - $self->maniaControl->chat->sendInformation('No Update available!', $player->login); - return; - } - - if (!$self->checkUpdateDataBuildVersion($updateData)) { - $self->maniaControl->chat->sendError("Please update Your Server to '{$updateData->minDedicatedBuild}' in order to receive further Updates!", $player->login); - return; - } - - $isNightly = $self->isNightlyUpdateChannel(); - if ($isNightly) { - $buildDate = $self->getNightlyBuildDate(); - if ($buildDate) { - if ($updateData->isNewerThan($buildDate)) { - $self->maniaControl->chat->sendInformation("No new Build available! (Current Build: '{$buildDate}')", $player->login); - } - else { - $self->maniaControl->chat->sendSuccess("New Nightly Build ({$updateData->releaseDate}) available! (Current Build: '{$buildDate}')", $player->login); - } - } - else { - $self->maniaControl->chat->sendSuccess("New Nightly Build ('{$updateData->releaseDate}') available!", $player->login); - } - } - else { - $self->maniaControl->chat->sendSuccess('Update for Version ' . $updateData->version . ' available!', $player->login); - } - }); - } - - /** - * Get the Build Date of the local Nightly Build Version - * - * @return string - */ - public function getNightlyBuildDate() { - if (!$this->currentBuildDate) { - $nightlyBuildDateFile = ManiaControlDir . '/core/nightly_build.txt'; - if (file_exists($nightlyBuildDateFile)) { - $this->currentBuildDate = file_get_contents($nightlyBuildDateFile); - } - } - return $this->currentBuildDate; - } - - /** - * Set the Build Date of the local Nightly Build Version - * - * @param string $date - * @return bool - */ - private function setNightlyBuildDate($date) { - $nightlyBuildDateFile = ManiaControlDir . '/core/nightly_build.txt'; - $success = (bool) file_put_contents($nightlyBuildDateFile, $date); - $this->currentBuildDate = $date; - return $success; - } - - /** - * Handle //coreupdate command - * - * @param array $chatCallback - * @param Player $player - */ - public function handle_CoreUpdate(array $chatCallback, Player $player) { - if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_UPDATE)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return; - } - - $self = $this; - $this->checkCoreUpdateAsync(function (UpdateData $updateData = null) use(&$self, &$player) { - if (!$updateData) { - $self->maniaControl->chat->sendError('Update is currently not possible!', $player->login); - return; - } - if (!$self->checkUpdateDataBuildVersion($updateData)) { - $self->maniaControl->chat->sendError("The Next ManiaControl Update requires a newer Dedicated Server Version!", $player->login); - return; - } - - $message = "Starting Update to Version v{$updateData->version}..."; - $self->maniaControl->chat->sendInformation($message, $player->login); - $self->maniaControl->log($message); - - $performBackup = $self->maniaControl->settingManager->getSetting($self, UpdateManager::SETTING_PERFORM_BACKUPS); - if ($performBackup && !BackupUtil::performFullBackup()) { - $message = 'Creating Backup failed!'; - $self->maniaControl->chat->sendError($message, $player->login); - $self->maniaControl->log($message); - } - - $self->performCoreUpdate($player); - }); - } - - /** - * Checks a Core Update asynchronously - * - * @param callable $function - */ - private function checkCoreUpdateAsync($function) { - $updateChannel = $this->getCurrentUpdateChannelSetting(); - $url = ManiaControl::URL_WEBSERVICE . 'versions?current=1&channel=' . $updateChannel; - - $this->maniaControl->fileReader->loadFile($url, function ($dataJson, $error) use(&$function) { - $versions = json_decode($dataJson); - if (!$versions || !isset($versions[0])) { - call_user_func($function, null); - } - else { - $updateData = new UpdateData($versions[0]); - call_user_func($function, $updateData); - } - }); - } - /** * Perform a Core Update - * + * * @param Player $player * @return bool */ @@ -382,9 +279,9 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener $this->maniaControl->log($message); return false; } - + $this->maniaControl->log("Starting Update to Version v{$this->coreUpdateData->version}..."); - + $directories = array('/core/', '/plugins/'); if (!FileUtil::checkWritePermissions($directories)) { $message = 'Update not possible: Incorrect File System Permissions!'; @@ -394,7 +291,7 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener $this->maniaControl->log($message); return false; } - + $performBackup = $this->maniaControl->settingManager->getSetting($this, self::SETTING_PERFORM_BACKUPS); if ($performBackup && !BackupUtil::performFullBackup()) { $message = 'Creating Backup before Update failed!'; @@ -403,12 +300,12 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener } $this->maniaControl->log($message); } - + $self = $this; - $this->maniaControl->fileReader->loadFile($this->coreUpdateData->url, function ($updateFileContent, $error) use(&$self, &$updateData, &$player) { - $tempDir = FileUtil::getTempFolder(); + $this->maniaControl->fileReader->loadFile($this->coreUpdateData->url, function ($updateFileContent, $error) use (&$self, &$updateData, &$player) { + $tempDir = FileUtil::getTempFolder(); $updateFileName = $tempDir . basename($updateData->url); - + $bytes = file_put_contents($updateFileName, $updateFileContent); if (!$bytes || $bytes <= 0) { $message = "Update failed: Couldn't save Update zip!"; @@ -418,8 +315,8 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener logMessage($message); return; } - - $zip = new \ZipArchive(); + + $zip = new \ZipArchive(); $result = $zip->open($updateFileName); if ($result !== true) { trigger_error("Couldn't open Update Zip. ({$result})"); @@ -428,51 +325,147 @@ class UpdateManager implements CallbackListener, CommandListener, TimerListener } return; } - + $zip->extractTo(ManiaControlDir); $zip->close(); unlink($updateFileName); FileUtil::removeTempFolder(); - + // Set the Nightly Build Date $self->setNightlyBuildDate($updateData->releaseDate); - + $message = 'Update finished!'; if ($player) { $self->maniaControl->chat->sendSuccess($message, $player); } $self->maniaControl->log($message); - + $self->maniaControl->restart(); }); - + return true; } /** - * Check if ManiaControl is running the Nightly Update Channel - * - * @param string $updateChannel + * Set the Build Date of the local Nightly Build Version + * + * @param string $date * @return bool */ - public function isNightlyUpdateChannel($updateChannel = null) { - if (!$updateChannel) { - $updateChannel = $this->getCurrentUpdateChannelSetting(); - } - return ($updateChannel === self::CHANNEL_NIGHTLY); + private function setNightlyBuildDate($date) { + $nightlyBuildDateFile = ManiaControlDir . '/core/nightly_build.txt'; + $success = (bool)file_put_contents($nightlyBuildDateFile, $date); + $this->currentBuildDate = $date; + return $success; } /** - * Retrieve the Update Channel Setting - * - * @return string + * Handle ManiaControl PlayerJoined callback + * + * @param Player $player */ - private function getCurrentUpdateChannelSetting() { - $updateChannel = $this->maniaControl->settingManager->getSetting($this, self::SETTING_UPDATECHECK_CHANNEL); - $updateChannel = strtolower($updateChannel); - if (!in_array($updateChannel, array(self::CHANNEL_RELEASE, self::CHANNEL_BETA, self::CHANNEL_NIGHTLY))) { - $updateChannel = self::CHANNEL_RELEASE; + public function handlePlayerJoined(Player $player) { + if (!$this->coreUpdateData) { + return; } - return $updateChannel; + // Announce available update + if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_UPDATE)) { + return; + } + + if ($this->isNightlyUpdateChannel()) { + $this->maniaControl->chat->sendSuccess('New Nightly Build (' . $this->coreUpdateData->releaseDate . ') available!', $player->login); + } else { + $this->maniaControl->chat->sendInformation('New ManiaControl Version ' . $this->coreUpdateData->version . ' available!', $player->login); + } + } + + /** + * Handle Player Disconnect Callback + * + * @param Player $player + */ + public function handlePlayerDisconnect(Player $player) { + $this->checkAutoUpdate(); + } + + /** + * Handle //checkupdate command + * + * @param array $chatCallback + * @param Player $player + */ + public function handle_CheckUpdate(array $chatCallback, Player $player) { + if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_UPDATECHECK)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return; + } + + $self = $this; + $this->checkCoreUpdateAsync(function (UpdateData $updateData = null) use (&$self, &$player) { + if (!$self->checkUpdateData($updateData)) { + $self->maniaControl->chat->sendInformation('No Update available!', $player->login); + return; + } + + if (!$self->checkUpdateDataBuildVersion($updateData)) { + $self->maniaControl->chat->sendError("Please update Your Server to '{$updateData->minDedicatedBuild}' in order to receive further Updates!", $player->login); + return; + } + + $isNightly = $self->isNightlyUpdateChannel(); + if ($isNightly) { + $buildDate = $self->getNightlyBuildDate(); + if ($buildDate) { + if ($updateData->isNewerThan($buildDate)) { + $self->maniaControl->chat->sendInformation("No new Build available! (Current Build: '{$buildDate}')", $player->login); + } else { + $self->maniaControl->chat->sendSuccess("New Nightly Build ({$updateData->releaseDate}) available! (Current Build: '{$buildDate}')", $player->login); + } + } else { + $self->maniaControl->chat->sendSuccess("New Nightly Build ('{$updateData->releaseDate}') available!", $player->login); + } + } else { + $self->maniaControl->chat->sendSuccess('Update for Version ' . $updateData->version . ' available!', $player->login); + } + }); + } + + /** + * Handle //coreupdate command + * + * @param array $chatCallback + * @param Player $player + */ + public function handle_CoreUpdate(array $chatCallback, Player $player) { + if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_UPDATE)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return; + } + + $self = $this; + $this->checkCoreUpdateAsync(function (UpdateData $updateData = null) use (&$self, &$player) { + if (!$updateData) { + $self->maniaControl->chat->sendError('Update is currently not possible!', $player->login); + return; + } + if (!$self->checkUpdateDataBuildVersion($updateData)) { + $self->maniaControl->chat->sendError("The Next ManiaControl Update requires a newer Dedicated Server Version!", $player->login); + return; + } + + $message = "Starting Update to Version v{$updateData->version}..."; + $self->maniaControl->chat->sendInformation($message, $player->login); + $self->maniaControl->log($message); + + $performBackup = $self->maniaControl->settingManager->getSetting($self, UpdateManager::SETTING_PERFORM_BACKUPS); + if ($performBackup && !BackupUtil::performFullBackup()) { + $message = 'Creating Backup failed!'; + $self->maniaControl->chat->sendError($message, $player->login); + $self->maniaControl->log($message); + } + + $self->performCoreUpdate($player); + }); } }