public function BuildArenaLadderList($type, $page, $num = false, $order = 'rank', $type = 'DESC') { if ($num == true) { return $this->cDB->selectCell("SELECT COUNT(`arenateamid`) FROM `arena_team` WHERE `type`=?", $type); } $arenaTeamInfo = $this->cDB->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 `type`=?\n ORDER BY `arena_team_stats`.`" . $order . "` " . $type . " LIMIT " . $page . ", 20\n ", $type); if (!$arenaTeamInfo) { return false; } $result_areanteams = array(); $i = 0; foreach ($arenaTeamInfo as $team) { $result_areanteams[$i]['data'] = $team; $result_areanteams[$i]['data']['num'] = $i + 1; $result_areanteams[$i]['data']['battleGroup'] = $this->armoryconfig['defaultBGName']; $result_areanteams[$i]['data']['faction'] = ''; $result_areanteams[$i]['data']['factionId'] = Utils::GetFactionId($result_areanteams[$i]['data']['race']); //$result_areanteams[$i]['data']['factionId'] = 1; $result_areanteams[$i]['data']['lastSeasonRanking'] = ''; $result_areanteams[$i]['data']['realm'] = $this->currentRealmInfo['name']; $result_areanteams[$i]['data']['realmUrl'] = sprintf('b=%s&r=%s&ts=%d&select=%s', urlencode($this->armoryconfig['defaultBGName']), urlencode($this->currentRealmInfo['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->armoryconfig['defaultBGName']), urlencode($this->currentRealmInfo['name']), $type, urlencode($team['name'])); $result_areanteams[$i]['emblem'] = self::GetArenaTeamEmblem($team['arenateamid']); unset($result_areanteams[$i]['data']['arenateamid']); unset($result_areanteams[$i]['data']['captainguid']); $i++; } return $result_areanteams; }
/** * Sets $this->guildFaction as $this->guildleaderguid's faction * @category Guilds class * @example Guilds::getGuildFaction() * @return bool **/ public function getGuildFaction() { if (!$this->guildleaderguid) { $this->Log()->writeError('%s : guildleaderguid not defined', __METHOD__); return false; } $race = $this->cDB->selectCell("SELECT `race` FROM `characters` WHERE `guid`=? LIMIT 1", $this->guildleaderguid); $this->guildFaction = Utils::GetFactionId($race); return true; }
/** * 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 Armory::$dbClass($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['port_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 Armory::$dbClass($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['port_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 SearchCharacters($num = false) { if (!$this->searchQuery) { $this->Log()->writeError('%s : searchQuery not defined', __METHOD__); return false; } $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 if ($num == true) { foreach ($this->realmData as $realm_info) { $count_results_currrent_realm = 0; $db = DbSimple_Generic::connect('mysql://' . $realm_info['user_characters'] . ':' . $realm_info['pass_characters'] . '@' . $realm_info['host_characters'] . '/' . $realm_info['name_characters']); $db->query("SET NAMES ?", $realm_info['charset_characters']); $characters_data[] = $db->select("SELECT `guid`, `level`, `account` FROM `characters` WHERE `name` LIKE ? AND `level` >= ? LIMIT 200", '%' . $this->searchQuery . '%', $this->armoryconfig['minlevel']); } $count_result_chars = count($characters_data[0]); for ($i = 0; $i < $count_result_chars; $i++) { if (isset($characters_data[0][$i]) && self::IsCharacterAllowedForSearch($characters_data[0][$i]['guid'], $characters_data[0][$i]['level'], $characters_data[0][$i]['account'])) { $count_results++; } } return $count_results; } foreach ($this->realmData as $realm_info) { $db = DbSimple_Generic::connect('mysql://' . $realm_info['user_characters'] . ':' . $realm_info['pass_characters'] . '@' . $realm_info['host_characters'] . '/' . $realm_info['name_characters']); $db->query("SET NAMES ?", $realm_info['charset_characters']); $current_realm = $db->select("SELECT `guid`, `name`, `class` AS `classId`, `gender` AS `genderId`, `race` AS `raceId`, `level`, `account` FROM `characters` WHERE `name` LIKE ?", '%' . $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`=?", $realm['guid'])) { $realm['guild'] = $db->selectCell("SELECT `name` FROM `guild` WHERE `guildid`=?", $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['relevance'] = 100; $realm['battleGroup'] = $this->armoryconfig['defaultBGName']; $realm['battleGroupId'] = 1; $realm['class'] = $this->aDB->selectCell("SELECT `name_" . $this->_locale . "` FROM `armory_classes` WHERE `id`=?", $realm['classId']); $realm['race'] = $this->aDB->selectCell("SELECT `name_" . $this->_locale . "` FROM `armory_races` WHERE `id`=?", $realm['raceId']); $realm['realm'] = $realm_info['name']; $realm['factionId'] = Utils::GetFactionId($realm['raceId']); $realm['searchRank'] = 1; //??? unset($realm['account'], $realm['guid']); $results[] = $realm; } } if ($results) { return $results; } return false; }
private function IsCharacterFitsRequirements(&$player_data) { $gmLevel = 0; // Disable next SQL error Armory::$rDB->SkipNextError(); if ($this->m_server == SERVER_TRINITY) { $gmLevel = Armory::$rDB->selectCell("SELECT `gmlevel` FROM `account_access` WHERE `id`=%d AND `RealmID` IN (-1, %d)", $player_data['account'], Armory::$connectionData['id']); } elseif ($this->m_server == SERVER_MANGOS) { $gmLevel = Armory::$rDB->selectCell("SELECT `gmlevel` FROM `account` WHERE `id`=%d LIMIT 1", $player_data['account']); } $allowed = $gmLevel <= Armory::$armoryconfig['minGmLevelToShow'] ? true : false; if (!$allowed) { Armory::Log()->writeLog('%s : unable to display character %s (GUID: %d): GM level restriction!', __METHOD__, $player_data['name'], $player_data['guid']); return false; } if ($player_data['level'] < Armory::$armoryconfig['minlevel']) { Armory::Log()->writeLog('%s : unable to load character %s (GUID: %d): level restriction.', __METHOD__, $player_data['name'], $player_data['guid']); return false; } if (Armory::$armoryconfig['skipBanned'] && Armory::$rDB->selectCell("SELECT 1 FROM `account_banned` WHERE `id` = %d AND `active` = 1", $player_data['account'])) { Armory::Log()->writeLog('%s : unable to load character %s (GUID: %d) from banned account %d.', __METHOD__, $player_data['name'], $player_data['guid'], $player_data['account']); return false; } // Class/race/faction checks if ($player_data['class'] >= MAX_CLASSES) { // Unknown class Armory::Log()->writeError('%s : character %s (GUID: %d) has wrong data in DB: classID %d was not found. Unable to continue.', __METHOD__, $player_data['name'], $player_data['guid'], $player_data['class']); return false; } elseif ($player_data['race'] >= MAX_RACES) { // Unknown race Armory::Log()->writeError('%s : character %s (GUID: %d) has wrong data in DB: raceID %d was not found. Unable to continue.', __METHOD__, $player_data['name'], $player_data['guid'], $player_data['race']); return false; } $this->faction = Utils::GetFactionId($player_data['race']); if ($this->faction === false) { // Unknown faction Armory::Log()->writeError('%s : character %s (GUID: %d) has wrong data in DB: factionID %d was not found (raceID: %d).', __METHOD__, $player_data['name'], $player_data['guid'], $this->faction, $player_data['race']); return false; } return true; }
/** * 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; }
public function PerformCharactersSearch($num = false) { if (!$this->searchQuery) { 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(Armory::$realmData); $search = ucfirst(strtolower($this->searchQuery)); if ($num == true) { foreach (Armory::$realmData as $realm_info) { $count_results_currrent_realm = 0; $db = new Armory::$dbClass($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['port_characters'], $realm_info['name_characters'], $realm_info['charset_characters']); $characters_data[] = $db->select("SELECT `guid`, `level`, `account` FROM `characters` WHERE `name`='%s' AND `level` >= %d LIMIT 200", $search, 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 (Armory::$realmData as $realm_info) { $db = new Armory::$dbClass($realm_info['host_characters'], $realm_info['user_characters'], $realm_info['pass_characters'], $realm_info['port_characters'], $realm_info['name_characters'], $realm_info['charset_characters']); 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'", $search); 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'] = Armory::$armoryconfig['defaultBGName']; $realm['battleGroupId'] = 1; $realm['class'] = Armory::$aDB->selectCell("SELECT `name_%s` FROM `ARMORYDBPREFIX_classes` WHERE `id`=%d", Armory::GetLocale(), $realm['classId']); $realm['race'] = Armory::$aDB->selectCell("SELECT `name_%s` FROM `ARMORYDBPREFIX_races` WHERE `id`=%d", 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 < MAX_PLAYER_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 = 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; }
/** * Assign guild faction by player faction ID * @category Guilds class * @access private * @return bool **/ private function SetGuildFaction() { if (!$this->guildleaderguid) { Armory::Log()->writeError('%s : guildleaderguid not defined', __METHOD__); return false; } $race = Armory::$cDB->selectCell("SELECT `race` FROM `characters` WHERE `guid`=%d LIMIT 1", $this->guildleaderguid); $this->guildFaction = Utils::GetFactionId($race); return true; }
public function BuildCharacter($name, $realmId = 1) { if (!is_string($name)) { $this->Log()->writeLog('%s : name must be a string!', __METHOD__); return false; } elseif (!isset($this->realmData[$realmId])) { $this->Log()->writeError('%s : unable to find data for realmId %d', __METHOD__, $realmId); return false; } $realm_info = $this->realmData[$realmId]; $this->db = DbSimple_Generic::connect('mysql://' . $realm_info['user_characters'] . ':' . $realm_info['pass_characters'] . '@' . $realm_info['host_characters'] . '/' . $realm_info['name_characters']); if (!$this->db) { $this->Log()->writeError('%s : unable to connect to MySQL server (error: %s; realmId: %d). Check your configs.', __METHOD__, mysql_error() ? mysql_error() : 'none', $realmId); return false; } $this->db->query("SET NAMES ?", isset($realm_info['charset']) ? $realm_info['charset'] : 'UTF8'); $player_data = $this->db->selectRow("\n SELECT\n `characters`.`guid`,\n `characters`.`account`,\n `characters`.`name`,\n `characters`.`race`,\n `characters`.`class`,\n `characters`.`gender`,\n `characters`.`level`,\n `characters`.`playerBytes`,\n `characters`.`playerBytes2`,\n `characters`.`playerFlags`,\n `characters`.`specCount`,\n `characters`.`activeSpec`,\n `characters`.`chosenTitle`,\n `characters`.`health`,\n `characters`.`power1`,\n `characters`.`power2`,\n `characters`.`power3`,\n `characters`.`equipmentCache`,\n `guild_member`.`guildid` AS `guild_id`,\n `guild`.`name` AS `guild_name`\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`.`name`=? LIMIT 1", $name); if (!$player_data || !is_array($player_data)) { $this->Log()->writeError('%s: unable to get data from characters DB for player %s', __METHOD__, $name); return false; } $player_stats_check = $this->db->selectCell("SELECT 1 FROM `armory_character_stats` WHERE `guid`=?d LIMIT 1", $player_data['guid']); if (!$player_stats_check) { $this->Log()->writeError('%s : player %d (%s) does not have any data in `armory_character_stats` table (SQL update to characters DB not applied?)', __METHOD__, $player_data['guid'], $player_data['name']); unset($player_data); return false; } // Is character allowed to be displayed in Armory? $gmLevel = false; $gmLevel_mangos = $this->rDB->selectCell("SELECT `gmlevel` FROM `account` WHERE `id`=?d LIMIT 1", $player_data['account']); $gmLevel_trinity = $this->rDB->selectCell("SELECT `gmlevel` FROM `account_access` WHERE `id`=? AND `RealmID` IN (-1, ?d)", $player_data['account'], $this->connectionData['id']); if ($gmLevel_mangos && $gmLevel_trinity) { // MaNGOS doesn't have `account_access` table in `realmd` DB if ($this->currentRealmInfo['type'] == 'trinity') { $this->Log()->writeLog('%s: Detected MaNGOS AND Trinity data in realmd DB, using Trinity (by armoryconfig[type])', __METHOD__); $gmLevel = $gmLevel_trinity; } else { // error? $this->Log()->writeLog('%s: Detected MaNGOS AND Trinity data in realmd DB, using MaNGOS (by armoryconfig[type])', __METHOD__); $gmLevel = $gmLevel_mangos; } } elseif ($gmLevel_mangos && !$gmLevel_trinity) { $gmLevel = $gmLevel_mangos; } elseif ($gmLevel_trinity && !$gmLevel_mangos) { $gmLevel = $gmLevel_trinity; } if (!$gmLevel) { $gmLevel = 0; } $allowed = $gmLevel <= $this->armoryconfig['minGmLevelToShow'] ? true : false; if (!$allowed || $player_data['level'] < $this->armoryconfig['minlevel']) { $this->Log()->writeLog('%s: Player %d (%s) is not allowed to be displayed in Armory!', __METHOD__, $player_data['guid'], $player_data['name']); unset($player_data); return false; } // Class/race/faction checks if ($player_data['class'] >= MAX_CLASSES) { // Unknown class $this->Log()->writeError('%s: Player %d (%s) have incorrect data in DB: class %d not found.', __METHOD__, $player_data['guid'], $player_data['name'], $player_data['class']); unset($player_data); return false; } elseif ($player_data['race'] >= MAX_RACES) { // Unknown race $this->Log()->writeError('%s: Player %d (%s) have incorrect data in DB: race %d not found.', __METHOD__, $player_data['guid'], $player_data['name'], $player_data['race']); unset($player_data); return false; } $this->faction = Utils::GetFactionId($player_data['race']); if ($this->faction != 0 && $this->faction != 1) { // Unknown faction $this->Log()->writeError('%s : player %d (%s) have incorrect faction in DB: faction %d not found (race: %d).', __METHOD__, $player_data['guid'], $player_data['name'], $this->faction, $player_data['class']); unset($player_data); return false; } // Everything correct, build class $this->Log()->writeLog('%s : All correct, player %s builded', __METHOD__, $name); foreach ($player_data as $pData_key => $pData_value) { $this->{$pData_key} = $pData_value; } // Get race and class strings $race_class = $this->aDB->selectRow("\n SELECT\n `armory_races`.`name_" . $this->_locale . "` AS `race`,\n `armory_classes`.`name_" . $this->_locale . "` AS `class`\n FROM `armory_races` AS `armory_races`\n LEFT JOIN `armory_classes` AS `armory_classes` ON `armory_classes`.`id`=?d\n WHERE `armory_races`.`id`=?d", $this->class, $this->race); if (!$race_class) { $this->Log()->writeError('%s : unable to find class/race text strings for player %d (name: %s, race: %d, class: %d)', __METHOD__, $player_data['guid'], $player_data['name'], $player_data['race'], $player_data['class']); unset($player_data); return false; } $this->classText = $race_class['class']; $this->raceText = $race_class['race']; // Get title info if ($this->chosenTitle > 0) { $this->__GetTitleInfo(); } $this->realmName = $realm_info['name']; $this->realmID = $realm_info['id']; unset($realm_info); $this->__HandleEquipmentCacheData(); return true; }
/** * Init character, load data from DB, checks for requirements, etc. * @category Characters class * @access public * @param string $name * @param int $realmId = 1 * @param bool $full = true * @param bool $initialBuild = false * @return bool **/ public function BuildCharacter($name, $realmId = 1, $full = true, $initialBuild = false) { if (!is_string($name)) { $this->armory->Log()->writeLog('%s : name must be a string!', __METHOD__); return false; } if ($realmId == false) { $this->armory->Log()->writeLog('%s : realmId not provided!', __METHOD__); return false; } if (!isset($this->armory->realmData[$realmId])) { $this->armory->Log()->writeError('%s : unable to find data for realmId %d', __METHOD__, $realmId); return false; } $realm_info = $this->armory->realmData[$realmId]; $this->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 (!$this->db || !$this->db->TestLink()) { $this->armory->Log()->writeError('%s : unable to connect to MySQL server (error: %s; realmId: %d). Check your configs.', __METHOD__, mysql_error() ? mysql_error() : 'none', $realmId); return false; } // Set type $this->m_server = $this->armory->aDB->selectCell("SELECT `type` FROM `ARMORYDBPREFIX_realm_data` WHERE `id`=%d", $realmId); if ($this->m_server == UNK_SERVER) { $this->armory->Log()->writeError('%s : unknown server type! Unable to initialize characters class (name: %s, realmId: %d)', __METHOD__, $name, $realmId); return false; } if ($full == true) { $player_data = $this->db->selectRow("\n SELECT\n `characters`.`guid`,\n `characters`.`account`,\n `characters`.`name`,\n `characters`.`race`,\n `characters`.`class`,\n `characters`.`gender`,\n `characters`.`level`,\n `characters`.`money`,\n `characters`.`playerBytes`,\n `characters`.`playerBytes2`,\n `characters`.`playerFlags`,\n `characters`.`specCount`,\n `characters`.`activeSpec`,\n `characters`.`chosenTitle`,\n `characters`.`health`,\n `characters`.`power1`,\n `characters`.`power2`,\n `characters`.`power3`,\n `characters`.`equipmentCache`,\n `guild_member`.`guildid` AS `guild_id`,\n `guild`.`name` AS `guild_name`\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`.`name`='%s' LIMIT 1", $name); } else { $player_data = $this->db->selectRow("\n SELECT\n `characters`.`guid`,\n `characters`.`account`,\n `characters`.`name`,\n `characters`.`race`,\n `characters`.`class`,\n `characters`.`gender`,\n `characters`.`level`,\n `characters`.`equipmentCache`,\n `guild_member`.`guildid` AS `guild_id`,\n `guild`.`name` AS `guild_name`\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`.`name`='%s' LIMIT 1", $name); } if ($player_data == false || !is_array($player_data)) { $this->armory->Log()->writeError('%s: unable to get data from characters DB for player %s (realmId: %d, expected realmName: %s, currentRealmName: %s)', __METHOD__, $name, $realmId, isset($_GET['r']) ? $_GET['r'] : 'none', $realm_info['name']); return false; } if ($full == true) { // Character data required for character-sheet page only. $player_stats_check = $this->db->selectCell("SELECT 1 FROM `armory_character_stats` WHERE `guid`=%d LIMIT 1", $player_data['guid']); if (!$player_stats_check) { $this->armory->Log()->writeError('%s : player %d (%s) does not have any data in `armory_character_stats` table (SQL update to Characters DB was not applied? / Character was not saved in game? / Server core was not patched?)', __METHOD__, $player_data['guid'], $player_data['name']); unset($player_data); return false; } } // Is character allowed to be displayed in Armory? $gmLevel = false; if ($this->m_server == SERVER_TRINITY) { $gmLevel = $this->armory->rDB->selectCell("SELECT `gmlevel` FROM `account_access` WHERE `id`=%d AND `RealmID` IN (-1, %d)", $player_data['account'], $this->armory->connectionData['id']); } elseif ($this->m_server == SERVER_MANGOS) { $gmLevel = $this->armory->rDB->selectCell("SELECT `gmlevel` FROM `account` WHERE `id`=%d LIMIT 1", $player_data['account']); } $allowed = $gmLevel <= $this->armory->armoryconfig['minGmLevelToShow'] ? true : false; if (!$allowed || $player_data['level'] < $this->armory->armoryconfig['minlevel']) { $this->armory->Log()->writeLog('%s : Player %d (%s) is not allowed to be displayed in Armory (GM level restriction or have low level)!', __METHOD__, $player_data['guid'], $player_data['name']); unset($player_data); return false; } // Class/race/faction checks if ($player_data['class'] >= MAX_CLASSES) { // Unknown class $this->armory->Log()->writeError('%s : Player %d (%s) have wrong data in DB: class %d was not found.', __METHOD__, $player_data['guid'], $player_data['name'], $player_data['class']); unset($player_data); return false; } elseif ($player_data['race'] >= MAX_RACES) { // Unknown race $this->armory->Log()->writeError('%s : Player %d (%s) have wrong data in DB: race %d was not found.', __METHOD__, $player_data['guid'], $player_data['name'], $player_data['race']); unset($player_data); return false; } $this->faction = Utils::GetFactionId($player_data['race']); if ($this->faction === false) { // Unknown faction $this->armory->Log()->writeError('%s : Player %d (%s) have wrong faction in DB: faction %d was not found (race: %d).', __METHOD__, $player_data['guid'], $player_data['name'], $this->faction, $player_data['class']); unset($player_data); return false; } foreach ($player_data as $pData_key => $pData_value) { if (is_string($pData_key)) { $this->{$pData_key} = $pData_value; } } $this->HandleEquipmentCacheData(); if ($full == true) { // Get race and class strings $race_class = $this->armory->aDB->selectRow("\n SELECT\n `ARMORYDBPREFIX_races`.`name_%s` AS `race`,\n `ARMORYDBPREFIX_classes`.`name_%s` AS `class`\n FROM `ARMORYDBPREFIX_races` AS `ARMORYDBPREFIX_races`\n LEFT JOIN `ARMORYDBPREFIX_classes` AS `ARMORYDBPREFIX_classes` ON `ARMORYDBPREFIX_classes`.`id`=%d\n WHERE `ARMORYDBPREFIX_races`.`id`=%d", $this->armory->GetLocale(), $this->armory->GetLocale(), $player_data['class'], $player_data['race']); if (!$race_class) { $this->armory->Log()->writeError('%s : unable to find class/race text strings for player %d (name: %s, race: %d, class: %d)', __METHOD__, $player_data['guid'], $player_data['name'], $player_data['race'], $player_data['class']); unset($player_data); return false; } $this->classText = $race_class['class']; $this->raceText = $race_class['race']; // Get title info if ($this->chosenTitle > 0) { $this->HandleChosenTitleInfo(); } if (defined('load_item_class') && defined('load_itemprototype_class')) { // Load items $this->LoadInventory(); } } $this->realmName = $realm_info['name']; $this->realmID = $realm_info['id']; unset($realm_info); // Initialize achievement manager if (defined('load_achievements_class') && class_exists('Achievements')) { $this->m_achievementMgr = new Achievements($this->armory); $this->m_achievementMgr->InitAchievements($this->guid, $this->db, true); } // Everything correct if ($initialBuild == true) { $this->armory->Log()->writeLog('%s : all correct, player %s (race: %d, class: %d, level: %d) loaded, class has been initialized.', __METHOD__, $name, $this->race, $this->class, $this->level); } return true; }
public function BuildCharacter($name) { if (!is_string($name)) { return false; } $player_data = $this->cDB->selectRow("\n SELECT\n `characters`.`guid`,\n `characters`.`account`,\n `characters`.`name`,\n `characters`.`race`,\n `characters`.`class`,\n `characters`.`gender`,\n `characters`.`level`,\n `characters`.`playerBytes`,\n `characters`.`playerBytes2`,\n `characters`.`playerFlags`,\n `characters`.`specCount`,\n `characters`.`activeSpec`,\n `characters`.`chosenTitle`,\n `characters`.`health`,\n `characters`.`power1`,\n `characters`.`power2`,\n `characters`.`power3`,\n `guild_member`.`guildid` AS `guild_id`,\n `guild`.`name` AS `guild_name`\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`.`name`=? LIMIT 1", $name); if (!$player_data || !is_array($player_data)) { return false; } // Is character allowed to be displayed in Armory? $gmLevel = $this->rDB->selectCell("SELECT `gmlevel` FROM `account` WHERE `id`=?d LIMIT 1", $player_data['account']); if (!$gmLevel) { unset($player_data); // Unknown account return false; } $allowed = $gmLevel <= $this->armoryconfig['minGmLevelToShow'] ? true : false; if (!$allowed || $player_data['level'] < $this->armoryconfig['minlevel']) { unset($player_data); return false; } // Class/race/faction checks if ($player_data['class'] >= MAX_CLASSES) { // Unknown class unset($player_data); return false; } elseif ($player_data['race'] >= MAX_RACES) { // Unknown race unset($player_data); return false; } $this->faction = Utils::GetFactionId($player_data['race']); if (!$this->faction) { // Unknown faction unset($player_data); return false; } // Everything correct, build class foreach ($player_data as $pData_key => $pData_value) { $this->{$pData_key} = $pData_value; } // Get race and class strings $race_class = $this->aDB->selectRow("\n SELECT\n `armory_races`.`name_" . $this->_locale . "` AS `race`,\n `armory_classes`.`name_" . $this->_locale . "` AS `class`\n FROM `armory_races` AS `armory_races`\n LEFT JOIN `armory_classes` AS `armory_classes` ON `armory_classes`.`id`=?d\n WHERE `armory_races`.`id`=?d", $this->class, $this->race); $this->classText = $race_class['class']; $this->raceText = $race_class['race']; // Get title info if ($this->chosenTitle > 0) { $this->__GetTitleInfo(); } return true; }
public function GetAllCharacters() { if (!isset($_SESSION['accountId'])) { return false; } $results = array(); foreach ($this->realmData as $realm_info) { $db = DbSimple_Generic::connect('mysql://' . $realm_info['user_characters'] . ':' . $realm_info['pass_characters'] . '@' . $realm_info['host_characters'] . '/' . $realm_info['name_characters']); $db->query("SET NAMES UTF8"); $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`=?", $_SESSION['accountId']); if (!$chars_data) { continue; } foreach ($chars_data as $realm) { $realm['account'] = strtoupper($_SESSION['username']); $realm['factionId'] = Utils::GetFactionId($realm['raceId']); $realm['realm'] = $realm_info['name']; $realm['relevance'] = 100; if ($realm['level'] < $this->armoryconfig['minlevel']) { $realm['relevance'] = 0; } elseif ($realm['level'] >= $this->armoryconfig['minlevel'] && $realm['level'] <= 79) { $realm['relevance'] = $realm['level']; } elseif ($realm['level'] == 80) { $realm['relevance'] = 100; } else { $realm['relevance'] = 0; // Unknown } $realm['url'] = sprintf('r=%s&cn=%s', urlencode($realm['realm']), urlencode($realm['name'])); $realm['selected'] = $this->aDB->selectCell("SELECT `selected` FROM `armory_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']); } unset($realm['guid']); // Do not show GUID in XML results $results[] = $realm; } } if (is_array($results)) { return $results; } return false; }