From d121a856c43bcc9830e503d5d7902b954b6eb1c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Fri, 1 Jan 2021 14:31:50 +0100 Subject: [PATCH] base: Remember the direct target for rooms. --- matrix_sdk_base/src/client.rs | 45 ++++++++++++++++++++++------- matrix_sdk_base/src/rooms/mod.rs | 3 ++ matrix_sdk_base/src/rooms/normal.rs | 8 +++++ 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/matrix_sdk_base/src/client.rs b/matrix_sdk_base/src/client.rs index 3ff27082..2593917c 100644 --- a/matrix_sdk_base/src/client.rs +++ b/matrix_sdk_base/src/client.rs @@ -644,6 +644,38 @@ impl BaseClient { AccountData { events } } + async fn handle_account_data( + &self, + events: Vec>, + changes: &mut StateChanges, + ) { + let events: Vec = + events.iter().filter_map(|e| e.deserialize().ok()).collect(); + + for event in &events { + if let AnyBasicEvent::Direct(e) = event { + for (user_id, rooms) in e.content.iter() { + for room_id in rooms { + if let Some(room) = changes.room_infos.get_mut(room_id) { + room.base_info.dm_target = Some(user_id.clone()); + } else if let Some(room) = self.store.get_bare_room(room_id) { + let mut info = room.clone_info(); + info.base_info.dm_target = Some(user_id.clone()); + changes.add_room(info); + } + } + } + } + } + + let account_data: BTreeMap = events + .into_iter() + .map(|e| (e.content().event_type().to_owned(), e)) + .collect(); + + changes.account_data = account_data; + } + /// Receive a response from a sync call. /// /// # Arguments @@ -826,17 +858,8 @@ impl BaseClient { changes.presence = presence; - let account_data: BTreeMap = response - .account_data - .events - .into_iter() - .filter_map(|e| { - let event = e.deserialize().ok()?; - Some((event.content().event_type().to_owned(), event)) - }) - .collect(); - - changes.account_data = account_data; + self.handle_account_data(response.account_data.events, &mut changes) + .await; self.store.save_changes(&changes).await; *self.sync_token.write().await = Some(response.next_batch.clone()); diff --git a/matrix_sdk_base/src/rooms/mod.rs b/matrix_sdk_base/src/rooms/mod.rs index 4bddea02..aeadd017 100644 --- a/matrix_sdk_base/src/rooms/mod.rs +++ b/matrix_sdk_base/src/rooms/mod.rs @@ -2,6 +2,7 @@ mod members; mod normal; mod stripped; +use matrix_sdk_common::identifiers::UserId; pub use normal::{Room, RoomInfo, RoomType}; pub use stripped::{StrippedRoom, StrippedRoomInfo}; @@ -119,6 +120,7 @@ impl Deref for InvitedRoom { pub struct BaseRoomInfo { pub name: Option, pub canonical_alias: Option, + pub dm_target: Option, pub avatar_url: Option, pub topic: Option, pub encryption: Option, @@ -171,6 +173,7 @@ impl Default for BaseRoomInfo { Self { name: None, canonical_alias: None, + dm_target: None, avatar_url: None, topic: None, encryption: None, diff --git a/matrix_sdk_base/src/rooms/normal.rs b/matrix_sdk_base/src/rooms/normal.rs index 661dcb10..021b9d2f 100644 --- a/matrix_sdk_base/src/rooms/normal.rs +++ b/matrix_sdk_base/src/rooms/normal.rs @@ -92,6 +92,14 @@ impl Room { self.inner.read().unwrap().room_type } + pub fn is_direct(&self) -> bool { + self.inner.read().unwrap().base_info.dm_target.is_some() + } + + pub fn direct_target(&self) -> Option { + self.inner.read().unwrap().base_info.dm_target.clone() + } + fn max_power_level(&self) -> i64 { self.inner.read().unwrap().base_info.max_power_level }