void RoomHandler::HandlePermsChanged (const QString& nick, QXmppMucItem::Affiliation aff, QXmppMucItem::Role role, const QString& reason) { RoomParticipantEntry_ptr entry = GetParticipantEntry (nick); if (aff == QXmppMucItem::OutcastAffiliation || role == QXmppMucItem::NoRole) { Account_->handleEntryRemoved (entry.get ()); if (aff == QXmppMucItem::OutcastAffiliation) MakeBanMessage (nick, reason); else MakeKickMessage (nick, reason); Nick2Entry_.remove (nick); return; } entry->SetAffiliation (aff); entry->SetRole (role); MakePermsChangedMessage (nick, aff, role, reason); }
void RoomHandler::HandleMessage (const QXmppMessage& msg, const QString& nick) { const bool existed = Nick2Entry_.contains (nick); RoomParticipantEntry_ptr entry = GetParticipantEntry (nick, false); if (msg.type () == QXmppMessage::Chat && !nick.isEmpty ()) { 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 message = new RoomPublicMessage (msg.body (), IMessage::DIn, CLEntry_, IMessage::MTEventMessage, IMessage::MSTOther); if (message) CLEntry_->HandleMessage (message); if (!existed) Nick2Entry_.remove (nick); } }
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 ()); }
RoomParticipantEntry_ptr RoomHandler::CreateParticipantEntry (const QString& nick, bool announce) { RoomParticipantEntry_ptr entry (new RoomParticipantEntry (nick, this, Account_)); if (IsGateway ()) entry->SetVersionReqsEnabled (false); connect (entry.get (), SIGNAL (messagesAreRead ()), this, SLOT (handleMessagesAreRead ())); Nick2Entry_ [nick] = entry; if (announce) Account_->handleGotRosterItems (QList<QObject*> () << entry.get ()); return entry; }
void RoomCLEntry::MoveMessages (const RoomParticipantEntry_ptr& from, const RoomParticipantEntry_ptr& to) { for (const auto msgFace : AllMessages_) { const auto msg = qobject_cast<RoomPublicMessage*> (msgFace->GetQObject ()); if (msg->OtherPart () == from.get ()) msg->SetParticipantEntry (to); } }
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::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::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); } }