diff options
-rw-r--r-- | src/server/authserver/Main.cpp | 2 | ||||
-rw-r--r-- | src/server/authserver/Realms/RealmList.cpp | 38 | ||||
-rw-r--r-- | src/server/authserver/Realms/RealmList.h | 12 | ||||
-rw-r--r-- | src/server/authserver/Server/AuthSession.cpp | 3 |
4 files changed, 26 insertions, 29 deletions
diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index e6156c7f622..939d15ceca8 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -194,6 +194,8 @@ int main(int argc, char** argv) sAuthSocketMgr.StopNetwork(); + sRealmList->Close(); + // Close the Database Pool and library StopDB(); diff --git a/src/server/authserver/Realms/RealmList.cpp b/src/server/authserver/Realms/RealmList.cpp index b64ff0974f9..8c4ac4fc95c 100644 --- a/src/server/authserver/Realms/RealmList.cpp +++ b/src/server/authserver/Realms/RealmList.cpp @@ -23,20 +23,27 @@ namespace boost { namespace asio { namespace ip { class address; } } } -RealmList::RealmList() : _updateInterval(0), _nextUpdateTime(time(NULL)), _resolver(nullptr) { } +RealmList::RealmList() : _updateInterval(0), _updateTimer(nullptr), _resolver(nullptr) { } RealmList::~RealmList() { delete _resolver; + delete _updateTimer; } // Load the realm list from the database void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInterval) { - _resolver = new boost::asio::ip::tcp::resolver(ioService); _updateInterval = updateInterval; + _updateTimer = new boost::asio::deadline_timer(ioService); + _resolver = new boost::asio::ip::tcp::resolver(ioService); // Get the content of the realmlist table in the database - UpdateRealms(true); + UpdateRealms(boost::system::error_code()); +} + +void RealmList::Close() +{ + _updateTimer->cancel(); } void RealmList::UpdateRealm(RealmHandle const& id, uint32 build, const std::string& name, ip::address const& address, ip::address const& localAddr, @@ -60,23 +67,11 @@ void RealmList::UpdateRealm(RealmHandle const& id, uint32 build, const std::stri realm.Port = port; } -void RealmList::UpdateIfNeed() +void RealmList::UpdateRealms(boost::system::error_code const& error) { - // maybe disabled or updated recently - if (!_updateInterval || _nextUpdateTime > time(NULL)) + if (error) return; - _nextUpdateTime = time(NULL) + _updateInterval; - - // Clears Realm list - _realms.clear(); - - // Get the content of the realmlist table in the database - UpdateRealms(); -} - -void RealmList::UpdateRealms(bool init) -{ TC_LOG_INFO("server.authserver", "Updating Realm List..."); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST); @@ -143,8 +138,7 @@ void RealmList::UpdateRealms(bool init) UpdateRealm(id, build, name, externalAddress, localAddress, localSubmask, port, icon, flag, timezone, (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), pop); - if (init) - TC_LOG_INFO("server.authserver", "Added realm \"%s\" at %s:%u.", name.c_str(), externalAddress.to_string().c_str(), port); + TC_LOG_INFO("server.authserver", "Added realm \"%s\" at %s:%u.", name.c_str(), externalAddress.to_string().c_str(), port); } catch (std::exception& ex) { @@ -154,6 +148,12 @@ void RealmList::UpdateRealms(bool init) } while (result->NextRow()); } + + if (_updateInterval) + { + _updateTimer->expires_from_now(boost::posix_time::seconds(_updateInterval)); + _updateTimer->async_wait(std::bind(&RealmList::UpdateRealms, this, std::placeholders::_1)); + } } Realm const* RealmList::GetRealm(RealmHandle const& id) const diff --git a/src/server/authserver/Realms/RealmList.h b/src/server/authserver/Realms/RealmList.h index e8b2c8337fa..28e442b5be0 100644 --- a/src/server/authserver/Realms/RealmList.h +++ b/src/server/authserver/Realms/RealmList.h @@ -24,6 +24,7 @@ #include <boost/asio/ip/address.hpp> #include <boost/asio/ip/tcp.hpp> #include <boost/asio/io_service.hpp> +#include <boost/asio/deadline_timer.hpp> using namespace boost::asio; @@ -42,10 +43,7 @@ public: ~RealmList(); void Initialize(boost::asio::io_service& ioService, uint32 updateInterval); - - void UpdateIfNeed(); - - void AddRealm(const Realm& NewRealm) { _realms[NewRealm.Id] = NewRealm; } + void Close(); RealmMap const& GetRealms() const { return _realms; } Realm const* GetRealm(RealmHandle const& id) const; @@ -53,13 +51,13 @@ public: private: RealmList(); - void UpdateRealms(bool init = false); + void UpdateRealms(boost::system::error_code const& error); void UpdateRealm(RealmHandle const& id, uint32 build, const std::string& name, ip::address const& address, ip::address const& localAddr, ip::address const& localSubmask, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, float population); RealmMap _realms; - uint32 _updateInterval; - time_t _nextUpdateTime; + uint32 _updateInterval; + boost::asio::deadline_timer* _updateTimer; boost::asio::ip::tcp::resolver* _resolver; }; diff --git a/src/server/authserver/Server/AuthSession.cpp b/src/server/authserver/Server/AuthSession.cpp index bb30f4f25e4..e0b463b74ad 100644 --- a/src/server/authserver/Server/AuthSession.cpp +++ b/src/server/authserver/Server/AuthSession.cpp @@ -880,9 +880,6 @@ void AuthSession::RealmListCallback(PreparedQueryResult result) } while (result->NextRow()); } - // Update realm list if need - sRealmList->UpdateIfNeed(); - // Circle through realms in the RealmList and construct the return packet (including # of user characters in each realm) ByteBuffer pkt; |