From df202393ba15e317044a1f05c65fbc22b48dc657 Mon Sep 17 00:00:00 2001 From: kremsy Date: Tue, 21 Jan 2014 21:58:39 +0100 Subject: [PATCH] minor improvements, begin simplestats --- application/core/Formatter.php | 2 +- application/core/Players/PlayerManager.php | 38 ++++- .../core/Statistics/SimpleStatsList.php | 141 ++++++++++++++---- .../core/Statistics/StatisticManager.php | 39 ++++- 4 files changed, 192 insertions(+), 28 deletions(-) diff --git a/application/core/Formatter.php b/application/core/Formatter.php index 48654a82..0c0faf6e 100644 --- a/application/core/Formatter.php +++ b/application/core/Formatter.php @@ -63,7 +63,7 @@ abstract class Formatter { * @return string */ public static function formatTimeH($seconds) { - return gmdate("H:i:s", $seconds); + return date("H:i:s", $seconds); } /** diff --git a/application/core/Players/PlayerManager.php b/application/core/Players/PlayerManager.php index b323fc7e..3b7682c8 100644 --- a/application/core/Players/PlayerManager.php +++ b/application/core/Players/PlayerManager.php @@ -219,7 +219,8 @@ class PlayerManager implements CallbackListener { return $player; } } - return null; + //Player is not online -> get Player from Database + return $this->getPlayerFromDatabaseByIndex($index); } /** @@ -266,6 +267,41 @@ class PlayerManager implements CallbackListener { 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(); + + $player = new Player(false); + $player->index = $playerIndex; + $player->login = $row->login; + $player->nickname = $row->nickname; + $player->path = $row->path; + $player->authLevel = $row->authLevel; + + return $player; + } + + /** * Save player in Database and fill up Object Properties * diff --git a/application/core/Statistics/SimpleStatsList.php b/application/core/Statistics/SimpleStatsList.php index 7637be5c..1cc225d6 100644 --- a/application/core/Statistics/SimpleStatsList.php +++ b/application/core/Statistics/SimpleStatsList.php @@ -6,17 +6,23 @@ namespace ManiaControl\Statistics; use FML\Controls\Control; use FML\Controls\Frame; use FML\Controls\Label; +use FML\Controls\Labels\Label_Text; use FML\Controls\Quad; use FML\Controls\Quads\Quad_BgsPlayerCard; use FML\Controls\Quads\Quad_Icons64x64_1; use FML\Controls\Quads\Quad_UIConstruction_Buttons; use FML\ManiaLink; +use FML\Script\Script; +use ManiaControl\Callbacks\CallbackListener; +use ManiaControl\Callbacks\CallbackManager; +use ManiaControl\Formatter; use ManiaControl\ManiaControl; use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\Manialinks\ManialinkPageAnswerListener; use ManiaControl\Players\Player; +use ManiaControl\Players\PlayerManager; -class SimpleStatsList implements ManialinkPageAnswerListener{ +class SimpleStatsList implements ManialinkPageAnswerListener, CallbackListener { /** * Constants */ @@ -35,19 +41,34 @@ class SimpleStatsList implements ManialinkPageAnswerListener{ public function __construct(ManiaControl $maniaControl) { $this->maniaControl = $maniaControl; - //$this->maniaControl->callbackManager->registerCallbackListener(ManialinkManager::CB_MAIN_WINDOW_CLOSED, $this, 'closeWidget'); - //$this->maniaControl->callbackManager->registerCallbackListener(ManialinkManager::CB_MAIN_WINDOW_OPENED, $this, 'handleWidgetOpened'); - //$this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); + //$this->maniaControl->callbackManager->registerCallbackListener(CallbackManager::CB_MC_ONINIT, $this, 'handleOnInit'); + } + + /** + * Add the menu entry + * + * @param array $callback + */ + public function handleOnInit(array $callback) { + // Action Open StatsList + $this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_OPEN_STATSLIST, $this, 'command_ShowStatsList'); + //TODO command - // Action Open Playerlist - //$this->maniaControl->manialinkManager->registerManialinkPageAnswerListener(self::ACTION_OPEN_STATSLIST, $this, 'command_playerList'); $itemQuad = new Quad_UIConstruction_Buttons(); - $itemQuad->setSubStyle($itemQuad::SUBSTYLE_Author); + $itemQuad->setSubStyle($itemQuad::SUBSTYLE_Stats); $itemQuad->setAction(self::ACTION_OPEN_STATSLIST); - //$this->maniaControl->actionsMenu->addMenuItem($itemQuad, true, 14, 'Open Statistics'); + $this->maniaControl->actionsMenu->addMenuItem($itemQuad, true, 14, 'Open Statistics'); } - + /** + * 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 @@ -60,8 +81,12 @@ class SimpleStatsList implements ManialinkPageAnswerListener{ $quadStyle = $this->maniaControl->manialinkManager->styleManager->getDefaultMainWindowStyle(); $quadSubstyle = $this->maniaControl->manialinkManager->styleManager->getDefaultMainWindowSubStyle(); + $width = $width * 1.4; //TODO setting + $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); - $script = $maniaLink->getScript(); + // Create script and features + $script = new Script(); + $maniaLink->setScript($script); // Main frame $frame = new Frame(); @@ -84,14 +109,14 @@ class SimpleStatsList implements ManialinkPageAnswerListener{ $closeQuad->setAction(ManialinkManager::ACTION_CLOSEWIDGET); // Start offsets - $x = -$width / 2; - $y = $height / 2; + $xStart = -$width / 2; + $y = $height / 2; // Predefine Description Label $descriptionLabel = new Label(); $frame->add($descriptionLabel); $descriptionLabel->setAlign(Control::LEFT, Control::TOP); - $descriptionLabel->setPosition($x + 10, -$height / 2 + 5); + $descriptionLabel->setPosition($xStart + 10, -$height / 2 + 5); $descriptionLabel->setSize($width * 0.7, 4); $descriptionLabel->setTextSize(2); $descriptionLabel->setVisible(false); @@ -101,24 +126,95 @@ class SimpleStatsList implements ManialinkPageAnswerListener{ $frame->add($headFrame); $headFrame->setY($y - 5); - $array = array("Id" => $x + 5, "Nickname" => $x + 18, "Login" => $x + 70, "Location" => $x + 101); + + // get Players by Main-Order + //$players = $this->maniaControl->playerManager->getPlayers(); + $time = $this->maniaControl->statisticManager->getStatsRanking(PlayerManager::STAT_SERVERTIME); + $kills = $this->maniaControl->statisticManager->getStatsRanking(StatisticCollector::STAT_ON_KILL); + $deaths = $this->maniaControl->statisticManager->getStatsRanking(StatisticCollector::STAT_ON_DEATH); + + + $x = $xStart; + $array['$oId'] = $x + 5; + $array['$oNickname'] = $x + 14; + $array['$oS'] = $x += 55; + $array['$oK'] = $x += 20; + $array['$oD'] = $x += 8; + $array['$oK/D'] = $x += 8; + + //$array = array("Id" => $xStart + 5, "Nickname" => $xStart + 14, "K" => $xStart + 50, "D" => $xStart + 58); $this->maniaControl->manialinkManager->labelLine($headFrame, $array); - // get PlayerList - $players = $this->maniaControl->playerManager->getPlayers(); - - $i = 1; + // define standard properties + $hAlign = Control::LEFT; + $style = Label_Text::STYLE_TextCardSmall; + $textSize = 1.5; + $textColor = 'FFF'; + $i = 1; $y -= 10; - foreach($players as $listPlayer) { + foreach($time as $playerId => $value) { + $listPlayer = $this->maniaControl->playerManager->getPlayerByIndex($playerId); + //var_dump($listPlayer); /** * * @var Player $listPlayer */ - $path = $listPlayer->getProvince(); $playerFrame = new Frame(); $frame->add($playerFrame); + //$this->maniaControl->statisticManager->get + + $displayArray = array(); + + if(!isset($kills[$playerId])) { + $killStat = 0; + } else { + $killStat = $kills[$playerId]; + } + + if(!isset($deaths[$playerId])) { + $deathStat = 0; + } else { + $deathStat = $deaths[$playerId]; + } + + $displayArray['Server Time'] = Formatter::formatTimeH($value); + var_dump($value); + $displayArray['Kills'] = strval($killStat); + //var_dump($deaths); + $displayArray['Deaths'] = strval($deathStat); + + // var_dump($displayArray); + if($deathStat == 0) { + $displayArray['Kill-Death Ratio'] = '-'; + } else { + $displayArray['Kill-Death Ratio'] = strval(round($killStat / $deathStat, 2)); + } + + $array = array($i => $xStart + 5, $listPlayer->nickname => $xStart + 14); + $this->maniaControl->manialinkManager->labelLine($playerFrame, $array); + + $x = $xStart + 55; + foreach($displayArray as $key => $array) { + $label = new Label_Text(); + $playerFrame->add($label); + $label->setHAlign($hAlign); + $label->setX($x); + $label->setStyle($style); + $label->setTextSize($textSize); + $label->setText($array); + $label->setTextColor($textColor); + $script->addTooltip($label, $descriptionLabel, array(Script::OPTION_TOOLTIP_TEXT => '$o ' . $key)); + if($x == $xStart + 55) { + $x += 10; //TODO improve + } + $x += 8; + } + + + $playerFrame->setY($y); + if($i % 2 != 0) { $lineQuad = new Quad_BgsPlayerCard(); $playerFrame->add($lineQuad); @@ -127,11 +223,6 @@ class SimpleStatsList implements ManialinkPageAnswerListener{ $lineQuad->setZ(0.001); } - $array = array($i => $x + 5, $listPlayer->nickname => $x + 18, $listPlayer->login => $x + 70, $path => $x + 101); - $this->maniaControl->manialinkManager->labelLine($playerFrame, $array); - - $playerFrame->setY($y); - $i++; $y -= 4; diff --git a/application/core/Statistics/StatisticManager.php b/application/core/Statistics/StatisticManager.php index 7d0741cc..52611d1a 100644 --- a/application/core/Statistics/StatisticManager.php +++ b/application/core/Statistics/StatisticManager.php @@ -86,6 +86,42 @@ class StatisticManager { return $row->value; } + /** + * Get All statistics orderd by an given name + * + * @param $orderedBy + * @param $serverIndex + * @return object + */ + public function getStatsRanking($statName = '', $serverIndex = -1) { + $mysqli = $this->maniaControl->database->mysqli; + $statId = $this->getStatId($statName); + + $query = "SELECT playerId, serverIndex, value FROM `" . self::TABLE_STATISTICS . "` WHERE statId = " . $statId . " 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; + } + } + + $result->close(); + return $stats; + } + /** * Store Stats Meta Data from the Database */ @@ -137,6 +173,7 @@ class StatisticManager { return $playerStats; } + /** * Inserts a Stat into the database * @@ -268,7 +305,7 @@ class StatisticManager { `serverIndex` int(11) NOT NULL, `playerId` int(11) NOT NULL, `statId` int(11) NOT NULL, - `value` int(20) COLLATE utf8_unicode_ci NOT NULL, + `value` int(20) COLLATE utf8_unicode_ci 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;";