/** * Builds arena ladder list * @category Arenateams class * @access public * @param int $type * @param bool $num = false * @param string $order = 'rating' * @param string $sort = 'ASC' * @return array **/ public function BuildArenaLadderList($type, $page, $num = false, $order = 'rating', $sort = 'ASC') { if ($num == true) { $summary = 0; foreach ($this->armory->realmData as $realm_info) { $db = new ArmoryDatabaseHandler($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['name_characters'], $realm_info['charset_characters'], $this->armory->Log()); $current_count = $db->selectCell("SELECT COUNT(`arena_team`.`arenateamid`) FROM `arena_team` AS `arena_team` LEFT JOIN `arena_team_stats` AS `arena_team_stats` ON `arena_team_stats`.`arenateamid` = `arena_team`.`arenateamid` WHERE `arena_team`.`type` = %d AND `arena_team_stats`.`rank` > 0", $type); $summary = $current_count + $summary; } return $summary; } $result_areanteams = array(); $i = 0; foreach ($this->armory->realmData as $realm_info) { $db = new ArmoryDatabaseHandler($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['name_characters'], $realm_info['charset_characters'], $this->armory->Log()); if ($order == 'lose') { // Special sorting $realmArenaTeamInfo = $db->select("\n SELECT\n `arena_team`.`arenateamid`,\n `arena_team`.`name`,\n `arena_team_stats`.`rating`,\n `arena_team_stats`.`games` AS `gamesPlayed`,\n `arena_team_stats`.`wins` AS `gamesWon`,\n `arena_team_stats`.`rank` AS `ranking`,\n `arena_team_stats`.`played` AS `seasonGamesPlayed`,\n `arena_team_stats`.`wins2` AS `seasonGamesWon`,\n `characters`.`race`,\n `arena_team_stats`.`played`-`arena_team_stats`.`wins2` AS `lose`\n FROM `arena_team` AS `arena_team`\n LEFT JOIN `arena_team_stats` AS `arena_team_stats` ON `arena_team_stats`.`arenateamid`=`arena_team`.`arenateamid`\n LEFT JOIN `characters` AS `characters` ON `characters`.`guid`=`arena_team`.`captainguid`\n WHERE `arena_team`.`type`=%d AND `arena_team_stats`.`rank` > 0\n ORDER BY `lose` %s LIMIT %d, 20", $type, $sort, $page); } else { $realmArenaTeamInfo = $db->select("\n SELECT\n `arena_team`.`arenateamid`,\n `arena_team`.`name`,\n `arena_team_stats`.`rating`,\n `arena_team_stats`.`games` AS `gamesPlayed`,\n `arena_team_stats`.`wins` AS `gamesWon`,\n `arena_team_stats`.`rank` AS `ranking`,\n `arena_team_stats`.`played` AS `seasonGamesPlayed`,\n `arena_team_stats`.`wins2` AS `seasonGamesWon`,\n `characters`.`race`\n FROM `arena_team` AS `arena_team`\n LEFT JOIN `arena_team_stats` AS `arena_team_stats` ON `arena_team_stats`.`arenateamid`=`arena_team`.`arenateamid`\n LEFT JOIN `characters` AS `characters` ON `characters`.`guid`=`arena_team`.`captainguid`\n WHERE `arena_team`.`type`=%d AND `arena_team_stats`.`rank` > 0\n ORDER BY %s %s LIMIT %d, 20", $type, $order, $sort, $page); } if (!$realmArenaTeamInfo || !is_array($realmArenaTeamInfo)) { $this->armory->Log()->writeLog('%s : loop finished, no arena teams found (order: %s, type: %d, page: %d, sort: %s, db_name: %s).', __METHOD__, $order, $type, $page, $sort, $realm_info['name_characters']); continue; } foreach ($realmArenaTeamInfo as $team) { $result_areanteams[$i]['data'] = $team; $result_areanteams[$i]['data']['num'] = $i + 1; $result_areanteams[$i]['data']['battleGroup'] = $this->armory->armoryconfig['defaultBGName']; $result_areanteams[$i]['data']['faction'] = null; $result_areanteams[$i]['data']['factionId'] = Utils::GetFactionId($result_areanteams[$i]['data']['race']); $result_areanteams[$i]['data']['lastSeasonRanking'] = null; $result_areanteams[$i]['data']['realm'] = $realm_info['name']; $result_areanteams[$i]['data']['realmUrl'] = sprintf('b=%s&r=%s&ts=%d&select=%s', urlencode($this->armory->armoryconfig['defaultBGName']), urlencode($realm_info['name']), $type, urlencode($team['name'])); $result_areanteams[$i]['data']['relevance'] = 0; $result_areanteams[$i]['data']['season'] = 0; $result_areanteams[$i]['data']['size'] = $type; $result_areanteams[$i]['data']['teamSize'] = $type; $result_areanteams[$i]['data']['teamUrl'] = sprintf('r=%s&ts=%d&t=%s', urlencode($this->armory->armoryconfig['defaultBGName']), urlencode($realm_info['name']), $type, urlencode($team['name'])); $result_areanteams[$i]['emblem'] = self::GetArenaTeamEmblem($team['arenateamid'], $db); unset($result_areanteams[$i]['data']['arenateamid'], $result_areanteams[$i]['data']['captainguid']); $i++; } } if (!isset($result_areanteams[0]['data'])) { $this->armory->Log()->writeLog('%s : unable to find any arena teams', __METHOD__); return false; } return $result_areanteams; }
/** * Builds arena ladder list * @category Arenateams class * @access public * @param int $type * @param bool $num = false * @param string $order = 'rating' * @param string $sort = 'ASC' * @return array **/ public function BuildArenaLadderList($type, $page, $num = false, $order = 'rating', $sort = 'ASC') { if ($num == true) { $summary = 0; foreach (Armory::$realmData as $realm_info) { $db = new ArmoryDatabaseHandler($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['name_characters'], $realm_info['charset_characters']); $current_count = $db->selectCell("SELECT COUNT(`arena_team`.`arenateamid`) FROM `arena_team` AS `arena_team` LEFT JOIN `arena_team_stats` AS `arena_team_stats` ON `arena_team_stats`.`arenateamid` = `arena_team`.`arenateamid` WHERE `arena_team`.`type` = %d AND `arena_team_stats`.`rank` > 0", $type); $summary += $current_count; } return $summary; } $result_areanteams = array(); $i = 0; foreach (Armory::$realmData as $realm_info) { $db = new ArmoryDatabaseHandler($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['name_characters'], $realm_info['charset_characters']); if ($order == 'lose') { // Special sorting switch ($realm_info['type']) { default: case SERVER_MANGOS: $realmArenaTeamInfo = $db->select("\n SELECT\n `arena_team`.`arenateamid`,\n `arena_team`.`name`,\n `arena_team_stats`.`rating`,\n `arena_team_stats`.`games_week` AS `gamesPlayed`,\n `arena_team_stats`.`wins_week` AS `gamesWon`,\n `arena_team_stats`.`rank` AS `ranking`,\n `arena_team_stats`.`games_season` AS `seasonGamesPlayed`,\n `arena_team_stats`.`wins_season` AS `seasonGamesWon`,\n `characters`.`race`,\n `arena_team_stats`.`games_season`-`arena_team_stats`.`wins_season` AS `lose`\n FROM `arena_team` AS `arena_team`\n LEFT JOIN `arena_team_stats` AS `arena_team_stats` ON `arena_team_stats`.`arenateamid`=`arena_team`.`arenateamid`\n LEFT JOIN `characters` AS `characters` ON `characters`.`guid`=`arena_team`.`captainguid`\n WHERE `arena_team`.`type`=%d AND `arena_team_stats`.`rank` > 0\n ORDER BY `lose` %s LIMIT %d, 20", $type, $sort, $page); break; case SERVER_TRINITY: $realmArenaTeamInfo = $db->select("\n SELECT\n `arena_team`.`arenaTeamId` AS `arenateamid`,\n `arena_team`.`name`,\n `arena_team`.`rating`,\n `arena_team`.`weekGames` AS `gamesPlayed`,\n `arena_team`.`weekWins` AS `gamesWon`,\n `arena_team`.`rank` AS `ranking`,\n `arena_team`.`seasonGames` AS `seasonGamesPlayed`,\n `arena_team`.`seasonWins` AS `seasonGamesWon`,\n `characters`.`race`,\n `arena_team`.`seasonGames`-`arena_team`.`seasonWins` AS `lose`\n FROM `arena_team` AS `arena_team`\n LEFT JOIN `characters` AS `characters` ON `characters`.`guid`=`arena_team`.`captainguid`\n WHERE `arena_team`.`type`=%d AND `arena_team`.`rank` > 0\n ORDER BY `lose` %s LIMIT %d, 20", $type, $sort, $page); break; } } else { switch ($realm_info['type']) { default: case SERVER_MANGOS: $realmArenaTeamInfo = $db->select("\n SELECT\n `arena_team`.`arenateamid`,\n `arena_team`.`name`,\n `arena_team_stats`.`rating`,\n `arena_team_stats`.`games_week` AS `gamesPlayed`,\n `arena_team_stats`.`wins_week` AS `gamesWon`,\n `arena_team_stats`.`rank` AS `ranking`,\n `arena_team_stats`.`games_season` AS `seasonGamesPlayed`,\n `arena_team_stats`.`wins_season` AS `seasonGamesWon`,\n `characters`.`race`\n FROM `arena_team` AS `arena_team`\n LEFT JOIN `arena_team_stats` AS `arena_team_stats` ON `arena_team_stats`.`arenateamid`=`arena_team`.`arenaTeamId`\n LEFT JOIN `characters` AS `characters` ON `characters`.`guid`=`arena_team`.`captainGuid`\n WHERE `arena_team`.`type`=%d AND `arena_team_stats`.`rank` > 0\n ORDER BY %s %s LIMIT %d, 20", $type, $order, $sort, $page); break; case SERVER_TRINITY: $realmArenaTeamInfo = $db->select("\n SELECT\n `arena_team`.`arenaTeamId` AS `arenateamid`,\n `arena_team`.`name`,\n `arena_team`.`rating`,\n `arena_team`.`weekGames` AS `gamesPlayed`,\n `arena_team`.`weekWins` AS `gamesWon`,\n `arena_team`.`rank` AS `ranking`,\n `arena_team`.`seasonGames` AS `seasonGamesPlayed`,\n `arena_team`.`seasonWins` AS `seasonGamesWon`,\n `characters`.`race`\n FROM `arena_team` AS `arena_team`\n LEFT JOIN `characters` AS `characters` ON `characters`.`guid`=`arena_team`.`captainGuid`\n WHERE `arena_team`.`type`=%d AND `arena_team`.`rank` > 0\n ORDER BY %s %s LIMIT %d, 20", $type, $order, $sort, $page); break; } } foreach ($realmArenaTeamInfo as $team) { $result_areanteams[$i]['data'] = $team; $result_areanteams[$i]['data']['num'] = $i + 1; $result_areanteams[$i]['data']['battleGroup'] = Armory::$armoryconfig['defaultBGName']; $result_areanteams[$i]['data']['faction'] = null; $result_areanteams[$i]['data']['factionId'] = Utils::GetFactionId($result_areanteams[$i]['data']['race']); $result_areanteams[$i]['data']['lastSeasonRanking'] = null; $result_areanteams[$i]['data']['realm'] = $realm_info['name']; $result_areanteams[$i]['data']['realmUrl'] = sprintf('b=%s&r=%s&ts=%d&select=%s', urlencode(Armory::$armoryconfig['defaultBGName']), urlencode($realm_info['name']), $type, urlencode($team['name'])); $result_areanteams[$i]['data']['relevance'] = 0; $result_areanteams[$i]['data']['season'] = 0; $result_areanteams[$i]['data']['size'] = $type; $result_areanteams[$i]['data']['teamSize'] = $type; $result_areanteams[$i]['data']['teamUrl'] = sprintf('r=%s&ts=%d&t=%s', urlencode(Armory::$armoryconfig['defaultBGName']), urlencode($realm_info['name']), $type, urlencode($team['name'])); $result_areanteams[$i]['emblem'] = self::GetArenaTeamEmblem($team['arenateamid'], $db); unset($result_areanteams[$i]['data']['arenateamid'], $result_areanteams[$i]['data']['captainguid']); $i++; } } if (!isset($result_areanteams[0]['data'])) { return false; } return $result_areanteams; }
public function PerformCharactersSearch($num = false) { if (!$this->searchQuery) { $this->armory->Log()->writeLog('%s : searchQuery not defined', __METHOD__); return false; } $currentTimeStamp = time(); $results = array(); // Full results $current_realm = array(); $count_results = 0; // All realms results $count_results_currrent_realm = 0; // Current realm results $db = null; // Temporary handler $countRealmData = count($this->armory->realmData); if ($num == true) { foreach ($this->armory->realmData as $realm_info) { $count_results_currrent_realm = 0; $db = new ArmoryDatabaseHandler($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['name_characters'], $realm_info['charset_characters'], $this->armory->Log()); $characters_data[] = $db->select("SELECT `guid`, `level`, `account` FROM `characters` WHERE `name`='%s' AND `level` >= %d LIMIT 200", $this->searchQuery, $this->armory->armoryconfig['minlevel']); } for ($ii = 0; $ii < $countRealmData; $ii++) { $count_result_chars = count($characters_data[$ii]); for ($i = 0; $i < $count_result_chars; $i++) { if (isset($characters_data[$ii][$i]) && self::IsCharacterAllowedForSearch($characters_data[$ii][$i]['guid'], $characters_data[$ii][$i]['level'], $characters_data[$ii][$i]['account'])) { $count_results++; } } } return $count_results; } $accounts_cache = array(); // For relevance calculation foreach ($this->armory->realmData as $realm_info) { $db = new ArmoryDatabaseHandler($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['name_characters'], $realm_info['charset_characters'], $this->armory->Log()); if (!$db) { continue; } $current_realm = $db->select("SELECT `guid`, `name`, `class` AS `classId`, `gender` AS `genderId`, `race` AS `raceId`, `level`, `account` FROM `characters` WHERE `name` = '%s'", $this->searchQuery); if (!$current_realm) { continue; } $count_current_realm = count($current_realm); foreach ($current_realm as $realm) { if (!self::IsCharacterAllowedForSearch($realm['guid'], $realm['level'], $realm['account'])) { continue; } if ($realm['guildId'] = $db->selectCell("SELECT `guildid` FROM `guild_member` WHERE `guid`=%d", $realm['guid'])) { $realm['guild'] = $db->selectCell("SELECT `name` FROM `guild` WHERE `guildid`=%d", $realm['guildId']); $realm['guildUrl'] = sprintf('r=%s&gn=%s', urlencode($realm_info['name']), urlencode($realm['guild'])); } $realm['url'] = sprintf('r=%s&cn=%s', urlencode($realm_info['name']), urlencode($realm['name'])); $realm['battleGroup'] = $this->armory->armoryconfig['defaultBGName']; $realm['battleGroupId'] = 1; $realm['class'] = $this->armory->aDB->selectCell("SELECT `name_%s` FROM `ARMORYDBPREFIX_classes` WHERE `id`=%d", $this->armory->GetLocale(), $realm['classId']); $realm['race'] = $this->armory->aDB->selectCell("SELECT `name_%s` FROM `ARMORYDBPREFIX_races` WHERE `id`=%d", $this->armory->GetLocale(), $realm['raceId']); $realm['realm'] = $realm_info['name']; $realm['factionId'] = Utils::GetFactionId($realm['raceId']); $realm['searchRank'] = 1; //??? /* Calculate relevance */ $realm['relevance'] = 100; // Relevance by last login date will check `realmd`.`account`.`last_login` timestamp // First of all - check character level $temp_value = $realm['level']; if ($temp_value > 70 && $temp_value < PLAYER_MAX_LEVEL) { $realm['relevance'] -= 20; } elseif ($temp_value > 60 && $temp_value < 70) { $realm['relevance'] -= 25; } elseif ($temp_value > 50 && $temp_value < 60) { $realm['relevance'] -= 30; } elseif ($temp_value > 40 && $temp_value < 50) { $realm['relevance'] -= 35; } elseif ($temp_value > 30 && $temp_value < 40) { $realm['relevance'] -= 40; } elseif ($temp_value > 20 && $temp_value < 30) { $realm['relevance'] -= 45; } elseif ($temp_value < 20) { $realm['relevance'] -= 50; // characters with level < 20 have 50% relevance and other reasons can't change this value unset($realm['account'], $realm['guid']); $results[] = $realm; continue; } // Check last login date. If it's more than 2 days, decrease relevance by 4 for every day if (!isset($accounts_cache[$realm['account']])) { $lastLogin = $this->armory->rDB->selectCell("SELECT `last_login` FROM `account` WHERE `id`=%d", $realm['account']); $accounts_cache[$realm['account']] = $lastLogin; } else { $lastLogin = $accounts_cache[$realm['account']]; } $lastLoginTimestamp = strtotime($lastLogin); $diff = $currentTimeStamp - $lastLoginTimestamp; if ($lastLogin && $diff > 0) { // 1 day is 86400 seconds $totalDays = round($diff / 86400); if ($totalDays > 2) { $decreaseRelevanceByLogin = $totalDays * 4; $realm['relevance'] -= $decreaseRelevanceByLogin; } } // Relevance for characters can't be less than 50 if ($realm['relevance'] < 50) { $realm['relevance'] = 50; } // Relevance can't be more than 100 if ($realm['relevance'] > 100) { $realm['relevance'] = 100; } unset($realm['account'], $realm['guid']); $results[] = $realm; } } if ($results) { return $results; } return false; }
/** * Returns array with all characters. * @category Utils class * @access public * @return array **/ public function GetAllCharacters() { if (!isset($_SESSION['accountId'])) { return false; } $results = array(); foreach (Armory::$realmData as $realm_info) { $db = new ArmoryDatabaseHandler($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['name_characters'], $realm_info['charset_characters']); if (!$db) { continue; } $chars_data = $db->select("\n SELECT\n `characters`.`guid`,\n `characters`.`name`, \n `characters`.`class` AS `classId`, \n `characters`.`race` AS `raceId`, \n `characters`.`gender` AS `genderId`, \n `characters`.`level`,\n `guild_member`.`guildid` AS `guildId`,\n `guild`.`name` AS `guild`\n FROM `characters` AS `characters`\n LEFT JOIN `guild_member` AS `guild_member` ON `guild_member`.`guid`=`characters`.`guid`\n LEFT JOIN `guild` AS `guild` ON `guild`.`guildid`=`guild_member`.`guildId`\n WHERE `characters`.`account`=%d", $_SESSION['accountId']); if (!$chars_data) { Armory::Log()->writeLog('%s : no characters found for account %d in `%s` database', __METHOD__, $_SESSION['accountId'], $realm_info['name_characters']); continue; } foreach ($chars_data as $realm) { $realm['account'] = strtoupper($_SESSION['username']); $realm['factionId'] = self::GetFactionId($realm['raceId']); $realm['realm'] = $realm_info['name']; $realm['relevance'] = 100; if ($realm['level'] < Armory::$armoryconfig['minlevel']) { $realm['relevance'] = 0; } elseif ($realm['level'] >= Armory::$armoryconfig['minlevel'] && $realm['level'] <= 79) { $realm['relevance'] = $realm['level']; } elseif ($realm['level'] == MAX_PLAYER_LEVEL) { $realm['relevance'] = 100; } else { $realm['relevance'] = 0; // Unknown } $realm['url'] = sprintf('r=%s&cn=%s', urlencode($realm['realm']), urlencode($realm['name'])); $realm['selected'] = Armory::$aDB->selectCell("SELECT `selected` FROM `ARMORYDBPREFIX_login_characters` WHERE `account`=%d AND `guid`=%d AND `realm_id`=%d LIMIT 1", $_SESSION['accountId'], $realm['guid'], $realm_info['id']); if ($realm['selected'] > 2) { $realm['selected'] = 2; } elseif ($realm['selected'] == 0) { unset($realm['selected']); } $ach = new Achievements(); $ach->InitAchievements($realm['guid'], $db); $realm['achPoints'] = $ach->CalculateAchievementPoints(); unset($realm['guid'], $ach); // Do not show GUID in XML results $results[] = $realm; } } if (is_array($results)) { return $results; } Armory::Log()->writeLog('%s : unable to find any character for account %d', __METHOD__, $_SESSION['accountId']); return false; }