From 9f9304a2532df44f4b85b03f3ad507af477bb2ba Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Sat, 5 Sep 2015 01:52:24 +0200 Subject: [PATCH] CIRCSock::OnPartMessage() handler --- include/znc/IRCSock.h | 1 + src/IRCSock.cpp | 53 +++++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/include/znc/IRCSock.h b/include/znc/IRCSock.h index cf1792b1..1d92a68c 100644 --- a/include/znc/IRCSock.h +++ b/include/znc/IRCSock.h @@ -59,6 +59,7 @@ public: bool OnChanNotice(CMessage& Message); bool OnJoinMessage(CJoinMessage& Message); bool OnNickMessage(CNickMessage& Message); + bool OnPartMessage(CPartMessage& Message); bool OnQuitMessage(CQuitMessage& Message); bool OnServerCapAvailable(const CString& sCap); // !Message Handlers diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index 0325eed9..06aca6b8 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -525,30 +525,7 @@ void CIRCSock::ReadLine(const CString& sData) { } } else if (Message.GetType() == CMessage::Type::Part) { CPartMessage& PartMsg = static_cast(Message); - CString sChan = PartMsg.GetParam(0); - - CChan* pChan = m_pNetwork->FindChan(sChan); - bool bDetached = false; - if (pChan) { - pChan->RemNick(Nick.GetNick()); - PartMsg.SetChan(pChan); - IRCSOCKMODULECALL(OnPartMessage(PartMsg), NOTHING); - - if (pChan->IsDetached()) - bDetached = true; - } - - if (Nick.NickEquals(GetNick())) { - m_pNetwork->DelChan(sChan); - } - - /* - * We use this boolean because - * m_pNetwork->DelChan() will delete this channel - * and thus we would dereference an - * already-freed pointer! - */ - if (bDetached) { + if (OnPartMessage(PartMsg)) { return; } } else if (Message.GetType() == CMessage::Type::Mode) { @@ -1070,6 +1047,34 @@ bool CIRCSock::OnNickMessage(CNickMessage& Message) { return !bIsVisible; } +bool CIRCSock::OnPartMessage(CPartMessage& Message) { + const CNick& Nick = Message.GetNick(); + CString sChan = Message.GetTarget(); + + CChan* pChan = m_pNetwork->FindChan(sChan); + bool bDetached = false; + if (pChan) { + pChan->RemNick(Nick.GetNick()); + Message.SetChan(pChan); + IRCSOCKMODULECALL(OnPartMessage(Message), NOTHING); + + if (pChan->IsDetached()) + bDetached = true; + } + + if (Nick.NickEquals(GetNick())) { + m_pNetwork->DelChan(sChan); + } + + /* + * We use this boolean because + * m_pNetwork->DelChan() will delete this channel + * and thus we would dereference an + * already-freed pointer! + */ + return bDetached; +} + bool CIRCSock::OnQuitMessage(CQuitMessage& Message) { const CNick& Nick = Message.GetNick(); bool bIsVisible = false;