/** * Count all arena teams (by type) in all available realms. * @category Arenateams class * @access public * @param int $type * @return int **/ public function CountArenaTeams($type) { $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(`arenateamid`) FROM `arena_team` WHERE `type`=%d", $type); $summary = $summary + $current_count; } return $summary; }
/** * Counts all characters. * @category Utils class * @access public * @return int **/ public function CountAllCharacters() { if (!isset($_SESSION['accountId'])) { return false; } $count_all = 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 = $db->selectCell("SELECT COUNT(*) FROM `characters` WHERE `account`=%d", $_SESSION['accountId']); $count_all += $current; } unset($realm_info, $db); return $count_all; }
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 realm type for provided $realm_id. * Warning: if detection fails, realm with provided ID will be deleted from allowed realms! * @category Utils class * @access public * @param int $realm_id * @return mixed **/ public function GetRealmType($realm_id) { if (!isset($this->armory->realmData[$realm_id]) || !isset($this->armory->realmData[$realm_id]['name_world'])) { $this->armory->Log()->writeError('%s : unable to detect realm type: world database config not found', __METHOD__); return false; } $realm_info = $this->armory->realmData[$realm_id]; $db = new ArmoryDatabaseHandler($realm_info['host_world'], $realm_info['user_world'], $realm_info['pass_world'], $realm_info['name_world'], $realm_info['charset_world'], $this->armory->Log()); if (!$db->TestLink()) { $this->armory->Log()->writeError('%s : unable to connect to MySQL database ("%s":"%s":"%s":"%s")', __METHOD__, $realm_info['host_world'], str_replace(substr($realm_info['user_world'], 2, 3), '***', $realm_info['user_world']), str_replace(substr($realm_info['pass_world'], 2, 3), '***', $realm_info['pass_world']), $realm_info['name_world']); return false; } if ($tmp = $db->selectCell("SELECT 1 FROM `mangos_string` LIMIT 1")) { return 'mangos'; } elseif ($tmp = $db->selectCell("SELECT 1 FROM `trinity_string` LIMIT 1")) { return 'trinity'; } $this->armory->Log()->writeError('%s : unable to detect realm type, realm info with ID #%d was removed from allowed realms', __METHOD__, $realm_id); unset($realm_id, $realm_info, $this->armory->realmData[$realm_id], $db); return false; }