void RoomHandler::handleParticipantRemoved (const QString& jid) { const QXmppPresence& pres = Room_->participantPresence (jid); QString nick; ClientConnection::Split (jid, 0, &nick); const bool us = Room_->nickName () == nick; RoomParticipantEntry_ptr entry = GetParticipantEntry (nick); const QXmppMucItem& item = pres.mucItem (); if (!item.nick ().isEmpty () && item.nick () != nick) { entry->SetEntryName (item.nick ()); Nick2Entry_ [item.nick ()] = Nick2Entry_ [nick]; MakeNickChangeMessage (nick, item.nick ()); Nick2Entry_.remove (nick); PendingNickChanges_ << item.nick (); return; } else if (pres.mucStatusCodes ().contains (301)) !us ? MakeBanMessage (nick, item.reason ()) : static_cast<void> (QMetaObject::invokeMethod (CLEntry_, "beenBanned", Qt::QueuedConnection, Q_ARG (QString, item.reason ()))); else if (pres.mucStatusCodes ().contains (307)) !us ? MakeKickMessage (nick, item.reason ()) : static_cast<void> (QMetaObject::invokeMethod (CLEntry_, "beenKicked", Qt::QueuedConnection, Q_ARG (QString, item.reason ()))); else MakeLeaveMessage (pres, nick); if (us) { Leave (QString (), false); return; } if (entry->HasUnreadMsgs ()) entry->SetStatus (EntryStatus (SOffline, item.reason ()), QString ()); else RemoveEntry (entry.get ()); }
void ChannelHandler::MakePermsChangedMessage (const QString& nick, ChannelRole role, bool isSet) { const QString& roleStr = ChannelCLEntry_->Role2String (role); QString msg = isSet ? tr ("%1 is now %2").arg (nick, roleStr) : tr ("%1 is not %2 anymore").arg (nick, roleStr); ChannelPublicMessage *message = new ChannelPublicMessage (msg, IMessage::DIn, ChannelCLEntry_.get (), IMessage::MTStatusMessage, IMessage::MSTParticipantRoleAffiliationChange, GetParticipantEntry (nick)); ChannelCLEntry_->HandleMessage (message); }
void RoomHandler::handleParticipantChanged (const QString& jid) { const QXmppPresence& pres = Room_->participantPresence (jid); QString nick; ClientConnection::Split (jid, 0, &nick); RoomParticipantEntry_ptr entry = GetParticipantEntry (nick); entry->HandlePresence (pres, QString ()); if (XooxUtil::PresenceToStatus (pres) != entry->GetStatus (QString ())) MakeStatusChangedMessage (pres, nick); const QXmppMucItem& item = pres.mucItem (); if (item.affiliation () != entry->GetAffiliation () || item.role () != entry->GetRole ()) HandlePermsChanged (nick, item.affiliation (), item.role (), item.reason ()); }
void RoomHandler::handleParticipantAdded (const QString& jid) { const QXmppPresence& pres = Room_->participantPresence (jid); QString nick; ClientConnection::Split (jid, 0, &nick); if (PendingNickChanges_.remove (nick)) return; RoomParticipantEntry_ptr entry = GetParticipantEntry (nick); entry->SetAffiliation (pres.mucItem ().affiliation ()); entry->SetRole (pres.mucItem ().role ()); entry->SetPhotoHash (pres.photoHash ()); entry->HandlePresence (pres, ""); MakeJoinMessage (pres, nick); }
void RoomHandler::MakeBanMessage (const QString& nick, const QString& reason) { QString msg; if (reason.isEmpty ()) msg = tr ("%1 has been banned") .arg (nick); else msg = tr ("%1 has been banned: %2") .arg (nick) .arg (reason); RoomPublicMessage *message = new RoomPublicMessage (msg, IMessage::DIn, CLEntry_, IMessage::MTStatusMessage, IMessage::MSTBanNotification, GetParticipantEntry (nick)); CLEntry_->HandleMessage (message); }
void RoomHandler::HandlePresence (const QXmppPresence& pres, const QString& nick) { if (pres.type () == QXmppPresence::Unavailable && PendingNickChanges_.remove (nick)) return; const bool existed = Nick2Entry_.contains (nick); RoomParticipantEntry_ptr entry = GetParticipantEntry (nick); if (pres.type () == QXmppPresence::Unavailable) { MakeLeaveMessage (pres, nick); Account_->handleEntryRemoved (entry.get ()); Nick2Entry_.remove (nick); return; } entry->SetClientInfo ("", pres); const QXmppPresence::Status& xmppSt = pres.status (); EntryStatus status (static_cast<State> (xmppSt.type ()), xmppSt.statusText ()); const bool statusChanged = (status != entry->GetStatus (QString ())); if (statusChanged) entry->SetStatus (status, QString ()); if (!PendingNickChanges_.remove (nick)) { if (!existed) { Account_->GetClientConnection ()-> FetchVCard (RoomJID_ + "/" + nick); MakeJoinMessage (pres, nick); entry->SetAffiliation (MUCManager_->getAffiliation (RoomJID_, nick)); entry->SetRole (MUCManager_->getRole (RoomJID_, nick)); } else if (statusChanged) MakeStatusChangedMessage (pres, nick); } }
void RoomHandler::HandlePermsChanged (const QString& nick, QXmppMucAdminIq::Item::Affiliation aff, QXmppMucAdminIq::Item::Role role, const QString& reason) { RoomParticipantEntry_ptr entry = GetParticipantEntry (nick); if (aff == QXmppMucAdminIq::Item::OutcastAffiliation || role == QXmppMucAdminIq::Item::NoRole) { Account_->handleEntryRemoved (entry.get ()); Nick2Entry_.remove (nick); if (aff == QXmppMucAdminIq::Item::OutcastAffiliation) MakeBanMessage (nick, reason); else MakeKickMessage (nick, reason); return; } entry->SetAffiliation (aff); entry->SetRole (role); MakePermsChangedMessage (nick, aff, role, reason); }
void IrcServerHandler::IncomingMessage (const QString& nick, const QString& target, const QString& msg, IMessage::Type type) { if (ChannelsManager_->IsChannelExists (target)) ChannelsManager_->ReceivePublicMessage (target, nick, msg); else { //TODO Work only for exists entries IrcMessage *message = new IrcMessage (type, IMessage::Direction::In, ServerID_, nick, Account_->GetClientConnection ().get ()); message->SetBody (msg); message->SetDateTime (QDateTime::currentDateTime ()); bool found = false; for (const auto entryObj : ChannelsManager_->GetParticipantsByNick (nick)) { const auto entry = qobject_cast<EntryBase*> (entryObj); if (!entry) continue; found = true; entry->HandleMessage (message); } if (!found) { if (Nick2Entry_.contains (nick)) Nick2Entry_ [nick]->HandleMessage (message); else GetParticipantEntry (nick)->HandleMessage (message); } } }
RoomParticipantEntry* RoomHandler::GetSelf () { return GetParticipantEntry (Room_->nickName ()).get (); }
void RoomHandler::HandleMessage (const QXmppMessage& msg, const QString& nick) { Q_FOREACH (const QXmppElement& elem, msg.extensions ()) { const QString& xmlns = elem.attribute ("xmlns"); if (xmlns == ns_data) { QXmppDataForm *df = new QXmppDataForm (); df->parse (XooxUtil::XmppElem2DomElem (elem)); if (df->isNull ()) { qWarning () << Q_FUNC_INFO << "unable to parse form from" << msg.from (); delete df; } else emit gotPendingForm (df, msg.from ()); } else qWarning () << Q_FUNC_INFO << "unhandled <x> element" << xmlns; } const bool existed = Nick2Entry_.contains (nick); RoomParticipantEntry_ptr entry = GetParticipantEntry (nick, false); if (msg.type () == QXmppMessage::Chat && !nick.isEmpty ()) { if (msg.isAttentionRequested ()) entry->HandleAttentionMessage (msg); if (msg.state ()) entry->UpdateChatState (msg.state (), QString ()); if (!msg.body ().isEmpty ()) { GlooxMessage *message = new GlooxMessage (msg, Account_->GetClientConnection ().get ()); entry->HandleMessage (message); } } else { RoomPublicMessage *message = 0; if (msg.type () == QXmppMessage::GroupChat && !msg.subject ().isEmpty ()) { Subject_ = msg.subject (); CLEntry_->HandleSubjectChanged (Subject_); const QString& string = nick.isEmpty () ? msg.subject () : tr ("%1 changed subject to %2") .arg (nick) .arg (msg.subject ()); message = new RoomPublicMessage (string, IMessage::DIn, CLEntry_, IMessage::MTEventMessage, IMessage::MSTOther); } else if (!nick.isEmpty ()) { if (!msg.body ().isEmpty ()) message = new RoomPublicMessage (msg, CLEntry_, entry); } else if (!msg.body ().isEmpty ()) message = new RoomPublicMessage (msg.body (), IMessage::DIn, CLEntry_, IMessage::MTEventMessage, IMessage::MSTOther); if (message) CLEntry_->HandleMessage (message); if (!existed) Nick2Entry_.remove (nick); } }