diff --git a/src/api/client_server/sync.rs b/src/api/client_server/sync.rs index c4e3fea3..214f2f8e 100644 --- a/src/api/client_server/sync.rs +++ b/src/api/client_server/sync.rs @@ -917,26 +917,39 @@ async fn load_joined_room( let room_events: Vec<_> = timeline_pdus.iter().map(|(_, pdu)| pdu.to_sync_room_event()).collect(); - let mut edus: Vec<_> = services() - .rooms - .edus - .read_receipt - .readreceipts_since(room_id, since) - .filter_map(Result::ok) - .map(|(_, _, v)| v) - .collect(); + let edus = if filter.room.ephemeral.room_allowed(room_id) { + let mut edus: Vec<_> = services() + .rooms + .edus + .read_receipt + .readreceipts_since(room_id, since) + .filter_map(Result::ok) + .map(|(_, _, v)| v) + .collect(); - if services().rooms.edus.typing.last_typing_update(room_id).await? > since { - edus.push( - serde_json::from_str( - &serde_json::to_string( - &services().rooms.edus.typing.typings_all(room_id).await?, + if services().rooms.edus.typing.last_typing_update(room_id).await? + > since + { + edus.push( + serde_json::from_str( + &serde_json::to_string( + &services() + .rooms + .edus + .typing + .typings_all(room_id) + .await?, + ) + .expect("event is valid, we just created it"), ) .expect("event is valid, we just created it"), - ) - .expect("event is valid, we just created it"), - ); - } + ); + } + + edus + } else { + vec![] + }; // Save the state after this sync so we can send the correct state diff next // sync diff --git a/src/utils/filter.rs b/src/utils/filter.rs index 6367fa46..d846af23 100644 --- a/src/utils/filter.rs +++ b/src/utils/filter.rs @@ -159,6 +159,7 @@ pub(crate) struct CompiledFilterDefinition<'a> { pub(crate) struct CompiledRoomFilter<'a> { rooms: AllowDenyList<'a, RoomId>, pub(crate) timeline: CompiledRoomEventFilter<'a>, + pub(crate) ephemeral: CompiledRoomEventFilter<'a>, pub(crate) state: CompiledRoomEventFilter<'a>, } @@ -198,6 +199,7 @@ impl<'a> TryFrom<&'a RoomFilter> for CompiledRoomFilter<'a> { &source.not_rooms, ), timeline: (&source.timeline).try_into()?, + ephemeral: (&source.ephemeral).try_into()?, state: (&source.state).try_into()?, }) }