diff --git a/Chan.cpp b/Chan.cpp index 1fb0fc4fb1..550b467c87 100644 --- a/Chan.cpp +++ b/Chan.cpp @@ -55,6 +55,7 @@ CChan::~CChan() { void CChan::Reset() { m_bIsOn = false; + m_bModeKnown = false; m_musModes.clear(); m_sTopic = ""; m_sTopicOwner = ""; diff --git a/Chan.h b/Chan.h index 58a083aae8..be8e833326 100644 --- a/Chan.h +++ b/Chan.h @@ -101,6 +101,7 @@ class CChan { // !wrappers // Setters + void SetModeKnown(bool b) { m_bModeKnown = b; } void SetIsOn(bool b) { m_bIsOn = b; if (!b) { Reset(); } } void SetKey(const CString& s) { m_sKey = s; } void SetTopic(const CString& s) { m_sTopic = s; } @@ -119,6 +120,7 @@ class CChan { // !Setters // Getters + bool IsModeKnown() const { return m_bModeKnown; } bool HasMode(unsigned char uMode) const; CString GetOptions() const; CString GetModeArg(unsigned char uMode) const; @@ -163,6 +165,7 @@ class CChan { unsigned int m_uBufferCount; vector m_vsBuffer; + bool m_bModeKnown; map m_musModes; }; diff --git a/IRCSock.cpp b/IRCSock.cpp index e3f458a821..ff40d7300b 100644 --- a/IRCSock.cpp +++ b/IRCSock.cpp @@ -193,6 +193,15 @@ void CIRCSock::ReadLine(const CString& sData) { if (pChan) { pChan->SetModes(sRest.Token(1, true)); + + // We don't SetModeKnown(true) here, + // because a 329 will follow + if (!pChan->IsModeKnown()) { + // When we JOIN, we send a MODE + // request. This makes sure the + // reply isn't forwarded. + return; + } } } break; @@ -203,6 +212,14 @@ void CIRCSock::ReadLine(const CString& sData) { if (pChan) { unsigned long ulDate = sLine.Token(4).ToULong(); pChan->SetCreationDate(ulDate); + + if (!pChan->IsModeKnown()) { + pChan->SetModeKnown(true); + // When we JOIN, we send a MODE + // request. This makes sure the + // reply isn't forwarded. + return; + } } } break; @@ -436,6 +453,7 @@ void CIRCSock::ReadLine(const CString& sData) { pChan->ResetJoinTries(); pChan->Enable(); pChan->SetIsOn(true); + PutIRC("MODE " + sChan); } } else { pChan = m_pNetwork->FindChan(sChan);