Fix sliding-sync room_avatar conditions.

Eliminate jsOption from non-sliding-sync avatar related codepaths.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-09-02 13:19:10 +00:00
parent 1d2818de58
commit 3deebeab78
5 changed files with 33 additions and 28 deletions

View File

@@ -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(),

View File

@@ -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();

View File

@@ -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,