From eb4e64d7e22a309af03dc21fd58bb7bcb4443d2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Mon, 18 Sep 2023 13:46:52 +0200 Subject: [PATCH] member-list: Fix tracking of Members activity --- src/session/model/room/member_list.rs | 20 +++++++++++++++++++- src/session/model/room/timeline/mod.rs | 8 ++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/session/model/room/member_list.rs b/src/session/model/room/member_list.rs index 4b18af2a..2cc76817 100644 --- a/src/session/model/room/member_list.rs +++ b/src/session/model/room/member_list.rs @@ -14,7 +14,7 @@ use matrix_sdk::{ }; use tracing::error; -use super::{Member, Membership, Room}; +use super::{Event, Member, Membership, Room}; use crate::{spawn, spawn_tokio}; mod imp { @@ -223,6 +223,24 @@ impl MemberList { member.update_from_room_member(room_member); } } + + // Restore the members activity according to the known timeline events. + for item in self.room().timeline().items().iter::().rev() { + let Ok(item) = item else { + // The iterator is broken, stop. + break; + }; + let Ok(event) = item.downcast::() else { + continue; + }; + if !event.counts_as_unread() { + continue; + } + + if let Some(member) = members.get(&event.sender_id()) { + member.set_latest_activity(event.origin_server_ts_u64()); + } + } } if num_members_added > 0 { diff --git a/src/session/model/room/timeline/mod.rs b/src/session/model/room/timeline/mod.rs index 76b36688..f91fe554 100644 --- a/src/session/model/room/timeline/mod.rs +++ b/src/session/model/room/timeline/mod.rs @@ -346,6 +346,14 @@ impl Timeline { .event_map .borrow_mut() .insert(event.key(), event.clone()); + + // Keep track of the activity of the sender. + if event.counts_as_unread() { + if let Some(members) = self.room().members() { + let member = members.get_or_create(event.sender_id()); + member.set_latest_activity(event.origin_server_ts_u64()); + } + } } item