diff --git a/crates/matrix-sdk-base/src/client.rs b/crates/matrix-sdk-base/src/client.rs index 29777099a..0445d1de5 100644 --- a/crates/matrix-sdk-base/src/client.rs +++ b/crates/matrix-sdk-base/src/client.rs @@ -610,28 +610,14 @@ impl BaseClient { new_rooms.invite.insert(room_id, invited_room_update); } - for (room_id, new_info) in response.rooms.knock { - let room = self.state_store.get_or_create_room( + for (room_id, knocked_room) in response.rooms.knock { + let knocked_room_update = processors::room::sync_v2::update_knocked_room( + &mut context, &room_id, - RoomState::Knocked, + knocked_room, + &self.state_store, self.room_info_notable_update_sender.clone(), - ); - - let (raw_events, events) = processors::state_events::stripped::collect( - &mut context, - &new_info.knock_state.events, - ); - - let mut room_info = room.clone_info(); - room_info.mark_as_knocked(); - room_info.mark_state_fully_synced(); - - processors::state_events::stripped::dispatch_invite_or_knock( - &mut context, - (&raw_events, &events), - &room, - &mut room_info, - processors::notification::Notification::new( + processors::timeline::builder::Notification::new( &push_rules, &mut notifications, &self.state_store, @@ -639,8 +625,7 @@ impl BaseClient { ) .await?; - context.state_changes.add_room(room_info); - new_rooms.knocked.insert(room_id, new_info); + new_rooms.knocked.insert(room_id, knocked_room_update); } global_account_data_processor.apply(&mut context, &self.state_store).await; diff --git a/crates/matrix-sdk-base/src/response_processors/room/sync_v2.rs b/crates/matrix-sdk-base/src/response_processors/room/sync_v2.rs index 668f8d79a..f7b05acd4 100644 --- a/crates/matrix-sdk-base/src/response_processors/room/sync_v2.rs +++ b/crates/matrix-sdk-base/src/response_processors/room/sync_v2.rs @@ -15,7 +15,7 @@ use std::collections::{BTreeMap, BTreeSet}; use ruma::{ - api::client::sync::sync_events::v3::{InvitedRoom, JoinedRoom, LeftRoom}, + api::client::sync::sync_events::v3::{InvitedRoom, JoinedRoom, KnockedRoom, LeftRoom}, OwnedRoomId, OwnedUserId, RoomId, }; use tokio::sync::broadcast::Sender; @@ -25,7 +25,7 @@ use super::super::e2ee; use super::super::{account_data, ephemeral_events, state_events, timeline, Context}; use crate::{ store::{ambiguity_map::AmbiguityCache, BaseStateStore}, - sync::{InvitedRoomUpdate, JoinedRoomUpdate, LeftRoomUpdate}, + sync::{InvitedRoomUpdate, JoinedRoomUpdate, KnockedRoomUpdate, LeftRoomUpdate}, RequestedRequiredStates, Result, RoomInfoNotableUpdate, RoomState, }; @@ -246,3 +246,39 @@ pub async fn update_invited_room( Ok(invited_room) } + +/// Process updates of a knocked room. +pub async fn update_knocked_room( + context: &mut Context, + room_id: &RoomId, + knocked_room: KnockedRoom, + state_store: &BaseStateStore, + room_info_notable_update_sender: Sender, + notification: timeline::builder::Notification<'_>, +) -> Result { + let room = state_store.get_or_create_room( + room_id, + RoomState::Knocked, + room_info_notable_update_sender, + ); + + let (raw_events, events) = + state_events::stripped::collect(context, &knocked_room.knock_state.events); + + let mut room_info = room.clone_info(); + room_info.mark_as_knocked(); + room_info.mark_state_fully_synced(); + + state_events::stripped::dispatch_invite_or_knock( + context, + (&raw_events, &events), + &room, + &mut room_info, + notification, + ) + .await?; + + context.state_changes.add_room(room_info); + + Ok(knocked_room) +}