CModule::EModRet TwitchGroupChat::OnUserTextMessage(CTextMessage &msg) { if(msg.GetTarget().Left(1).Equals("#")) return CModule::CONTINUE; msg.SetText(msg.GetText().insert(0, " ").insert(0, msg.GetTarget()).insert(0, "/w ")); msg.SetTarget("#jtv"); return CModule::CONTINUE; }
TEST(MessageTest, PrivMsg) { CTextMessage msg; msg.Parse(":sender PRIVMSG receiver :foo bar"); EXPECT_EQ("sender", msg.GetNick().GetNick()); EXPECT_EQ("PRIVMSG", msg.GetCommand()); EXPECT_EQ("receiver", msg.GetTarget()); EXPECT_EQ("foo bar", msg.GetText()); EXPECT_EQ(CMessage::Type::Text, msg.GetType()); msg.SetText(":)"); EXPECT_EQ(":)", msg.GetText()); EXPECT_EQ(":sender PRIVMSG receiver ::)", msg.ToString()); }
TEST(MessageTest, ChanMsg) { CTextMessage msg; msg.Parse(":sender PRIVMSG #chan :text"); EXPECT_EQ("sender", msg.GetNick().GetNick()); EXPECT_EQ("PRIVMSG", msg.GetCommand()); EXPECT_EQ("#chan", msg.GetTarget()); EXPECT_EQ("text", msg.GetText()); EXPECT_EQ(CMessage::Type::Text, msg.GetType()); msg.SetText("foo bar"); EXPECT_EQ("foo bar", msg.GetText()); EXPECT_EQ(":sender PRIVMSG #chan :foo bar", msg.ToString()); }
CModule::EModRet TwitchTMI::OnPrivTextMessage(CTextMessage &Message) { if(Message.GetNick().GetNick().Equals("jtv")) return CModule::HALT; return CModule::CONTINUE; }
CModule::EModRet TwitchTMI::OnChanTextMessage(CTextMessage &Message) { if(Message.GetNick().GetNick().Equals("jtv")) return CModule::HALT; if(Message.GetText() == "FrankerZ" && std::time(nullptr) - lastFrankerZ > 10) { std::stringstream ss; CString mynick = GetNetwork()->GetIRCNick().GetNickMask(); CChan *chan = Message.GetChan(); ss << "PRIVMSG " << chan->GetName() << " :FrankerZ"; PutIRC(ss.str()); CThreadPool::Get().addJob(new GenericJob([]() {}, [this, chan, mynick]() { PutUserChanMessage(chan, mynick, "FrankerZ"); })); lastFrankerZ = std::time(nullptr); } return CModule::CONTINUE; }
bool CClient::OnTextMessage(CTextMessage& Message) { CString sTargets = Message.GetTarget(); VCString vTargets; sTargets.Split(",", vTargets, false); for (CString& sTarget : vTargets) { Message.SetTarget(sTarget); if (m_pNetwork) { // May be nullptr. Message.SetChan(m_pNetwork->FindChan(sTarget)); } if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { if (sTarget.Equals("status")) { CString sMsg = Message.GetText(); UserCommand(sMsg); } else { CALLMOD(sTarget, this, m_pUser, m_pNetwork, OnModCommand(Message.GetText())); } continue; } bool bContinue = false; NETWORKMODULECALL(OnUserTextMessage(Message), m_pUser, m_pNetwork, this, &bContinue); if (bContinue) continue; if (!GetIRCSock()) { // Some lagmeters do a PRIVMSG to their own nick, ignore those. if (!sTarget.Equals(m_sNick)) PutStatus( t_f("Your message to {1} got lost, you are not connected " "to IRC!")(Message.GetTarget())); continue; } if (m_pNetwork) { AddBuffer(Message); EchoMessage(Message); PutIRC(Message.ToString(CMessage::ExcludePrefix | CMessage::ExcludeTags)); } } return true; }
bool CIRCSock::OnTextMessage(CTextMessage& Message) { bool bResult = false; CChan* pChan = nullptr; CString sTarget = Message.GetTarget(); if (sTarget.Equals(GetNick())) { IRCSOCKMODULECALL(OnPrivMessage(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) { CTextMessage Format; Format.Clone(Message); Format.SetNick(_NAMEDFMT(Nick.GetNickMask())); Format.SetTarget("{target}"); Format.SetText("{text}"); pQuery->AddBuffer(Format, Message.GetText()); } } } else { pChan = m_pNetwork->FindChan(sTarget); if (pChan) { Message.SetChan(pChan); FixupChanNick(Message.GetNick(), pChan); IRCSOCKMODULECALL(OnChanMessage(Message), &bResult); if (bResult) return true; if (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) { CTextMessage Format; Format.Clone(Message); Format.SetNick(_NAMEDFMT(Message.GetNick().GetNickMask())); Format.SetTarget(_NAMEDFMT(Message.GetTarget())); Format.SetText("{text}"); pChan->AddBuffer(Format, Message.GetText()); } } } return (pChan && pChan->IsDetached()); }
EModRet OnChanMessage(CTextMessage& msg) override { vsHooks.push_back("OnChanMessage"); vsMessages.push_back(msg.ToString()); vNetworks.push_back(msg.GetNetwork()); vChannels.push_back(msg.GetChan()); return eAction; }