Skip to main content

tuwunel_service/rooms/directory/
mod.rs

1use std::sync::Arc;
2
3use futures::Stream;
4use ruma::{RoomId, api::client::room::Visibility};
5use tuwunel_core::{Result, implement, utils::stream::TryIgnore};
6use tuwunel_database::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) { self.db.publicroomids.insert(room_id, []); }
30
31#[implement(Service)]
32pub fn set_not_public(&self, room_id: &RoomId) { self.db.publicroomids.remove(room_id); }
33
34#[implement(Service)]
35pub fn public_rooms(&self) -> impl Stream<Item = &RoomId> + Send {
36	self.db.publicroomids.keys().ignore_err()
37}
38
39#[implement(Service)]
40pub async fn is_public_room(&self, room_id: &RoomId) -> bool {
41	self.visibility(room_id).await == Visibility::Public
42}
43
44#[implement(Service)]
45pub async fn visibility(&self, room_id: &RoomId) -> Visibility {
46	if self.db.publicroomids.get(room_id).await.is_ok() {
47		Visibility::Public
48	} else {
49		Visibility::Private
50	}
51}