From b796b0cbe724698bc7b9b4dadfb8ed7fcd09a727 Mon Sep 17 00:00:00 2001 From: lotodore Date: Mon, 17 Aug 2009 11:26:03 +0000 Subject: [PATCH] Adding server function to reconnect to the chat server. --- src/net/chatcleanermanager.h | 4 ++++ src/net/common/chatcleanermanager.cpp | 18 +++++++++++++++--- src/net/common/serverlobbythread.cpp | 6 ++++++ src/net/common/servermanager.cpp | 5 +++++ src/net/serverlobbythread.h | 1 + 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/net/chatcleanermanager.h b/src/net/chatcleanermanager.h index 3ea8745f..4863eddf 100644 --- a/src/net/chatcleanermanager.h +++ b/src/net/chatcleanermanager.h @@ -37,6 +37,7 @@ public: void Init(const std::string &serverAddr, int port, bool ipv6, const std::string &clientSecret, const std::string &serverSecret); + void ReInit(); void HandleChatText(unsigned playerId, const std::string &name, const std::string &text); protected: @@ -59,6 +60,9 @@ private: bool m_connected; unsigned m_curRequestId; + std::string m_serverAddr; + int m_serverPort; + bool m_useIpv6; std::string m_clientSecret; std::string m_serverSecret; unsigned char m_recvBuf[2*MAX_CLEANER_PACKET_SIZE]; diff --git a/src/net/common/chatcleanermanager.cpp b/src/net/common/chatcleanermanager.cpp index 594be736..ad996bba 100644 --- a/src/net/common/chatcleanermanager.cpp +++ b/src/net/common/chatcleanermanager.cpp @@ -44,16 +44,25 @@ void ChatCleanerManager::Init(const string &serverAddr, int port, bool ipv6, const string &clientSecret, const string &serverSecret) { + m_serverAddr = serverAddr; + m_serverPort = port; + m_useIpv6 = ipv6; m_clientSecret = clientSecret; m_serverSecret = serverSecret; - if (ipv6) + ReInit(); +} + +void +ChatCleanerManager::ReInit() +{ + if (m_useIpv6) m_socket.reset(new boost::asio::ip::tcp::socket(*m_ioService, tcp::v6())); else m_socket.reset(new boost::asio::ip::tcp::socket(*m_ioService, tcp::v4())); ostringstream portStr; - portStr << port; - boost::asio::ip::tcp::resolver::query q(serverAddr, portStr.str()); + portStr << m_serverPort; + boost::asio::ip::tcp::resolver::query q(m_serverAddr, portStr.str()); m_resolver->async_resolve( q, @@ -209,9 +218,12 @@ ChatCleanerManager::HandleRead(const boost::system::error_code &ec, size_t bytes else if (ec != boost::asio::error::operation_aborted) { LOG_ERROR("Error receiving data from chat cleaner."); + bool wasConnected = m_connected; boost::system::error_code ec; m_socket->close(ec); m_connected = false; + if (wasConnected) + ReInit(); // Try to reconnect once if disconnected. } } diff --git a/src/net/common/serverlobbythread.cpp b/src/net/common/serverlobbythread.cpp index 047c8545..27cbd9a9 100644 --- a/src/net/common/serverlobbythread.cpp +++ b/src/net/common/serverlobbythread.cpp @@ -469,6 +469,12 @@ ServerLobbyThread::SendChatBotMsg(const std::string &message) m_gameSessionManager.SendLobbyMsgToAllSessions(GetSender(), packet, SessionData::Game); } +void +ServerLobbyThread::ReconnectChatBot() +{ + m_chatCleanerManager->ReInit(); +} + void ServerLobbyThread::AddComputerPlayer(boost::shared_ptr player) { diff --git a/src/net/common/servermanager.cpp b/src/net/common/servermanager.cpp index 7241bc40..0aa40ee5 100644 --- a/src/net/common/servermanager.cpp +++ b/src/net/common/servermanager.cpp @@ -112,6 +112,11 @@ ServerManager::SignalIrcChatMsg(const std::string &nickName, const std::string & m_ircThread->SendChatMessage(nickName + ": Player \"" + playerName + "\" was not found on the server."); } } + else if (command == "cleaner-reconnect") + { + GetLobbyThread().ReconnectChatBot(); + m_ircThread->SendChatMessage(nickName + ": Cleaner bot reconnect initiated."); + } else if (command == "showip") { while (msgStream.peek() == ' ') diff --git a/src/net/serverlobbythread.h b/src/net/serverlobbythread.h index 04d3369d..1af09be6 100644 --- a/src/net/serverlobbythread.h +++ b/src/net/serverlobbythread.h @@ -81,6 +81,7 @@ public: void SendGlobalChat(const std::string &message); void SendGlobalMsgBox(const std::string &message); void SendChatBotMsg(const std::string &message); + void ReconnectChatBot(); void AddComputerPlayer(boost::shared_ptr player); void RemoveComputerPlayer(boost::shared_ptr player);