mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
fix(sliding-sync): Properly handle wildcard state_key
Fixes calls as described in https://forgejo.ellis.link/continuwuation/continuwuity/issues/1306
This commit is contained in:
+45
-16
@@ -30,7 +30,8 @@ use ruma::{
|
|||||||
api::client::sync::sync_events::{self, DeviceLists, UnreadNotificationsCount},
|
api::client::sync::sync_events::{self, DeviceLists, UnreadNotificationsCount},
|
||||||
directory::RoomTypeFilter,
|
directory::RoomTypeFilter,
|
||||||
events::{
|
events::{
|
||||||
AnyRawAccountDataEvent, AnySyncEphemeralRoomEvent, StateEventType, TimelineEventType,
|
AnyRawAccountDataEvent, AnySyncEphemeralRoomEvent, AnySyncStateEvent, StateEventType,
|
||||||
|
TimelineEventType,
|
||||||
room::member::{MembershipState, RoomMemberEventContent},
|
room::member::{MembershipState, RoomMemberEventContent},
|
||||||
typing::TypingEventContent,
|
typing::TypingEventContent,
|
||||||
},
|
},
|
||||||
@@ -533,6 +534,9 @@ where
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let required_state =
|
||||||
|
collect_required_state(services, room_id, required_state_request).await;
|
||||||
|
|
||||||
let room_events: Vec<_> = timeline_pdus
|
let room_events: Vec<_> = timeline_pdus
|
||||||
.iter()
|
.iter()
|
||||||
.stream()
|
.stream()
|
||||||
@@ -551,21 +555,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let required_state = required_state_request
|
|
||||||
.iter()
|
|
||||||
.stream()
|
|
||||||
.filter_map(|state| async move {
|
|
||||||
services
|
|
||||||
.rooms
|
|
||||||
.state_accessor
|
|
||||||
.room_state_get(room_id, &state.0, &state.1)
|
|
||||||
.await
|
|
||||||
.map(Event::into_format)
|
|
||||||
.ok()
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
.await;
|
|
||||||
|
|
||||||
// Heroes
|
// Heroes
|
||||||
let heroes: Vec<_> = services
|
let heroes: Vec<_> = services
|
||||||
.rooms
|
.rooms
|
||||||
@@ -689,6 +678,46 @@ where
|
|||||||
Ok(rooms)
|
Ok(rooms)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Collect the required state events for a room
|
||||||
|
async fn collect_required_state(
|
||||||
|
services: &Services,
|
||||||
|
room_id: &RoomId,
|
||||||
|
required_state_request: &BTreeSet<TypeStateKey>,
|
||||||
|
) -> Vec<Raw<AnySyncStateEvent>> {
|
||||||
|
let mut required_state = Vec::new();
|
||||||
|
for (event_type, state_key) in required_state_request {
|
||||||
|
// Resolve wild-card sentinel issue
|
||||||
|
// Addresses: https://forgejo.ellis.link/continuwuation/continuwuity/issues/1306
|
||||||
|
if state_key.as_str() == "*" {
|
||||||
|
if let Ok(keys) = services
|
||||||
|
.rooms
|
||||||
|
.state_accessor
|
||||||
|
.room_state_keys(room_id, event_type)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
for key in keys {
|
||||||
|
if let Ok(event) = services
|
||||||
|
.rooms
|
||||||
|
.state_accessor
|
||||||
|
.room_state_get(room_id, event_type, &key)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
required_state.push(Event::into_format(event));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if let Ok(event) = services
|
||||||
|
.rooms
|
||||||
|
.state_accessor
|
||||||
|
.room_state_get(room_id, event_type, state_key)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
required_state.push(Event::into_format(event));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
required_state
|
||||||
|
}
|
||||||
|
|
||||||
async fn collect_typing_events(
|
async fn collect_typing_events(
|
||||||
services: &Services,
|
services: &Services,
|
||||||
sender_user: &UserId,
|
sender_user: &UserId,
|
||||||
|
|||||||
Reference in New Issue
Block a user