tuwunel_service/rooms/directory/
mod.rs1use std::sync::Arc;
2
3use futures::Stream;
4use ruma::{OwnedRoomAliasId, RoomAliasId, RoomId, api::client::room::Visibility};
5use tuwunel_core::{Result, implement, utils::stream::TryIgnore};
6use tuwunel_database::{Deserialized, Map};
7
8pub struct Service {
9 db: Data,
10}
11
12struct Data {
13 publicroomids: Arc<Map>,
14}
15
16impl crate::Service for Service {
17 fn build(args: &crate::Args<'_>) -> Result<Arc<Self>> {
18 Ok(Arc::new(Self {
19 db: Data {
20 publicroomids: args.db["publicroomids"].clone(),
21 },
22 }))
23 }
24
25 fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
26}
27
28#[implement(Service)]
29pub fn set_public(&self, room_id: &RoomId, alias: Option<&RoomAliasId>) {
30 self.db
31 .publicroomids
32 .insert(room_id, alias.map_or("", RoomAliasId::as_str));
33}
34
35#[implement(Service)]
36pub fn set_not_public(&self, room_id: &RoomId) { self.db.publicroomids.remove(room_id); }
37
38#[implement(Service)]
41pub async fn published_alias(&self, room_id: &RoomId) -> Result<OwnedRoomAliasId> {
42 self.db
43 .publicroomids
44 .get(room_id)
45 .await
46 .deserialized()
47}
48
49#[implement(Service)]
50pub fn public_rooms(&self) -> impl Stream<Item = &RoomId> + Send {
51 self.db.publicroomids.keys().ignore_err()
52}
53
54#[implement(Service)]
55pub async fn is_public_room(&self, room_id: &RoomId) -> bool {
56 self.visibility(room_id).await == Visibility::Public
57}
58
59#[implement(Service)]
60pub async fn visibility(&self, room_id: &RoomId) -> Visibility {
61 if self.db.publicroomids.get(room_id).await.is_ok() {
62 Visibility::Public
63 } else {
64 Visibility::Private
65 }
66}