diff --git a/src/api/client/directory.rs b/src/api/client/directory.rs index ae86fe76..9f02f460 100644 --- a/src/api/client/directory.rs +++ b/src/api/client/directory.rs @@ -405,7 +405,11 @@ async fn public_rooms_chunk(services: &Services, room_id: OwnedRoomId) -> Public .get_canonical_alias(&room_id) .ok(); - let avatar_url = services.state_accessor.get_avatar(&room_id); + let avatar_url = services + .state_accessor + .get_avatar(&room_id) + .map_ok(|content| content.url) + .ok(); let topic = services .state_accessor @@ -441,7 +445,7 @@ async fn public_rooms_chunk(services: &Services, room_id: OwnedRoomId) -> Public .await; PublicRoomsChunk { - avatar_url: avatar_url.into_option().unwrap_or_default().url, + avatar_url: avatar_url.flatten(), canonical_alias, guest_can_join, join_rule: join_rule.unwrap_or_default(), diff --git a/src/api/client/room/summary.rs b/src/api/client/room/summary.rs index eb9fd6c4..a2d21bc3 100644 --- a/src/api/client/room/summary.rs +++ b/src/api/client/room/summary.rs @@ -1,7 +1,7 @@ use axum::extract::State; use axum_client_ip::InsecureClientIp; use futures::{ - FutureExt, StreamExt, + FutureExt, StreamExt, TryFutureExt, future::{OptionFuture, join3}, stream::FuturesUnordered, }; @@ -142,7 +142,9 @@ async fn local_room_summary_response( let avatar_url = services .state_accessor .get_avatar(room_id) - .map(|res| res.into_option().unwrap_or_default().url); + .map_ok(|content| content.url) + .ok() + .map(Option::flatten); let room_version = services.state.get_room_version(room_id).ok(); diff --git a/src/api/client/sync/v5.rs b/src/api/client/sync/v5.rs index 7471eb1b..2fe64d2d 100644 --- a/src/api/client/sync/v5.rs +++ b/src/api/client/sync/v5.rs @@ -612,24 +612,26 @@ where | Ordering::Less => None, }; - let heroes_avatar = if heroes.len() == 1 { - heroes[0].avatar.clone() - } else { - None - }; + let room_avatar = services + .state_accessor + .get_avatar(room_id) + .map_ok(|content| content.url) + .ok() + .map(Option::flatten) + .await; - let room_avatar = match services.state_accessor.get_avatar(room_id).await { - | ruma::JsOption::Some(avatar) => ruma::JsOption::from_option(avatar.url), - | ruma::JsOption::Null => ruma::JsOption::Null, - | ruma::JsOption::Undefined => ruma::JsOption::Undefined, - }; + let heroes_avatar = (room_avatar.is_none() && room_name.is_none()) + .then(|| { + heroes + .first() + .and_then(|hero| hero.avatar.clone()) + }) + .flatten(); + + let avatar = ruma::JsOption::from_option(room_avatar.or(heroes_avatar)); rooms.insert(room_id.clone(), sync_events::v5::response::Room { - avatar: if room_name.is_some() { - room_avatar - } else { - ruma::JsOption::from_option(heroes_avatar) - }, + avatar, name: room_name.or(hero_name), initial: Some(roomsince == &0), is_dm: None, diff --git a/src/service/rooms/spaces/mod.rs b/src/service/rooms/spaces/mod.rs index 5dbf764e..1000be7d 100644 --- a/src/service/rooms/spaces/mod.rs +++ b/src/service/rooms/spaces/mod.rs @@ -360,7 +360,8 @@ async fn get_room_summary( .services .state_accessor .get_avatar(room_id) - .map(|res| res.into_option().unwrap_or_default().url); + .map_ok(|content| content.url) + .ok(); let room_version = self.services.state.get_room_version(room_id).ok(); @@ -397,12 +398,12 @@ async fn get_room_summary( let summary = SpaceHierarchyParentSummary { children_state, summary: RoomSummary { + avatar_url: avatar_url.flatten(), canonical_alias, name, topic, world_readable, guest_can_join, - avatar_url, room_type, encryption, room_version, diff --git a/src/service/rooms/state_accessor/mod.rs b/src/service/rooms/state_accessor/mod.rs index 054b3d8a..4bdd4091 100644 --- a/src/service/rooms/state_accessor/mod.rs +++ b/src/service/rooms/state_accessor/mod.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use async_trait::async_trait; use futures::{FutureExt, TryFutureExt, future::try_join}; use ruma::{ - EventEncryptionAlgorithm, JsOption, OwnedRoomAliasId, RoomId, UserId, + EventEncryptionAlgorithm, OwnedRoomAliasId, RoomId, UserId, events::{ StateEventType, room::{ @@ -88,13 +88,9 @@ impl Service { .map(|c: RoomNameEventContent| c.name) } - pub async fn get_avatar(&self, room_id: &RoomId) -> JsOption { - let content = self - .room_state_get_content(room_id, &StateEventType::RoomAvatar, "") + pub async fn get_avatar(&self, room_id: &RoomId) -> Result { + self.room_state_get_content(room_id, &StateEventType::RoomAvatar, "") .await - .ok(); - - JsOption::from_option(content) } pub async fn get_member(