From a2bbfd124229800cbab7eb08bd6f4cae19d07431 Mon Sep 17 00:00:00 2001 From: Lambda Date: Tue, 20 May 2025 17:02:22 +0000 Subject: [PATCH] SSS: Fix room names --- src/api/client_server/sync/msc4186.rs | 84 +++++++++++---------------- 1 file changed, 33 insertions(+), 51 deletions(-) diff --git a/src/api/client_server/sync/msc4186.rs b/src/api/client_server/sync/msc4186.rs index 5b210702..72ce3a24 100644 --- a/src/api/client_server/sync/msc4186.rs +++ b/src/api/client_server/sync/msc4186.rs @@ -11,8 +11,9 @@ use std::{ use ruma::{ api::client::{ sync::sync_events::{ - self, v5::request::ListFilters, DeviceLists, - UnreadNotificationsCount, + self, + v5::{request::ListFilters, response::Hero}, + DeviceLists, UnreadNotificationsCount, }, uiaa::UiaaResponse, }, @@ -933,55 +934,37 @@ fn process_room( .collect() }; - // Heroes - let heroes = services() - .rooms - .state_cache - .room_members(room_id) - .filter_map(Result::ok) - .filter(|member| member != sender_user) - .filter_map(|member| { - services() - .rooms - .state_accessor - .get_member(room_id, &member) - .ok() - .flatten() - .map(|memberevent| { - ( - memberevent - .displayname - .unwrap_or_else(|| member.to_string()), - memberevent.avatar_url, - ) - }) - }) - .take(5) - .collect::>(); - let name = match &*heroes { - [] => None, - [(only, _)] => Some(only.clone()), - [firsts @ .., (last, _)] => Some({ - let firsts = firsts - .iter() - .map(|(name, _)| name.clone()) - .collect::>() - .join(", "); - - format!("{firsts} and {last}") - }), - }; + let name = services().rooms.state_accessor.get_name(room_id)?; + let heroes = name.is_none().then(|| { + services() + .rooms + .state_cache + .room_members(room_id) + .filter_map(Result::ok) + .filter(|member| member != sender_user) + .filter_map(|member| { + services() + .rooms + .state_accessor + .get_member(room_id, &member) + .ok() + .flatten() + .map(|memberevent| Hero { + user_id: member, + name: memberevent.displayname, + avatar: memberevent.avatar_url, + }) + }) + .take(5) + .collect::>() + }); let room = sync_events::v5::response::Room { - name: services().rooms.state_accessor.get_name(room_id)?.or(name), - avatar: if let [(_name, Some(avatar))] = &*heroes { - JsOption::Some(avatar.clone()) - } else { - match services().rooms.state_accessor.get_avatar(room_id)? { - JsOption::Some(avatar) => JsOption::from_option(avatar.url), - JsOption::Null => JsOption::Null, - JsOption::Undefined => JsOption::Undefined, - } + name, + avatar: match services().rooms.state_accessor.get_avatar(room_id)? { + JsOption::Some(avatar) => JsOption::from_option(avatar.url), + JsOption::Null => JsOption::Null, + JsOption::Undefined => JsOption::Undefined, }, initial: Some(todo_room.roomsince == 0), is_dm: None, @@ -1028,8 +1011,7 @@ fn process_room( num_live: None, // TODO bump_stamp: None, - // TODO - heroes: None, + heroes, }; trace!(?room, "Built room data");