aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/room.cpp29
-rw-r--r--lib/room.h7
2 files changed, 22 insertions, 14 deletions
diff --git a/lib/room.cpp b/lib/room.cpp
index 398b3ec8..45f1af53 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -590,9 +590,14 @@ JoinState Room::memberJoinState(User* user) const
: JoinState::Leave;
}
-Membership Room::memberState(User* user) const
+Membership Room::memberState(const QString& userId) const
{
- return d->getCurrentState<RoomMemberEvent>(user->id())->membership();
+ return d->getCurrentState<RoomMemberEvent>(userId)->membership();
+}
+
+bool Room::isMember(const QString& userId) const
+{
+ return memberState(userId) == Membership::Join;
}
JoinState Room::joinState() const { return d->joinState; }
@@ -2698,11 +2703,10 @@ Room::Changes Room::processEphemeralEvent(EventPtr&& event)
et.start();
if (auto* evt = eventCast<TypingEvent>(event)) {
d->usersTyping.clear();
- for (const auto& userId : evt->users()) {
- auto u = user(userId);
- if (memberJoinState(u) == JoinState::Join)
- d->usersTyping.append(u);
- }
+ for (const auto& userId : evt->users())
+ if (isMember(userId))
+ d->usersTyping.append(user(userId));
+
if (evt->users().size() > 3 || et.nsecsElapsed() >= profilerMinNsecs())
qCDebug(PROFILER) << "*** Room::processEphemeralEvent(typing):"
<< evt->users().size() << "users," << et;
@@ -2726,9 +2730,9 @@ Room::Changes Room::processEphemeralEvent(EventPtr&& event)
for (const Receipt& r : p.receipts) {
if (r.userId == connection()->userId())
continue; // FIXME, #185
- auto u = user(r.userId);
- if (memberJoinState(u) == JoinState::Join)
- changes |= d->promoteReadMarker(u, newMarker);
+ if (isMember(r.userId))
+ changes |=
+ d->promoteReadMarker(user(r.userId), newMarker);
}
} else {
qCDebug(EPHEMERAL) << "Event" << p.evtId
@@ -2740,9 +2744,10 @@ Room::Changes Room::processEphemeralEvent(EventPtr&& event)
for (const Receipt& r : p.receipts) {
if (r.userId == connection()->userId())
continue; // FIXME, #185
+ if (!isMember(r.userId))
+ continue;
auto u = user(r.userId);
- if (memberJoinState(u) == JoinState::Join
- && readMarker(u) == historyEdge())
+ if (readMarker(u) == historyEdge())
changes |= d->setLastReadEvent(u, p.evtId);
}
}
diff --git a/lib/room.h b/lib/room.h
index de0c7504..179295d0 100644
--- a/lib/room.h
+++ b/lib/room.h
@@ -240,13 +240,16 @@ public:
*
* \return Join if the user is a room member; Leave otherwise
*/
- Q_DECL_DEPRECATED_X("Use memberState and check against the mask") //
+ Q_DECL_DEPRECATED_X("Use isMember() instead")
Q_INVOKABLE Quotient::JoinState memberJoinState(Quotient::User* user) const;
//! \brief Check the join state of a given user in this room
//!
//! \return the given user's state with respect to the room
- Q_INVOKABLE Quotient::Membership memberState(User* user) const;
+ Q_INVOKABLE Quotient::Membership memberState(const QString& userId) const;
+
+ //! Check whether a user with the given id is a member of the room
+ Q_INVOKABLE bool isMember(const QString& userId) const;
//! \brief Get a display name (without disambiguation) for the given member
//!