use matrix_sdk::{Room, RoomHero, RoomState};
use ruma::{
OwnedMxcUri, OwnedRoomAliasId, OwnedRoomId, OwnedServerName,
events::room::{guest_access::GuestAccess, history_visibility::HistoryVisibility},
room::{JoinRuleSummary, RoomSummary, RoomType},
};
#[derive(Debug, Clone, PartialEq)]
pub struct SpaceRoom {
pub room_id: OwnedRoomId,
pub canonical_alias: Option<OwnedRoomAliasId>,
pub name: Option<String>,
pub display_name: String,
pub topic: Option<String>,
pub avatar_url: Option<OwnedMxcUri>,
pub room_type: Option<RoomType>,
pub num_joined_members: u64,
pub join_rule: Option<JoinRuleSummary>,
pub world_readable: Option<bool>,
pub guest_can_join: bool,
pub is_direct: Option<bool>,
pub children_count: u64,
pub state: Option<RoomState>,
pub heroes: Option<Vec<RoomHero>>,
pub via: Vec<OwnedServerName>,
}
impl SpaceRoom {
pub(crate) fn new_from_summary(
summary: &RoomSummary,
known_room: Option<Room>,
children_count: u64,
via: Vec<OwnedServerName>,
) -> Self {
let display_name = matrix_sdk_base::Room::compute_display_name_with_fields(
summary.name.clone(),
summary.canonical_alias.as_deref(),
known_room.as_ref().map(|r| r.heroes().to_vec()).unwrap_or_default(),
summary.num_joined_members.into(),
)
.to_string();
Self {
room_id: summary.room_id.clone(),
canonical_alias: summary.canonical_alias.clone(),
name: summary.name.clone(),
display_name,
topic: summary.topic.clone(),
avatar_url: summary.avatar_url.clone(),
room_type: summary.room_type.clone(),
num_joined_members: summary.num_joined_members.into(),
join_rule: Some(summary.join_rule.clone()),
world_readable: Some(summary.world_readable),
guest_can_join: summary.guest_can_join,
is_direct: known_room.as_ref().map(|r| r.direct_targets_length() != 0),
children_count,
state: known_room.as_ref().map(|r| r.state()),
heroes: known_room.map(|r| r.heroes()),
via,
}
}
pub(crate) fn new_from_known(known_room: &Room, children_count: u64) -> Self {
let room_info = known_room.clone_info();
let name = room_info.name().map(ToOwned::to_owned);
let display_name = matrix_sdk_base::Room::compute_display_name_with_fields(
name.clone(),
room_info.canonical_alias(),
room_info.heroes().to_vec(),
known_room.joined_members_count(),
)
.to_string();
Self {
room_id: room_info.room_id().to_owned(),
canonical_alias: room_info.canonical_alias().map(ToOwned::to_owned),
name,
display_name,
topic: room_info.topic().map(ToOwned::to_owned),
avatar_url: room_info.avatar_url().map(ToOwned::to_owned),
room_type: room_info.room_type().cloned(),
num_joined_members: known_room.joined_members_count(),
join_rule: room_info.join_rule().cloned().map(Into::into),
world_readable: room_info
.history_visibility()
.map(|vis| *vis == HistoryVisibility::WorldReadable),
guest_can_join: known_room.guest_access() == GuestAccess::CanJoin,
is_direct: Some(known_room.direct_targets_length() != 0),
children_count,
state: Some(known_room.state()),
heroes: Some(room_info.heroes().to_vec()),
via: vec![],
}
}
}