Skip to main content

tuwunel_service/rooms/directory/
mod.rs

1use 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/// Alias the room was published under; empty values from rooms published
39/// without one fail the alias parse and land as Err.
40#[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}