From e60e86e9edf26cf76a2a95bdd14615a5d52df280 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 19 Nov 2025 02:14:35 +0000 Subject: [PATCH] Optimize heroes calculation using member state instead of timeline scan. Signed-off-by: Jason Volk --- src/api/client/sync/v3.rs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/api/client/sync/v3.rs b/src/api/client/sync/v3.rs index c09d9740..40430cf6 100644 --- a/src/api/client/sync/v3.rs +++ b/src/api/client/sync/v3.rs @@ -1275,28 +1275,23 @@ async fn calculate_heroes( sender_user: &UserId, ) -> Vec { services - .timeline - .all_pdus(sender_user, room_id) - .ready_filter(|(_, pdu)| pdu.kind == RoomMember) - .fold_default(|heroes: Vec<_>, (_, pdu)| { + .state_accessor + .room_state_type_pdus(room_id, &StateEventType::RoomMember) + .ready_filter_map(Result::ok) + .fold_default(|heroes: Vec<_>, pdu| { fold_hero(heroes, services, room_id, sender_user, pdu) }) .await } -async fn fold_hero( +async fn fold_hero( mut heroes: Vec, services: &Services, room_id: &RoomId, sender_user: &UserId, - pdu: PduEvent, + pdu: Pdu, ) -> Vec { - let Some(user_id): Option<&UserId> = pdu - .state_key - .as_deref() - .map(TryInto::try_into) - .flat_ok() - else { + let Some(user_id): Option<&UserId> = pdu.state_key().map(TryInto::try_into).flat_ok() else { return heroes; };