diff --git a/include/znc/IRCSock.h b/include/znc/IRCSock.h index 1d92a68c..34ac9a18 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 OnJoinMessage(CJoinMessage& Message); + bool OnKickMessage(CKickMessage& Message); bool OnNickMessage(CNickMessage& Message); bool OnPartMessage(CPartMessage& Message); bool OnQuitMessage(CQuitMessage& Message); diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index 06aca6b8..1c9ad896 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -563,28 +563,7 @@ void CIRCSock::ReadLine(const CString& sData) { } } else if (Message.GetType() == CMessage::Type::Kick) { CKickMessage& KickMsg = static_cast(Message); - // :opnick!ident@host.com KICK #chan nick :msg - CString sChan = KickMsg.GetParam(0); - CString sKickedNick = KickMsg.GetKickedNick(); - - CChan* pChan = m_pNetwork->FindChan(sChan); - - if (pChan) { - KickMsg.SetChan(pChan); - IRCSOCKMODULECALL(OnKickMessage(KickMsg), NOTHING); - // do not remove the nick till after the OnKick call, so modules - // can do Chan.FindNick or something to get more info. - pChan->RemNick(sKickedNick); - } - - if (GetNick().Equals(sKickedNick) && pChan) { - pChan->SetIsOn(false); - - // Don't try to rejoin! - pChan->Disable(); - } - - if ((pChan) && (pChan->IsDetached())) { + if (OnKickMessage(KickMsg)) { return; } } else if (Message.GetType() == CMessage::Type::Notice) { @@ -1017,6 +996,30 @@ bool CIRCSock::OnJoinMessage(CJoinMessage& Message) { return false; } +bool CIRCSock::OnKickMessage(CKickMessage& Message) { + CString sChan = Message.GetParam(0); + CString sKickedNick = Message.GetKickedNick(); + + CChan* pChan = m_pNetwork->FindChan(sChan); + + if (pChan) { + Message.SetChan(pChan); + IRCSOCKMODULECALL(OnKickMessage(Message), NOTHING); + // do not remove the nick till after the OnKick call, so modules + // can do Chan.FindNick or something to get more info. + pChan->RemNick(sKickedNick); + } + + if (GetNick().Equals(sKickedNick) && pChan) { + pChan->SetIsOn(false); + + // Don't try to rejoin! + pChan->Disable(); + } + + return (pChan && pChan->IsDetached()); +} + bool CIRCSock::OnNickMessage(CNickMessage& Message) { const CNick& Nick = Message.GetNick(); CString sNewNick = Message.GetNewNick();