diff --git a/include/znc/IRCSock.h b/include/znc/IRCSock.h index 437b73a8..8b5793e7 100644 --- a/include/znc/IRCSock.h +++ b/include/znc/IRCSock.h @@ -51,6 +51,7 @@ public: // Message Handlers bool OnPrivMsg(CMessage& Message); bool OnChanMsg(CMessage& Message); + bool OnActionMessage(CActionMessage& Message); bool OnCTCPMessage(CCTCPMessage& Message); bool OnJoinMessage(CJoinMessage& Message); bool OnKickMessage(CKickMessage& Message); diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index 85bb3b3a..1060da6a 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -576,6 +576,11 @@ void CIRCSock::ReadLine(const CString& sData) { if (OnTopicMessage(TopicMsg)) { return; } + } else if (Message.GetType() == CMessage::Type::Action) { + CActionMessage& ActionMsg = static_cast(Message); + if (OnActionMessage(ActionMsg)) { + return; + } } else if (Message.GetType() == CMessage::Type::CTCP) { CCTCPMessage& CTCPMsg = static_cast(Message); if (OnCTCPMessage(CTCPMsg)) { @@ -775,6 +780,38 @@ bool CIRCSock::OnChanMsg(CMessage& Message) { return ((pChan) && (pChan->IsDetached())); } +bool CIRCSock::OnActionMessage(CActionMessage& Message) { + bool bResult = false; + CChan* pChan = nullptr; + CString sTarget = Message.GetTarget(); + if (sTarget.Equals(GetNick())) { + IRCSOCKMODULECALL(OnPrivActionMessage(Message), &bResult); + if (bResult) return true; + + if (!m_pNetwork->IsUserOnline() || !m_pNetwork->GetUser()->AutoClearQueryBuffer()) { + const CNick& Nick = Message.GetNick(); + CQuery* pQuery = m_pNetwork->AddQuery(Nick.GetNick()); + if (pQuery) { + pQuery->AddBuffer(":" + _NAMEDFMT(Nick.GetNickMask()) + " PRIVMSG {target} :\001ACTION {text}\001", Message.GetText(), &Message.GetTime(), Message.GetTags()); + } + } + } else { + pChan = m_pNetwork->FindChan(sTarget); + if (pChan) { + Message.SetChan(pChan); + FixupChanNick(Message.GetNick(), pChan); + IRCSOCKMODULECALL(OnChanActionMessage(Message), &bResult); + if (bResult) return true; + + if (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) { + pChan->AddBuffer(":" + _NAMEDFMT(Message.GetNick().GetNickMask()) + " PRIVMSG " + _NAMEDFMT(pChan->GetName()) + " :\001ACTION {text}\001", Message.GetText(), &Message.GetTime(), Message.GetTags()); + } + } + } + + return (pChan && pChan->IsDetached()); +} + bool CIRCSock::OnCTCPMessage(CCTCPMessage& Message) { bool bResult = false; CChan* pChan = nullptr;