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; }
void OnPartMessage(CPartMessage& Message) override { const CNick& Nick = Message.GetNick(); CChan& Channel = *Message.GetChan(); const CString sMessage = Message.GetReason(); AddBuffer(Channel, t_f("{1} parted: {2}")(Nick.GetNickMask(), sMessage), &Message.GetTime(), Message.GetTags()); }
void OnPartMessage(CPartMessage& Message) override { const CNick& Nick = Message.GetNick(); CChan& Channel = *Message.GetChan(); const CString sMessage = Message.GetReason(); AddBuffer(Channel, Nick.GetNickMask() + " parted with message: [" + sMessage + "]", &Message.GetTime(), Message.GetTags()); }
TEST(MessageTest, Part) { CPartMessage msg; msg.Parse(":nick PART #chan :reason"); EXPECT_EQ("nick", msg.GetNick().GetNick()); EXPECT_EQ("PART", msg.GetCommand()); EXPECT_EQ("#chan", msg.GetTarget()); EXPECT_EQ("reason", msg.GetReason()); EXPECT_EQ(CMessage::Type::Part, msg.GetType()); msg.SetReason("test"); EXPECT_EQ("test", msg.GetReason()); EXPECT_EQ(":nick PART #chan :test", msg.ToString()); }