/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef _REALMLIST_H #define _REALMLIST_H #include "ClientBuildInfo.h" #include "Define.h" #include "Duration.h" #include "Optional.h" #include "Realm.h" #include #include #include #include #include #include namespace bgs::protocol::game_utilities::v1 { class ClientResponse; class GetAllValuesForAttributeResponse; } namespace JSON::RealmList { class RealmEntry; } /// Storage object for the list of realms on the server class TC_SHARED_API RealmList { public: typedef std::map> RealmMap; static RealmList* Instance(); RealmList(RealmList const&) = delete; RealmList(RealmList&&) = delete; RealmList& operator=(RealmList const&) = delete; RealmList& operator=(RealmList&&) = delete; ~RealmList(); void Initialize(Trinity::Asio::IoContext& ioContext, uint32 updateInterval); void Close(); std::shared_ptr GetRealm(Battlenet::RealmHandle const& id) const; Battlenet::RealmHandle GetCurrentRealmId() const; void SetCurrentRealmId(Battlenet::RealmHandle const& id); std::shared_ptr GetCurrentRealm() const; void WriteSubRegions(bgs::protocol::game_utilities::v1::GetAllValuesForAttributeResponse* response) const; std::vector GetRealmEntryJSON(Battlenet::RealmHandle const& id, uint32 build, AccountTypes accountSecurityLevel) const; std::vector GetRealmList(uint32 build, AccountTypes accountSecurityLevel, std::string const& subRegion) const; uint32 JoinRealm(uint32 realmAddress, uint32 build, ClientBuild::VariantId const& buildVariant, boost::asio::ip::address const& clientAddress, std::array const& clientSecret, LocaleConstant locale, std::string const& os, Minutes timezoneOffset, std::string const& accountName, AccountTypes accountSecurityLevel, bgs::protocol::game_utilities::v1::ClientResponse* response) const; private: RealmList(); void UpdateRealms(); static void UpdateRealm(Realm& realm, Battlenet::RealmHandle const& id, uint32 build, std::string const& name, std::vector&& addresses, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, RealmPopulationState population); void FillRealmEntry(Realm const& realm, uint32 clientBuild, AccountTypes accountSecurityLevel, JSON::RealmList::RealmEntry* realmEntry) const; mutable std::shared_mutex _realmsMutex; RealmMap _realms; std::map _removedRealms; std::unordered_set _subRegions; uint32 _updateInterval; std::unique_ptr _updateTimer; std::unique_ptr _resolver; Optional _currentRealmId; }; #define sRealmList RealmList::Instance() #endif