diff --git a/source/glest_game/menu/menu_state_masterserver.cpp b/source/glest_game/menu/menu_state_masterserver.cpp index 872fa718d..8418631e0 100644 --- a/source/glest_game/menu/menu_state_masterserver.cpp +++ b/source/glest_game/menu/menu_state_masterserver.cpp @@ -308,11 +308,23 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#1 IRCCLient Cache check\n"); IRCThread * &ircThread = CacheManager::getCachedItem< IRCThread * >(GameConstants::ircClientCacheLookupKey); + + // Playername changed so restart the IRC Thread + if(ircThread != NULL && netPlayerName != ircThread->getPlayerName()) { + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); + ircThread->leaveChannel(); + ircThread->setCallbackObj(NULL); + ircThread->signalQuit(); + if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); + ircThread = NULL; + } + if(ircThread == NULL) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("#2 IRCCLient Cache check\n"); ircThread = new IRCThread(ircArgs,this); ircClient = ircThread; ircClient->setUniqueID(extractFileFromDirectoryPath(__FILE__).c_str()); + ircClient->setPlayerName(netPlayerName); ircClient->start(); } else { diff --git a/source/shared_lib/include/platform/posix/ircclient.h b/source/shared_lib/include/platform/posix/ircclient.h index 8d6cc7569..cbbfff1e6 100644 --- a/source/shared_lib/include/platform/posix/ircclient.h +++ b/source/shared_lib/include/platform/posix/ircclient.h @@ -65,6 +65,8 @@ protected: string channel; string nick; + string playerName; + bool hasJoinedChannel; bool eventDataDone; Mutex mutexNickList; @@ -83,6 +85,9 @@ public: virtual void signalQuit(); virtual bool shutdownAndWait(); + void setPlayerName(string value) { playerName = value; } + string getPlayerName() const { return playerName; } + bool getWantToLeaveChannel() const { return wantToLeaveChannel; } void SendIRCCmdMessage(string target, string msg); diff --git a/source/shared_lib/sources/platform/posix/ircclient.cpp b/source/shared_lib/sources/platform/posix/ircclient.cpp index 7f3918ccb..5e298fe31 100644 --- a/source/shared_lib/sources/platform/posix/ircclient.cpp +++ b/source/shared_lib/sources/platform/posix/ircclient.cpp @@ -461,6 +461,7 @@ IRCThread::IRCThread(const std::vector &argv, IRCCallbackInterface *call hasJoinedChannel = false; lastNickListUpdate = time(NULL); wantToLeaveChannel = false; + playerName = ""; } void IRCThread::signalQuit() {