diff --git a/core/ManiaExchange/ManiaExchangeManager.php b/core/ManiaExchange/ManiaExchangeManager.php index 5c250dfa..8dbed022 100644 --- a/core/ManiaExchange/ManiaExchangeManager.php +++ b/core/ManiaExchange/ManiaExchangeManager.php @@ -9,7 +9,7 @@ use ManiaControl\Maps\MapManager; use Maniaplanet\DedicatedServer\Xmlrpc\GameModeException; /** - * Mania Exchange Info Searcher Class + * Mania Exchange Manager Class * * @author ManiaControl Team * @copyright 2014-2015 ManiaControl Team @@ -18,6 +18,7 @@ use Maniaplanet\DedicatedServer\Xmlrpc\GameModeException; class ManiaExchangeManager { /* * Constants + * @deprecated SEARCH Constants */ //Search orders (prior parameter) http://api.mania-exchange.com/documents/enums#orderings const SEARCH_ORDER_NONE = -1; @@ -37,24 +38,6 @@ class ManiaExchangeManager { const SEARCH_ORDER_DIFFICULTY_HARDEST = 13; const SEARCH_ORDER_LENGTH_SHORTEST = 14; const SEARCH_ORDER_LENGTH_LONGEST = 15; - const SEARCH_ORDER_TRACK_VALUE_LTH = 24; - const SEARCH_ORDER_TRACK_VALUE_HTL = 25; - const SEARCH_ORDER_ONLINE_RATING_LTH = 26; - const SEARCH_ORDER_ONLINE_RATING_HTL = 27; - - //Special Search Orders (mode parameter): http://api.mania-exchange.com/documents/enums#modes - const SEARCH_ORDER_SPECIAL_DEFAULT = 0; - const SEARCH_ORDER_SPECIAL_USER_TRACKS = 1; - const SEARCH_ORDER_SPECIAL_LATEST_TRACKS = 2; - const SEARCH_ORDER_SPECIAL_RECENTLY_AWARDED = 3; - const SEARCH_ORDER_SPECIAL_BEST_OF_WEEK_AWARDS = 4; - const SEARCH_ORDER_SPECIAL_BEST_OF_MONTH_AWARDS = 5; - const SEARCH_ORDER_SPECIAL_MX_SUPPORTER_TRACKS = 10; - const SEARCH_ORDER_SPECIAL_DUO_ACCOUNT_TRACKS = 11; - const SEARCH_ORDER_SPECIAL_MOST_COMPETITIVE_WEEK = 19; - const SEARCH_ORDER_SPECIAL_MOST_COMPETITIVE_MONTH = 20; - const SEARCH_ORDER_SPECIAL_BEST_ONLINE_RATING_WEEK = 21; - const SEARCH_ORDER_SPECIAL_BEST_ONLINE_RATING_MONTH = 22; //Maximum Maps per request const MAPS_PER_MX_FETCH = 50; diff --git a/core/ManiaExchange/ManiaExchangeMapSearch.php b/core/ManiaExchange/ManiaExchangeMapSearch.php new file mode 100644 index 00000000..b25370e6 --- /dev/null +++ b/core/ManiaExchange/ManiaExchangeMapSearch.php @@ -0,0 +1,358 @@ + + * @copyright 2014-2015 ManiaControl Team + * @license http://www.gnu.org/licenses/ GNU General Public License, Version 3 + */ +class ManiaExchangeMapSearch { + //Search orders (prior parameter) http://api.mania-exchange.com/documents/enums#orderings + const SEARCH_ORDER_NONE = -1; + const SEARCH_ORDER_TRACK_NAME = 0; + const SEARCH_ORDER_AUTHOR = 1; + const SEARCH_ORDER_UPLOADED_NEWEST = 2; + const SEARCH_ORDER_UPLOADED_OLDEST = 3; + const SEARCH_ORDER_UPDATED_NEWEST = 4; + const SEARCH_ORDER_UPDATED_OLDEST = 5; + const SEARCH_ORDER_ACTIVITY_LATEST = 6; + const SEARCH_ORDER_ACTIVITY_OLDEST = 7; + const SEARCH_ORDER_AWARDS_MOST = 8; + const SEARCH_ORDER_AWARDS_LEAST = 9; + const SEARCH_ORDER_COMMENTS_MOST = 10; + const SEARCH_ORDER_COMMENTS_LEAST = 11; + const SEARCH_ORDER_DIFFICULTY_EASIEST = 12; + const SEARCH_ORDER_DIFFICULTY_HARDEST = 13; + const SEARCH_ORDER_LENGTH_SHORTEST = 14; + const SEARCH_ORDER_LENGTH_LONGEST = 15; + const SEARCH_ORDER_TRACK_VALUE_LTH = 24; + const SEARCH_ORDER_TRACK_VALUE_HTL = 25; + const SEARCH_ORDER_ONLINE_RATING_LTH = 26; + const SEARCH_ORDER_ONLINE_RATING_HTL = 27; + + //Special Search Orders (mode parameter): http://api.mania-exchange.com/documents/enums#modes + const SEARCH_ORDER_SPECIAL_DEFAULT = 0; + const SEARCH_ORDER_SPECIAL_USER_TRACKS = 1; + const SEARCH_ORDER_SPECIAL_LATEST_TRACKS = 2; + const SEARCH_ORDER_SPECIAL_RECENTLY_AWARDED = 3; + const SEARCH_ORDER_SPECIAL_BEST_OF_WEEK_AWARDS = 4; + const SEARCH_ORDER_SPECIAL_BEST_OF_MONTH_AWARDS = 5; + const SEARCH_ORDER_SPECIAL_MX_SUPPORTER_TRACKS = 10; + const SEARCH_ORDER_SPECIAL_DUO_ACCOUNT_TRACKS = 11; + const SEARCH_ORDER_SPECIAL_MOST_COMPETITIVE_WEEK = 19; + const SEARCH_ORDER_SPECIAL_MOST_COMPETITIVE_MONTH = 20; + const SEARCH_ORDER_SPECIAL_BEST_ONLINE_RATING_WEEK = 21; + const SEARCH_ORDER_SPECIAL_BEST_ONLINE_RATING_MONTH = 22; + + //Private Properties + private $url = ""; + + private $mode = null; + private $trackName = null; + private $authorName = null; + private $mod = null; + private $authorId = null; + private $maniaScriptType = null; + private $titlePack = null; + private $replayType = null; + private $style = null; + private $length = null; + private $lengthOperator = null; + private $priorityOrder = null; + private $secondaryOrder = null; + private $environments = null; + private $vehicles = null; + private $page = null; + private $limit = null; + private $unreleased = null; + private $mapGroup = null; + private $commentsMinLength = null; + private $customScreenshot = null; + private $minExeBuild = null; + private $envMix = null; + private $ghostBlocks = null; + private $embeddedObjects = null; + + /** @var ManiaControl $maniaControl */ + private $maniaControl = null; + + /** + * Construct map manager + * + * @param \ManiaControl\ManiaControl $maniaControl + */ + public function __construct(ManiaControl $maniaControl) { + $this->maniaControl = $maniaControl; + + + $titleId = $this->maniaControl->getServer()->titleId; + $titlePrefix = $this->maniaControl->getMapManager()->getCurrentMap()->getGame(); + + $this->url = 'http://' . $titlePrefix . '.mania-exchange.com/tracksearch2/search?api=on'; + + //Set some defaults: + //Set Min Exe Build Default for games which are not Trackmania + if ($titlePrefix !== "tm") { + $this->minExeBuild = ManiaExchangeManager::MIN_EXE_BUILD; + } + + //Set MapTypes + try { + $scriptInfos = $this->maniaControl->getClient()->getModeScriptInfo(); + $mapTypes = $scriptInfos->compatibleMapTypes; + $this->maniaScriptType = $mapTypes; + } catch (GameModeException $e) { + } + + //Set Environments on Trackmania + $game = explode('@', $titleId); + $envNumber = $this->getEnvironment($game[0]); //TODO enviroment as constant + if ($envNumber > -1) { + $this->environments = $envNumber; + } + + //More Defaults: + $this->limit = 100; + $this->priorityOrder = self::SEARCH_ORDER_UPDATED_NEWEST; + } + + /** + * Fetch a MapList Asynchronously + * + * @param callable $function + */ + public function fetchMapsAsync(callable $function) { + $titlePrefix = $this->maniaControl->getMapManager()->getCurrentMap()->getGame(); + + // compile search URL + $parameters = ""; + + //TODO ALl Parameters + //$url .= "&..."; //TODO + + + $this->maniaControl->getFileReader()->loadFile($this->url . $parameters, function ($mapInfo, $error) use (&$function, $titlePrefix) { + if ($error) { + trigger_error($error); + return; + } + + $mxMapList = json_decode($mapInfo); + + if (!isset($mxMapList->results)) { + trigger_error('Cannot decode searched JSON data'); + return; + } + + $mxMapList = $mxMapList->results; + + if ($mxMapList === null) { + trigger_error('Cannot decode searched JSON data'); + return; + } + + $maps = array(); + foreach ($mxMapList as $map) { + if (!empty($map)) { + array_push($maps, new MXMapInfo($titlePrefix, $map)); + } + } + + call_user_func($function, $maps); + }, AsynchronousFileReader::CONTENT_TYPE_JSON); + } + + + /** + * Get the Current Environment by String + * + * @param string $env + * @return int + */ + private function getEnvironment($env) { + switch ($env) { + case 'TMCanyon': + return 1; + case 'TMStadium': + return 2; + case 'TMValley': + return 3; + default: + return -1; + } + } + + /** + * @param int $mode + */ + public function setMode($mode) { + $this->mode = $mode; + } + + /** + * @param string $trackName + */ + public function setTrackName($trackName) { + $this->trackName = $trackName; + } + + /** + * @param string $authorName + */ + public function setAuthorName($authorName) { + $this->authorName = $authorName; + } + + /** + * @param int $authorId + */ + public function setAuthorId($authorId) { + $this->authorId = $authorId; + } + + /** + * @param string $maniaScriptType + */ + public function setManiaScriptType($maniaScriptType) { + $this->maniaScriptType = $maniaScriptType; + } + + /** + * @param string $mod + */ + public function setMod($mod) { + $this->mod = $mod; + } + + /** + * @param string $titlePack + */ + public function setTitlePack($titlePack) { + $this->titlePack = $titlePack; + } + + /** + * @param int $replayType + */ + public function setReplayType($replayType) { + $this->replayType = $replayType; + } + + /** + * @param int $length + */ + public function setLength($length) { + $this->length = $length; + } + + /** + * @param int $style + */ + public function setStyle($style) { + $this->style = $style; + } + + /** + * @param int $lengthOperator + */ + public function setLengthOperator($lengthOperator) { + $this->lengthOperator = $lengthOperator; + } + + /** + * @param int $secondaryOrder + */ + public function setSecondaryOrder($secondaryOrder) { + $this->secondaryOrder = $secondaryOrder; + } + + /** + * @param int $priorityOrder + */ + public function setPriorityOrder($priorityOrder) { + $this->priorityOrder = $priorityOrder; + } + + /** + * @param string $environments + */ + public function setEnvironments($environments) { + $this->environments = $environments; + } + + /** + * @param int $page + */ + public function setPage($page) { + $this->page = $page; + } + + /** + * @param string $vehicles + */ + public function setVehicles($vehicles) { + $this->vehicles = $vehicles; + } + + /** + * @param bool $unreleased + */ + public function setUnreleased($unreleased) { + $this->unreleased = $unreleased; + } + + /** + * @param int $mapGroup + */ + public function setMapGroup($mapGroup) { + $this->mapGroup = $mapGroup; + } + + /** + * @param int $commentsMinLength + */ + public function setCommentsMinLength($commentsMinLength) { + $this->commentsMinLength = $commentsMinLength; + } + + /** + * @param bool $customScreenshot + */ + public function setCustomScreenshot($customScreenshot) { + $this->customScreenshot = $customScreenshot; + } + + /** + * @param bool $envMix + */ + public function setEnvMix($envMix) { + $this->envMix = $envMix; + } + + /** + * @param string $minExeBuild + */ + public function setMinExeBuild($minExeBuild) { + $this->minExeBuild = $minExeBuild; + } + + /** + * @param bool $ghostBlocks + */ + public function setGhostBlocks($ghostBlocks) { + $this->ghostBlocks = $ghostBlocks; + } + + /** + * @param bool $embeddedObjects + */ + public function setEmbeddedObjects($embeddedObjects) { + $this->embeddedObjects = $embeddedObjects; + } +} \ No newline at end of file