diff --git a/include/znc/IRCSock.h b/include/znc/IRCSock.h index f4eb243d..f370d3c4 100644 --- a/include/znc/IRCSock.h +++ b/include/znc/IRCSock.h @@ -58,6 +58,7 @@ public: bool OnPrivNotice(CMessage& Message); bool OnChanNotice(CMessage& Message); bool OnNickMessage(CNickMessage& Message); + bool OnQuitMessage(CQuitMessage& Message); bool OnServerCapAvailable(const CString& sCap); // !Message Handlers diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index 61a8d303..aab0bfca 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -515,34 +515,7 @@ void CIRCSock::ReadLine(const CString& sData) { } } else if (Message.GetType() == CMessage::Type::Quit) { CQuitMessage& QuitMsg = static_cast(Message); - bool bIsVisible = false; - - // :nick!ident@host.com QUIT :message - - if (Nick.NickEquals(GetNick())) { - m_pNetwork->PutStatus("You quit [" + QuitMsg.GetReason() + "]"); - // We don't call module hooks and we don't - // forward this quit to clients (Some clients - // disconnect if they receive such a QUIT) - return; - } - - vector vFoundChans; - const vector& vChans = m_pNetwork->GetChans(); - - for (CChan* pChan : vChans) { - if (pChan->RemNick(Nick.GetNick())) { - vFoundChans.push_back(pChan); - - if (!pChan->IsDetached()) { - bIsVisible = true; - } - } - } - - IRCSOCKMODULECALL(OnQuitMessage(QuitMsg, vFoundChans), NOTHING); - - if (!bIsVisible) { + if (OnQuitMessage(QuitMsg)) { return; } } else if (Message.GetType() == CMessage::Type::Join) { @@ -1089,6 +1062,36 @@ bool CIRCSock::OnNickMessage(CNickMessage& Message) { return !bIsVisible; } +bool CIRCSock::OnQuitMessage(CQuitMessage& Message) { + const CNick& Nick = Message.GetNick(); + bool bIsVisible = false; + + if (Nick.NickEquals(GetNick())) { + m_pNetwork->PutStatus("You quit [" + Message.GetReason() + "]"); + // We don't call module hooks and we don't + // forward this quit to clients (Some clients + // disconnect if they receive such a QUIT) + return true; + } + + vector vFoundChans; + const vector& vChans = m_pNetwork->GetChans(); + + for (CChan* pChan : vChans) { + if (pChan->RemNick(Nick.GetNick())) { + vFoundChans.push_back(pChan); + + if (!pChan->IsDetached()) { + bIsVisible = true; + } + } + } + + IRCSOCKMODULECALL(OnQuitMessage(Message, vFoundChans), NOTHING); + + return !bIsVisible; +} + void CIRCSock::PutIRC(const CString& sLine) { // Only print if the line won't get sent immediately (same condition as in TrySend()!) if (m_bFloodProtection && m_iSendsAllowed <= 0) {