diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 00000000..8b44f614 --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,213 @@ + + + + + + + diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..0218f4cb --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/application/ManiaControl.php b/application/ManiaControl.php index f6043cee..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,11 +68,12 @@ else { /** * Log and echo the given text - * + * * @param string $message + * @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; @@ -93,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/configs/server.xml b/application/configs/server.xml index 8e0d1d4a..eff62ecc 100644 --- a/application/configs/server.xml +++ b/application/configs/server.xml @@ -11,7 +11,7 @@ SuperAdmin password - + diff --git a/application/core/Admin/ActionsMenu.php b/application/core/Admin/ActionsMenu.php index 88d67006..3c5e8158 100644 --- a/application/core/Admin/ActionsMenu.php +++ b/application/core/Admin/ActionsMenu.php @@ -18,21 +18,21 @@ use ManiaControl\Players\PlayerManager; /** * Class managing Actions Menus * - * @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 ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { /* * Constants */ - const MLID_MENU = 'ActionsMenu.MLID'; - const SETTING_MENU_POSX = 'Menu Position: X'; - const SETTING_MENU_POSY = 'Menu Position: Y'; - const SETTING_MENU_ITEMSIZE = 'Menu Item Size'; - const ACTION_OPEN_ADMIN_MENU = 'ActionsMenu.OpenAdminMenu'; + const MLID_MENU = 'ActionsMenu.MLID'; + const SETTING_MENU_POSX = 'Menu Position: X'; + const SETTING_MENU_POSY = 'Menu Position: Y'; + const SETTING_MENU_ITEMSIZE = 'Menu Item Size'; + const ACTION_OPEN_ADMIN_MENU = 'ActionsMenu.OpenAdminMenu'; const ACTION_OPEN_PLAYER_MENU = 'ActionsMenu.OpenPlayerMenu'; - + /* * Private Properties */ @@ -48,12 +48,12 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - + // Init settings $this->maniaControl->settingManager->initSetting($this, self::SETTING_MENU_POSX, 156.); $this->maniaControl->settingManager->initSetting($this, self::SETTING_MENU_POSY, -17.); $this->maniaControl->settingManager->initSetting($this, self::SETTING_MENU_ITEMSIZE, 6.); - + // Register for callbacks $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_AFTERINIT, $this, 'handleAfterInit'); $this->maniaControl->callbackManager->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerJoined'); @@ -64,41 +64,24 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { * Add a new Menu Item * * @param Control $control - * @param bool $playerAction - * @param int $order - * @param string $description + * @param bool $playerAction + * @param int $order + * @param string $description */ public function addMenuItem(Control $control, $playerAction = true, $order = 0, $description = null) { if ($playerAction) { $this->addPlayerMenuItem($control, $order, $description); - } - else { + } else { $this->addAdminMenuItem($control, $order, $description); } } - /** - * Removes a Menu Item - * - * @param $order - * @param bool $playerAction - */ - public function removeMenuItem($order, $playerAction = true) { - if ($playerAction) { - unset($this->playerMenuItems[$order]); - } - else { - unset($this->adminMenuItems[$order]); - } - $this->rebuildAndShowMenu(); - } - /** * Add a new Player Menu Item * * @param Control $control - * @param int $order - * @param string $description + * @param int $order + * @param string $description */ public function addPlayerMenuItem(Control $control, $order = 0, $description = null) { if (!isset($this->playerMenuItems[$order])) { @@ -109,30 +92,6 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $this->rebuildAndShowMenu(); } - /** - * Add a new Admin Menu Item - * - * @param Control $control - * @param int $order - * @param string $description - */ - public function addAdminMenuItem(Control $control, $order = 0, $description = null) { - if (!isset($this->adminMenuItems[$order])) { - $this->adminMenuItems[$order] = array(); - } - array_push($this->adminMenuItems[$order], array($control, $description)); - krsort($this->adminMenuItems); - $this->rebuildAndShowMenu(); - } - - /** - * Handle ManiaControl AfterInit callback - */ - public function handleAfterInit() { - $this->initCompleted = true; - $this->rebuildAndShowMenu(); - } - /** * Build and show the menus to everyone (if a menu get made after the init) */ @@ -147,16 +106,6 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { } } - /** - * Handle PlayerJoined callback - * - * @param Player $player - */ - public function handlePlayerJoined(Player $player) { - $maniaLink = $this->buildMenuIconsManialink($player); - $this->maniaControl->manialinkManager->sendManialink($maniaLink, $player->login); - } - /** * Builds the Manialink * @@ -164,22 +113,22 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { * @return ManiaLink */ private function buildMenuIconsManialink(Player $player) { - $posX = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MENU_POSX); - $posY = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MENU_POSY); - $itemSize = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MENU_ITEMSIZE); - $shootManiaOffset = $this->maniaControl->manialinkManager->styleManager->getDefaultIconOffsetSM(); - $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadStyle(); - $quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadSubstyle(); + $posX = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MENU_POSX); + $posY = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MENU_POSY); + $itemSize = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MENU_ITEMSIZE); + $shootManiaOffset = $this->maniaControl->manialinkManager->styleManager->getDefaultIconOffsetSM(); + $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadStyle(); + $quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultQuadSubstyle(); $itemMarginFactorX = 1.3; $itemMarginFactorY = 1.2; - + // If game is shootmania lower the icons position by 20 if ($this->maniaControl->mapManager->getCurrentMap()->getGame() == 'sm') { $posY -= $shootManiaOffset; } - + $manialink = new ManiaLink(self::MLID_MENU); - + /* * Admin Menu */ @@ -188,17 +137,17 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $iconFrame = new Frame(); $manialink->add($iconFrame); $iconFrame->setPosition($posX, $posY); - + $backgroundQuad = new Quad(); $iconFrame->add($backgroundQuad); $backgroundQuad->setSize($itemSize * $itemMarginFactorX, $itemSize * $itemMarginFactorY); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); - + $itemQuad = new Quad_Icons64x64_1(); $iconFrame->add($itemQuad); $itemQuad->setSubStyle($itemQuad::SUBSTYLE_IconServers); $itemQuad->setSize($itemSize, $itemSize); - + // Admin Menu Description $descriptionLabel = new Label(); $manialink->add($descriptionLabel); @@ -207,7 +156,7 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $descriptionLabel->setSize(40, 4); $descriptionLabel->setTextSize(1.4); $descriptionLabel->setTextColor('fff'); - + // Admin Menu $popoutFrame = new Frame(); $manialink->add($popoutFrame); @@ -215,15 +164,15 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $popoutFrame->setHAlign(Control::RIGHT); $popoutFrame->setSize(4 * $itemSize * $itemMarginFactorX, $itemSize * $itemMarginFactorY); $popoutFrame->setVisible(false); - + $backgroundQuad = new Quad(); $popoutFrame->add($backgroundQuad); $backgroundQuad->setHAlign(Control::RIGHT); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); $backgroundQuad->setSize(count($this->adminMenuItems) * $itemSize * 1.15 + 2, $itemSize * $itemMarginFactorY); - + $itemQuad->addToggleFeature($popoutFrame); - + // Add items $x = -1; foreach ($this->adminMenuItems as $menuItems) { @@ -237,7 +186,7 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $menuQuad->setX($x); $menuQuad->setHAlign(Control::RIGHT); $x -= $itemSize * 1.05; - + if ($menuItem[1]) { $menuQuad->removeScriptFeatures(); $description = '$s' . $menuItem[1]; @@ -246,7 +195,7 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { } } } - + /* * Player Menu */ @@ -254,17 +203,17 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $iconFrame = new Frame(); $manialink->add($iconFrame); $iconFrame->setPosition($posX, $posY - $itemSize * $itemMarginFactorY); - + $backgroundQuad = new Quad(); $iconFrame->add($backgroundQuad); $backgroundQuad->setSize($itemSize * $itemMarginFactorX, $itemSize * $itemMarginFactorY); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); - + $itemQuad = new Quad_Icons64x64_1(); $iconFrame->add($itemQuad); $itemQuad->setSubStyle($itemQuad::SUBSTYLE_IconPlayers); $itemQuad->setSize($itemSize, $itemSize); - + // Player Menu Description $descriptionLabel = new Label(); $manialink->add($descriptionLabel); @@ -273,7 +222,7 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $descriptionLabel->setSize(40, 4); $descriptionLabel->setTextSize(1.4); $descriptionLabel->setTextColor('fff'); - + // Player Menu $popoutFrame = new Frame(); $manialink->add($popoutFrame); @@ -281,15 +230,15 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $popoutFrame->setHAlign(Control::RIGHT); $popoutFrame->setSize(4 * $itemSize * $itemMarginFactorX, $itemSize * $itemMarginFactorY); $popoutFrame->setVisible(false); - + $backgroundQuad = new Quad(); $popoutFrame->add($backgroundQuad); $backgroundQuad->setHAlign(Control::RIGHT); $backgroundQuad->setStyles($quadStyle, $quadSubstyle); $backgroundQuad->setSize(count($this->playerMenuItems) * $itemSize * 1.15 + 2, $itemSize * $itemMarginFactorY); - + $itemQuad->addToggleFeature($popoutFrame); - + // Add items $x = -1; foreach ($this->playerMenuItems as $menuItems) { @@ -303,7 +252,7 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { $menuQuad->setX($x); $menuQuad->setHAlign(Control::RIGHT); $x -= $itemSize * 1.05; - + if ($menuItem[1]) { $menuQuad->removeScriptFeatures(); $description = '$s' . $menuItem[1]; @@ -311,7 +260,56 @@ class ActionsMenu implements CallbackListener, ManialinkPageAnswerListener { } } } - + return $manialink; } + + /** + * Add a new Admin Menu Item + * + * @param Control $control + * @param int $order + * @param string $description + */ + public function addAdminMenuItem(Control $control, $order = 0, $description = null) { + if (!isset($this->adminMenuItems[$order])) { + $this->adminMenuItems[$order] = array(); + } + array_push($this->adminMenuItems[$order], array($control, $description)); + krsort($this->adminMenuItems); + $this->rebuildAndShowMenu(); + } + + /** + * Removes a Menu Item + * + * @param $order + * @param bool $playerAction + */ + public function removeMenuItem($order, $playerAction = true) { + if ($playerAction) { + unset($this->playerMenuItems[$order]); + } else { + unset($this->adminMenuItems[$order]); + } + $this->rebuildAndShowMenu(); + } + + /** + * Handle ManiaControl AfterInit callback + */ + public function handleAfterInit() { + $this->initCompleted = true; + $this->rebuildAndShowMenu(); + } + + /** + * Handle PlayerJoined callback + * + * @param Player $player + */ + public function handlePlayerJoined(Player $player) { + $maniaLink = $this->buildMenuIconsManialink($player); + $this->maniaControl->manialinkManager->sendManialink($maniaLink, $player->login); + } } diff --git a/application/core/Admin/AdminLists.php b/application/core/Admin/AdminLists.php index bf83d7ae..06721456 100644 --- a/application/core/Admin/AdminLists.php +++ b/application/core/Admin/AdminLists.php @@ -20,10 +20,10 @@ use ManiaControl\Players\Player; /** * Widget Class listing Authorized Players - * - * @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 AdminLists implements ManialinkPageAnswerListener, CallbackListener { /* @@ -61,8 +61,8 @@ class AdminLists implements ManialinkPageAnswerListener, CallbackListener { /** * Open Admin List Action - * - * @param array $callback + * + * @param array $callback * @param Player $player */ public function openAdminList(array $callback, Player $player) { @@ -71,7 +71,7 @@ class AdminLists implements ManialinkPageAnswerListener, CallbackListener { /** * Show the Admin List - * + * * @param Player $player */ public function showAdminLists(Player $player) { @@ -90,8 +90,8 @@ class AdminLists implements ManialinkPageAnswerListener, CallbackListener { //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); @@ -115,7 +115,7 @@ class AdminLists implements ManialinkPageAnswerListener, CallbackListener { $i = 1; $y = $y - 10; $pageFrames = array(); - foreach($admins as $admin) { + foreach ($admins as $admin) { if (!isset($pageFrame)) { $pageFrame = new Frame(); $frame->add($pageFrame); @@ -124,7 +124,7 @@ class AdminLists implements ManialinkPageAnswerListener, CallbackListener { } array_push($pageFrames, $pageFrame); $y = $height / 2 - 10; - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); } @@ -158,8 +158,8 @@ class AdminLists implements ManialinkPageAnswerListener, CallbackListener { $rightLabel->setTextSize(0.8); $rightLabel->setZ(10); $rightLabel->setText($this->maniaControl->authenticationManager->getAuthLevelAbbreviation($admin)); - $description = $this->maniaControl->authenticationManager->getAuthLevelName($admin) . " " . $admin->nickname; - $rightLabel->addTooltipLabelFeature($descriptionLabel, $description); + $description = $this->maniaControl->authenticationManager->getAuthLevelName($admin) . " " . $admin->nickname; + $rightLabel->addTooltipLabelFeature($descriptionLabel, $description); //Revoke Button if ($admin->authLevel > 0 && $this->maniaControl->authenticationManager->checkRight($player, $admin->authLevel + 1)) { @@ -217,7 +217,7 @@ class AdminLists implements ManialinkPageAnswerListener, CallbackListener { $adminLogin = $callback[1][1]; $targetLogin = $actionArray[2]; - switch($action) { + switch ($action) { case self::ACTION_REVOKE_RIGHTS: $this->maniaControl->playerManager->playerActions->revokeAuthLevel($adminLogin, $targetLogin); break; @@ -227,10 +227,10 @@ class AdminLists implements ManialinkPageAnswerListener, CallbackListener { /** * Reopen the widget on Map Begin, MapListChanged, etc. * - * @param array $callback + * @param Player $player */ public function updateWidget(Player $player) { - foreach($this->adminListShown as $login => $shown) { + foreach ($this->adminListShown as $login => $shown) { if ($shown) { $player = $this->maniaControl->playerManager->getPlayer($login); if ($player) { diff --git a/application/core/Admin/AuthCommands.php b/application/core/Admin/AuthCommands.php index 2dccd93c..d76428b6 100644 --- a/application/core/Admin/AuthCommands.php +++ b/application/core/Admin/AuthCommands.php @@ -2,16 +2,16 @@ namespace ManiaControl\Admin; -use ManiaControl\ManiaControl; use ManiaControl\Commands\CommandListener; +use ManiaControl\ManiaControl; use ManiaControl\Players\Player; /** * Class offering Commands to grant Authorizations 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 AuthCommands implements CommandListener { /* @@ -22,29 +22,29 @@ class AuthCommands implements CommandListener { /** * Create a new AuthCommands instance * - * @param ManiaControl $maniaControl + * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - + // Register for commands - $this->maniaControl->commandManager->registerCommandListener('addsuperadmin', $this, 'command_AddSuperAdmin',true, 'Adds player to adminlist as SuperAdmin.'); - $this->maniaControl->commandManager->registerCommandListener('addadmin', $this, 'command_AddAdmin',true, 'Adds player to adminlist as Admin.'); - $this->maniaControl->commandManager->registerCommandListener('addmod', $this, 'command_AddModerator',true, 'Add player to adminlist as Moderator.'); + $this->maniaControl->commandManager->registerCommandListener('addsuperadmin', $this, 'command_AddSuperAdmin', true, 'Add Player to the AdminList as SuperAdmin.'); + $this->maniaControl->commandManager->registerCommandListener('addadmin', $this, 'command_AddAdmin', true, 'Add Player to the AdminList as Admin.'); + $this->maniaControl->commandManager->registerCommandListener('addmod', $this, 'command_AddModerator', true, 'Add Player to the AdminList as Moderator.'); } /** * Handle //addsuperadmin command * - * @param array $chatCallback - * @param Player $player + * @param array $chatCallback + * @param Player $player */ public function command_AddSuperAdmin(array $chatCallback, Player $player) { if (!AuthenticationManager::checkRight($player, AuthenticationManager::AUTH_LEVEL_MASTERADMIN)) { $this->maniaControl->authenticationManager->sendNotAllowed($player); return; } - $text = $chatCallback[1][2]; + $text = $chatCallback[1][2]; $commandParts = explode(' ', $text); if (!array_key_exists(1, $commandParts)) { $this->sendAddSuperAdminUsageInfo($player); @@ -64,18 +64,29 @@ class AuthCommands implements CommandListener { $this->maniaControl->chat->sendSuccess($message); } + /** + * Send usage example for //addsuperadmin command + * + * @param Player $player + * @return bool + */ + private function sendAddSuperAdminUsageInfo(Player $player) { + $message = "Usage Example: '//addsuperadmin login'"; + return $this->maniaControl->chat->sendUsageInfo($message, $player->login); + } + /** * Handle //addadmin command * - * @param array $chatCallback - * @param Player $player + * @param array $chatCallback + * @param Player $player */ public function command_AddAdmin(array $chatCallback, Player $player) { if (!AuthenticationManager::checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) { $this->maniaControl->authenticationManager->sendNotAllowed($player); return; } - $text = $chatCallback[1][2]; + $text = $chatCallback[1][2]; $commandParts = explode(' ', $text); if (!array_key_exists(1, $commandParts)) { $this->sendAddAdminUsageInfo($player); @@ -95,18 +106,29 @@ class AuthCommands implements CommandListener { $this->maniaControl->chat->sendSuccess($message); } + /** + * Send usage example for //addadmin command + * + * @param Player $player + * @return bool + */ + private function sendAddAdminUsageInfo(Player $player) { + $message = "Usage Example: '//addadmin login'"; + return $this->maniaControl->chat->sendUsageInfo($message, $player->login); + } + /** * Handle //addmod command * - * @param array $chatCallback - * @param Player $player + * @param array $chatCallback + * @param Player $player */ public function command_AddModerator(array $chatCallback, Player $player) { if (!AuthenticationManager::checkRight($player, AuthenticationManager::AUTH_LEVEL_ADMIN)) { $this->maniaControl->authenticationManager->sendNotAllowed($player); return; } - $text = $chatCallback[1][2]; + $text = $chatCallback[1][2]; $commandParts = explode(' ', $text); if (!array_key_exists(1, $commandParts)) { $this->sendAddModeratorUsageInfo($player); @@ -126,32 +148,10 @@ class AuthCommands implements CommandListener { $this->maniaControl->chat->sendSuccess($message); } - /** - * Send usage example for //addsuperadmin command - * - * @param Player $player - * @return bool - */ - private function sendAddSuperAdminUsageInfo(Player $player) { - $message = "Usage Example: '//addsuperadmin login'"; - return $this->maniaControl->chat->sendUsageInfo($message, $player->login); - } - - /** - * Send usage example for //addadmin command - * - * @param Player $player - * @return bool - */ - private function sendAddAdminUsageInfo(Player $player) { - $message = "Usage Example: '//addadmin login'"; - return $this->maniaControl->chat->sendUsageInfo($message, $player->login); - } - /** * Send usage example for //addop command * - * @param Player $player + * @param Player $player * @return bool */ private function sendAddModeratorUsageInfo(Player $player) { diff --git a/application/core/Admin/AuthenticationManager.php b/application/core/Admin/AuthenticationManager.php index 39eac23e..e39de66a 100644 --- a/application/core/Admin/AuthenticationManager.php +++ b/application/core/Admin/AuthenticationManager.php @@ -10,32 +10,32 @@ use ManiaControl\Players\PlayerManager; /** * Class managing Authentication Levels - * - * @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 AuthenticationManager implements CallbackListener { /* * Constants */ - const AUTH_LEVEL_PLAYER = 0; - const AUTH_LEVEL_MODERATOR = 1; - const AUTH_LEVEL_ADMIN = 2; - const AUTH_LEVEL_SUPERADMIN = 3; + const AUTH_LEVEL_PLAYER = 0; + const AUTH_LEVEL_MODERATOR = 1; + const AUTH_LEVEL_ADMIN = 2; + const AUTH_LEVEL_SUPERADMIN = 3; const AUTH_LEVEL_MASTERADMIN = 4; - const AUTH_NAME_PLAYER = 'Player'; - const AUTH_NAME_MODERATOR = 'Moderator'; - const AUTH_NAME_ADMIN = 'Admin'; - const AUTH_NAME_SUPERADMIN = 'SuperAdmin'; - const AUTH_NAME_MASTERADMIN = 'MasterAdmin'; - const CB_AUTH_LEVEL_CHANGED = 'AuthenticationManager.AuthLevelChanged'; - + const AUTH_NAME_PLAYER = 'Player'; + const AUTH_NAME_MODERATOR = 'Moderator'; + const AUTH_NAME_ADMIN = 'Admin'; + const AUTH_NAME_SUPERADMIN = 'SuperAdmin'; + const AUTH_NAME_MASTERADMIN = 'MasterAdmin'; + const CB_AUTH_LEVEL_CHANGED = 'AuthenticationManager.AuthLevelChanged'; + /* * Public Properties */ public $authCommands = null; - + /* * Private Properties */ @@ -43,196 +43,19 @@ class AuthenticationManager implements CallbackListener { /** * Construct a new Authentication Manager - * + * * @param \ManiaControl\ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; $this->authCommands = new AuthCommands($maniaControl); - + $this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_ONINIT, $this, 'handleOnInit'); } - /** - * Handle ManiaControl OnInit Callback - */ - public function handleOnInit() { - $this->updateMasterAdmins(); - } - - /** - * Update MasterAdmins based on config - * - * @return bool - */ - private function updateMasterAdmins() { - $mysqli = $this->maniaControl->database->mysqli; - - // Remove all MasterAdmins - $adminQuery = "UPDATE `" . PlayerManager::TABLE_PLAYERS . "` - SET `authLevel` = ? - WHERE `authLevel` = ?;"; - $adminStatement = $mysqli->prepare($adminQuery); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); - return false; - } - $adminLevel = self::AUTH_LEVEL_SUPERADMIN; - $masterAdminLevel = self::AUTH_LEVEL_MASTERADMIN; - $adminStatement->bind_param('ii', $adminLevel, $masterAdminLevel); - $adminStatement->execute(); - if ($adminStatement->error) { - trigger_error($adminStatement->error); - } - $adminStatement->close(); - - // Set MasterAdmins - $masterAdmins = $this->maniaControl->config->masteradmins->xpath('login'); - $adminQuery = "INSERT INTO `" . PlayerManager::TABLE_PLAYERS . "` ( - `login`, - `authLevel` - ) VALUES ( - ?, ? - ) ON DUPLICATE KEY UPDATE - `authLevel` = VALUES(`authLevel`);"; - $adminStatement = $mysqli->prepare($adminQuery); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); - return false; - } - $success = true; - foreach ($masterAdmins as $masterAdmin) { - $login = (string) $masterAdmin; - $adminStatement->bind_param('si', $login, $masterAdminLevel); - $adminStatement->execute(); - if ($adminStatement->error) { - trigger_error($adminStatement->error); - $success = false; - } - } - $adminStatement->close(); - return $success; - } - - /** - * Get a List of all Admins - * - * @param $authLevel - * @return array null - */ - public function getAdmins($authLevel = -1) { - $mysqli = $this->maniaControl->database->mysqli; - if ($authLevel < 0) { - $query = "SELECT * FROM `" . PlayerManager::TABLE_PLAYERS . "` WHERE `authLevel` > 0 ORDER BY `authLevel` DESC;"; - } - else { - $query = "SELECT * FROM `" . PlayerManager::TABLE_PLAYERS . "` WHERE `authLevel` = " . $authLevel . ";"; - } - $result = $mysqli->query($query); - if (!$result) { - trigger_error($mysqli->error); - return null; - } - $admins = array(); - while ($row = $result->fetch_object()) { - array_push($admins, $row); - } - return $admins; - } - - /** - * Grant the Auth Level to the Player - * - * @param Player $player - * @param int $authLevel - * @return bool - */ - public function grantAuthLevel(Player &$player, $authLevel) { - if (!$player || !is_numeric($authLevel)) { - return false; - } - $authLevel = (int) $authLevel; - if ($authLevel >= self::AUTH_LEVEL_MASTERADMIN) { - return false; - } - - $mysqli = $this->maniaControl->database->mysqli; - $authQuery = "INSERT INTO `" . PlayerManager::TABLE_PLAYERS . "` ( - `login`, - `authLevel` - ) VALUES ( - ?, ? - ) ON DUPLICATE KEY UPDATE - `authLevel` = VALUES(`authLevel`);"; - $authStatement = $mysqli->prepare($authQuery); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); - return false; - } - $authStatement->bind_param('si', $player->login, $authLevel); - $authStatement->execute(); - if ($authStatement->error) { - trigger_error($authStatement->error); - $authStatement->close(); - return false; - } - $authStatement->close(); - - $player->authLevel = $authLevel; - $this->maniaControl->callbackManager->triggerCallback(self::CB_AUTH_LEVEL_CHANGED, $player); - - return true; - } - - /** - * Send an Error Message to the Player - * - * @param Player $player - * @return bool - */ - public function sendNotAllowed(Player $player) { - if (!$player) { - return false; - } - return $this->maniaControl->chat->sendError('You do not have the required Rights to perform this Action!', $player->login); - } - - /** - * Check if the Player has enough Rights - * - * @param Player $player - * @param int $neededAuthLevel - * @return bool - */ - public static function checkRight(Player $player, $neededAuthLevel) { - return ($player->authLevel >= $neededAuthLevel); - } - - /** - * Checks the permission by a right name - * - * @param Player $player - * @param $rightName - * @return bool - */ - public function checkPermission(Player $player, $rightName) { - $right = $this->maniaControl->settingManager->getSetting($this, $rightName); - return $this->checkRight($player, $right); - } - - /** - * Defines a Minimum Right Level needed for an action - * - * @param $rightName - * @param $authLevelNeeded - */ - public function definePermissionLevel($rightName, $authLevelNeeded) { - $this->maniaControl->settingManager->initSetting($this, $rightName, $authLevelNeeded); - } - /** * Get Name of the Authentication Level from Level Int - * + * * @param mixed $authLevelInt * @return string */ @@ -251,9 +74,46 @@ class AuthenticationManager implements CallbackListener { return self::AUTH_NAME_PLAYER; } + /** + * Get the Authentication Level Int from the given Param + * + * @param mixed $authLevelParam + * @return int + */ + public static function getAuthLevelInt($authLevelParam) { + if (is_object($authLevelParam) && property_exists($authLevelParam, 'authLevel')) { + return (int)$authLevelParam->authLevel; + } + if (is_string($authLevelParam)) { + return self::getAuthLevel($authLevelParam); + } + return (int)$authLevelParam; + } + + /** + * Get Authentication Level Int from Level Name + * + * @param string $authLevelName + * @return int + */ + public static function getAuthLevel($authLevelName) { + $authLevelName = (string)$authLevelName; + switch ($authLevelName) { + case self::AUTH_NAME_MASTERADMIN: + return self::AUTH_LEVEL_MASTERADMIN; + case self::AUTH_NAME_SUPERADMIN: + return self::AUTH_LEVEL_SUPERADMIN; + case self::AUTH_NAME_ADMIN: + return self::AUTH_LEVEL_ADMIN; + case self::AUTH_NAME_MODERATOR: + return self::AUTH_LEVEL_MODERATOR; + } + return self::AUTH_LEVEL_PLAYER; + } + /** * Get the Abbreviation of the Authentication Level from Level Int - * + * * @param mixed $authLevelInt * @return string */ @@ -273,39 +133,178 @@ class AuthenticationManager implements CallbackListener { } /** - * Get Authentication Level Int from Level Name - * - * @param string $authLevelName - * @return int + * Handle ManiaControl OnInit Callback */ - public static function getAuthLevel($authLevelName) { - $authLevelName = (string) $authLevelName; - switch ($authLevelName) { - case self::AUTH_NAME_MASTERADMIN: - return self::AUTH_LEVEL_MASTERADMIN; - case self::AUTH_NAME_SUPERADMIN: - return self::AUTH_LEVEL_SUPERADMIN; - case self::AUTH_NAME_ADMIN: - return self::AUTH_LEVEL_ADMIN; - case self::AUTH_NAME_MODERATOR: - return self::AUTH_LEVEL_MODERATOR; - } - return self::AUTH_LEVEL_PLAYER; + public function handleOnInit() { + $this->updateMasterAdmins(); } /** - * Get the Authentication Level Int from the given Param - * - * @param mixed $authLevelParam - * @return int + * Update MasterAdmins based on Config + * + * @return bool */ - public static function getAuthLevelInt($authLevelParam) { - if (is_object($authLevelParam) && property_exists($authLevelParam, 'authLevel')) { - return (int) $authLevelParam->authLevel; + private function updateMasterAdmins() { + $mysqli = $this->maniaControl->database->mysqli; + + // Remove all MasterAdmins + $adminQuery = "UPDATE `" . PlayerManager::TABLE_PLAYERS . "` + SET `authLevel` = ? + WHERE `authLevel` = ?;"; + $adminStatement = $mysqli->prepare($adminQuery); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; } - if (is_string($authLevelParam)) { - return self::getAuthLevel($authLevelParam); + $adminLevel = self::AUTH_LEVEL_SUPERADMIN; + $masterAdminLevel = self::AUTH_LEVEL_MASTERADMIN; + $adminStatement->bind_param('ii', $adminLevel, $masterAdminLevel); + $adminStatement->execute(); + if ($adminStatement->error) { + trigger_error($adminStatement->error); } - return (int) $authLevelParam; + $adminStatement->close(); + + // Set MasterAdmins + $masterAdmins = $this->maniaControl->config->masteradmins->xpath('login'); + $adminQuery = "INSERT INTO `" . PlayerManager::TABLE_PLAYERS . "` ( + `login`, + `authLevel` + ) VALUES ( + ?, ? + ) ON DUPLICATE KEY UPDATE + `authLevel` = VALUES(`authLevel`);"; + $adminStatement = $mysqli->prepare($adminQuery); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; + } + $success = true; + foreach ($masterAdmins as $masterAdmin) { + $login = (string)$masterAdmin; + $adminStatement->bind_param('si', $login, $masterAdminLevel); + $adminStatement->execute(); + if ($adminStatement->error) { + trigger_error($adminStatement->error); + $success = false; + } + } + $adminStatement->close(); + return $success; + } + + /** + * Get a List of all Admins + * + * @param $authLevel + * @return array null + */ + public function getAdmins($authLevel = -1) { + $mysqli = $this->maniaControl->database->mysqli; + if ($authLevel < 0) { + $query = "SELECT * FROM `" . PlayerManager::TABLE_PLAYERS . "` WHERE `authLevel` > 0 ORDER BY `authLevel` DESC;"; + } else { + $query = "SELECT * FROM `" . PlayerManager::TABLE_PLAYERS . "` WHERE `authLevel` = " . $authLevel . ";"; + } + $result = $mysqli->query($query); + if (!$result) { + trigger_error($mysqli->error); + return null; + } + $admins = array(); + while ($row = $result->fetch_object()) { + array_push($admins, $row); + } + return $admins; + } + + /** + * Grant the Auth Level to the Player + * + * @param Player $player + * @param int $authLevel + * @return bool + */ + public function grantAuthLevel(Player &$player, $authLevel) { + if (!$player || !is_numeric($authLevel)) { + return false; + } + $authLevel = (int)$authLevel; + if ($authLevel >= self::AUTH_LEVEL_MASTERADMIN) { + return false; + } + + $mysqli = $this->maniaControl->database->mysqli; + $authQuery = "INSERT INTO `" . PlayerManager::TABLE_PLAYERS . "` ( + `login`, + `authLevel` + ) VALUES ( + ?, ? + ) ON DUPLICATE KEY UPDATE + `authLevel` = VALUES(`authLevel`);"; + $authStatement = $mysqli->prepare($authQuery); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + return false; + } + $authStatement->bind_param('si', $player->login, $authLevel); + $authStatement->execute(); + if ($authStatement->error) { + trigger_error($authStatement->error); + $authStatement->close(); + return false; + } + $authStatement->close(); + + $player->authLevel = $authLevel; + $this->maniaControl->callbackManager->triggerCallback(self::CB_AUTH_LEVEL_CHANGED, $player); + + return true; + } + + /** + * Send an Error Message to the Player + * + * @param Player $player + * @return bool + */ + public function sendNotAllowed(Player $player) { + if (!$player) { + return false; + } + return $this->maniaControl->chat->sendError('You do not have the required Rights to perform this Action!', $player->login); + } + + /** + * Checks the permission by a right name + * + * @param Player $player + * @param $rightName + * @return bool + */ + public function checkPermission(Player $player, $rightName) { + $right = $this->maniaControl->settingManager->getSetting($this, $rightName); + return $this->checkRight($player, $right); + } + + /** + * Check if the Player has enough Rights + * + * @param Player $player + * @param int $neededAuthLevel + * @return bool + */ + public static function checkRight(Player $player, $neededAuthLevel) { + return ($player->authLevel >= $neededAuthLevel); + } + + /** + * Defines a Minimum Right Level needed for an action + * + * @param $rightName + * @param $authLevelNeeded + */ + public function definePermissionLevel($rightName, $authLevelNeeded) { + $this->maniaControl->settingManager->initSetting($this, $rightName, $authLevelNeeded); } } diff --git a/application/core/Bills/BillData.php b/application/core/Bills/BillData.php index a1606c7f..d228b0a8 100644 --- a/application/core/Bills/BillData.php +++ b/application/core/Bills/BillData.php @@ -1,14 +1,15 @@ + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class BillData { /* @@ -17,19 +18,20 @@ class BillData { public $function = null; public $pay = false; public $player = null; - public $receiverLogin = false; + public $receiverLogin = null; public $amount = 0; public $creationTime = -1; /** * Construct new BillData - * @param mixed $function + * + * @param mixed $function * @param Player $player - * @param int $amount - * @param string $pay + * @param int $amount + * @param bool $pay * @param string $receiverLogin */ - public function __construct($function, $player, $amount, $pay = false, $receiverLogin = false) { + public function __construct($function, Player $player, $amount, $pay = false, $receiverLogin = null) { $this->function = $function; $this->player = $player; $this->amount = $amount; diff --git a/application/core/Bills/BillManager.php b/application/core/Bills/BillManager.php index 1708447a..532c6fbb 100644 --- a/application/core/Bills/BillManager.php +++ b/application/core/Bills/BillManager.php @@ -11,8 +11,8 @@ use Maniaplanet\DedicatedServer\Structures\Bill; /** * ManiaControl Bill-Manager * - * @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 BillManager implements CallbackListener { @@ -103,7 +103,7 @@ class BillManager implements CallbackListener { $billData = $this->openBills[$billId]; /** @var BillData $billData */ - switch($callback[1][1]) { + switch ($callback[1][1]) { case Bill::STATE_PAYED: if ($billData->pay) { call_user_func($billData->function, $billData, self::PAYED_FROM_SERVER); 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 dea0bad3..f35843f9 100644 --- a/application/core/Callbacks/LibXmlRpcCallbackManager.php +++ b/application/core/Callbacks/LibXmlRpcCallbackManager.php @@ -5,6 +5,13 @@ namespace ManiaControl\Callbacks; use ManiaControl\ManiaControl; +/** + * Class managing & converting LibXmlRpc Callbacks + * + * @author ManiaControl Team + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + */ class LibXmlRpcCallbackManager implements CallbackListener { /* * Private Properties @@ -14,7 +21,8 @@ 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) { $this->maniaControl = $maniaControl; @@ -24,11 +32,11 @@ class LibXmlRpcCallbackManager implements CallbackListener { /** * Handle Script Callbacks * - * @param $name - * @param $data + * @param string $name + * @param array $data */ - public function handleScriptCallbacks($name, $data) { - switch($name) { + public function handleScriptCallbacks($name, array $data) { + switch ($name) { case 'LibXmlRpc_BeginMatch': $this->maniaControl->callbackManager->triggerCallback(Callbacks::BEGINMATCH, $data[0]); break; @@ -76,9 +84,9 @@ class LibXmlRpcCallbackManager implements CallbackListener { /** * Triggers the Ranking of a Player * - * @param $data + * @param array $data */ - private function triggerPlayerRanking($data) { + private function triggerPlayerRanking(array $data) { $player = $this->maniaControl->playerManager->getPlayer($data[1]); $this->maniaControl->callbackManager->triggerCallback(Callbacks::PLAYERRANKING, $player, $data[0], $data[6], $data[5]); } diff --git a/application/core/Callbacks/ShootManiaCallbacks.php b/application/core/Callbacks/ShootManiaCallbacks.php index d820e17d..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,8 @@ 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) { $this->maniaControl = $maniaControl; @@ -42,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; @@ -62,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 6d3ac808..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 { /* @@ -39,27 +39,12 @@ class TimerManager { } /** - * 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 Timing Listening, note < 10ms it can get inaccurate + * Register a Timer Listening, note < 10ms it can get inaccurate * - * @param TimerListener $listener - * @param $method - * @param $time + * @param TimerListener $listener + * @param string $method + * @param float $time + * @param bool $oneTime * @return bool */ public function registerTimerListening(TimerListener $listener, $method, $time, $oneTime = false) { @@ -70,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); @@ -85,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 * @@ -93,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; } @@ -108,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/Chat.php b/application/core/Chat.php index 56e7685b..a5f5d998 100644 --- a/application/core/Chat.php +++ b/application/core/Chat.php @@ -2,15 +2,14 @@ namespace ManiaControl; -use Maniaplanet\DedicatedServer\Xmlrpc\Exception; use Maniaplanet\DedicatedServer\Xmlrpc\LoginUnknownException; /** * Chat Utility 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 Chat { /* @@ -44,21 +43,18 @@ class Chat { } /** - * Get prefix + * Send an information message to the given login * + * @param string $message + * @param string $login * @param string|bool $prefix - * @return string + * @return bool */ - private function getPrefix($prefix) { - if (is_string($prefix)) { - return $prefix; - } - if ($prefix === true) { - return $this->maniaControl->settingManager->getSetting($this, self::SETTING_PREFIX); - } - return ''; + public function sendInformation($message, $login = null, $prefix = true) { + $format = $this->maniaControl->settingManager->getSetting($this, self::SETTING_FORMAT_INFORMATION); + return $this->sendChat($format . $message, $login); } - + /** * Send a chat message to the given login * @@ -73,7 +69,7 @@ class Chat { } if (!$login) { - $prefix = $this->getPrefix($prefix); + $prefix = $this->getPrefix($prefix); $chatMessage = '$<$z$ff0' . str_replace(' ', '', $prefix) . $prefix . $message . '$>'; $this->maniaControl->client->chatSendServerMessage($chatMessage); } else { @@ -81,25 +77,28 @@ class Chat { if (is_object($login) && property_exists($login, 'login')) { $login = $login->login; } - try{ + try { $this->maniaControl->client->chatSendServerMessage($chatMessage, $login); - } catch(LoginUnknownException $e){ + } catch (LoginUnknownException $e) { } } return true; } /** - * Send an information message to the given login + * Get prefix * - * @param string $message - * @param string $login * @param string|bool $prefix - * @return bool + * @return string */ - public function sendInformation($message, $login = null, $prefix = true) { - $format = $this->maniaControl->settingManager->getSetting($this, self::SETTING_FORMAT_INFORMATION); - return $this->sendChat($format . $message, $login); + private function getPrefix($prefix) { + if (is_string($prefix)) { + return $prefix; + } + if ($prefix === true) { + return $this->maniaControl->settingManager->getSetting($this, self::SETTING_PREFIX); + } + return ''; } /** @@ -115,6 +114,19 @@ class Chat { return $this->sendChat($format . $message, $login); } + /** + * Send the Exception Information to the Chat + * + * @param \Exception $exception + * @param string $login + * @return bool + */ + public function sendException(\Exception $exception, $login = null) { + $message = "Exception occurred: '{$exception->getMessage()}' ({$exception->getCode()})"; + $this->maniaControl->errorHandler->triggerDebugNotice($message); + return $this->sendError($message, $login); + } + /** * Send an Error Message to the Chat * @@ -127,19 +139,6 @@ class Chat { $format = $this->maniaControl->settingManager->getSetting($this, self::SETTING_FORMAT_ERROR); return $this->sendChat($format . $message, $login); } - - /** - * Send the Exception Information to the Chat - * - * @param Exception $exception - * @param string $login - * @return bool - */ - public function sendException(\Exception $exception, $login = null) { - $message = "Exception occurred: '{$exception->getMessage()}' ({$exception->getCode()})"; - $this->maniaControl->errorHandler->triggerDebugNotice($message); - $this->sendError($message, $login); - } /** * Send an usage info message to the given login diff --git a/application/core/ColorUtil.php b/application/core/ColorUtil.php index 8e99dfcd..80bd8c1d 100644 --- a/application/core/ColorUtil.php +++ b/application/core/ColorUtil.php @@ -5,21 +5,21 @@ namespace ManiaControl; /** * Utility Class offering Methods to convert and use ManiaPlanet Colors * - * @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 */ abstract class ColorUtil { /** * Convert the given float value to a color code from red to green * - * @param float $value + * @param float $value * @return string */ public static function floatToStatusColor($value) { $value = floatval($value); - $red = 1.; + $red = 1.; $green = 1.; if ($value < 0.5) { $green = $value * 2.; @@ -27,7 +27,7 @@ abstract class ColorUtil { if ($value > 0.5) { $red = 2. * (1. - $value); } - $red = ColorUtil::floatToCode($red); + $red = ColorUtil::floatToCode($red); $green = ColorUtil::floatToCode($green); return $red . $green . '0'; } @@ -35,7 +35,7 @@ abstract class ColorUtil { /** * Get hex color representation of the float * - * @param float $value + * @param float $value * @return string */ public static function floatToCode($value) { @@ -47,9 +47,9 @@ abstract class ColorUtil { $value = 1.; } $value *= 15.; - $value = (int) round($value); + $value = (int)round($value); if ($value < 10) { - return (string) $value; + return (string)$value; } $codes = array(10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f'); return $codes[$value]; diff --git a/application/core/CommandLineHelper.php b/application/core/CommandLineHelper.php index 73c79700..0ad10113 100644 --- a/application/core/CommandLineHelper.php +++ b/application/core/CommandLineHelper.php @@ -4,22 +4,22 @@ namespace ManiaControl; /** * Command Line Helper 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 CommandLineHelper { /** * Get the Command Line Parameter with the given Name - * + * * @param string $paramName * @return mixed */ public static function getParameter($paramName) { global $argv; - $paramName = (string) $paramName; + $paramName = (string)$paramName; foreach ($argv as $arg) { $parts = explode('=', $arg, 2); if (count($parts) < 2) { 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 0c687225..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,17 +100,13 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn } /** - * Handle Config Admin Command - * - * @param array $callback + * 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'); } /** @@ -123,45 +119,18 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn } /** - * Reopens the Menu - * - * @param array $callback - */ - public function reopenMenu($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); } /** @@ -177,73 +146,10 @@ class Configurator implements CallbackListener, CommandListener, ManialinkPageAn } /** - * Unset the player if he opened another Main Widget + * Build Menu ManiaLink if necessary * + * @param int $menuIdShown * @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 - * @internal param bool $forceBuild * @return \FML\ManiaLink */ private function buildManialink($menuIdShown = 0, Player $player) { @@ -285,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 @@ -307,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; @@ -343,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 * @@ -365,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/ConfiguratorMenu.php b/application/core/Configurators/ConfiguratorMenu.php index 10dd093d..d5c9a228 100644 --- a/application/core/Configurators/ConfiguratorMenu.php +++ b/application/core/Configurators/ConfiguratorMenu.php @@ -8,9 +8,9 @@ use ManiaControl\Players\Player; /** * Interface for Configurator Menus * - * @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 ConfiguratorMenu { 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 c9cc8801..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; } @@ -399,7 +348,7 @@ class ScriptSettings implements ConfiguratorMenu, CallbackListener { * * @param array $newSettings * @param Player $player - * @param bool + * @return bool */ private function applyNewScriptSettings(array $newSettings, Player $player) { if (!$newSettings) { @@ -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/Database/Database.php b/application/core/Database/Database.php index c1d90b34..b8aafd97 100644 --- a/application/core/Database/Database.php +++ b/application/core/Database/Database.php @@ -8,9 +8,9 @@ use ManiaControl\ManiaControl; /** * Database Connection 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 Database implements TimerListener { /* @@ -18,7 +18,7 @@ class Database implements TimerListener { */ public $mysqli = null; public $migrationHelper = null; - + /* * Private Properties */ @@ -29,13 +29,13 @@ class Database implements TimerListener { */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - + // Get mysql server information $host = $this->maniaControl->config->database->xpath('host'); $port = $this->maniaControl->config->database->xpath('port'); $user = $this->maniaControl->config->database->xpath('user'); $pass = $this->maniaControl->config->database->xpath('pass'); - + if (!$host) { trigger_error("Invalid database configuration (host).", E_USER_ERROR); } @@ -48,52 +48,32 @@ class Database implements TimerListener { if (!$pass) { trigger_error("Invalid database configuration (pass).", E_USER_ERROR); } - - $host = (string) $host[0]; - $port = (int) $port[0]; - $user = (string) $user[0]; - $pass = (string) $pass[0]; - + + $host = (string)$host[0]; + $port = (int)$port[0]; + $user = (string)$user[0]; + $pass = (string)$pass[0]; + // Enable mysqli Reconnect ini_set('mysqli.reconnect', 'on'); - + // Open database connection $this->mysqli = @new \mysqli($host, $user, $pass, null, $port); if ($this->mysqli->connect_error) { trigger_error($this->mysqli->connect_error, E_USER_ERROR); } $this->mysqli->set_charset("utf8"); - + $this->initDatabase(); $this->optimizeTables(); - + // Register Method which checks the Database Connection every 5 seconds $this->maniaControl->timerManager->registerTimerListening($this, 'checkConnection', 5000); - + // Create migration helper $this->migrationHelper = new MigrationHelper($maniaControl); } - /** - * Check if Connection still exists every 5 seconds - * - * @param $time - */ - public function checkConnection($time) { - if (!$this->mysqli->ping()) { - $this->maniaControl->quit("The MySQL server has gone away"); - } - } - - /** - * Destruct database connection - */ - public function __destruct() { - if ($this->mysqli) { - $this->mysqli->close(); - } - } - /** * Connect to the defined database (create it if needed) * @@ -105,14 +85,16 @@ class Database implements TimerListener { trigger_error("Invalid database configuration (database).", E_USER_ERROR); return false; } - $dbName = (string) $dbName[0]; - + $dbName = (string)$dbName[0]; + // Try to connect $result = $this->mysqli->select_db($dbName); - if ($result) return true; - + if ($result) { + return true; + } + // Create database - $databaseQuery = "CREATE DATABASE ?;"; + $databaseQuery = "CREATE DATABASE ?;"; $databaseStatement = $this->mysqli->prepare($databaseQuery); if ($this->mysqli->error) { trigger_error($this->mysqli->error, E_USER_ERROR); @@ -125,7 +107,7 @@ class Database implements TimerListener { return false; } $databaseStatement->close(); - + // Connect to new database $this->mysqli->select_db($dbName); if ($this->mysqli->error) { @@ -142,7 +124,7 @@ class Database implements TimerListener { */ private function optimizeTables() { $showQuery = "SHOW TABLES;"; - $result = $this->mysqli->query($showQuery); + $result = $this->mysqli->query($showQuery); if ($this->mysqli->error) { trigger_error($this->mysqli->error); return false; @@ -153,7 +135,7 @@ class Database implements TimerListener { return true; } $optimizeQuery = "OPTIMIZE TABLE "; - $index = 0; + $index = 0; while ($row = $result->fetch_row()) { $tableName = $row[0]; $optimizeQuery .= "`{$tableName}`"; @@ -171,4 +153,24 @@ class Database implements TimerListener { } return true; } + + /** + * Check if Connection still exists every 5 seconds + * + * @param $time + */ + public function checkConnection($time) { + if (!$this->mysqli->ping()) { + $this->maniaControl->quit("The MySQL server has gone away"); + } + } + + /** + * Destruct database connection + */ + public function __destruct() { + if ($this->mysqli) { + $this->mysqli->close(); + } + } } diff --git a/application/core/Database/MigrationHelper.php b/application/core/Database/MigrationHelper.php index fcc074a9..a6025bdc 100644 --- a/application/core/Database/MigrationHelper.php +++ b/application/core/Database/MigrationHelper.php @@ -1,16 +1,16 @@ + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class MigrationHelper { /* @@ -20,7 +20,7 @@ class MigrationHelper { /** * Construct Migration Helper - * + * * @param ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { @@ -37,10 +37,10 @@ class MigrationHelper { public function transferSettings($sourceClass, $targetClass) { $sourceClass = $this->getClass($sourceClass); $targetClass = $this->getClass($targetClass); - + $mysqli = $this->maniaControl->database->mysqli; - - $query = "INSERT INTO `" . SettingManager::TABLE_SETTINGS . "` (`class`, `setting`, `type`, `value`, `default`) + + $query = "INSERT INTO `" . SettingManager::TABLE_SETTINGS . "` (`class`, `setting`, `type`, `value`, `default`) SELECT ?, `setting`, `type`, `value`, `default` FROM `" . SettingManager::TABLE_SETTINGS . "` WHERE `class` = ?;"; $statement = $mysqli->prepare($query); if ($mysqli->error) { @@ -68,6 +68,6 @@ class MigrationHelper { if (is_object($class)) { return get_class($class); } - return (string) $class; + return (string)$class; } } diff --git a/application/core/ErrorHandler.php b/application/core/ErrorHandler.php index 458b38ef..317d196b 100644 --- a/application/core/ErrorHandler.php +++ b/application/core/ErrorHandler.php @@ -7,18 +7,18 @@ use ManiaControl\Update\UpdateManager; /** * Error and Exception 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 ErrorHandler { /* * Constants */ - const MC_DEBUG_NOTICE = "ManiaControl.DebugNotice"; + const MC_DEBUG_NOTICE = "ManiaControl.DebugNotice"; const SETTING_RESTART_ON_EXCEPTION = 'Automatically restart on Exceptions'; - + /* * Private Properties */ @@ -43,55 +43,52 @@ class ErrorHandler { /** * ManiaControl ExceptionHandler - * ManiaControl Shuts down after exception - * + * * @param \Exception $ex + * @param bool $shutdown */ public function exceptionHandler(\Exception $ex, $shutdown = true) { // Log exception - $message = "[ManiaControl EXCEPTION]: {$ex->getMessage()}"; + $message = "[ManiaControl EXCEPTION]: {$ex->getMessage()}"; $traceMessage = 'Class: ' . get_class($ex) . PHP_EOL; $traceMessage .= 'Trace:' . PHP_EOL . $ex->getTraceAsString(); logMessage($message . PHP_EOL . $traceMessage); - + if ($this->reportErrors) { - $error = array(); - $error["Type"] = "Exception"; - $error["Message"] = $message; - $error["Backtrace"] = $traceMessage; + $error = array(); + $error["Type"] = "Exception"; + $error["Message"] = $message; + $error["Backtrace"] = $traceMessage; $error['OperatingSystem'] = php_uname(); - $error['PHPVersion'] = phpversion(); - + $error['PHPVersion'] = phpversion(); + if ($this->maniaControl->server) { $error['ServerLogin'] = $this->maniaControl->server->login; - } - else { + } else { $error['ServerLogin'] = ''; } - + if ($this->maniaControl->settingManager && $this->maniaControl->updateManager) { - $error['UpdateChannel'] = $this->maniaControl->settingManager->getSetting($this->maniaControl->updateManager, UpdateManager::SETTING_UPDATECHECK_CHANNEL); + $error['UpdateChannel'] = $this->maniaControl->settingManager->getSetting($this->maniaControl->updateManager, UpdateManager::SETTING_UPDATECHECK_CHANNEL); $error['ManiaControlVersion'] = $this->maniaControl->updateManager->getNightlyBuildDate(); - } - else { - $error['UpdateChannel'] = ''; + } else { + $error['UpdateChannel'] = ''; $error['ManiaControlVersion'] = ManiaControl::VERSION; } - + $json = json_encode($error); $info = base64_encode($json); - - $url = ManiaControl::URL_WEBSERVICE . "errorreport?error=" . urlencode($info); + + $url = ManiaControl::URL_WEBSERVICE . "errorreport?error=" . urlencode($info); $success = FileUtil::loadFile($url); - + if (!json_decode($success)) { logMessage("Exception-Report failed!"); - } - else { + } else { logMessage("Exception successfully reported!"); } } - + if ($shutdown) { if ($this->shouldRestart()) { $this->maniaControl->restart(); @@ -100,9 +97,31 @@ class ErrorHandler { } } + /** + * Test if ManiaControl should restart automatically + * + * @return bool + */ + private function shouldRestart() { + if (!$this->maniaControl || !$this->maniaControl->settingManager) { + return false; + } + $setting = $this->maniaControl->settingManager->getSetting($this, self::SETTING_RESTART_ON_EXCEPTION, true); + return $setting; + } + + /** + * Triggers a Debug Notice to the ManiaControl Website + * + * @param $message + */ + public function triggerDebugNotice($message) { + $this->errorHandler(self::MC_DEBUG_NOTICE, $message); + } + /** * Error Handler - * + * * @param $errorNumber * @param $errorString * @param $errorFile @@ -114,52 +133,49 @@ class ErrorHandler { // Error suppressed return false; } - + $userError = $this->isUserErrorNumber($errorNumber); - + // Log error - $errorTag = $this->getErrorTag($errorNumber); - $message = $errorTag . ': ' . $errorString; - $fileLine = $errorFile . ': ' . $errorLine; + $errorTag = $this->getErrorTag($errorNumber); + $message = $errorTag . ': ' . $errorString; + $fileLine = $errorFile . ': ' . $errorLine; $traceMessage = $this->parseBackTrace(debug_backtrace()); - $logMessage = $message . PHP_EOL . ($userError ? $fileLine : $traceMessage); + $logMessage = $message . PHP_EOL . ($userError ? $fileLine : $traceMessage); logMessage($logMessage); - + if ($this->reportErrors && !$userError) { - $error = array(); - $error["Type"] = "Error"; - $error["Message"] = $message; - $error["FileLine"] = $fileLine; - $error["Backtrace"] = $traceMessage; + $error = array(); + $error["Type"] = "Error"; + $error["Message"] = $message; + $error["FileLine"] = $fileLine; + $error["Backtrace"] = $traceMessage; $error['OperatingSystem'] = php_uname(); - $error['PHPVersion'] = phpversion(); - + $error['PHPVersion'] = phpversion(); + if ($this->maniaControl->server) { $error['ServerLogin'] = $this->maniaControl->server->login; - } - else { + } else { $error['ServerLogin'] = ''; } - + if ($this->maniaControl->settingManager && $this->maniaControl->updateManager) { - $error['UpdateChannel'] = $this->maniaControl->settingManager->getSetting($this->maniaControl->updateManager, UpdateManager::SETTING_UPDATECHECK_CHANNEL); + $error['UpdateChannel'] = $this->maniaControl->settingManager->getSetting($this->maniaControl->updateManager, UpdateManager::SETTING_UPDATECHECK_CHANNEL); $error['ManiaControlVersion'] = ManiaControl::VERSION . '#' . $this->maniaControl->updateManager->getNightlyBuildDate(); - } - else { - $error['UpdateChannel'] = ''; + } else { + $error['UpdateChannel'] = ''; $error['ManiaControlVersion'] = ManiaControl::VERSION; } - + $json = json_encode($error); $info = base64_encode($json); - - $url = ManiaControl::URL_WEBSERVICE . "errorreport?error=" . urlencode($info); + + $url = ManiaControl::URL_WEBSERVICE . "errorreport?error=" . urlencode($info); $success = FileUtil::loadFile($url); - + if (!json_decode($success)) { logMessage("Error-Report failed!"); - } - else { + } else { logMessage("Error successfully reported!"); } } @@ -172,7 +188,7 @@ class ErrorHandler { /** * Check if the given Error Number is a User Error - * + * * @param int $errorNumber * @return bool */ @@ -180,18 +196,9 @@ class ErrorHandler { return ($errorNumber === E_USER_ERROR || $errorNumber === E_USER_WARNING || $errorNumber === E_USER_NOTICE || $errorNumber === E_USER_DEPRECATED); } - /** - * Triggers a Debug Notice to the ManiaControl Website - * - * @param $message - */ - public function triggerDebugNotice($message) { - $this->errorHandler(self::MC_DEBUG_NOTICE, $message); - } - /** * Get the Prefix for the given Error Level - * + * * @param int $errorLevel * @return string */ @@ -229,36 +236,13 @@ class ErrorHandler { return "[PHP {$errorLevel}]"; } - /** - * Test if ManiaControl should stop its Execution - * - * @param int $errorNumber - * @return bool - */ - private function shouldStopExecution($errorNumber) { - return ($errorNumber === E_ERROR || $errorNumber === E_USER_ERROR || $errorNumber === E_FATAL); - } - - /** - * Test if ManiaControl should restart automatically - * - * @return bool - */ - private function shouldRestart() { - if (!$this->maniaControl || !$this->maniaControl->settingManager) { - return false; - } - $setting = $this->maniaControl->settingManager->getSetting($this, self::SETTING_RESTART_ON_EXCEPTION, true); - return $setting; - } - /** * Parse the Debug Backtrace into a String for the Error Report * return string */ private function parseBackTrace(array $backtrace) { $traceString = 'Trace:'; - $stepCount = 0; + $stepCount = 0; foreach ($backtrace as $traceStep) { $traceString .= PHP_EOL . '#' . $stepCount . ': '; if (isset($traceStep['class'])) { @@ -282,4 +266,14 @@ class ErrorHandler { } return $traceString; } + + /** + * Test if ManiaControl should stop its Execution + * + * @param int $errorNumber + * @return bool + */ + private function shouldStopExecution($errorNumber) { + return ($errorNumber === E_ERROR || $errorNumber === E_USER_ERROR || $errorNumber === E_FATAL); + } } \ No newline at end of file diff --git a/application/core/Files/AsynchronousFileReader.php b/application/core/Files/AsynchronousFileReader.php index 7701a8ea..422832da 100644 --- a/application/core/Files/AsynchronousFileReader.php +++ b/application/core/Files/AsynchronousFileReader.php @@ -11,9 +11,9 @@ use ManiaControl\ManiaControl; /** * Asynchronous File Reader * - * @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 AsynchronousFileReader { /* @@ -35,13 +35,13 @@ class AsynchronousFileReader { * Appends the Data */ public function appendData() { - foreach($this->requests as $key => $request) { + foreach ($this->requests as $key => $request) { /** @var Request $request */ try { if ($request->socketPerform()) { $request->socketSelect(); } - } catch(Exception $e) { + } catch (Exception $e) { if ($e->getMessage() == "Cannot perform if there are no requests in queue.") { unset($this->requests[$key]); } else { @@ -54,9 +54,10 @@ class AsynchronousFileReader { /** * Load a remote file * - * @param string $url - * @param $function - * @param string $contentType + * @param string $url + * @param callable $function + * @param string $contentType + * @param int $keepAlive * @return bool */ public function loadFile($url, $function, $contentType = 'UTF-8', $keepAlive = 0) { @@ -118,11 +119,11 @@ class AsynchronousFileReader { /** * Send Data via POST Method * - * @param $url - * @param $function - * @param $content - * @param string $compression - * @param string $contentType + * @param string $url + * @param callable $function + * @param string $content + * @param bool $compression + * @param string $contentType * @return bool */ public function postData($url, $function, $content, $compression = false, $contentType = 'text/xml; charset=UTF-8') { diff --git a/application/core/Files/BackupUtil.php b/application/core/Files/BackupUtil.php index f4f2ec4a..04e9d2be 100644 --- a/application/core/Files/BackupUtil.php +++ b/application/core/Files/BackupUtil.php @@ -1,14 +1,15 @@ + * @copyright 2014 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ abstract class BackupUtil { /* @@ -18,53 +19,30 @@ abstract class BackupUtil { /** * Perform a Full Backup of ManiaControl - * + * * @return bool */ public static function performFullBackup() { - $backupFolder = self::getBackupFolder(); + $backupFolder = self::getBackupFolder(); $backupFileName = $backupFolder . 'backup_' . ManiaControl::VERSION . '_' . date('y-m-d') . '_' . time() . '.zip'; - $backupZip = new \ZipArchive(); - if ($backupZip->open($backupFileName, \ZipArchive::CREATE) !== TRUE) { + $backupZip = new \ZipArchive(); + if ($backupZip->open($backupFileName, \ZipArchive::CREATE) !== true) { trigger_error("Couldn't create Backup Zip!"); return false; } - $excludes = array('.', '..', 'backup', 'logs', 'ManiaControl.log'); - $pathInfo = pathInfo(ManiaControlDir); + $excludes = array('.', '..', 'backup', 'logs', 'ManiaControl.log'); + $pathInfo = pathInfo(ManiaControlDir); $parentPath = $pathInfo['dirname'] . '/'; - $dirName = $pathInfo['basename']; + $dirName = $pathInfo['basename']; $backupZip->addEmptyDir($dirName); self::zipDirectory($backupZip, ManiaControlDir, strlen($parentPath), $excludes); $backupZip->close(); return true; } - /** - * Perform a Backup of the Plugins - * - * @return bool - */ - public static function performPluginsBackup() { - $backupFolder = self::getBackupFolder(); - $backupFileName = $backupFolder . 'backup_plugins_' . date('y-m-d') . '_' . time() . '.zip'; - $backupZip = new \ZipArchive(); - if ($backupZip->open($backupFileName, \ZipArchive::CREATE) !== TRUE) { - trigger_error("Couldn't create Backup Zip!"); - return false; - } - $excludes = array('.', '..'); - $pathInfo = pathInfo(ManiaControlDir . '/plugins'); - $parentPath = $pathInfo['dirname'] . '/'; - $dirName = $pathInfo['basename']; - $backupZip->addEmptyDir($dirName); - self::zipDirectory($backupZip, ManiaControlDir . '/plugins', strlen($parentPath), $excludes); - $backupZip->close(); - return true; - } - /** * Get the Backup Folder Path and create it if necessary - * + * * @return string */ private static function getBackupFolder() { @@ -77,11 +55,11 @@ abstract class BackupUtil { /** * Add a complete Directory to the ZipArchive - * + * * @param \ZipArchive $zipArchive - * @param string $folderName - * @param int $prefixLength - * @param array $excludes + * @param string $folderName + * @param int $prefixLength + * @param array $excludes * @return bool */ private static function zipDirectory(\ZipArchive &$zipArchive, $folderName, $prefixLength, array $excludes = array()) { @@ -94,7 +72,7 @@ abstract class BackupUtil { if (in_array($file, $excludes)) { continue; } - $filePath = $folderName . '/' . $file; + $filePath = $folderName . '/' . $file; $localPath = substr($filePath, $prefixLength); if (is_file($filePath)) { $zipArchive->addFile($filePath, $localPath); @@ -109,4 +87,27 @@ abstract class BackupUtil { closedir($folderHandle); return true; } + + /** + * Perform a Backup of the Plugins + * + * @return bool + */ + public static function performPluginsBackup() { + $backupFolder = self::getBackupFolder(); + $backupFileName = $backupFolder . 'backup_plugins_' . date('y-m-d') . '_' . time() . '.zip'; + $backupZip = new \ZipArchive(); + if ($backupZip->open($backupFileName, \ZipArchive::CREATE) !== true) { + trigger_error("Couldn't create Backup Zip!"); + return false; + } + $excludes = array('.', '..'); + $pathInfo = pathInfo(ManiaControlDir . '/plugins'); + $parentPath = $pathInfo['dirname'] . '/'; + $dirName = $pathInfo['basename']; + $backupZip->addEmptyDir($dirName); + self::zipDirectory($backupZip, ManiaControlDir . '/plugins', strlen($parentPath), $excludes); + $backupZip->close(); + return true; + } } diff --git a/application/core/Files/FileUtil.php b/application/core/Files/FileUtil.php index 2b98458d..9e898841 100644 --- a/application/core/Files/FileUtil.php +++ b/application/core/Files/FileUtil.php @@ -2,15 +2,15 @@ namespace ManiaControl\Files; -use ManiaControl\ManiaControl; use ManiaControl\Formatter; +use ManiaControl\ManiaControl; /** * Files Utility 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 */ abstract class FileUtil { /* @@ -20,7 +20,7 @@ abstract class FileUtil { /** * Load a remote file - * + * * @param string $url * @param string $contentType * @return string || null @@ -29,48 +29,48 @@ abstract class FileUtil { if (!$url) { return null; } - $urlData = parse_url($url); - $port = (isset($urlData['port']) ? $urlData['port'] : 80); + $urlData = parse_url($url); + $port = (isset($urlData['port']) ? $urlData['port'] : 80); $urlQuery = isset($urlData['query']) ? "?" . $urlData['query'] : ""; - + $fsock = fsockopen($urlData['host'], $port); stream_set_timeout($fsock, 3); - + $query = 'GET ' . $urlData['path'] . $urlQuery . ' HTTP/1.0' . PHP_EOL; $query .= 'Host: ' . $urlData['host'] . PHP_EOL; $query .= 'Content-Type: ' . $contentType . PHP_EOL; $query .= 'User-Agent: ManiaControl v' . ManiaControl::VERSION . PHP_EOL; $query .= PHP_EOL; - + fwrite($fsock, $query); - + $buffer = ''; - $info = array('timed_out' => false); + $info = array('timed_out' => false); while (!feof($fsock) && !$info['timed_out']) { $buffer .= fread($fsock, 1024); $info = stream_get_meta_data($fsock); } fclose($fsock); - + if ($info['timed_out'] || !$buffer) { return null; } if (substr($buffer, 9, 3) != "200") { return null; } - + $result = explode("\r\n\r\n", $buffer, 2); - + if (count($result) < 2) { return null; } - + return $result[1]; } /** * Load config xml-file - * + * * @param string $fileName * @return \SimpleXMLElement */ @@ -89,7 +89,7 @@ abstract class FileUtil { /** * Return file name cleared from special characters - * + * * @param string $fileName * @return string */ @@ -100,9 +100,19 @@ abstract class FileUtil { return $fileName; } + /** + * Delete the Temporary Folder if it's empty + * + * @return bool + */ + public static function removeTempFolder() { + $tempFolder = self::getTempFolder(false); + return @rmdir($tempFolder); + } + /** * Get the Temporary Folder and create it if necessary - * + * * @param bool $createIfNecessary * @return string */ @@ -114,19 +124,9 @@ abstract class FileUtil { return $tempFolder; } - /** - * Delete the Temporary Folder if it's empty - * - * @return bool - */ - public static function removeTempFolder() { - $tempFolder = self::getTempFolder(false); - return @rmdir($tempFolder); - } - /** * Check if ManiaControl has sufficient Access to write to Files in the given Directories - * + * * @param mixed $directories * @return bool */ @@ -134,7 +134,7 @@ abstract class FileUtil { if (!is_array($directories)) { $directories = array($directories); } - + foreach ($directories as $directory) { $dir = new \RecursiveDirectoryIterator(ManiaControlDir . $directory); foreach (new \RecursiveIteratorIterator($dir) as $fileName => $file) { @@ -148,7 +148,7 @@ abstract class FileUtil { } } } - + return true; } } diff --git a/application/core/Formatter.php b/application/core/Formatter.php index 7c0d1818..9dfde90a 100644 --- a/application/core/Formatter.php +++ b/application/core/Formatter.php @@ -5,9 +5,9 @@ namespace ManiaControl; /** * Class offering Methods to format Texts and Values * - * @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 */ abstract class Formatter { @@ -68,7 +68,7 @@ abstract class Formatter { $a = array(12 * 30 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute', 1 => 'second'); - foreach($a as $secs => $str) { + foreach ($a as $secs => $str) { $d = $etime / $secs; if ($d >= 1) { $r = round($d); @@ -111,6 +111,16 @@ abstract class Formatter { return $string; } + /** + * Remove Links from the String + * + * @param string $string + * @return string + */ + public static function stripLinks($string) { + return preg_replace('/(? 'AFG', 'Albania' => 'ALB', 'Algeria' => 'ALG', 'Andorra' => 'AND', 'Angola' => 'ANG', 'Argentina' => 'ARG', 'Armenia' => 'ARM', 'Aruba' => 'ARU', 'Australia' => 'AUS', 'Austria' => 'AUT', 'Azerbaijan' => 'AZE', 'Bahamas' => 'BAH', 'Bahrain' => 'BRN', 'Bangladesh' => 'BAN', 'Barbados' => 'BAR', 'Belarus' => 'BLR', 'Belgium' => 'BEL', 'Belize' => 'BIZ', 'Benin' => 'BEN', 'Bermuda' => 'BER', 'Bhutan' => 'BHU', 'Bolivia' => 'BOL', 'Bosnia&Herzegovina' => 'BIH', 'Botswana' => 'BOT', 'Brazil' => 'BRA', 'Brunei' => 'BRU', 'Bulgaria' => 'BUL', 'Burkina Faso' => 'BUR', 'Burundi' => 'BDI', 'Cambodia' => 'CAM', 'Cameroon' => 'CAR', // actually CMR - 'Canada' => 'CAN', 'Cape Verde' => 'CPV', 'Central African Republic' => 'CAF', 'Chad' => 'CHA', 'Chile' => 'CHI', 'China' => 'CHN', 'Chinese Taipei' => 'TPE', 'Colombia' => 'COL', 'Congo' => 'CGO', 'Costa Rica' => 'CRC', 'Croatia' => 'CRO', 'Cuba' => 'CUB', 'Cyprus' => 'CYP', 'Czech Republic' => 'CZE', 'Czech republic' => 'CZE', 'DR Congo' => 'COD', 'Denmark' => 'DEN', 'Djibouti' => 'DJI', 'Dominica' => 'DMA', 'Dominican Republic' => 'DOM', 'Ecuador' => 'ECU', 'Egypt' => 'EGY', 'El Salvador' => 'ESA', 'Eritrea' => 'ERI', 'Estonia' => 'EST', 'Ethiopia' => 'ETH', 'Fiji' => 'FIJ', 'Finland' => 'FIN', 'France' => 'FRA', 'Gabon' => 'GAB', 'Gambia' => 'GAM', 'Georgia' => 'GEO', 'Germany' => 'GER', 'Ghana' => 'GHA', 'Greece' => 'GRE', 'Grenada' => 'GRN', 'Guam' => 'GUM', 'Guatemala' => 'GUA', 'Guinea' => 'GUI', 'Guinea-Bissau' => 'GBS', 'Guyana' => 'GUY', 'Haiti' => 'HAI', 'Honduras' => 'HON', 'Hong Kong' => 'HKG', 'Hungary' => 'HUN', 'Iceland' => 'ISL', 'India' => 'IND', 'Indonesia' => 'INA', 'Iran' => 'IRI', 'Iraq' => 'IRQ', 'Ireland' => 'IRL', 'Israel' => 'ISR', 'Italy' => 'ITA', 'Ivory Coast' => 'CIV', 'Jamaica' => 'JAM', 'Japan' => 'JPN', 'Jordan' => 'JOR', 'Kazakhstan' => 'KAZ', 'Kenya' => 'KEN', 'Kiribati' => 'KIR', 'Korea' => 'KOR', 'Kuwait' => 'KUW', 'Kyrgyzstan' => 'KGZ', 'Laos' => 'LAO', 'Latvia' => 'LAT', 'Lebanon' => 'LIB', 'Lesotho' => 'LES', 'Liberia' => 'LBR', 'Libya' => 'LBA', 'Liechtenstein' => 'LIE', 'Lithuania' => 'LTU', 'Luxembourg' => 'LUX', 'Macedonia' => 'MKD', 'Malawi' => 'MAW', 'Malaysia' => 'MAS', 'Mali' => 'MLI', 'Malta' => 'MLT', 'Mauritania' => 'MTN', 'Mauritius' => 'MRI', 'Mexico' => 'MEX', 'Moldova' => 'MDA', 'Monaco' => 'MON', 'Mongolia' => 'MGL', 'Montenegro' => 'MNE', 'Morocco' => 'MAR', 'Mozambique' => 'MOZ', 'Myanmar' => 'MYA', 'Namibia' => 'NAM', 'Nauru' => 'NRU', 'Nepal' => 'NEP', 'Netherlands' => 'NED', 'New Zealand' => 'NZL', 'Nicaragua' => 'NCA', 'Niger' => 'NIG', 'Nigeria' => 'NGR', 'Norway' => 'NOR', 'Oman' => 'OMA', 'Other Countries' => 'OTH', 'Pakistan' => 'PAK', 'Palau' => 'PLW', 'Palestine' => 'PLE', 'Panama' => 'PAN', 'Paraguay' => 'PAR', 'Peru' => 'PER', 'Philippines' => 'PHI', 'Poland' => 'POL', 'Portugal' => 'POR', 'Puerto Rico' => 'PUR', 'Qatar' => 'QAT', 'Romania' => 'ROM', // actually ROU - 'Russia' => 'RUS', 'Rwanda' => 'RWA', 'Samoa' => 'SAM', 'San Marino' => 'SMR', 'Saudi Arabia' => 'KSA', 'Senegal' => 'SEN', 'Serbia' => 'SCG', // actually SRB - 'Sierra Leone' => 'SLE', 'Singapore' => 'SIN', 'Slovakia' => 'SVK', 'Slovenia' => 'SLO', 'Somalia' => 'SOM', 'South Africa' => 'RSA', 'Spain' => 'ESP', 'Sri Lanka' => 'SRI', 'Sudan' => 'SUD', 'Suriname' => 'SUR', 'Swaziland' => 'SWZ', 'Sweden' => 'SWE', 'Switzerland' => 'SUI', 'Syria' => 'SYR', 'Taiwan' => 'TWN', 'Tajikistan' => 'TJK', 'Tanzania' => 'TAN', 'Thailand' => 'THA', 'Togo' => 'TOG', 'Tonga' => 'TGA', 'Trinidad and Tobago' => 'TRI', 'Tunisia' => 'TUN', 'Turkey' => 'TUR', 'Turkmenistan' => 'TKM', 'Tuvalu' => 'TUV', 'Uganda' => 'UGA', 'Ukraine' => 'UKR', 'United Arab Emirates' => 'UAE', 'United Kingdom' => 'GBR', 'United States of America' => 'USA', 'Uruguay' => 'URU', 'Uzbekistan' => 'UZB', 'Vanuatu' => 'VAN', 'Venezuela' => 'VEN', 'Vietnam' => 'VIE', 'Yemen' => 'YEM', 'Zambia' => 'ZAM', 'Zimbabwe' => 'ZIM'); + $nations = array('Afghanistan' => 'AFG', 'Albania' => 'ALB', 'Algeria' => 'ALG', 'Andorra' => 'AND', 'Angola' => 'ANG', 'Argentina' => 'ARG', 'Armenia' => 'ARM', 'Aruba' => 'ARU', 'Australia' => 'AUS', 'Austria' => 'AUT', 'Azerbaijan' => 'AZE', 'Bahamas' => 'BAH', 'Bahrain' => 'BRN', 'Bangladesh' => 'BAN', 'Barbados' => 'BAR', 'Belarus' => 'BLR', 'Belgium' => 'BEL', 'Belize' => 'BIZ', 'Benin' => 'BEN', 'Bermuda' => 'BER', 'Bhutan' => 'BHU', 'Bolivia' => 'BOL', 'Bosnia&Herzegovina' => 'BIH', 'Botswana' => 'BOT', 'Brazil' => 'BRA', 'Brunei' => 'BRU', 'Bulgaria' => 'BUL', 'Burkina Faso' => 'BUR', 'Burundi' => 'BDI', 'Cambodia' => 'CAM', 'Cameroon' => 'CAR', // actually CMR + 'Canada' => 'CAN', 'Cape Verde' => 'CPV', 'Central African Republic' => 'CAF', 'Chad' => 'CHA', 'Chile' => 'CHI', 'China' => 'CHN', 'Chinese Taipei' => 'TPE', 'Colombia' => 'COL', 'Congo' => 'CGO', 'Costa Rica' => 'CRC', 'Croatia' => 'CRO', 'Cuba' => 'CUB', 'Cyprus' => 'CYP', 'Czech Republic' => 'CZE', 'Czech republic' => 'CZE', 'DR Congo' => 'COD', 'Denmark' => 'DEN', 'Djibouti' => 'DJI', 'Dominica' => 'DMA', 'Dominican Republic' => 'DOM', 'Ecuador' => 'ECU', 'Egypt' => 'EGY', 'El Salvador' => 'ESA', 'Eritrea' => 'ERI', 'Estonia' => 'EST', 'Ethiopia' => 'ETH', 'Fiji' => 'FIJ', 'Finland' => 'FIN', 'France' => 'FRA', 'Gabon' => 'GAB', 'Gambia' => 'GAM', 'Georgia' => 'GEO', 'Germany' => 'GER', 'Ghana' => 'GHA', 'Greece' => 'GRE', 'Grenada' => 'GRN', 'Guam' => 'GUM', 'Guatemala' => 'GUA', 'Guinea' => 'GUI', 'Guinea-Bissau' => 'GBS', 'Guyana' => 'GUY', 'Haiti' => 'HAI', 'Honduras' => 'HON', 'Hong Kong' => 'HKG', 'Hungary' => 'HUN', 'Iceland' => 'ISL', 'India' => 'IND', 'Indonesia' => 'INA', 'Iran' => 'IRI', 'Iraq' => 'IRQ', 'Ireland' => 'IRL', 'Israel' => 'ISR', 'Italy' => 'ITA', 'Ivory Coast' => 'CIV', 'Jamaica' => 'JAM', 'Japan' => 'JPN', 'Jordan' => 'JOR', 'Kazakhstan' => 'KAZ', 'Kenya' => 'KEN', 'Kiribati' => 'KIR', 'Korea' => 'KOR', 'Kuwait' => 'KUW', 'Kyrgyzstan' => 'KGZ', 'Laos' => 'LAO', 'Latvia' => 'LAT', 'Lebanon' => 'LIB', 'Lesotho' => 'LES', 'Liberia' => 'LBR', 'Libya' => 'LBA', 'Liechtenstein' => 'LIE', 'Lithuania' => 'LTU', 'Luxembourg' => 'LUX', 'Macedonia' => 'MKD', 'Malawi' => 'MAW', 'Malaysia' => 'MAS', 'Mali' => 'MLI', 'Malta' => 'MLT', 'Mauritania' => 'MTN', 'Mauritius' => 'MRI', 'Mexico' => 'MEX', 'Moldova' => 'MDA', 'Monaco' => 'MON', 'Mongolia' => 'MGL', 'Montenegro' => 'MNE', 'Morocco' => 'MAR', 'Mozambique' => 'MOZ', 'Myanmar' => 'MYA', 'Namibia' => 'NAM', 'Nauru' => 'NRU', 'Nepal' => 'NEP', 'Netherlands' => 'NED', 'New Zealand' => 'NZL', 'Nicaragua' => 'NCA', 'Niger' => 'NIG', 'Nigeria' => 'NGR', 'Norway' => 'NOR', 'Oman' => 'OMA', 'Other Countries' => 'OTH', 'Pakistan' => 'PAK', 'Palau' => 'PLW', 'Palestine' => 'PLE', 'Panama' => 'PAN', 'Paraguay' => 'PAR', 'Peru' => 'PER', 'Philippines' => 'PHI', 'Poland' => 'POL', 'Portugal' => 'POR', 'Puerto Rico' => 'PUR', 'Qatar' => 'QAT', 'Romania' => 'ROM', // actually ROU + 'Russia' => 'RUS', 'Rwanda' => 'RWA', 'Samoa' => 'SAM', 'San Marino' => 'SMR', 'Saudi Arabia' => 'KSA', 'Senegal' => 'SEN', 'Serbia' => 'SCG', // actually SRB + 'Sierra Leone' => 'SLE', 'Singapore' => 'SIN', 'Slovakia' => 'SVK', 'Slovenia' => 'SLO', 'Somalia' => 'SOM', 'South Africa' => 'RSA', 'Spain' => 'ESP', 'Sri Lanka' => 'SRI', 'Sudan' => 'SUD', 'Suriname' => 'SUR', 'Swaziland' => 'SWZ', 'Sweden' => 'SWE', 'Switzerland' => 'SUI', 'Syria' => 'SYR', 'Taiwan' => 'TWN', 'Tajikistan' => 'TJK', 'Tanzania' => 'TAN', 'Thailand' => 'THA', 'Togo' => 'TOG', 'Tonga' => 'TGA', 'Trinidad and Tobago' => 'TRI', 'Tunisia' => 'TUN', 'Turkey' => 'TUR', 'Turkmenistan' => 'TKM', 'Tuvalu' => 'TUV', 'Uganda' => 'UGA', 'Ukraine' => 'UKR', 'United Arab Emirates' => 'UAE', 'United Kingdom' => 'GBR', 'United States of America' => 'USA', 'Uruguay' => 'URU', 'Uzbekistan' => 'UZB', 'Vanuatu' => 'VAN', 'Venezuela' => 'VEN', 'Vietnam' => 'VIE', 'Yemen' => 'YEM', 'Zambia' => 'ZAM', 'Zimbabwe' => 'ZIM'); if (array_key_exists($country, $nations)) { return $nations[$country]; } diff --git a/application/core/ManiaControl.php b/application/core/ManiaControl.php index 5c3db1d7..7234fea0 100644 --- a/application/core/ManiaControl.php +++ b/application/core/ManiaControl.php @@ -11,6 +11,7 @@ use ManiaControl\Callbacks\TimerManager; use ManiaControl\Commands\CommandListener; use ManiaControl\Commands\CommandManager; use ManiaControl\Configurators\Configurator; +use ManiaControl\Database\Database; use ManiaControl\Files\AsynchronousFileReader; use ManiaControl\Files\FileUtil; use ManiaControl\Manialinks\ManialinkManager; @@ -26,7 +27,6 @@ use Maniaplanet\DedicatedServer\Connection; use Maniaplanet\DedicatedServer\Xmlrpc\Exception; use Maniaplanet\DedicatedServer\Xmlrpc\NotInScriptModeException; use Maniaplanet\DedicatedServer\Xmlrpc\TransportException; -use ManiaControl\Database\Database; require_once __DIR__ . '/Libs/Maniaplanet/DedicatedServer/Connection.php'; require_once __DIR__ . '/Libs/GbxDataFetcher/gbxdatafetcher.inc.php'; @@ -36,26 +36,26 @@ require_once __DIR__ . '/Libs/curl-easy/autoload.php'; /** * ManiaControl Server Controller for ManiaPlanet Server - * - * @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 ManiaControl implements CommandListener, TimerListener { /* * Constants */ - const VERSION = '0.12'; - const API_VERSION = '2013-04-16'; - const MIN_DEDIVERSION = '2014-04-02_18_00'; - const OS_UNIX = 'Unix'; - const OS_WIN = 'Windows'; - const CONNECT_TIMEOUT = 50; - const SCRIPT_TIMEOUT = 20; - const URL_WEBSERVICE = 'http://ws.maniacontrol.com/'; + const VERSION = '0.12'; + const API_VERSION = '2013-04-16'; + const MIN_DEDIVERSION = '2014-04-02_18_00'; + const OS_UNIX = 'Unix'; + const OS_WIN = 'Windows'; + const CONNECT_TIMEOUT = 50; + const SCRIPT_TIMEOUT = 20; + const URL_WEBSERVICE = 'http://ws.maniacontrol.com/'; const SETTING_PERMISSION_SHUTDOWN = 'Shutdown ManiaControl'; - const SETTING_PERMISSION_RESTART = 'Restart ManiaControl'; - + const SETTING_PERMISSION_RESTART = 'Restart ManiaControl'; + /* * Public Properties */ @@ -66,7 +66,6 @@ class ManiaControl implements CommandListener, TimerListener { public $config = null; public $configurator = null; /** - * * @var Connection $client */ public $client = null; @@ -85,7 +84,7 @@ class ManiaControl implements CommandListener, TimerListener { public $timerManager = null; public $fileReader = null; public $billManager = null; - + /* * Private Properties */ @@ -97,53 +96,66 @@ class ManiaControl implements CommandListener, TimerListener { public function __construct() { // Construct Error Handler $this->errorHandler = new ErrorHandler($this); - + $this->log('Loading ManiaControl v' . self::VERSION . '...'); - + $this->loadConfig(); - + // Load ManiaControl Modules - $this->callbackManager = new CallbackManager($this); - $this->timerManager = new TimerManager($this); - $this->database = new Database($this); - $this->fileReader = new AsynchronousFileReader($this); - $this->billManager = new BillManager($this); - $this->settingManager = new SettingManager($this); - $this->statisticManager = new StatisticManager($this); - $this->manialinkManager = new ManialinkManager($this); - $this->actionsMenu = new ActionsMenu($this); - $this->chat = new Chat($this); - $this->commandManager = new CommandManager($this); - $this->server = new Server($this); + $this->callbackManager = new CallbackManager($this); + $this->timerManager = new TimerManager($this); + $this->database = new Database($this); + $this->fileReader = new AsynchronousFileReader($this); + $this->billManager = new BillManager($this); + $this->settingManager = new SettingManager($this); + $this->statisticManager = new StatisticManager($this); + $this->manialinkManager = new ManialinkManager($this); + $this->actionsMenu = new ActionsMenu($this); + $this->chat = new Chat($this); + $this->commandManager = new CommandManager($this); + $this->server = new Server($this); $this->authenticationManager = new AuthenticationManager($this); - $this->playerManager = new PlayerManager($this); - $this->mapManager = new MapManager($this); - $this->configurator = new Configurator($this); - $this->pluginManager = new PluginManager($this); - $this->updateManager = new UpdateManager($this); - + $this->playerManager = new PlayerManager($this); + $this->mapManager = new MapManager($this); + $this->configurator = new Configurator($this); + $this->pluginManager = new PluginManager($this); + $this->updateManager = new UpdateManager($this); + // Define Permission Levels $this->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_SHUTDOWN, AuthenticationManager::AUTH_LEVEL_SUPERADMIN); $this->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_RESTART, AuthenticationManager::AUTH_LEVEL_SUPERADMIN); - + // Register for commands $this->commandManager->registerCommandListener('version', $this, 'command_Version', false, 'Shows ManiaControl version.'); $this->commandManager->registerCommandListener('restart', $this, 'command_Restart', true, 'Restarts ManiaControl.'); $this->commandManager->registerCommandListener('shutdown', $this, 'command_Shutdown', true, 'Shuts ManiaControl down.'); - + // Check connection every 30 seconds $this->timerManager->registerTimerListening($this, 'checkConnection', 1000 * 30); - + $this->errorHandler->init(); } + /** + * Print a message to console and log + * + * @param string $message + * @param bool $stripCodes + */ + public function log($message, $stripCodes = false) { + if ($stripCodes) { + $message = Formatter::stripCodes($message); + } + logMessage($message); + } + /** * Load the Config XML-File */ private function loadConfig() { - $configId = CommandLineHelper::getParameter('-config'); + $configId = CommandLineHelper::getParameter('-config'); $configFileName = ($configId ? $configId : 'server.xml'); - $this->config = FileUtil::loadConfig($configFileName); + $this->config = FileUtil::loadConfig($configFileName); if (!$this->config) { trigger_error("Error loading Configuration XML-File! ('{$configFileName}')", E_USER_ERROR); } @@ -154,7 +166,7 @@ class ManiaControl implements CommandListener, TimerListener { /** * Checks connection every xxx Minutes - * + * * @param $time */ public function checkConnection($time) { @@ -164,20 +176,65 @@ class ManiaControl implements CommandListener, TimerListener { } /** - * Print a message to console and log - * + * Handle Version Command + * + * @param array $chatCallback + * @param Player $player + */ + public function command_Version(array $chatCallback, Player $player) { + $message = 'This server is using ManiaControl v' . ManiaControl::VERSION . '!'; + $this->chat->sendInformation($message, $player->login); + } + + /** + * Handle Restart AdminCommand + * + * @param array $chatCallback + * @param Player $player + */ + public function command_Restart(array $chatCallback, Player $player) { + if (!$this->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_RESTART)) { + $this->authenticationManager->sendNotAllowed($player); + return; + } + $this->restart("ManiaControl Restart requested by '{$player->login}'!"); + } + + /** + * Restart ManiaControl + * * @param string $message */ - public function log($message, $stripCodes = false) { - if ($stripCodes) { - $message = Formatter::stripCodes($message); + public function restart($message = null) { + // Shutdown callback + $this->callbackManager->triggerCallback(CallbackManager::CB_ONSHUTDOWN); + + // Announce restart + $this->chat->sendInformation('Restarting ManiaControl...'); + if ($message) { + $this->log($message); } - logMessage($message); + + // Hide widgets + $this->client->sendHideManialinkPage(); + + $this->log('Restarting ManiaControl!'); + + // Execute start script in background + // TODO: restart the .php script itself ($_SERVER['scriptname'] or something + $argv) + if ($this->getOS(self::OS_UNIX)) { + $command = 'sh ' . escapeshellarg(ManiaControlDir . '/ManiaControl.sh') . ' > /dev/null &'; + exec($command); + } else { + $command = escapeshellarg(ManiaControlDir . "\ManiaControl.bat"); + system($command); // TODO, windows stucks here as long controller is running + } + exit(); } /** * Get the Operating System on which ManiaControl is running - * + * * @param string $compareOS * @return string */ @@ -197,35 +254,10 @@ class ManiaControl implements CommandListener, TimerListener { return self::OS_UNIX; } - /** - * Handle Version Command - * - * @param array $chatCallback - * @param Player $player - */ - public function command_Version(array $chatCallback, Player $player) { - $message = 'This server is using ManiaControl v' . ManiaControl::VERSION . '!'; - $this->chat->sendInformation($message, $player->login); - } - - /** - * Handle Restart AdminCommand - * - * @param array $chatCallback - * @param Player $player - */ - public function command_Restart(array $chatCallback, Player $player) { - if (!$this->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_RESTART)) { - $this->authenticationManager->sendNotAllowed($player); - return; - } - $this->restart("ManiaControl Restart requested by '{$player->login}'!"); - } - /** * Handle //shutdown command - * - * @param array $chat + * + * @param array $chat * @param Player $player */ public function command_Shutdown(array $chat, Player $player) { @@ -238,14 +270,14 @@ class ManiaControl implements CommandListener, TimerListener { /** * Quit ManiaControl and log the given message - * + * * @param string $message */ public function quit($message = null) { if ($message) { $this->log($message); } - + exit(); } @@ -255,144 +287,35 @@ class ManiaControl implements CommandListener, TimerListener { public function handleShutdown() { // OnShutdown callback $this->callbackManager->triggerCallback(CallbackManager::CB_ONSHUTDOWN); - + // Announce quit $this->chat->sendInformation('ManiaControl shutting down.'); - + if ($this->client) { try { // Hide manialinks $this->client->sendHideManialinkPage(); // Close the client connection $this->client->delete($this->server->ip, $this->server->port); - } - catch (TransportException $e) { + } catch (TransportException $e) { $this->errorHandler->triggerDebugNotice($e->getMessage() . " File: " . $e->getFile() . " Line: " . $e->getLine()); } } - + // Check and Trigger Fatal Errors $error = error_get_last(); if ($error && ($error['type'] & E_FATAL)) { $this->errorHandler->errorHandler($error['type'], $error['message'], $error['file'], $error['line']); } - + // Disable Garbage Collector $this->collectGarbage(); gc_disable(); - + $this->log('Quitting ManiaControl!'); exit(); } - /** - * Restart ManiaControl - * - * @param string $message - */ - public function restart($message = null) { - // Shutdown callback - $this->callbackManager->triggerCallback(CallbackManager::CB_ONSHUTDOWN); - - // Announce restart - $this->chat->sendInformation('Restarting ManiaControl...'); - if ($message) { - $this->log($message); - } - - // Hide widgets - $this->client->sendHideManialinkPage(); - - $this->log('Restarting ManiaControl!'); - - // Execute start script in background - // TODO: restart the .php script itself ($_SERVER['scriptname'] or something + $argv) - if ($this->getOS(self::OS_UNIX)) { - $command = 'sh ' . escapeshellarg(ManiaControlDir . '/ManiaControl.sh') . ' > /dev/null &'; - exec($command); - } - else { - $command = escapeshellarg(ManiaControlDir . "\ManiaControl.bat"); - system($command); // TODO, windows stucks here as long controller is running - } - exit(); - } - - /** - * Run ManiaControl - */ - public function run() { - $this->log('Starting ManiaControl v' . self::VERSION . '!'); - - // Register shutdown handler - register_shutdown_function(array($this, 'handleShutdown')); - - // Connect to server - $this->connect(); - - // Check if the version of the server is high enough - $version = $this->client->getVersion(); - if ($version->build < self::MIN_DEDIVERSION) { - trigger_error("The Server has Version '{$version->build}', while at least '" . self::MIN_DEDIVERSION . "' is required!", E_USER_ERROR); - } - - // OnInit callback - $this->callbackManager->triggerCallback(CallbackManager::CB_ONINIT); - - // Load plugins - $this->pluginManager->loadPlugins(); - $this->updateManager->pluginUpdateManager->checkPluginsUpdate(); - - // AfterInit callback - $this->callbackManager->triggerCallback(CallbackManager::CB_AFTERINIT); - - // Enable Garbage Collecting - gc_enable(); - $this->timerManager->registerTimerListening($this, 'collectGarbage', 1000 * 60); - - // Announce ManiaControl - $this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!'); - - // Loading finished - $this->log('Loading completed!'); - $this->log('Link: maniaplanet://#join=' . $this->server->login . '@' . $this->server->titleId); - - // Main loop - while (!$this->shutdownRequested) { - $loopStart = microtime(true); - - // Disable script timeout - set_time_limit(self::SCRIPT_TIMEOUT); - - try { - // Manager callbacks - $this->callbackManager->manageCallbacks(); - } - catch (TransportException $e) { - $this->log("Connection interrupted!"); - // TODO remove - if ($this->errorHandler) { - $this->errorHandler->exceptionHandler($e, false); - } - $this->quit($e->getMessage()); - } - - // Manage FileReader - $this->fileReader->appendData(); - - // Yield for next tick - $loopEnd = microtime(true); - - $sleepTime = (int) (2000 - ($loopEnd - $loopStart) * 1000000); - if ($sleepTime > 0) { - usleep($sleepTime); - } - } - - // Shutdown - $this->quit(); - } - /** * Collect Garbage */ @@ -400,69 +323,139 @@ class ManiaControl implements CommandListener, TimerListener { gc_collect_cycles(); } + /** + * Run ManiaControl + */ + public function run() { + $this->log('Starting ManiaControl v' . self::VERSION . '!'); + + // Register shutdown handler + register_shutdown_function(array($this, 'handleShutdown')); + + // Connect to server + $this->connect(); + + // Check if the version of the server is high enough + $version = $this->client->getVersion(); + if ($version->build < self::MIN_DEDIVERSION) { + trigger_error("The Server has Version '{$version->build}', while at least '" . self::MIN_DEDIVERSION . "' is required!", E_USER_ERROR); + } + + // OnInit callback + $this->callbackManager->triggerCallback(CallbackManager::CB_ONINIT); + + // Load plugins + $this->pluginManager->loadPlugins(); + $this->updateManager->pluginUpdateManager->checkPluginsUpdate(); + + // AfterInit callback + $this->callbackManager->triggerCallback(CallbackManager::CB_AFTERINIT); + + // Enable Garbage Collecting + gc_enable(); + $this->timerManager->registerTimerListening($this, 'collectGarbage', 1000 * 60); + + // Announce ManiaControl + $this->chat->sendInformation('ManiaControl v' . self::VERSION . ' successfully started!'); + + // Loading finished + $this->log('Loading completed!'); + $this->log('Link: maniaplanet://#join=' . $this->server->login . '@' . $this->server->titleId); + + // Main loop + while (!$this->shutdownRequested) { + $loopStart = microtime(true); + + // Disable script timeout + set_time_limit(self::SCRIPT_TIMEOUT); + + try { + // Manager callbacks + $this->callbackManager->manageCallbacks(); + } catch (TransportException $e) { + $this->log("Connection interrupted!"); + // TODO remove + if ($this->errorHandler) { + $this->errorHandler->exceptionHandler($e, false); + } + $this->quit($e->getMessage()); + } + + // Manage FileReader + $this->fileReader->appendData(); + + // Yield for next tick + $loopEnd = microtime(true); + + $sleepTime = (int)(2000 - ($loopEnd - $loopStart) * 1000000); + if ($sleepTime > 0) { + usleep($sleepTime); + } + } + + // Shutdown + $this->quit(); + } + /** * Connect to ManiaPlanet server */ private function connect() { // Load remote client $this->server->loadConfig(); - + $this->log("Connecting to server at {$this->server->config->host}:{$this->server->config->port}..."); - + try { $this->client = Connection::factory($this->server->config->host, $this->server->config->port, self::CONNECT_TIMEOUT, $this->server->config->login, $this->server->config->pass); - } - catch (Exception $e) { + } catch (Exception $e) { trigger_error("Couldn't authenticate on server with user '{$this->server->config->login}'! " . $e->getMessage(), E_USER_ERROR); } - + // Enable callback system $this->client->enableCallbacks(true); - + // Wait for server to be ready try { if (!$this->server->waitForStatus(4)) { trigger_error("Server couldn't get ready!", E_USER_ERROR); } - } - catch (Exception $e) { + } catch (Exception $e) { // TODO remove if ($this->errorHandler) { $this->errorHandler->triggerDebugNotice("Fatal Exception: " . $e->getMessage() . " Trace: " . $e->getTraceAsString()); } $this->quit($e->getMessage()); } - + // Connect finished $this->log("Server Connection successfully established!"); - + // Hide old widgets $this->client->sendHideManialinkPage(); - + // Enable script callbacks if needed if ($this->server->getGameMode() != 0) { return; } - + try { $scriptSettings = $this->client->getModeScriptSettings(); - } - catch (NotInScriptModeException $e) { + } catch (NotInScriptModeException $e) { return; } - + if (!array_key_exists('S_UseScriptCallbacks', $scriptSettings)) { return; } - + $scriptSettings['S_UseScriptCallbacks'] = true; try { $this->client->setModeScriptSettings($scriptSettings); - } - catch (Exception $e) { + } catch (Exception $e) { // TODO temp added 19.04.2014 $this->errorHandler->triggerDebugNotice("Exception line 437 ManiaControl.php " . $e->getMessage()); - + trigger_error("Couldn't set mode script settings to enable script callbacks. " . $e->getMessage()); return; } 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 03a23b2c..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,33 +289,38 @@ 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); } } + /** + * Handle ManialinkPageAnswer Callback + * + * @param array $callback + */ 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)) { @@ -325,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 * @@ -334,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); @@ -357,58 +386,46 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb } } - private function showMapListAuthor($author, $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); - } - - private function showMapListKarma($best, $player) { + /** + * Show a Karma based MapList + * + * @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); } @@ -418,18 +435,20 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb } } - private function sortByKarma($a, $b) { - return $a->karma - $b->karma; - } - - private function showMapListDate($newest, $player) { + /** + * Show a Date based MapList + * + * @param bool $newest + * @param Player $player + */ + private function showMapListDate($newest, Player $player) { $maps = $this->maniaControl->mapManager->getMaps(); - usort($maps, function($a, $b) { - return $a->index - $b->index; + usort($maps, function ($a, $b) { + return ($a->index - $b->index); }); - if($newest) { + if ($newest) { $maps = array_reverse($maps); } @@ -445,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 03f9be30..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,55 +129,40 @@ 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); } /** - * Updates the Timestamp of a map + * Update the Timestamp of a Map * - * @param $map + * @param string $uid * @return bool */ private function updateMapTimestamp($uid) { $mysqli = $this->maniaControl->database->mysqli; - $mapQuery = "UPDATE `" . self::TABLE_MAPS . "` SET mxid = 0, changed = NOW() WHERE 'uid' = ?"; + $mapQuery = "UPDATE `" . self::TABLE_MAPS . "` SET + mxid = 0, + changed = NOW() + WHERE 'uid' = ?"; $mapStatement = $mysqli->prepare($mapQuery); if ($mysqli->error) { @@ -195,30 +180,6 @@ class MapManager implements CallbackListener { return true; } - /** - * Updates a Map from Mania Exchange - * - * @param Player $admin - * @param $mxId - * @param $uid - */ - public function updateMap(Player $admin, $uid) { - $this->updateMapTimestamp($uid); - - if (!isset($uid) || !isset($this->maps[$uid])) { - trigger_error("Error while updating Map, unkown 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 * @@ -245,7 +206,7 @@ class MapManager implements CallbackListener { // Remove map try { $this->maniaControl->client->removeMap($map->fileName); - } catch(MapNotInCurrentSelectionException $e) { + } catch (MapNotInCurrentSelectionException $e) { } @@ -271,328 +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 - * - * @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 * @@ -668,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; @@ -680,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; @@ -715,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 cef6d7ff..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) { } } } @@ -203,7 +203,6 @@ class PlayerActions { * * @param string $adminLogin * @param string $targetLogin - * @param int $spectatorState */ public function unMutePlayer($adminLogin, $targetLogin) { $admin = $this->maniaControl->playerManager->getPlayer($adminLogin); @@ -218,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; } @@ -236,7 +235,6 @@ class PlayerActions { * * @param string $adminLogin * @param string $targetLogin - * @param int $spectatorState */ public function mutePlayer($adminLogin, $targetLogin) { $admin = $this->maniaControl->playerManager->getPlayer($adminLogin); @@ -251,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; } @@ -324,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); @@ -370,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; } @@ -497,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 93fcc185..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); @@ -167,8 +167,8 @@ class PlayerCommands implements CommandListener, ManialinkPageAnswerListener, Ca * @param array $chatCallback * @param Player $player */ - public function command_Warn(array $chat, Player $player) { - $params = explode(' ', $chat[1][2], 3); + public function command_Warn(array $chatCallback, Player $player) { + $params = explode(' ', $chatCallback[1][2], 3); if (count($params) <= 1) { $this->maniaControl->chat->sendUsageInfo("No Login given! Example: '//kick login'", $player->login); return; diff --git a/application/core/Players/PlayerDataManager.php b/application/core/Players/PlayerDataManager.php index eedd87af..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,200 +42,6 @@ class PlayerDataManager { $this->storeMetaData(); } - /** - * Destroys the stored PlayerData (Method get called by PlayerManager, so don't call it anywhere else) - * - * @param Player $player - */ - public function destroyPlayerData(Player $player) { - unset($this->storedData[$player->index]); - } - - /** - * Defines the Player-Data MetaData - * - * @param $object - * @param $dataName - * @param $default - * @param $dataDescription (optional) - * @return bool - */ - public function defineMetaData($object, $dataName, $default, $dataDescription = '') { - $mysqli = $this->maniaControl->database->mysqli; - $className = $this->getClassName($object); - - $query = "INSERT INTO `" . self::TABLE_PLAYERDATAMETADATA . "` ( - `class`, - `dataName`, - `type`, - `defaultValue`, - `description` - ) VALUES ( - ?, ?, ?, ?, ? - ) ON DUPLICATE KEY UPDATE - `type` = VALUES(`type`), - `defaultValue` = VALUES(`defaultValue`), - `description` = VALUES(`description`);"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error); - return false; - } - $type = $this->getType($default); - - $statement->bind_param('sssss', $className, $dataName, $type, $default, $dataDescription); - $statement->execute(); - if ($statement->error) { - trigger_error($statement->error); - $statement->close(); - 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(); - } - - /** - * Gets the Player Data - * - * @param $object - * @param $dataName - * @param Player $player - * @param $serverIndex - * @return mixed|null - */ - public function getPlayerData($object, $statName, Player $player, $serverIndex = -1) { - $className = $this->getClassName($object); - - $meta = $this->metaData[$className . $statName]; - - //Check if data is already in the ram - if (isset($this->storedData[$player->index])) { - if (isset($this->storedData[$player->index][$meta->dataId])) { - return $this->storedData[$player->index][$meta->dataId]; - } - } - - $mysqli = $this->maniaControl->database->mysqli; - $dataQuery = "SELECT `value` FROM `" . self::TABLE_PLAYERDATA . "` - WHERE `dataId` = ? - AND `playerId` = ? - AND `serverIndex` = ?;"; - $dataStatement = $mysqli->prepare($dataQuery); - if ($mysqli->error) { - trigger_error($mysqli->error); - return null; - } - $dataStatement->bind_param('iii', $meta->dataId, $player->index, $serverIndex); - $dataStatement->execute(); - if ($dataStatement->error) { - trigger_error($dataStatement->error); - return null; - } - $dataStatement->store_result(); - if ($dataStatement->num_rows <= 0) { - $this->setPlayerData($object, $statName, $player, $meta->defaultValue, $serverIndex); - return $meta->default; - } - $dataStatement->bind_result($value); - $dataStatement->fetch(); - $dataStatement->free_result(); - $dataStatement->close(); - $data = $this->castSetting($meta->type, $value); - - //Store setting in the ram - if (!isset($this->storedData[$player->index])) { - $this->storedData[$player->index] = array(); - } - $this->storedData[$player->index][$meta->dataId] = $data; - return $data; - } - - /** - * Set a PlayerData to a specific defined statMetaData - * - * @param $object - * @param $statName - * @param Player $player - * @param $value - * @param $serverIndex (let it empty if its global) - * @return bool - */ - public function setPlayerData($object, $dataName, Player $player, $value, $serverIndex = -1) { - $className = $this->getClassName($object); - if (!$player) { - return false; - } - - $dataId = $this->getMetaDataId($className, $dataName); - if (!$dataId) { - return false; - } - - $mysqli = $this->maniaControl->database->mysqli; - $query = "INSERT INTO `" . self::TABLE_PLAYERDATA . "` ( - `serverIndex`, - `playerId`, - `dataId`, - `value` - ) VALUES ( - ?, ?, ?, ? - ) ON DUPLICATE KEY UPDATE - `value` = VALUES(`value`);"; - $statement = $mysqli->prepare($query); - if ($mysqli->error) { - trigger_error($mysqli->error); - return false; - } - $statement->bind_param('iiis', $serverIndex, $player->index, $dataId, $value); - $statement->execute(); - if ($statement->error) { - trigger_error($statement->error); - $statement->close(); - return false; - } - $statement->close(); - - //FIXME store changed value - if (isset($this->storedData[$player->index]) && isset($this->storedData[$player->index][$dataId])) { - unset($this->storedData[$player->index][$dataId]); - } - - return true; - } - - /** - * Return the Id of the MetaData - * - * @param $statName - * @return int - */ - private function getMetaDataId($className, $statName) { - if (isset($this->metaData[$className . $statName])) { - $stat = $this->metaData[$className . $statName]; - return (int)$stat->dataId; - } - return null; - } - /** * Initialize necessary database tables * @@ -291,6 +97,94 @@ class PlayerDataManager { 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) + * + * @param Player $player + */ + public function destroyPlayerData(Player $player) { + unset($this->storedData[$player->index]); + } + + /** + * Defines the Player-Data MetaData + * + * @param $object + * @param $dataName + * @param $default + * @param $dataDescription (optional) + * @return bool + */ + public function defineMetaData($object, $dataName, $default, $dataDescription = '') { + $mysqli = $this->maniaControl->database->mysqli; + $className = $this->getClassName($object); + + $query = "INSERT INTO `" . self::TABLE_PLAYERDATAMETADATA . "` ( + `class`, + `dataName`, + `type`, + `defaultValue`, + `description` + ) VALUES ( + ?, ?, ?, ?, ? + ) ON DUPLICATE KEY UPDATE + `type` = VALUES(`type`), + `defaultValue` = VALUES(`defaultValue`), + `description` = VALUES(`description`);"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error); + return false; + } + $type = $this->getType($default); + + $statement->bind_param('sssss', $className, $dataName, $type, $default, $dataDescription); + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error); + $statement->close(); + return false; + } + $statement->close(); + return true; + } + + /** + * 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 * @@ -317,6 +211,130 @@ class PlayerDataManager { return null; } + /** + * Gets the Player Data + * + * @param mixed $object + * @param string $dataName + * @param Player $player + * @param int $serverIndex + * @return mixed|null + */ + public function getPlayerData($object, $dataName, Player $player, $serverIndex = -1) { + $className = $this->getClassName($object); + + $meta = $this->metaData[$className . $dataName]; + + //Check if data is already in the ram + if (isset($this->storedData[$player->index])) { + if (isset($this->storedData[$player->index][$meta->dataId])) { + return $this->storedData[$player->index][$meta->dataId]; + } + } + + $mysqli = $this->maniaControl->database->mysqli; + $dataQuery = "SELECT `value` FROM `" . self::TABLE_PLAYERDATA . "` + WHERE `dataId` = ? + AND `playerId` = ? + AND `serverIndex` = ?;"; + $dataStatement = $mysqli->prepare($dataQuery); + if ($mysqli->error) { + trigger_error($mysqli->error); + return null; + } + $dataStatement->bind_param('iii', $meta->dataId, $player->index, $serverIndex); + $dataStatement->execute(); + if ($dataStatement->error) { + trigger_error($dataStatement->error); + return null; + } + $dataStatement->store_result(); + if ($dataStatement->num_rows <= 0) { + $this->setPlayerData($object, $dataName, $player, $meta->defaultValue, $serverIndex); + return $meta->default; + } + $dataStatement->bind_result($value); + $dataStatement->fetch(); + $dataStatement->free_result(); + $dataStatement->close(); + $data = $this->castSetting($meta->type, $value); + + //Store setting in the ram + if (!isset($this->storedData[$player->index])) { + $this->storedData[$player->index] = array(); + } + $this->storedData[$player->index][$meta->dataId] = $data; + return $data; + } + + /** + * Set a PlayerData to a specific defined statMetaData + * + * @param mixed $object + * @param string $dataName + * @param Player $player + * @param mixed $value + * @param int $serverIndex (let it empty if its global) + * @return bool + */ + public function setPlayerData($object, $dataName, Player $player, $value, $serverIndex = -1) { + $className = $this->getClassName($object); + if (!$player) { + return false; + } + + $dataId = $this->getMetaDataId($className, $dataName); + if (!$dataId) { + return false; + } + + $mysqli = $this->maniaControl->database->mysqli; + $query = "INSERT INTO `" . self::TABLE_PLAYERDATA . "` ( + `serverIndex`, + `playerId`, + `dataId`, + `value` + ) VALUES ( + ?, ?, ?, ? + ) ON DUPLICATE KEY UPDATE + `value` = VALUES(`value`);"; + $statement = $mysqli->prepare($query); + if ($mysqli->error) { + trigger_error($mysqli->error); + return false; + } + $statement->bind_param('iiis', $serverIndex, $player->index, $dataId, $value); + $statement->execute(); + if ($statement->error) { + trigger_error($statement->error); + $statement->close(); + return false; + } + $statement->close(); + + //FIXME store changed value + if (isset($this->storedData[$player->index]) && isset($this->storedData[$player->index][$dataId])) { + unset($this->storedData[$player->index][$dataId]); + } + + return true; + } + + /** + * Return the Id of the MetaData + * + * @param string $className + * @param string $statName + * @return int + */ + private function getMetaDataId($className, $statName) { + if (isset($this->metaData[$className . $statName])) { + $stat = $this->metaData[$className . $statName]; + return (int)$stat->dataId; + } + return null; + } + /** * Cast a Setting to the given Type * @@ -343,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 4b9ab3b0..c0162271 100644 --- a/application/core/Players/PlayerDetailed.php +++ b/application/core/Players/PlayerDetailed.php @@ -14,13 +14,14 @@ use ManiaControl\Formatter; use ManiaControl\ManiaControl; use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\Statistics\StatisticManager; +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 { /* @@ -48,8 +49,14 @@ class PlayerDetailed { $this->quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultMainWindowSubStyle(); } - + /** + * Show a Frame with detailed Information about the Target Player + * + * @param Player $player + * @param string $targetLogin + */ public function showPlayerDetailed(Player $player, $targetLogin) { + /** @var Player $target */ $target = $this->maniaControl->playerManager->getPlayer($targetLogin); //Create ManiaLink @@ -209,7 +216,13 @@ class PlayerDetailed { $this->maniaControl->manialinkManager->displayWidget($maniaLink, $player, 'PlayerDetailed'); } - public function statisticsFrame($player) { + /** + * Build a Frame with Statistics about the given Player + * + * @param Player $player + * @return Frame + */ + public function statisticsFrame(Player $player) { $frame = new Frame(); $playerStats = $this->maniaControl->statisticManager->getAllPlayerStats($player); @@ -217,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 e2099acd..1c5536e2 100644 --- a/application/core/Players/PlayerList.php +++ b/application/core/Players/PlayerList.php @@ -2,7 +2,6 @@ namespace ManiaControl\Players; -use MCTeam\CustomVotesPlugin; use FML\Controls\Control; use FML\Controls\Frame; use FML\Controls\Labels\Label_Button; @@ -23,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 { @@ -96,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 * @@ -115,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); @@ -144,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(); @@ -154,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(); @@ -193,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; @@ -221,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 @@ -240,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(); @@ -251,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(); @@ -261,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 @@ -272,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 @@ -289,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()) { @@ -305,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(); @@ -318,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 @@ -331,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)) { @@ -345,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); } } @@ -361,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(); @@ -374,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; @@ -395,27 +429,14 @@ 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... * - * @param $login + * @param Player $admin + * @param string $login * @return Frame */ - public function showAdvancedPlayerWidget($admin, $login) { + public function showAdvancedPlayerWidget(Player $admin, $login) { $player = $this->maniaControl->playerManager->getPlayer($login); $width = $this->maniaControl->manialinkManager->styleManager->getListWidgetsWidth(); $height = $this->maniaControl->manialinkManager->styleManager->getListWidgetsHeight(); @@ -608,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 * @@ -657,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: @@ -734,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; @@ -758,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 eaa31b6b..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|null - */ - 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's a Player out of the database - * - * @param $playerIndex - * @return Player $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/Plugins/Plugin.php b/application/core/Plugins/Plugin.php index 960424ca..7157d3f1 100644 --- a/application/core/Plugins/Plugin.php +++ b/application/core/Plugins/Plugin.php @@ -7,9 +7,9 @@ use ManiaControl\ManiaControl; /** * Interface for ManiaControl Plugins * - * @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 Plugin { /* @@ -24,19 +24,6 @@ interface Plugin { */ public static function prepare(ManiaControl $maniaControl); - /** - * Load the plugin - * - * @param \ManiaControl\ManiaControl $maniaControl - * @return bool - */ - public function load(ManiaControl $maniaControl); - - /** - * Unload the plugin and its Resources - */ - public function unload(); - /** * Get plugin id * @@ -71,4 +58,17 @@ interface Plugin { * @return string */ public static function getDescription(); + + /** + * Load the plugin + * + * @param \ManiaControl\ManiaControl $maniaControl + * @return bool + */ + public function load(ManiaControl $maniaControl); + + /** + * Unload the plugin and its Resources + */ + public function unload(); } diff --git a/application/core/Plugins/PluginInstallMenu.php b/application/core/Plugins/PluginInstallMenu.php index c21297d8..4a9c1bff 100644 --- a/application/core/Plugins/PluginInstallMenu.php +++ b/application/core/Plugins/PluginInstallMenu.php @@ -21,16 +21,16 @@ use ManiaControl\Players\Player; /** * Configurator for enabling and disabling Plugins * - * @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 PluginInstallMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAnswerListener { /* * Constants */ - const SETTING_PERMISSION_INSTALL_PLUGINS = 'Install plugins'; - const ACTION_PREFIX_INSTALLPLUGIN = 'PluginInstallMenu.Install.'; + const SETTING_PERMISSION_INSTALL_PLUGINS = 'Install plugins'; + const ACTION_PREFIX_INSTALLPLUGIN = 'PluginInstallMenu.Install.'; /** * Create a new plugin menu instance @@ -58,12 +58,13 @@ class PluginInstallMenu implements CallbackListener, ConfiguratorMenu, Manialink * @param float $width * @param float $height * @param Script $script + * @param Player $player * @return \FML\Controls\Frame */ 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(); // Config $pagerSize = 9.; @@ -86,8 +87,8 @@ class PluginInstallMenu implements CallbackListener, ConfiguratorMenu, Manialink $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_Text(); $frame->add($pageCountLabel); @@ -96,22 +97,22 @@ class PluginInstallMenu implements CallbackListener, ConfiguratorMenu, Manialink $pageCountLabel->setStyle($pageCountLabel::STYLE_TextTitle1); $pageCountLabel->setTextSize(2); - $paging->setLabel($pageCountLabel); + $paging->setLabel($pageCountLabel); - $url = ManiaControl::URL_WEBSERVICE . 'plugins'; - $dataJson = FileUtil::loadFile($url); - $pluginList = json_decode($dataJson); - $index = 0; + $url = ManiaControl::URL_WEBSERVICE . 'plugins'; + $dataJson = FileUtil::loadFile($url); + $pluginList = json_decode($dataJson); + $index = 0; if ($pluginList && isset($pluginList[0])) { - $pluginClasses = $this->maniaControl->pluginManager->getPluginClasses(); - $pluginIds = array(); + $pluginClasses = $this->maniaControl->pluginManager->getPluginClasses(); + $pluginIds = array(); /** @var Plugin $class */ - foreach($pluginClasses as $class) { + foreach ($pluginClasses as $class) { $pluginIds[] = $class::getId(); } - foreach($pluginList as $plugin) { - if(!in_array($plugin->id, $pluginIds)) { + foreach ($pluginList as $plugin) { + if (!in_array($plugin->id, $pluginIds)) { if (!isset($pageFrame)) { $pageFrame = new Frame(); $frame->add($pageFrame); @@ -120,7 +121,7 @@ class PluginInstallMenu implements CallbackListener, ConfiguratorMenu, Manialink } array_push($pageFrames, $pageFrame); - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); $y = $height * 0.41; } @@ -149,7 +150,7 @@ class PluginInstallMenu implements CallbackListener, ConfiguratorMenu, Manialink $descriptionLabel->setMaxLines(5); $description = "Author: {$plugin->author}\nVersion: {$plugin->currentVersion->version}\nDesc: {$plugin->description}"; $descriptionLabel->setText($description); - $nameLabel->addTooltipFeature($descriptionLabel); + $nameLabel->addTooltipFeature($descriptionLabel); $installButton = new Label_Button(); $pluginFrame->add($installButton); diff --git a/application/core/Plugins/PluginManager.php b/application/core/Plugins/PluginManager.php index c4c2ac7d..1a71c8e5 100644 --- a/application/core/Plugins/PluginManager.php +++ b/application/core/Plugins/PluginManager.php @@ -3,24 +3,24 @@ namespace ManiaControl\Plugins; use ManiaControl\Callbacks\CallbackListener; -use ManiaControl\ManiaControl; -use ManiaControl\Manialinks\ManialinkPageAnswerListener; use ManiaControl\Callbacks\TimerListener; use ManiaControl\Commands\CommandListener; +use ManiaControl\ManiaControl; +use ManiaControl\Manialinks\ManialinkPageAnswerListener; /** * Class managing Plugins - * - * @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 PluginManager { /* * Constants */ const TABLE_PLUGINS = 'mc_plugins'; - + /* * Private Properties */ @@ -32,27 +32,27 @@ class PluginManager { /** * Construct plugin manager - * + * * @param \ManiaControl\ManiaControl $maniaControl */ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; $this->initTables(); - + $this->pluginMenu = new PluginMenu($maniaControl); $this->maniaControl->configurator->addMenu($this->pluginMenu); - + $this->pluginInstallMenu = new PluginInstallMenu($maniaControl); $this->maniaControl->configurator->addMenu($this->pluginInstallMenu); } /** * Initialize necessary database tables - * + * * @return bool */ private function initTables() { - $mysqli = $this->maniaControl->database->mysqli; + $mysqli = $this->maniaControl->database->mysqli; $pluginsTableQuery = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_PLUGINS . "` ( `index` int(11) NOT NULL AUTO_INCREMENT, `className` varchar(100) NOT NULL, @@ -61,7 +61,7 @@ class PluginManager { PRIMARY KEY (`index`), UNIQUE KEY `className` (`className`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='ManiaControl plugin status' AUTO_INCREMENT=1;"; - $tableStatement = $mysqli->prepare($pluginsTableQuery); + $tableStatement = $mysqli->prepare($pluginsTableQuery); if ($mysqli->error) { trigger_error($mysqli->error, E_USER_ERROR); return false; @@ -75,95 +75,9 @@ class PluginManager { return true; } - /** - * Check if the plugin is running - * - * @param string $pluginClass - * @return bool - */ - public function isPluginActive($pluginClass) { - $pluginClass = $this->getPluginClass($pluginClass); - return isset($this->activePlugins[$pluginClass]); - } - - /** - * Check if the given class implements the plugin interface - * - * @param string $pluginClass - * @return bool - */ - public static function isPluginClass($pluginClass) { - $pluginClass = self::getClass($pluginClass); - if (!class_exists($pluginClass, false)) { - return false; - } - if (!in_array(Plugin::PLUGIN_INTERFACE, class_implements($pluginClass, false))) { - return false; - } - return true; - } - - /** - * Add the class to array of loaded plugin classes - * - * @param string $pluginClass - * @return bool - */ - public function addPluginClass($pluginClass) { - $pluginClass = $this->getPluginClass($pluginClass); - if (in_array($pluginClass, $this->pluginClasses)) { - return false; - } - if (!$this->isPluginClass($pluginClass)) { - return false; - } - array_push($this->pluginClasses, $pluginClass); - sort($this->pluginClasses); - return true; - } - - /** - * Activate and start the plugin with the given name - * - * @param string $pluginClass - * @param string $adminLogin - * @return bool - */ - public function activatePlugin($pluginClass, $adminLogin = null) { - if (!is_string($pluginClass)) { - return false; - } - if (!$this->isPluginClass($pluginClass)) { - return false; - } - if ($this->isPluginActive($pluginClass)) { - return false; - } - $plugin = new $pluginClass(); - /** - * - * @var Plugin $plugin - */ - $this->activePlugins[$pluginClass] = $plugin; - $this->savePluginStatus($pluginClass, true); - try { - $plugin->load($this->maniaControl); - } - catch (\Exception $e) { - $this->maniaControl->chat->sendError('Error while plugin activating ' . $pluginClass . ': ' . $e->getMessage(), $adminLogin); - $this->maniaControl->log('Error while plugin activation: ' . $pluginClass . ': ' . $e->getMessage()); - unset($this->activePlugins[$pluginClass]); - $this->savePluginStatus($pluginClass, false); - return false; - } - - $this->savePluginStatus($pluginClass, true); - return true; - } - /** * Deactivate the plugin with the given class - * + * * @param string $pluginClass * @return bool */ @@ -174,7 +88,6 @@ class PluginManager { } $plugin = $this->activePlugins[$pluginClass]; /** - * * @var Plugin $plugin */ $plugin->unload(); @@ -197,113 +110,69 @@ class PluginManager { } /** - * Load complete Plugins Directory and start all configured Plugins - * - * @return array + * Get the Class of the Plugin + * + * @param mixed $pluginClass + * @return string */ - public function loadPlugins() { - $pluginsDirectory = ManiaControlDir . '/plugins/'; - - $classesBefore = get_declared_classes(); - $this->loadPluginFiles($pluginsDirectory); - $classesAfter = get_declared_classes(); - - $newPluginClasses = array(); - - $newClasses = array_diff($classesAfter, $classesBefore); - foreach ($newClasses as $className) { - if (!$this->isPluginClass($className)) { - continue; - } - - if (!$this->addPluginClass($className)) { - continue; - } - array_push($newPluginClasses, $className); - - /** @var Plugin $className */ - $className::prepare($this->maniaControl); - - if ($this->getSavedPluginStatus($className)) { - $this->activatePlugin($className); - } + public static function getPluginClass($pluginClass) { + $pluginClass = self::getClass($pluginClass); + if (!self::isPluginClass($pluginClass)) { + return false; } - - return $newPluginClasses; + return $pluginClass; } /** - * Load all Plugin Files from the Directory - * - * @param string $directory + * Get the Class of the Object + * + * @param mixed $object + * @return string */ - public function loadPluginFiles($directory = '') { - $pluginFiles = scandir($directory); - foreach ($pluginFiles as $pluginFile) { - if (stripos($pluginFile, '.') === 0) { - continue; - } - - $filePath = $directory . $pluginFile; - if (is_file($filePath)) { - if (!stripos($pluginFile, '.php')) { - continue; - } - $success = include_once $filePath; - if (!$success) { - trigger_error("Error loading File '{$filePath}'!"); - } - continue; - } - - $dirPath = $directory . $pluginFile; - if (is_dir($dirPath)) { - $this->loadPluginFiles($dirPath . '/'); - continue; - } + private static function getClass($object) { + if (is_object($object)) { + return get_class($object); } + return (string)$object; } /** - * Returns a Plugin if it is activated - * + * Check if the given class implements the plugin interface + * * @param string $pluginClass - * @return Plugin + * @return bool */ - public function getPlugin($pluginClass) { - if ($this->isPluginActive($pluginClass)) { - return $this->activePlugins[$pluginClass]; + public static function isPluginClass($pluginClass) { + $pluginClass = self::getClass($pluginClass); + if (!class_exists($pluginClass, false)) { + return false; } - return null; + if (!in_array(Plugin::PLUGIN_INTERFACE, class_implements($pluginClass, false))) { + return false; + } + return true; } /** - * Get all declared plugin class names - * - * @return array + * Check if the plugin is running + * + * @param string $pluginClass + * @return bool */ - public function getPluginClasses() { - return $this->pluginClasses; - } - - /** - * Get all active plugins - * - * @return array - */ - public function getActivePlugins() { - return $this->activePlugins; + public function isPluginActive($pluginClass) { + $pluginClass = $this->getPluginClass($pluginClass); + return isset($this->activePlugins[$pluginClass]); } /** * Save plugin status in database - * + * * @param string $className - * @param bool $active + * @param bool $active * @return bool */ private function savePluginStatus($className, $active) { - $mysqli = $this->maniaControl->database->mysqli; + $mysqli = $this->maniaControl->database->mysqli; $pluginStatusQuery = "INSERT INTO `" . self::TABLE_PLUGINS . "` ( `className`, `active` @@ -311,7 +180,7 @@ class PluginManager { ?, ? ) ON DUPLICATE KEY UPDATE `active` = VALUES(`active`);"; - $pluginStatement = $mysqli->prepare($pluginStatusQuery); + $pluginStatement = $mysqli->prepare($pluginStatusQuery); if ($mysqli->error) { trigger_error($mysqli->error); return false; @@ -328,17 +197,104 @@ class PluginManager { return true; } + /** + * Load complete Plugins Directory and start all configured Plugins + * + * @return array + */ + public function loadPlugins() { + $pluginsDirectory = ManiaControlDir . '/plugins/'; + + $classesBefore = get_declared_classes(); + $this->loadPluginFiles($pluginsDirectory); + $classesAfter = get_declared_classes(); + + $newPluginClasses = array(); + + $newClasses = array_diff($classesAfter, $classesBefore); + foreach ($newClasses as $className) { + if (!$this->isPluginClass($className)) { + continue; + } + + if (!$this->addPluginClass($className)) { + continue; + } + array_push($newPluginClasses, $className); + + /** @var Plugin $className */ + $className::prepare($this->maniaControl); + + if ($this->getSavedPluginStatus($className)) { + $this->activatePlugin($className); + } + } + + return $newPluginClasses; + } + + /** + * Load all Plugin Files from the Directory + * + * @param string $directory + */ + public function loadPluginFiles($directory = '') { + $pluginFiles = scandir($directory); + foreach ($pluginFiles as $pluginFile) { + if (stripos($pluginFile, '.') === 0) { + continue; + } + + $filePath = $directory . $pluginFile; + if (is_file($filePath)) { + if (!stripos($pluginFile, '.php')) { + continue; + } + $success = include_once $filePath; + if (!$success) { + trigger_error("Error loading File '{$filePath}'!"); + } + continue; + } + + $dirPath = $directory . $pluginFile; + if (is_dir($dirPath)) { + $this->loadPluginFiles($dirPath . '/'); + continue; + } + } + } + + /** + * Add the class to array of loaded plugin classes + * + * @param string $pluginClass + * @return bool + */ + public function addPluginClass($pluginClass) { + $pluginClass = $this->getPluginClass($pluginClass); + if (in_array($pluginClass, $this->pluginClasses)) { + return false; + } + if (!$this->isPluginClass($pluginClass)) { + return false; + } + array_push($this->pluginClasses, $pluginClass); + sort($this->pluginClasses); + return true; + } + /** * Get plugin status from database - * + * * @param string $className * @return bool */ public function getSavedPluginStatus($className) { - $mysqli = $this->maniaControl->database->mysqli; + $mysqli = $this->maniaControl->database->mysqli; $pluginStatusQuery = "SELECT `active` FROM `" . self::TABLE_PLUGINS . "` WHERE `className` = ?;"; - $pluginStatement = $mysqli->prepare($pluginStatusQuery); + $pluginStatement = $mysqli->prepare($pluginStatusQuery); if ($mysqli->error) { trigger_error($mysqli->error); return false; @@ -365,44 +321,85 @@ class PluginManager { return $active; } + /** + * Activate and start the plugin with the given name + * + * @param string $pluginClass + * @param string $adminLogin + * @return bool + */ + public function activatePlugin($pluginClass, $adminLogin = null) { + if (!is_string($pluginClass)) { + return false; + } + if (!$this->isPluginClass($pluginClass)) { + return false; + } + if ($this->isPluginActive($pluginClass)) { + return false; + } + $plugin = new $pluginClass(); + /** + * @var Plugin $plugin + */ + $this->activePlugins[$pluginClass] = $plugin; + $this->savePluginStatus($pluginClass, true); + try { + $plugin->load($this->maniaControl); + } catch (\Exception $e) { + $this->maniaControl->chat->sendError('Error while plugin activating ' . $pluginClass . ': ' . $e->getMessage(), $adminLogin); + $this->maniaControl->log('Error while plugin activation: ' . $pluginClass . ': ' . $e->getMessage()); + unset($this->activePlugins[$pluginClass]); + $this->savePluginStatus($pluginClass, false); + return false; + } + + $this->savePluginStatus($pluginClass, true); + return true; + } + + /** + * Returns a Plugin if it is activated + * + * @param string $pluginClass + * @return Plugin + */ + public function getPlugin($pluginClass) { + if ($this->isPluginActive($pluginClass)) { + return $this->activePlugins[$pluginClass]; + } + return null; + } + + /** + * Get all declared plugin class names + * + * @return array + */ + public function getPluginClasses() { + return $this->pluginClasses; + } + + /** + * Get all active plugins + * + * @return array + */ + public function getActivePlugins() { + return $this->activePlugins; + } + /** * Fetch the Plugins List from the ManiaControl Website - * + * * @param $function */ public function fetchPluginList($function) { $url = ManiaControl::URL_WEBSERVICE . 'plugins'; - - $this->maniaControl->fileReader->loadFile($url, function ($dataJson, $error) use(&$function) { + + $this->maniaControl->fileReader->loadFile($url, function ($dataJson, $error) use (&$function) { $data = json_decode($dataJson); call_user_func($function, $data, $error); }); } - - /** - * Get the Class of the Plugin - * - * @param mixed $pluginClass - * @return string - */ - public static function getPluginClass($pluginClass) { - $pluginClass = self::getClass($pluginClass); - if (!self::isPluginClass($pluginClass)) { - return false; - } - return $pluginClass; - } - - /** - * Get the Class of the Object - * - * @param mixed $pluginClass - * @return string - */ - private static function getClass($object) { - if (is_object($object)) { - return get_class($object); - } - return (string) $object; - } } diff --git a/application/core/Plugins/PluginMenu.php b/application/core/Plugins/PluginMenu.php index 5c172cfa..5b5d51f0 100644 --- a/application/core/Plugins/PluginMenu.php +++ b/application/core/Plugins/PluginMenu.php @@ -8,8 +8,8 @@ use FML\Controls\Frame; use FML\Controls\Label; use FML\Controls\Labels\Label_Button; use FML\Controls\Labels\Label_Text; -use FML\Controls\Quads\Quad_Icons128x32_1; use FML\Controls\Quads\Quad_Icons128x128_1; +use FML\Controls\Quads\Quad_Icons128x32_1; use FML\Controls\Quads\Quad_Icons64x64_1; use FML\Script\Features\Paging; use FML\Script\Script; @@ -25,9 +25,9 @@ use ManiaControl\Players\Player; /** * Configurator for enabling and disabling Plugins * - * @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 PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAnswerListener { /* @@ -62,13 +62,6 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $this->maniaControl->authenticationManager->definePermissionLevel(self::SETTING_PERMISSION_CHANGE_PLUGIN_SETTINGS, AuthenticationManager::AUTH_LEVEL_SUPERADMIN); } - /** - * @see \ManiaControl\Configurators\ConfiguratorMenu::getTitle() - */ - public function getTitle() { - return 'Plugins'; - } - /** * Returns Back to the Plugins */ @@ -78,13 +71,20 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $this->maniaControl->configurator->reopenMenu($player, $menuId); } + /** + * @see \ManiaControl\Configurators\ConfiguratorMenu::getTitle() + */ + public function getTitle() { + return 'Plugins'; + } + /** * @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(); $pluginClasses = $this->maniaControl->pluginManager->getPluginClasses(); @@ -107,8 +107,8 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $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_Text(); $frame->add($pageCountLabel); @@ -117,7 +117,7 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $pageCountLabel->setStyle($pageCountLabel::STYLE_TextTitle1); $pageCountLabel->setTextSize(2); - $paging->setLabel($pageCountLabel); + $paging->setLabel($pageCountLabel); //Show Settings Menu if ($this->settingsClass != '') { //TODO improve @@ -128,7 +128,7 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $y = 0; $index = 1; $settingHeight = 5.; - foreach($settings as $setting) { + foreach ($settings as $setting) { if (!isset($pageFrame)) { $pageFrame = new Frame(); $frame->add($pageFrame); @@ -137,7 +137,7 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns } array_push($pageFrames, $pageFrame); $y = $height * 0.41; - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); } $settingFrame = new Frame(); @@ -166,7 +166,7 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns } array_push($pageFrames, $pageFrame); $y = $height * 0.41; - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); } } @@ -244,11 +244,11 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $y = 0.; $pluginUpdates = $this->maniaControl->updateManager->pluginUpdateManager->getPluginsUpdates(); - usort($pluginClasses, function($a, $b) { + usort($pluginClasses, function ($a, $b) { return strcmp($a::getName(), $b::getName()); }); - foreach($pluginClasses as $index => $pluginClass) { + foreach ($pluginClasses as $index => $pluginClass) { /** @var Plugin $pluginClass */ if (!isset($pageFrame)) { $pageFrame = new Frame(); @@ -258,7 +258,7 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns } array_push($pageFrames, $pageFrame); - $paging->addPage($pageFrame); + $paging->addPage($pageFrame); $y = $height * 0.41; } @@ -299,7 +299,7 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $descriptionLabel->setMaxLines(5); $description = "Author: {$pluginClass::getAuthor()}\nVersion: {$pluginClass::getVersion()}\nDesc: {$pluginClass::getDescription()}"; $descriptionLabel->setText($description); - $nameLabel->addTooltipFeature($descriptionLabel); + $nameLabel->addTooltipFeature($descriptionLabel); $quad = new Quad_Icons128x32_1(); $pluginFrame->add($quad); @@ -340,7 +340,7 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns } } - if($pluginUpdates != false) { + if ($pluginUpdates != false) { $updatePluginsButton = new Label_Button(); $frame->add($updatePluginsButton); $updatePluginsButton->setHAlign(Control::RIGHT); @@ -349,48 +349,13 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $updatePluginsButton->setZ(2); $updatePluginsButton->setWidth(10); $updatePluginsButton->setStyle($updatePluginsButton::STYLE_CardButtonSmallS); - $updatePluginsButton->setText(count($pluginUpdates).' update(s)'); + $updatePluginsButton->setText(count($pluginUpdates) . ' update(s)'); $updatePluginsButton->setAction(self::ACTION_UPDATEPLUGINS); } return $frame; } - /** - * @see \ManiaControl\Configurators\ConfiguratorMenu::saveConfigData() - */ - public function saveConfigData(array $configData, Player $player) { - if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_CHANGE_PLUGIN_SETTINGS)) { - $this->maniaControl->authenticationManager->sendNotAllowed($player); - return; - } - if (!$configData[3] || strpos($configData[3][0]['Name'], self::ACTION_PREFIX_SETTING) !== 0) { - return; - } - - $maniaControlSettings = $this->maniaControl->settingManager->getSettings(); - - $prefixLength = strlen(self::ACTION_PREFIX_SETTING); - - foreach($configData[3] as $setting) { - $settingName = substr($setting['Name'], $prefixLength + 1); - - if(!isset($maniaControlSettings[$settingName])) - continue; - - $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 PlayerManialinkPageAnswer callback * @@ -456,7 +421,7 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns } /** - * Toggles a Boolean Value + * Toggle a Boolean Value * * @param $setting * @param Player $player @@ -481,4 +446,40 @@ class PluginMenu implements CallbackListener, ConfiguratorMenu, ManialinkPageAns $this->maniaControl->settingManager->setSetting($oldSetting->class, $oldSetting->setting, "1"); } } + + /** + * @see \ManiaControl\Configurators\ConfiguratorMenu::saveConfigData() + */ + public function saveConfigData(array $configData, Player $player) { + if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_CHANGE_PLUGIN_SETTINGS)) { + $this->maniaControl->authenticationManager->sendNotAllowed($player); + return; + } + if (!$configData[3] || strpos($configData[3][0]['Name'], self::ACTION_PREFIX_SETTING) !== 0) { + return; + } + + $maniaControlSettings = $this->maniaControl->settingManager->getSettings(); + + $prefixLength = strlen(self::ACTION_PREFIX_SETTING); + + foreach ($configData[3] as $setting) { + $settingName = substr($setting['Name'], $prefixLength + 1); + + if (!isset($maniaControlSettings[$settingName])) { + continue; + } + + $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); + } } 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 4eba6a2b..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; } @@ -190,9 +190,10 @@ class ServerCommands implements CallbackListener, CommandListener, ManialinkPage } /** - * Breaks the current game + * Pause the current game * - * @param array $callback + * @param array $callback + * @param Player $player */ public function setPause(array $callback, Player $player) { if (!$this->maniaControl->authenticationManager->checkPermission($player, self::SETTING_PERMISSION_SET_PAUSE)) { @@ -200,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; } @@ -231,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 * @@ -410,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 2df82e4c..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) { @@ -440,12 +465,13 @@ class SettingManager implements CallbackListener { /** * Get all Setting Classes - * + * + * @param bool $hidePluginClasses * @return array */ 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) { @@ -461,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 44c7c961..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,11 +100,21 @@ 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 PlayerList Widget to the Player + * Show the StatsList Widget to the Player * * @param Player $player + * @param string $order */ public function showStatsList(Player $player, $order = PlayerManager::STAT_SERVERTIME) { $height = $this->maniaControl->manialinkManager->styleManager->getListWidgetsHeight(); @@ -173,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; @@ -188,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++; } @@ -213,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; @@ -234,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]; @@ -253,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); @@ -262,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']; } @@ -300,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 aa26488c..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,91 +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 Shoots - * - * @param $login - */ - 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); - } - } - - /** - * Gets the Weapon stat - * - * @param $weaponNumber - * @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 * @@ -238,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; @@ -261,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; @@ -333,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 84fb14ae..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 Versin - * + * 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 2e028235..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,272 +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 - */ - 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 3719deb1..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,50 +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); + }); } } diff --git a/application/plugins/ChatMessagePlugin.php b/application/plugins/ChatMessagePlugin.php index 3de12242..99f084f5 100644 --- a/application/plugins/ChatMessagePlugin.php +++ b/application/plugins/ChatMessagePlugin.php @@ -11,8 +11,8 @@ use Maniaplanet\DedicatedServer\Xmlrpc\Exception; /** * ManiaControl Chat-Message Plugin * - * @author kremsy - * @copyright ManiaControl Copyright © 2014 ManiaControl Team + * @author kremsy + * @copyright 2014 ManiaControl Team * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 */ class ChatMessagePlugin implements CommandListener, Plugin { @@ -43,6 +43,51 @@ class ChatMessagePlugin implements CommandListener, Plugin { //do nothing } + /** + * Get plugin id + * + * @return int + */ + public static function getId() { + return self::PLUGIN_ID; + } + + /** + * Get Plugin Name + * + * @return string + */ + public static function getName() { + return self::PLUGIN_NAME; + } + + /** + * Get Plugin Version + * + * @return float,, + */ + public static function getVersion() { + return self::PLUGIN_VERSION; + } + + /** + * Get Plugin Author + * + * @return string + */ + public static function getAuthor() { + return self::PLUGIN_AUTHOR; + } + + /** + * Get Plugin Description + * + * @return string + */ + public static function getDescription() { + return "Plugin offers various Chat-Commands like /gg /hi /afk /rq..."; + } + /** * Load the plugin * @@ -113,6 +158,30 @@ class ChatMessagePlugin implements CommandListener, Plugin { $this->maniaControl->chat->sendChat($msg, null, false); } + /** + * Checks if a Player is in the PlayerList and returns the nickname if he is, can be called per login, pid or nickname or lj for + * (last joined) + * + * @param $login + * @return mixed + */ + private function getTarget($login) { + /** @var Player $player */ + $player = null; + foreach ($this->maniaControl->playerManager->getPlayers() as $player) { + if ($login == $player->login || $login == $player->pid || $login == $player->nickname) { + return $player->nickname; + } + } + + if ($player && $login == 'lj') { + return $player->nickname; + } + + //returns the text given if nothing matches + return $login; + } + /** * Bye Message * @@ -314,7 +383,7 @@ class ChatMessagePlugin implements CommandListener, Plugin { $message = '$39F Thanks for Playing, see you around!$z'; try { $this->maniaControl->client->kick($player->login, $message); - } catch(Exception $e) { + } catch (Exception $e) { $this->maniaControl->errorHandler->triggerDebugNotice("ChatMessagePlugin Debug Line 316: " . $e->getMessage()); // TODO: only possible valid exception should be "wrong login" - throw others (like connection error) $this->maniaControl->chat->sendError('Error occurred: ' . $e->getMessage(), $player->login); @@ -335,7 +404,7 @@ class ChatMessagePlugin implements CommandListener, Plugin { $message = '$39F Thanks for Playing, please come back soon!$z '; try { $this->maniaControl->client->kick($player->login, $message); - } catch(Exception $e) { + } catch (Exception $e) { $this->maniaControl->errorHandler->triggerDebugNotice("ChatMessagePlugin Debug Line " . $e->getLine() . ": " . $e->getMessage()); // TODO: only possible valid exception should be "wrong login" - throw others (like connection error) $this->maniaControl->chat->sendError('Error occurred: ' . $e->getMessage(), $player->login); @@ -361,7 +430,7 @@ class ChatMessagePlugin implements CommandListener, Plugin { // force into spec try { $this->maniaControl->client->forceSpectator($player->login, 3); - } catch(Exception $e) { + } catch (Exception $e) { $this->maniaControl->errorHandler->triggerDebugNotice("ChatMessagePlugin Debug Line " . $e->getLine() . ": " . $e->getMessage()); // TODO: only possible valid exception should be "wrong login" - throw others (like connection error) $this->maniaControl->chat->sendError('Error occurred: ' . $e->getMessage(), $player->login); @@ -371,7 +440,7 @@ class ChatMessagePlugin implements CommandListener, Plugin { // free player slot try { $this->maniaControl->client->spectatorReleasePlayerSlot($player->login); - } catch(Exception $e) { + } catch (Exception $e) { if ($e->getMessage() != 'The player is not a spectator') { $this->maniaControl->errorHandler->triggerDebugNotice("ChatMessagePlugin Debug Line " . $e->getLine() . ": " . $e->getMessage()); // TODO: only possible valid exception should be "wrong login" - throw others (like connection error) @@ -380,73 +449,4 @@ class ChatMessagePlugin implements CommandListener, Plugin { } } } - - /** - * Checks if a Player is in the PlayerList and returns the nickname if he is, can be called per login, pid or nickname or lj for - * (last joined) - * - * @param $login - * @return mixed - */ - private function getTarget($login) { - /** @var Player $player */ - $player = null; - foreach($this->maniaControl->playerManager->getPlayers() as $player) { - if ($login == $player->login || $login == $player->pid || $login == $player->nickname) { - return $player->nickname; - } - } - - if ($player && $login == 'lj') { - return $player->nickname; - } - - //returns the text given if nothing matches - return $login; - } - - /** - * Get plugin id - * - * @return int - */ - public static function getId() { - return self::PLUGIN_ID; - } - - /** - * Get Plugin Name - * - * @return string - */ - public static function getName() { - return self::PLUGIN_NAME; - } - - /** - * Get Plugin Version - * - * @return float,, - */ - public static function getVersion() { - return self::PLUGIN_VERSION; - } - - /** - * Get Plugin Author - * - * @return string - */ - public static function getAuthor() { - return self::PLUGIN_AUTHOR; - } - - /** - * Get Plugin Description - * - * @return string - */ - public static function getDescription() { - return "Plugin offers various Chat-Commands like /gg /hi /afk /rq..."; - } } \ No newline at end of file diff --git a/application/plugins/Karma.php b/application/plugins/Karma.php index 543bfca4..188e09c6 100644 --- a/application/plugins/Karma.php +++ b/application/plugins/Karma.php @@ -22,8 +22,8 @@ use ManiaControl\Settings\SettingManager; /** * ManiaControl Karma Plugin * - * @author kremsy and 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 KarmaPlugin implements CallbackListener, TimerListener, Plugin { @@ -81,11 +81,46 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { $maniaControl->settingManager->initSetting(get_class(), self::SETTING_MX_KARMA_IMPORTING, true); $maniaControl->settingManager->initSetting(get_class(), self::SETTING_WIDGET_DISPLAY_MX, true); $servers = $maniaControl->server->getAllServers(); - foreach($servers as $server) { + foreach ($servers as $server) { $maniaControl->settingManager->initSetting(get_class(), '$l[http://karma.mania-exchange.com/auth/getapikey?server=' . $server->login . ']MX Karma Code for ' . $server->login . '$l', ''); } } + /** + * @see \ManiaControl\Plugins\Plugin::getId() + */ + public static function getId() { + return self::ID; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getName() + */ + public static function getName() { + return 'Karma Plugin'; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getVersion() + */ + public static function getVersion() { + return self::VERSION; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getAuthor() + */ + public static function getAuthor() { + return 'steeffeen and kremsy'; + } + + /** + * @see \ManiaControl\Plugins\Plugin::getDescription() + */ + public static function getDescription() { + return 'Plugin offering Karma Voting for Maps.'; + } + /** * @see \ManiaControl\Plugins\Plugin::load() */ @@ -129,6 +164,221 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { return true; } + /** + * Create necessary database tables + */ + private function initTables() { + $mysqli = $this->maniaControl->database->mysqli; + + // Create local table + $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_KARMA . "` ( + `index` int(11) NOT NULL AUTO_INCREMENT, + `mapIndex` int(11) NOT NULL, + `playerIndex` int(11) NOT NULL, + `vote` float NOT NULL DEFAULT '-1', + `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`index`), + UNIQUE KEY `player_map_vote` (`mapIndex`, `playerIndex`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Save players map votes' AUTO_INCREMENT=1;"; + $mysqli->query($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + } + + // Migrate settings + $this->maniaControl->database->migrationHelper->transferSettings('KarmaPlugin', $this); + + if (!$this->maniaControl->settingManager->getSetting($this, self::SETTING_MX_KARMA_ACTIVATED)) { + return; + } + + // Create mx table + $query = "CREATE TABLE IF NOT EXISTS `" . self::MX_IMPORT_TABLE . "` ( + `index` int(11) NOT NULL AUTO_INCREMENT, + `mapIndex` int(11) NOT NULL, + `mapImported` tinyint(1) NOT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`index`), + UNIQUE KEY `mapIndex` (`mapIndex`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MX Karma Import Table' AUTO_INCREMENT=1;"; + $mysqli->query($query); + if ($mysqli->error) { + trigger_error($mysqli->error, E_USER_ERROR); + } + } + + /** + * Open a Mx Karma Session + */ + private function mxKarmaOpenSession() { + if (!$this->maniaControl->settingManager->getSetting($this, self::SETTING_MX_KARMA_ACTIVATED)) { + return; + } + + $serverLogin = $this->maniaControl->server->login; + $mxKarmaCode = $this->maniaControl->settingManager->getSetting($this, '$l[http://karma.mania-exchange.com/auth/getapikey?server=' . $serverLogin . ']MX Karma Code for ' . $serverLogin . '$l'); + + if ($mxKarmaCode == '') { + return; + } + + $applicationIdentifier = 'ManiaControl v' . ManiaControl::VERSION; + $testMode = 'true'; + + $query = self::MX_KARMA_URL . self::MX_KARMA_STARTSESSION; + $query .= '?serverLogin=' . $serverLogin; + $query .= '&applicationIdentifier=' . urlencode($applicationIdentifier); + $query .= '&testMode=' . $testMode; + + $this->mxKarma['connectionInProgress'] = true; + + $self = $this; + $this->maniaControl->fileReader->loadFile($query, function ($data, $error) use (&$self, $mxKarmaCode) { + if (!$error) { + $data = json_decode($data); + if ($data->success) { + $self->mxKarma['session'] = $data->data; + $self->activateSession($mxKarmaCode); + } else { + $self->maniaControl->log("Error while authenticating on Mania-Exchange Karma"); + // TODO remove temp trigger + $self->maniaControl->errorHandler->triggerDebugNotice("Error while authenticating on Mania-Exchange Karma " . $data->data->message); + $self->mxKarma['connectionInProgress'] = false; + } + } else { + $self->maniaControl->log($error); + // TODO remove temp trigger + $self->maniaControl->errorHandler->triggerDebugNotice("Error while authenticating on Mania-Exchange Karma " . $error); + $self->mxKarma['connectionInProgress'] = false; + } + }, "application/json", 1000); + } + + /** + * Activates the MX-Karma Session + * + * @param $mxKarmaCode + */ + private function activateSession($mxKarmaCode) { + $hash = $this->buildActivationHash($this->mxKarma['session']->sessionSeed, $mxKarmaCode); + + $query = self::MX_KARMA_URL . self::MX_KARMA_ACTIVATESESSION; + $query .= '?sessionKey=' . urlencode($this->mxKarma['session']->sessionKey); + $query .= '&activationHash=' . urlencode($hash); + + $self = $this; + $this->maniaControl->fileReader->loadFile($query, function ($data, $error) use (&$self, $query) { + if (!$error) { + $data = json_decode($data); + if ($data->success && $data->data->activated) { + $self->maniaControl->log("Successfully authenticated on Mania-Exchange Karma"); + $self->mxKarma['connectionInProgress'] = false; + + // Fetch the Mx Karma Votes + $self->getMxKarmaVotes(); + } else { + $self->maniaControl->log("Error while authenticating on Mania-Exchange Karma " . $data->data->message); + // TODO remove temp trigger + $self->maniaControl->errorHandler->triggerDebugNotice("Error while authenticating on Mania-Exchange Karma " . $data->data->message . " url Query " . $query); + $self->mxKarma['connectionInProgress'] = false; + } + } else { + // TODO remove temp trigger + $self->maniaControl->errorHandler->triggerDebugNotice("Error while authenticating on Mania-Exchange Karma " . $error); + $self->maniaControl->log($error); + $self->mxKarma['connectionInProgress'] = false; + } + }, "application/json", 1000); + } + + /** + * Builds a sha512 activation Hash for the MX-Karma + * + * @param $sessionSeed + * @param $mxKey + * @return string + */ + private function buildActivationHash($sessionSeed, $mxKey) { + return hash('sha512', $mxKey . $sessionSeed); + } + + /** + * Fetch the mxKarmaVotes for the current map + */ + public function getMxKarmaVotes(Player $player = null) { + if (!$this->maniaControl->settingManager->getSetting($this, self::SETTING_MX_KARMA_ACTIVATED)) { + return; + } + + if (!isset($this->mxKarma['session'])) { + if (!isset($this->mxKarma['connectionInProgress']) || !$this->mxKarma['connectionInProgress']) { + $this->mxKarmaOpenSession(); + } + return; + } + + $map = $this->maniaControl->mapManager->getCurrentMap(); + + $properties = array(); + + $gameMode = $this->maniaControl->server->getGameMode(true); + if ($gameMode == 'Script') { + $scriptName = $this->maniaControl->client->getScriptName(); + $properties['gamemode'] = $scriptName["CurrentValue"]; + } else { + $properties['gamemode'] = $gameMode; + } + + $properties['titleid'] = $this->maniaControl->server->titleId; + $properties['mapuid'] = $map->uid; + + if (!$player) { + $properties['getvotesonly'] = false; + $properties['playerlogins'] = array(); + foreach ($this->maniaControl->playerManager->getPlayers() as $plyr) { + /** + * @var Player $player + */ + $properties['playerlogins'][] = $plyr->login; + } + } else { + $properties['getvotesonly'] = true; + $properties['playerlogins'] = array($player->login); + } + + $content = json_encode($properties); + $self = $this; + $this->maniaControl->fileReader->postData(self::MX_KARMA_URL . self::MX_KARMA_GETMAPRATING . "?sessionKey=" . urlencode($this->mxKarma['session']->sessionKey), function ($data, $error) use (&$self, &$player) { + if (!$error) { + $data = json_decode($data); + if ($data->success) { + + // Fetch averages if its for the whole server + if (!$player) { + $self->mxKarma["voteCount"] = $data->data->votecount; + $self->mxKarma["voteAverage"] = $data->data->voteaverage; + $self->mxKarma["modeVoteCount"] = $data->data->modevotecount; + $self->mxKarma["modeVoteAverage"] = $data->data->modevoteaverage; + } + + foreach ($data->data->votes as $votes) { + $self->mxKarma["votes"][$votes->login] = $votes->vote; + } + + $self->updateManialink = true; + $self->maniaControl->callbackManager->triggerCallback($self::CB_KARMA_MXUPDATED, $self->mxKarma); + $self->maniaControl->log("MX-Karma Votes successfully fetched"); + } else { + $self->maniaControl->log("Error while fetching votes: " . $data->data->message); + // TODO remove temp trigger + $self->maniaControl->errorHandler->triggerDebugNotice("Error while fetching votes: " . $data->data->message . " " . KarmaPlugin::MX_KARMA_URL . KarmaPlugin::MX_KARMA_SAVEVOTES . "?sessionKey=" . urlencode($self->mxKarma['session']->sessionKey)); + } + } else { + $self->maniaControl->log($error); + } + }, $content, false, 'application/json'); + } + /** * @see \ManiaControl\Plugins\Plugin::unload() */ @@ -139,112 +389,6 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { unset($this->maniaControl); } - /** - * @see \ManiaControl\Plugins\Plugin::getId() - */ - public static function getId() { - return self::ID; - } - - /** - * @see \ManiaControl\Plugins\Plugin::getName() - */ - public static function getName() { - return 'Karma Plugin'; - } - - /** - * @see \ManiaControl\Plugins\Plugin::getVersion() - */ - public static function getVersion() { - return self::VERSION; - } - - /** - * @see \ManiaControl\Plugins\Plugin::getAuthor() - */ - public static function getAuthor() { - return 'steeffeen and kremsy'; - } - - /** - * @see \ManiaControl\Plugins\Plugin::getDescription() - */ - public static function getDescription() { - return 'Plugin offering Karma Voting for Maps.'; - } - - /** - * Handle ManiaControl 1 Second callback - * - * @param $time - */ - public function handle1Second($time) { - if (!$this->updateManialink) { - return; - } - - $displayMxKarma = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_DISPLAY_MX); - - // Get players - $players = $this->updateManialink; - if ($players === true) { - $players = $this->maniaControl->playerManager->getPlayers(); - } - $this->updateManialink = false; - - // Get map karma - $map = $this->maniaControl->mapManager->getCurrentMap(); - - // Display the mx Karma if the setting is choosen and the MX session is available - if ($displayMxKarma && isset($this->mxKarma['session']) && isset($this->mxKarma['voteCount'])) { - $karma = $this->mxKarma['modeVoteAverage'] / 100; - $voteCount = $this->mxKarma['modeVoteCount']; - } else { - $karma = $this->getMapKarma($map); - $votes = $this->getMapVotes($map); - $voteCount = $votes['count']; - } - - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_ENABLE)) { - // Build karma manialink - $this->buildManialink(); - - // Update karma gauge & label - /** - * @var Gauge $karmaGauge - */ - $karmaGauge = $this->manialink->karmaGauge; - /** - * @var Label $karmaLabel - */ - $karmaLabel = $this->manialink->karmaLabel; - if (is_numeric($karma) && $voteCount > 0) { - $karma = floatval($karma); - $karmaGauge->setRatio($karma + 0.15 - $karma * 0.15); - $karmaColor = ColorUtil::floatToStatusColor($karma); - $karmaGauge->setColor($karmaColor . '7'); - $karmaLabel->setText(' ' . round($karma * 100.) . '% (' . $voteCount . ')'); - } else { - $karmaGauge->setRatio(0.); - $karmaGauge->setColor('00fb'); - $karmaLabel->setText('-'); - } - - // Loop players - foreach($players as $login => $player) { - // Get player vote - // TODO: show the player his own vote in some way - // $vote = $this->getPlayerVote($player, $map); - // $votesFrame = $this->manialink->votesFrame; - // $votesFrame->removeChildren(); - - // Send manialink - $this->maniaControl->manialinkManager->sendManialink($this->manialink, $login); - } - } - } - /** * Handle BeginMap ManiaControl callback * @@ -254,7 +398,7 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { // send Map Karma to MX from previous Map if (isset($this->mxKarma['map'])) { $votes = array(); - foreach($this->mxKarma['votes'] as $login => $value) { + foreach ($this->mxKarma['votes'] as $login => $value) { $player = $this->maniaControl->playerManager->getPlayer($login); array_push($votes, array("login" => $login, "nickname" => $player->rawNickname, "vote" => $value)); } @@ -270,6 +414,67 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { $this->getMxKarmaVotes(); } + /** + * Post the Karma votes to MX-Karma + * + * @param Map $map + * @param array $votes + * @param bool $import + */ + private function postKarmaVotes(Map $map, array $votes, $import = false) { + if (!isset($this->mxKarma['session'])) { + if (!isset($this->mxKarma['connectionInProgress']) || !$this->mxKarma['connectionInProgress']) { + $this->mxKarmaOpenSession(); + } + return; + } + + $gameMode = $this->maniaControl->server->getGameMode(true); + + if (count($votes) == 0) { + return; + } + + $properties = array(); + if ($gameMode == 'Script') { + $scriptName = $this->maniaControl->client->getScriptName(); + $properties['gamemode'] = $scriptName["CurrentValue"]; + } else { + $properties['gamemode'] = $gameMode; + } + + if ($import) { + $properties['maptime'] = 0; + } else { + $properties['maptime'] = time() - $this->mxKarma['startTime']; + } + + $properties['votes'] = $votes; + $properties['titleid'] = $this->maniaControl->server->titleId; + $properties['mapname'] = $map->rawName; + $properties['mapuid'] = $map->uid; + $properties['mapauthor'] = $map->authorLogin; + $properties['isimport'] = $import; + + $content = json_encode($properties); + + $self = $this; + $this->maniaControl->fileReader->postData(self::MX_KARMA_URL . self::MX_KARMA_SAVEVOTES . "?sessionKey=" . urlencode($this->mxKarma['session']->sessionKey), function ($data, $error) use (&$self) { + if (!$error) { + $data = json_decode($data); + if ($data->success) { + $self->maniaControl->log("Votes successfully permitted"); + } else { + $self->maniaControl->log("Error while updating votes: " . $data->data->message); + // TODO remove temp trigger + $self->maniaControl->errorHandler->triggerDebugNotice("Error while updating votes: " . $data->data->message . " " . KarmaPlugin::MX_KARMA_URL . $self::MX_KARMA_SAVEVOTES . "?sessionKey=" . urlencode($self->mxKarma['session']->sessionKey)); + } + } else { + $self->maniaControl->log($error); + } + }, $content, false, 'application/json'); + } + /** * Handle PlayerConnect callback * @@ -285,6 +490,21 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { $this->getMxKarmaVotes($player); } + /** + * Query the player to update the manialink + * + * @param Player $player + */ + private function queryManialinkUpdateFor(Player $player) { + if ($this->updateManialink === true) { + return; + } + if (!is_array($this->updateManialink)) { + $this->updateManialink = array(); + } + $this->updateManialink[$player->login] = $player; + } + /** * Handle PlayerChat callback * @@ -379,61 +599,31 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { } /** - * Query the player to update the manialink + * Get the current vote of the player for the map * * @param Player $player + * @param Map $map + * @return int */ - private function queryManialinkUpdateFor(Player $player) { - if ($this->updateManialink === true) { - return; - } - if (!is_array($this->updateManialink)) { - $this->updateManialink = array(); - } - $this->updateManialink[$player->login] = $player; - } - - /** - * Create necessary database tables - */ - private function initTables() { + public function getPlayerVote(Player $player, Map $map) { $mysqli = $this->maniaControl->database->mysqli; - - // Create local table - $query = "CREATE TABLE IF NOT EXISTS `" . self::TABLE_KARMA . "` ( - `index` int(11) NOT NULL AUTO_INCREMENT, - `mapIndex` int(11) NOT NULL, - `playerIndex` int(11) NOT NULL, - `vote` float NOT NULL DEFAULT '-1', - `changed` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`index`), - UNIQUE KEY `player_map_vote` (`mapIndex`, `playerIndex`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Save players map votes' AUTO_INCREMENT=1;"; - $mysqli->query($query); + $query = "SELECT * FROM `" . self::TABLE_KARMA . "` + WHERE `playerIndex` = {$player->index} + AND `mapIndex` = {$map->index} + AND `vote` >= 0;"; + $result = $mysqli->query($query); if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); + trigger_error($mysqli->error); + return false; } - - // Migrate settings - $this->maniaControl->database->migrationHelper->transferSettings('KarmaPlugin', $this); - - if (!$this->maniaControl->settingManager->getSetting($this, self::SETTING_MX_KARMA_ACTIVATED)) { - return; - } - - // Create mx table - $query = "CREATE TABLE IF NOT EXISTS `" . self::MX_IMPORT_TABLE . "` ( - `index` int(11) NOT NULL AUTO_INCREMENT, - `mapIndex` int(11) NOT NULL, - `mapImported` tinyint(1) NOT NULL, - `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`index`), - UNIQUE KEY `mapIndex` (`mapIndex`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='MX Karma Import Table' AUTO_INCREMENT=1;"; - $mysqli->query($query); - if ($mysqli->error) { - trigger_error($mysqli->error, E_USER_ERROR); + if ($result->num_rows <= 0) { + $result->free(); + return false; } + $item = $result->fetch_object(); + $result->free(); + $vote = $item->vote; + return floatval($vote); } /** @@ -466,31 +656,134 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { } /** - * Get the current vote of the player for the map + * Get all players votes * - * @param Player $player - * @param Map $map - * @return int + * @param Map $map + * @return array */ - public function getPlayerVote(Player $player, Map $map) { + public function getMapPlayerVotes(Map $map) { $mysqli = $this->maniaControl->database->mysqli; $query = "SELECT * FROM `" . self::TABLE_KARMA . "` - WHERE `playerIndex` = {$player->index} - AND `mapIndex` = {$map->index} - AND `vote` >= 0;"; + WHERE `mapIndex` = {$map->index} + AND `vote` >= 0"; $result = $mysqli->query($query); if ($mysqli->error) { trigger_error($mysqli->error); return false; } - if ($result->num_rows <= 0) { - $result->free(); - return false; + + $votes = array(); + while ($vote = $result->fetch_object()) { + $player = $this->maniaControl->playerManager->getPlayerByIndex($vote->playerIndex); + $karma = $vote->vote; + $votes[] = array('player' => $player, 'karma' => $karma); + } + + usort($votes, function ($a, $b) { + return $a['karma'] - $b['karma']; + }); + $votes = array_reverse($votes); + + return $votes; + } + + /** + * Update Settings + * + * @param $class + * @param $settingName + * @param $value + */ + public function updateSettings($class, $settingName, $value) { + if (!$class = get_class()) { + return; + } + + $serverLogin = $this->maniaControl->server->login; + if ($settingName == '$l[http://karma.mania-exchange.com/auth/getapikey?server=' . $serverLogin . ']MX Karma Code for ' . $serverLogin . '$l') { + $this->mxKarmaOpenSession(); + } + + if ($settingName == 'Enable Karma Widget' && $value == true) { + $this->updateManialink = true; + $this->handle1Second(time()); + } elseif ($settingName == 'Enable Karma Widget' && $value == false) { + $this->updateManialink = false; + $ml = new ManiaLink(self::MLID_KARMA); + $mltext = $ml->render()->saveXML(); + $this->maniaControl->manialinkManager->sendManialink($mltext); + } + } + + /** + * Handle ManiaControl 1 Second callback + * + * @param $time + */ + public function handle1Second($time) { + if (!$this->updateManialink) { + return; + } + + $displayMxKarma = $this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_DISPLAY_MX); + + // Get players + $players = $this->updateManialink; + if ($players === true) { + $players = $this->maniaControl->playerManager->getPlayers(); + } + $this->updateManialink = false; + + // Get map karma + $map = $this->maniaControl->mapManager->getCurrentMap(); + + // Display the mx Karma if the setting is choosen and the MX session is available + if ($displayMxKarma && isset($this->mxKarma['session']) && isset($this->mxKarma['voteCount'])) { + $karma = $this->mxKarma['modeVoteAverage'] / 100; + $voteCount = $this->mxKarma['modeVoteCount']; + } else { + $karma = $this->getMapKarma($map); + $votes = $this->getMapVotes($map); + $voteCount = $votes['count']; + } + + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_WIDGET_ENABLE)) { + // Build karma manialink + $this->buildManialink(); + + // Update karma gauge & label + /** + * @var Gauge $karmaGauge + */ + $karmaGauge = $this->manialink->karmaGauge; + /** + * @var Label $karmaLabel + */ + $karmaLabel = $this->manialink->karmaLabel; + if (is_numeric($karma) && $voteCount > 0) { + $karma = floatval($karma); + $karmaGauge->setRatio($karma + 0.15 - $karma * 0.15); + $karmaColor = ColorUtil::floatToStatusColor($karma); + $karmaGauge->setColor($karmaColor . '7'); + $karmaLabel->setText(' ' . round($karma * 100.) . '% (' . $voteCount . ')'); + } else { + $karmaGauge->setRatio(0.); + $karmaGauge->setColor('00fb'); + $karmaLabel->setText('-'); + } + + // Loop players + foreach ($players as $login => $player) { + // Get player vote + // TODO: show the player his own vote in some way + // $vote = $this->getPlayerVote($player, $map); + // $votesFrame = $this->manialink->votesFrame; + // $votesFrame->removeChildren(); + + // Send manialink + $this->maniaControl->manialinkManager->sendManialink($this->manialink, $login); + } } - $item = $result->fetch_object(); - $result->free(); - $vote = $item->vote; - return floatval($vote); } /** @@ -541,7 +834,7 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { } $votes = array(); $count = 0; - while($vote = $result->fetch_object()) { + while ($vote = $result->fetch_object()) { $votes[$vote->vote] = $vote; $count += $vote->count; } @@ -550,38 +843,6 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { return $votes; } - /** - * Get all players votes - * - * @param Map $map - * @return array - */ - public function getMapPlayerVotes(Map $map) { - $mysqli = $this->maniaControl->database->mysqli; - $query = "SELECT * FROM `" . self::TABLE_KARMA . "` - WHERE `mapIndex` = {$map->index} - AND `vote` >= 0"; - $result = $mysqli->query($query); - if ($mysqli->error) { - trigger_error($mysqli->error); - return false; - } - - $votes = array(); - while($vote = $result->fetch_object()) { - $player = $this->maniaControl->playerManager->getPlayerByIndex($vote->playerIndex); - $karma = $vote->vote; - $votes[] = array('player' => $player, 'karma' => $karma); - } - - usort($votes, function($a, $b) { - return $a['karma'] - $b['karma']; - }); - $votes = array_reverse($votes); - - return $votes; - } - /** * Build karma voting manialink if necessary * @@ -644,195 +905,6 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { $this->manialink = $manialink; } - /** - * Update Settings - * - * @param $class - * @param $settingName - * @param $value - */ - public function updateSettings($class, $settingName, $value) { - if (!$class = get_class()) { - return; - } - - $serverLogin = $this->maniaControl->server->login; - if ($settingName == '$l[http://karma.mania-exchange.com/auth/getapikey?server=' . $serverLogin . ']MX Karma Code for ' . $serverLogin . '$l') { - $this->mxKarmaOpenSession(); - } - - if ($settingName == 'Enable Karma Widget' && $value == true) { - $this->updateManialink = true; - $this->handle1Second(time()); - } elseif ($settingName == 'Enable Karma Widget' && $value == false) { - $this->updateManialink = false; - $ml = new ManiaLink(self::MLID_KARMA); - $mltext = $ml->render()->saveXML(); - $this->maniaControl->manialinkManager->sendManialink($mltext); - } - } - - /** - * Open a Mx Karma Session - */ - private function mxKarmaOpenSession() { - if (!$this->maniaControl->settingManager->getSetting($this, self::SETTING_MX_KARMA_ACTIVATED)) { - return; - } - - $serverLogin = $this->maniaControl->server->login; - $mxKarmaCode = $this->maniaControl->settingManager->getSetting($this, '$l[http://karma.mania-exchange.com/auth/getapikey?server=' . $serverLogin . ']MX Karma Code for ' . $serverLogin . '$l'); - - if ($mxKarmaCode == '') { - return; - } - - $applicationIdentifier = 'ManiaControl v' . ManiaControl::VERSION; - $testMode = 'true'; - - $query = self::MX_KARMA_URL . self::MX_KARMA_STARTSESSION; - $query .= '?serverLogin=' . $serverLogin; - $query .= '&applicationIdentifier=' . urlencode($applicationIdentifier); - $query .= '&testMode=' . $testMode; - - $this->mxKarma['connectionInProgress'] = true; - - $self = $this; - $this->maniaControl->fileReader->loadFile($query, function ($data, $error) use (&$self, $mxKarmaCode) { - if (!$error) { - $data = json_decode($data); - if ($data->success) { - $self->mxKarma['session'] = $data->data; - $self->activateSession($mxKarmaCode); - } else { - $self->maniaControl->log("Error while authenticating on Mania-Exchange Karma"); - // TODO remove temp trigger - $self->maniaControl->errorHandler->triggerDebugNotice("Error while authenticating on Mania-Exchange Karma " . $data->data->message); - $self->mxKarma['connectionInProgress'] = false; - } - } else { - $self->maniaControl->log($error); - // TODO remove temp trigger - $self->maniaControl->errorHandler->triggerDebugNotice("Error while authenticating on Mania-Exchange Karma " . $error); - $self->mxKarma['connectionInProgress'] = false; - } - }, "application/json", 1000); - } - - /** - * Activates the MX-Karma Session - * - * @param $mxKarmaCode - */ - private function activateSession($mxKarmaCode) { - $hash = $this->buildActivationHash($this->mxKarma['session']->sessionSeed, $mxKarmaCode); - - $query = self::MX_KARMA_URL . self::MX_KARMA_ACTIVATESESSION; - $query .= '?sessionKey=' . urlencode($this->mxKarma['session']->sessionKey); - $query .= '&activationHash=' . urlencode($hash); - - $self = $this; - $this->maniaControl->fileReader->loadFile($query, function ($data, $error) use (&$self, $query) { - if (!$error) { - $data = json_decode($data); - if ($data->success && $data->data->activated) { - $self->maniaControl->log("Successfully authenticated on Mania-Exchange Karma"); - $self->mxKarma['connectionInProgress'] = false; - - // Fetch the Mx Karma Votes - $self->getMxKarmaVotes(); - } else { - $self->maniaControl->log("Error while authenticating on Mania-Exchange Karma " . $data->data->message); - // TODO remove temp trigger - $self->maniaControl->errorHandler->triggerDebugNotice("Error while authenticating on Mania-Exchange Karma " . $data->data->message . " url Query " . $query); - $self->mxKarma['connectionInProgress'] = false; - } - } else { - // TODO remove temp trigger - $self->maniaControl->errorHandler->triggerDebugNotice("Error while authenticating on Mania-Exchange Karma " . $error); - $self->maniaControl->log($error); - $self->mxKarma['connectionInProgress'] = false; - } - }, "application/json", 1000); - } - - /** - * Fetch the mxKarmaVotes for the current map - */ - public function getMxKarmaVotes(Player $player = null) { - if (!$this->maniaControl->settingManager->getSetting($this, self::SETTING_MX_KARMA_ACTIVATED)) { - return; - } - - if (!isset($this->mxKarma['session'])) { - if (!isset($this->mxKarma['connectionInProgress']) || !$this->mxKarma['connectionInProgress']) { - $this->mxKarmaOpenSession(); - } - return; - } - - $map = $this->maniaControl->mapManager->getCurrentMap(); - - $properties = array(); - - $gameMode = $this->maniaControl->server->getGameMode(true); - if ($gameMode == 'Script') { - $scriptName = $this->maniaControl->client->getScriptName(); - $properties['gamemode'] = $scriptName["CurrentValue"]; - } else { - $properties['gamemode'] = $gameMode; - } - - $properties['titleid'] = $this->maniaControl->server->titleId; - $properties['mapuid'] = $map->uid; - - if (!$player) { - $properties['getvotesonly'] = false; - $properties['playerlogins'] = array(); - foreach($this->maniaControl->playerManager->getPlayers() as $plyr) { - /** - * @var Player $player - */ - $properties['playerlogins'][] = $plyr->login; - } - } else { - $properties['getvotesonly'] = true; - $properties['playerlogins'] = array($player->login); - } - - $content = json_encode($properties); - $self = $this; - $this->maniaControl->fileReader->postData(self::MX_KARMA_URL . self::MX_KARMA_GETMAPRATING . "?sessionKey=" . urlencode($this->mxKarma['session']->sessionKey), function ($data, $error) use (&$self, &$player) { - if (!$error) { - $data = json_decode($data); - if ($data->success) { - - // Fetch averages if its for the whole server - if (!$player) { - $self->mxKarma["voteCount"] = $data->data->votecount; - $self->mxKarma["voteAverage"] = $data->data->voteaverage; - $self->mxKarma["modeVoteCount"] = $data->data->modevotecount; - $self->mxKarma["modeVoteAverage"] = $data->data->modevoteaverage; - } - - foreach($data->data->votes as $votes) { - $self->mxKarma["votes"][$votes->login] = $votes->vote; - } - - $self->updateManialink = true; - $self->maniaControl->callbackManager->triggerCallback($self::CB_KARMA_MXUPDATED, $self->mxKarma); - $self->maniaControl->log("MX-Karma Votes successfully fetched"); - } else { - $self->maniaControl->log("Error while fetching votes: " . $data->data->message); - // TODO remove temp trigger - $self->maniaControl->errorHandler->triggerDebugNotice("Error while fetching votes: " . $data->data->message . " " . KarmaPlugin::MX_KARMA_URL . KarmaPlugin::MX_KARMA_SAVEVOTES . "?sessionKey=" . urlencode($self->mxKarma['session']->sessionKey)); - } - } else { - $self->maniaControl->log($error); - } - }, $content, false, 'application/json'); - } - /** * Import old Karma votes to Mania-Exchange Karma * @@ -872,7 +944,7 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { } $votes = array(); - while($row = $result2->fetch_object()) { + while ($row = $result2->fetch_object()) { array_push($votes, array("login" => $row->login, "nickname" => $row->nickname, "vote" => $row->vote * 100)); } @@ -913,76 +985,4 @@ class KarmaPlugin implements CallbackListener, TimerListener, Plugin { $this->mxKarma['map'] = $map; } - - /** - * Post the Karma votes to MX-Karma - * - * @param Map $map - * @param array $votes - * @param bool $import - */ - private function postKarmaVotes(Map $map, array $votes, $import = false) { - if (!isset($this->mxKarma['session'])) { - if (!isset($this->mxKarma['connectionInProgress']) || !$this->mxKarma['connectionInProgress']) { - $this->mxKarmaOpenSession(); - } - return; - } - - $gameMode = $this->maniaControl->server->getGameMode(true); - - if (count($votes) == 0) { - return; - } - - $properties = array(); - if ($gameMode == 'Script') { - $scriptName = $this->maniaControl->client->getScriptName(); - $properties['gamemode'] = $scriptName["CurrentValue"]; - } else { - $properties['gamemode'] = $gameMode; - } - - if ($import) { - $properties['maptime'] = 0; - } else { - $properties['maptime'] = time() - $this->mxKarma['startTime']; - } - - $properties['votes'] = $votes; - $properties['titleid'] = $this->maniaControl->server->titleId; - $properties['mapname'] = $map->rawName; - $properties['mapuid'] = $map->uid; - $properties['mapauthor'] = $map->authorLogin; - $properties['isimport'] = $import; - - $content = json_encode($properties); - - $self = $this; - $this->maniaControl->fileReader->postData(self::MX_KARMA_URL . self::MX_KARMA_SAVEVOTES . "?sessionKey=" . urlencode($this->mxKarma['session']->sessionKey), function ($data, $error) use (&$self) { - if (!$error) { - $data = json_decode($data); - if ($data->success) { - $self->maniaControl->log("Votes successfully permitted"); - } else { - $self->maniaControl->log("Error while updating votes: " . $data->data->message); - // TODO remove temp trigger - $self->maniaControl->errorHandler->triggerDebugNotice("Error while updating votes: " . $data->data->message . " " . KarmaPlugin::MX_KARMA_URL . $self::MX_KARMA_SAVEVOTES . "?sessionKey=" . urlencode($self->mxKarma['session']->sessionKey)); - } - } else { - $self->maniaControl->log($error); - } - }, $content, false, 'application/json'); - } - - /** - * Builds a sha512 activation Hash for the MX-Karma - * - * @param $sessionSeed - * @param $mxKey - * @return string - */ - private function buildActivationHash($sessionSeed, $mxKey) { - return hash('sha512', $mxKey . $sessionSeed); - } } diff --git a/application/plugins/WidgetPlugin.php b/application/plugins/WidgetPlugin.php index 6aacbbcf..d1555c99 100644 --- a/application/plugins/WidgetPlugin.php +++ b/application/plugins/WidgetPlugin.php @@ -24,8 +24,8 @@ use ManiaControl\Plugins\Plugin; /** * ManiaControl Widget Plugin * - * @author steeffeen and 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 WidgetPlugin implements CallbackListener, TimerListener, Plugin { @@ -88,6 +88,51 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { //do nothing } + /** + * Get plugin id + * + * @return int + */ + public static function getId() { + return self::PLUGIN_ID; + } + + /** + * Get Plugin Name + * + * @return string + */ + public static function getName() { + return self::PLUGIN_NAME; + } + + /** + * Get Plugin Version + * + * @return float,, + */ + public static function getVersion() { + return self::PLUGIN_VERSION; + } + + /** + * Get Plugin Author + * + * @return string + */ + public static function getAuthor() { + return self::PLUGIN_AUTHOR; + } + + /** + * Get Plugin Description + * + * @return string + */ + public static function getDescription() { + return 'Plugin offers some Widgets'; + } + /** * Load the plugin * @@ -136,22 +181,7 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { } /** - * Unload the plugin and its resources - */ - public function unload() { - $this->closeWidget(self::MLID_CLOCKWIDGET); - $this->closeWidget(self::MLID_SERVERINFOWIDGET); - $this->closeWidget(self::MLID_MAPWIDGET); - $this->closeWidget(self::MLID_NEXTMAPWIDGET); - $this->maniaControl->callbackManager->unregisterCallbackListener($this); - $this->maniaControl->timerManager->unregisterTimerListenings($this); - unset($this->maniaControl); - } - - /** - * Displays the Widgets onLoad - * - * @param array $callback + * Display the Widgets */ private function displayWidgets() { // Display Map Widget @@ -168,11 +198,11 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { } /** - * Displays the Map Widget + * Display the Map Widget * - * @param String $login + * @param string $login */ - public function displayMapWidget($login = false) { + public function displayMapWidget($login = null) { $pos_x = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAP_WIDGET_POSX); $pos_y = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAP_WIDGET_POSY); $width = $this->maniaControl->settingManager->getSetting($this, self::SETTING_MAP_WIDGET_WIDTH); @@ -280,11 +310,11 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { } /** - * Displays the Server Info Widget + * Display the Server Info Widget * - * @param String $login + * @param string $login */ - public function displayServerInfoWidget($login = false) { + public function displayServerInfoWidget($login = null) { $pos_x = $this->maniaControl->settingManager->getSetting($this, self::SETTING_SERVERINFO_WIDGET_POSX); $pos_y = $this->maniaControl->settingManager->getSetting($this, self::SETTING_SERVERINFO_WIDGET_POSY); $width = $this->maniaControl->settingManager->getSetting($this, self::SETTING_SERVERINFO_WIDGET_WIDTH); @@ -318,7 +348,7 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { /** * @var Player $player */ - foreach($players as $player) { + foreach ($players as $player) { if ($player->isSpectator) { $spectatorCount++; } else { @@ -383,16 +413,16 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { } /** - * Handle on Begin Map - * - * @param Map $map + * Unload the plugin and its resources */ - public function handleOnBeginMap(Map $map) { - // Display Map Widget - if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_MAP_WIDGET_ACTIVATED)) { - $this->displayMapWidget(); - } + public function unload() { + $this->closeWidget(self::MLID_CLOCKWIDGET); + $this->closeWidget(self::MLID_SERVERINFOWIDGET); + $this->closeWidget(self::MLID_MAPWIDGET); $this->closeWidget(self::MLID_NEXTMAPWIDGET); + $this->maniaControl->callbackManager->unregisterCallbackListener($this); + $this->maniaControl->timerManager->unregisterTimerListenings($this); + unset($this->maniaControl); } /** @@ -405,6 +435,19 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { $this->maniaControl->manialinkManager->sendManialink($emptyManialink); } + /** + * Handle on Begin Map + * + * @param Map $map + */ + public function handleOnBeginMap(Map $map) { + // Display Map Widget + if ($this->maniaControl->settingManager->getSetting($this, self::SETTING_MAP_WIDGET_ACTIVATED)) { + $this->displayMapWidget(); + } + $this->closeWidget(self::MLID_NEXTMAPWIDGET); + } + /** * Handle on End Map * @@ -543,49 +586,4 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { $this->displayServerInfoWidget(); } } - - /** - * Get plugin id - * - * @return int - */ - public static function getId() { - return self::PLUGIN_ID; - } - - /** - * Get Plugin Name - * - * @return string - */ - public static function getName() { - return self::PLUGIN_NAME; - } - - /** - * Get Plugin Version - * - * @return float,, - */ - public static function getVersion() { - return self::PLUGIN_VERSION; - } - - /** - * Get Plugin Author - * - * @return string - */ - public static function getAuthor() { - return self::PLUGIN_AUTHOR; - } - - /** - * Get Plugin Description - * - * @return string - */ - public static function getDescription() { - return 'Plugin offers some Widgets'; - } } \ No newline at end of file