diff --git a/Client.cpp b/Client.cpp index aa9d55cc..bfb2f737 100644 --- a/Client.cpp +++ b/Client.cpp @@ -383,11 +383,20 @@ void CClient::ReadLine(const CString& sData) { return; } + CChan* pChan = m_pUser->FindChan(sTarget); + + if (sCTCP.Token(0).CaseCmp("ACTION") == 0) { + if (pChan && pChan->KeepBuffer()) { + pChan->AddBuffer(":" + GetNickMask() + " PRIVMSG " + sTarget + " :\001" + sCTCP + "\001"); + } #ifdef _MODULES - CZNC::Get().GetModules().SetClient(this); - MODULECALLRET(OnUserCTCP(sTarget, sCTCP)); - CZNC::Get().GetModules().SetClient(NULL); + } else { + CZNC::Get().GetModules().SetClient(this); + MODULECALLRET(OnUserCTCP(sTarget, sCTCP)); + CZNC::Get().GetModules().SetClient(NULL); #endif + } + PutIRC("PRIVMSG " + sTarget + " :\001" + sCTCP + "\001"); return; } diff --git a/IRCSock.cpp b/IRCSock.cpp index 4baf3bfa..c88390be 100644 --- a/IRCSock.cpp +++ b/IRCSock.cpp @@ -716,14 +716,15 @@ bool CIRCSock::OnPrivMsg(CNick& Nick, CString& sMessage) { bool CIRCSock::OnChanCTCP(CNick& Nick, const CString& sChan, CString& sMessage) { CChan* pChan = m_pUser->FindChan(sChan); if (pChan) { - MODULECALL(OnChanCTCP(Nick, *pChan, sMessage)); - - if (pChan->IsDetached()) { - return true; + // Record a /me + if (sMessage.Token(0).CaseCmp("ACTION") == 0 && (pChan->KeepBuffer() || !m_pUser->IsUserAttached())) { + pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :\001" + sMessage + "\001"); + } else { + MODULECALL(OnChanCTCP(Nick, *pChan, sMessage)); } } - return false; + return (pChan && pChan->IsDetached()); } bool CIRCSock::OnChanNotice(CNick& Nick, const CString& sChan, CString& sMessage) {