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) .get_canonical_alias(&room_id)
.ok(); .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 let topic = services
.state_accessor .state_accessor
@@ -441,7 +445,7 @@ async fn public_rooms_chunk(services: &Services, room_id: OwnedRoomId) -> Public
.await; .await;
PublicRoomsChunk { PublicRoomsChunk {
avatar_url: avatar_url.into_option().unwrap_or_default().url, avatar_url: avatar_url.flatten(),
canonical_alias, canonical_alias,
guest_can_join, guest_can_join,
join_rule: join_rule.unwrap_or_default(), join_rule: join_rule.unwrap_or_default(),

View File

@@ -1,7 +1,7 @@
use axum::extract::State; use axum::extract::State;
use axum_client_ip::InsecureClientIp; use axum_client_ip::InsecureClientIp;
use futures::{ use futures::{
FutureExt, StreamExt, FutureExt, StreamExt, TryFutureExt,
future::{OptionFuture, join3}, future::{OptionFuture, join3},
stream::FuturesUnordered, stream::FuturesUnordered,
}; };
@@ -142,7 +142,9 @@ async fn local_room_summary_response(
let avatar_url = services let avatar_url = services
.state_accessor .state_accessor
.get_avatar(room_id) .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(); let room_version = services.state.get_room_version(room_id).ok();

View File

@@ -612,24 +612,26 @@ where
| Ordering::Less => None, | Ordering::Less => None,
}; };
let heroes_avatar = if heroes.len() == 1 { let room_avatar = services
heroes[0].avatar.clone() .state_accessor
} else { .get_avatar(room_id)
None .map_ok(|content| content.url)
}; .ok()
.map(Option::flatten)
.await;
let room_avatar = match services.state_accessor.get_avatar(room_id).await { let heroes_avatar = (room_avatar.is_none() && room_name.is_none())
| ruma::JsOption::Some(avatar) => ruma::JsOption::from_option(avatar.url), .then(|| {
| ruma::JsOption::Null => ruma::JsOption::Null, heroes
| ruma::JsOption::Undefined => ruma::JsOption::Undefined, .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 { rooms.insert(room_id.clone(), sync_events::v5::response::Room {
avatar: if room_name.is_some() { avatar,
room_avatar
} else {
ruma::JsOption::from_option(heroes_avatar)
},
name: room_name.or(hero_name), name: room_name.or(hero_name),
initial: Some(roomsince == &0), initial: Some(roomsince == &0),
is_dm: None, is_dm: None,

View File

@@ -360,7 +360,8 @@ async fn get_room_summary(
.services .services
.state_accessor .state_accessor
.get_avatar(room_id) .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(); let room_version = self.services.state.get_room_version(room_id).ok();
@@ -397,12 +398,12 @@ async fn get_room_summary(
let summary = SpaceHierarchyParentSummary { let summary = SpaceHierarchyParentSummary {
children_state, children_state,
summary: RoomSummary { summary: RoomSummary {
avatar_url: avatar_url.flatten(),
canonical_alias, canonical_alias,
name, name,
topic, topic,
world_readable, world_readable,
guest_can_join, guest_can_join,
avatar_url,
room_type, room_type,
encryption, encryption,
room_version, room_version,

View File

@@ -8,7 +8,7 @@ use std::sync::Arc;
use async_trait::async_trait; use async_trait::async_trait;
use futures::{FutureExt, TryFutureExt, future::try_join}; use futures::{FutureExt, TryFutureExt, future::try_join};
use ruma::{ use ruma::{
EventEncryptionAlgorithm, JsOption, OwnedRoomAliasId, RoomId, UserId, EventEncryptionAlgorithm, OwnedRoomAliasId, RoomId, UserId,
events::{ events::{
StateEventType, StateEventType,
room::{ room::{
@@ -88,13 +88,9 @@ impl Service {
.map(|c: RoomNameEventContent| c.name) .map(|c: RoomNameEventContent| c.name)
} }
pub async fn get_avatar(&self, room_id: &RoomId) -> JsOption<RoomAvatarEventContent> { pub async fn get_avatar(&self, room_id: &RoomId) -> Result<RoomAvatarEventContent> {
let content = self self.room_state_get_content(room_id, &StateEventType::RoomAvatar, "")
.room_state_get_content(room_id, &StateEventType::RoomAvatar, "")
.await .await
.ok();
JsOption::from_option(content)
} }
pub async fn get_member( pub async fn get_member(