From 84b44c29b918b5fb9b0946959b75007cce759f9b Mon Sep 17 00:00:00 2001 From: Max Klaversma Date: Tue, 29 Apr 2014 15:20:20 +0200 Subject: [PATCH] Added sorting options for list: best/worst/newest/oldest (via /list). --- application/core/Maps/MapCommands.php | 74 ++++++++++++++++++++++++++- application/core/Maps/MapList.php | 36 +++++++++---- 2 files changed, 100 insertions(+), 10 deletions(-) diff --git a/application/core/Maps/MapCommands.php b/application/core/Maps/MapCommands.php index ee484602..fdfadb24 100644 --- a/application/core/Maps/MapCommands.php +++ b/application/core/Maps/MapCommands.php @@ -316,7 +316,79 @@ class MapCommands implements CommandListener, ManialinkPageAnswerListener, Callb * @param Player $player */ public function command_List(array $chatCallback, Player $player) { - $this->maniaControl->mapManager->mapList->showMapList($player); + $chatCommands = explode(' ', $chatCallback[1][2]); + $this->maniaControl->mapManager->mapList->playerCloseWidget($player); + if(isset($chatCommands[1])) { + if($chatCommands[1] == ' ' || $chatCommands[1] == 'all') { + $this->maniaControl->mapManager->mapList->showMapList($player); + } elseif($chatCommands[1] == 'best') { + $this->showMapListKarma(true, $player); + } elseif($chatCommands[1] == 'worst') { + $this->showMapListKarma(false, $player); + } elseif($chatCommands[1] == 'newest') { + $this->showMapListDate(true, $player); + } elseif($chatCommands[1] == 'oldest') { + $this->showMapListDate(false, $player); + } + } else { + $this->maniaControl->mapManager->mapList->showMapList($player); + } + } + + private function showMapListKarma($best, $player) { + /** @var \MCTeam\KarmaPlugin $karmaPlugin */ + $karmaPlugin = $this->maniaControl->pluginManager->getPlugin(MapList::DEFAULT_KARMA_PLUGIN); + if($karmaPlugin) { + $maps = $this->maniaControl->mapManager->getMaps(); + $mapList = array(); + foreach($maps as $map) { + if($map instanceof Map) { + $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; + } else { + $plus = $plus+$vote->count; + } + } + } + } + $map->karma = $plus-$min; + $mapList[] = $map; + } + } + + usort($mapList, array($this, 'sortByKarma')); + if($best) { + $mapList = array_reverse($mapList); + } + + $this->maniaControl->mapManager->mapList->showMapList($player, $mapList); + } else { + $this->maniaControl->chat->sendError('KarmaPlugin is not enabled!', $player->login); + } + } + + private function sortByKarma($a, $b) { + return $a->karma - $b->karma; + } + + private function showMapListDate($newest, $player) { + $maps = $this->maniaControl->mapManager->getMaps(); + + usort($maps, function($a, $b) { + return $a->index - $b->index; + }); + + if($newest) { + $maps = array_reverse($maps); + } + + $this->maniaControl->mapManager->mapList->showMapList($player, $maps); } /** diff --git a/application/core/Maps/MapList.php b/application/core/Maps/MapList.php index 9e319670..0940e145 100644 --- a/application/core/Maps/MapList.php +++ b/application/core/Maps/MapList.php @@ -123,19 +123,20 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { // Get Maps $mapList = array(); if (is_array($maps)) { - $mapList = $maps; - $pageCount = ceil(count($mapList) / 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]; + $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 if ($maps !== 'redirect') { $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); } - else if (array_key_exists($player->login, $this->mapsInListShown)) { - $mapList = $this->mapsInListShown[$player->login]; - $pageCount = ceil(count($mapList) / self::MAX_MAPS_PER_PAGE); - } - - $this->mapsInListShown[$player->login] = $mapList; // Create ManiaLink $maniaLink = new ManiaLink(ManialinkManager::MAIN_MLID); @@ -422,6 +423,21 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $karma = $karmaPlugin->getMapKarma($map); $votes = $karmaPlugin->getMapVotes($map); if (is_numeric($karma)) { + $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; + } + } + } + } + $endKarma = $plus-$min; + $karmaGauge = new Gauge(); $mapFrame->add($karmaGauge); $karmaGauge->setZ(2); @@ -441,7 +457,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { $karmaLabel->setTextSize(0.9); $karmaLabel->setTextColor('000'); $karmaLabel->setAlign(Control::CENTER, Control::CENTER); - $karmaLabel->setText(' ' . round($karma * 100.) . '% (' . $votes['count'] . ')'); + $karmaLabel->setText(' ' . $endKarma . ' (' . $votes['count'] . 'x / ' . round($karma * 100.) . '%)'); } } @@ -533,6 +549,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { */ public function closeWidget(Player $player) { unset($this->mapListShown[$player->login]); + unset($this->mapsInListShown[$player->login]); } /** @@ -542,6 +559,7 @@ class MapList implements ManialinkPageAnswerListener, CallbackListener { */ public function playerCloseWidget(Player $player) { unset($this->mapListShown[$player->login]); + unset($this->mapsInListShown[$player->login]); $this->maniaControl->manialinkManager->closeWidget($player); }