// チャンネル離脱ストリーム受信時 void CMainWindow::onPartStream(CStreamEvent<CPartMessage>& event) { CChatServiceBase* service = m_serviceHolder->getService( event.getConnectionId()); if (service != NULL){ CPartMessage* partLog = event.getServiceLog(); wxString name = partLog->getUserName(); wxString channel = partLog->getChannelName(); // データ更新 service->onGetPartStream(channel, name); service->addLog(event.getServiceLog()); m_logHolder->pushLog(event.getServiceLog()); // 表示の更新 m_view->displayLogs(m_logHolder->getLogs(), m_serviceHolder); // ログペイン if ((channel == service->getCurrentChannel() || channel == "") && m_serviceHolder->getCurrentServiceId() == event.getConnectionId()){ m_view->addMessage(event.getServiceLog()); updateMemberView(event.getConnectionId(), service->getCurrentChannel()); } } }
bool CClient::OnPartMessage(CPartMessage& Message) { CString sChans = Message.GetTarget(); VCString vsChans; sChans.Split(",", vsChans, false); sChans.clear(); for (CString& sChan : vsChans) { bool bContinue = false; Message.SetTarget(sChan); NETWORKMODULECALL(OnUserPartMessage(Message), m_pUser, m_pNetwork, this, &bContinue); if (bContinue) continue; sChan = Message.GetTarget(); CChan* pChan = m_pNetwork ? m_pNetwork->FindChan(sChan) : nullptr; if (pChan && !pChan->IsOn()) { PutStatusNotice("Removing channel [" + sChan + "]"); m_pNetwork->DelChan(sChan); } else { sChans += (sChans.empty()) ? sChan : CString("," + sChan); } } if (sChans.empty()) { return true; } Message.SetTarget(sChans); return false; }
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()); }
CConnectionEventBase* CIRCEventFactory::Create(const CIRCResponseData& message) { if (message.m_statusCode == IRCCommand::PRIVMSG){ return createPrivateMessageEvent(message); } if (message.m_statusCode == IRCCommand::PART){ return createPartMessageEvent(message); } if (message.m_statusCode == IRCCommand::JOIN){ return createJoinMessageEvent(message); } if (message.m_statusCode == IRCCommand::TOPIC){ return createTopicMessageEvent(message); } if (message.m_statusCode == IRCCommand::QUIT){ // すべてのチャンネルへのPartEventの作成 CStreamEvent<CPartMessage>* event = new CStreamEvent<CPartMessage>(myEVT_THREAD_STREAM_CH_PART); CPartMessage* log = new CPartMessage(); log->setServiceId(m_connectionId); log->setChannelName(""); log->setUserName(message.m_username); event->setServiceLog(log); return event; } if (message.m_statusCode == IRCCommand::NICK){ return createNickMessageEvent(message); } if (message.m_statusCode == IRCCommand::KICK){ return createKickEvent(message); } if (message.m_statusCode == IRCCommand::INVITE){ return createInviteEvent(message); } if (message.m_statusCode == IRCCommand::NAMES_REPLY){ addNames(message); } if (message.m_statusCode == IRCCommand::TOPIC_REPLY){ return createTopicEvent(message); } if (message.m_statusCode == IRCCommand::NAMES_REPLY_END){ //ユーザー名羅列終了リプライ return createNamesEvent(message); } if (message.m_statusCode == IRCCommand::INVALID_USERNAME || message.m_statusCode == IRCCommand::INVALID_CHANNEL){ // 不適切 //エラー CAuthEvent* event = new CAuthEvent(); event->setAuthResult(false); return event; } return NULL; }
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()); }
CConnectionEventBase* CIRCEventFactory::createPartMessageEvent( const CIRCResponseData& message) const { // Eventの作成 CStreamEvent<CPartMessage>* event = new CStreamEvent<CPartMessage>(myEVT_THREAD_STREAM_CH_PART); CPartMessage* log = new CPartMessage(); log->setServiceId(m_connectionId); log->setChannelName(message.m_channel); log->setUserName(message.m_username); event->setServiceLog(log); return event; }
void OnPartMessage(CPartMessage& msg) override { vsHooks.push_back("OnPartMessage"); vsMessages.push_back(msg.ToString()); vNetworks.push_back(msg.GetNetwork()); vChannels.push_back(msg.GetChan()); }