Skip to content

Commit 2602c36

Browse files
committed
matrix_sdk_base: save room states after successfully parsed account events
1 parent d858940 commit 2602c36

File tree

1 file changed

+36
-16
lines changed

1 file changed

+36
-16
lines changed

matrix_sdk_base/src/client.rs

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -698,19 +698,20 @@ impl BaseClient {
698698
/// Handle a m.direct event, updating rooms states if necessary.
699699
///
700700
/// Returns true if any room changed, false otherwise.
701-
pub(crate) async fn handle_direct(&self, event: &DirectEvent) -> bool {
702-
let mut update = false;
701+
pub(crate) async fn handle_direct(&self, event: &DirectEvent) -> Vec<Arc<RwLock<Room>>> {
702+
let mut updated_rooms = vec![];
703+
703704
for (user_id, rooms) in event.content.iter() {
704705
for room_id in rooms.iter() {
705-
if let Some(room) = self.get_joined_room(room_id).await {
706-
let mut room = room.write().await;
707-
if room.handle_direct(user_id) {
708-
update = true;
706+
if let Some(room) = &self.get_joined_room(room_id).await {
707+
let mut room_locked = room.write().await;
708+
if room_locked.handle_direct(user_id) {
709+
updated_rooms.push(room.to_owned());
709710
}
710711
}
711712
}
712713
}
713-
update
714+
updated_rooms
714715
}
715716

716717
/// Receive a timeline event for a joined room and update the client state.
@@ -893,7 +894,8 @@ impl BaseClient {
893894
}
894895
}
895896

896-
/// Receive an account data event from a sync response and updates the client state.
897+
/// Receive an account data event associated to a room from a sync
898+
/// response and updates the client state.
897899
///
898900
/// Returns true if the state of the `Room` has changed, false otherwise.
899901
///
@@ -902,16 +904,29 @@ impl BaseClient {
902904
/// * `room_id` - The unique id of the room the event belongs to.
903905
///
904906
/// * `event` - The presence event for a specified room member.
907+
pub async fn receive_room_account_data_event(&self, _: &RoomId, event: &AnyBasicEvent) -> bool {
908+
match event {
909+
AnyBasicEvent::IgnoredUserList(event) => self.handle_ignored_users(event).await,
910+
AnyBasicEvent::PushRules(event) => self.handle_push_rules(event).await,
911+
_ => false,
912+
}
913+
}
914+
915+
/// Receive an account data event from a sync response and updates
916+
/// the client state.
917+
///
918+
/// Returns true if the state of any room has changed, false otherwise.
919+
///
920+
/// # Arguments
921+
///
922+
/// * `event` - The presence event for a specified room member.
905923
pub async fn receive_account_data_event(
906924
&self,
907-
_: Option<&RoomId>,
908925
event: &AnyBasicEvent,
909-
) -> bool {
926+
) -> Vec<Arc<RwLock<Room>>> {
910927
match event {
911-
AnyBasicEvent::IgnoredUserList(event) => self.handle_ignored_users(event).await,
912-
AnyBasicEvent::PushRules(event) => self.handle_push_rules(event).await,
913928
AnyBasicEvent::Direct(event) => self.handle_direct(event).await,
914-
_ => false,
929+
_ => vec![],
915930
}
916931
}
917932

@@ -1076,7 +1091,7 @@ impl BaseClient {
10761091
// FIXME: receive_* and emit_* methods shouldn't be called in parallel. We
10771092
// should only pass events to receive_* methods and then let *them* emit.
10781093
if let Ok(e) = account_data.deserialize() {
1079-
if self.receive_account_data_event(Some(&room_id), &e).await {
1094+
if self.receive_room_account_data_event(&room_id, &e).await {
10801095
updated = true;
10811096
}
10821097
self.emit_account_data_event(room_id, &e, RoomStateType::Joined)
@@ -1201,13 +1216,18 @@ impl BaseClient {
12011216
{
12021217
// FIXME: emit_account_data_event assumes a room is given
12031218
if let Ok(e) = account_data.deserialize() {
1204-
if self.receive_account_data_event(None, &e).await {
1219+
for room in self.receive_account_data_event(&e).await {
1220+
if let Some(store) = self.state_store.read().await.as_ref() {
1221+
// FIXME: currently only operate on Joined rooms
1222+
store
1223+
.store_room_state(RoomState::Joined(room.read().await.deref()))
1224+
.await?;
1225+
}
12051226
updated = true;
12061227
}
12071228
}
12081229
}
12091230
}
1210-
// FIXME store all rooms if updated?
12111231
Ok(updated)
12121232
}
12131233

0 commit comments

Comments
 (0)