Skip to main content

tuwunel_admin/federation/
remote_user_in_rooms.rs

1use futures::StreamExt;
2use ruma::{OwnedRoomId, OwnedUserId};
3use tuwunel_core::{Err, Result};
4
5use crate::{admin_command, get_room_info};
6
7#[admin_command]
8pub(super) async fn remote_user_in_rooms(&self, user_id: OwnedUserId) -> Result {
9	if user_id.server_name() == self.services.server.name {
10		return Err!(
11			"User belongs to our server, please use `list-joined-rooms` user admin command \
12			 instead.",
13		);
14	}
15
16	if !self.services.users.exists(&user_id).await {
17		return Err!("Remote user does not exist in our database.",);
18	}
19
20	let mut rooms: Vec<(OwnedRoomId, u64, String)> = self
21		.services
22		.state_cache
23		.rooms_joined(&user_id)
24		.then(|room_id| get_room_info(self.services, room_id))
25		.collect()
26		.await;
27
28	if rooms.is_empty() {
29		return Err!("User is not in any rooms.");
30	}
31
32	rooms.sort_by_key(|r| r.1);
33	rooms.reverse();
34
35	let num = rooms.len();
36	write!(self, "Rooms {user_id} shares with us ({num}):\n```\n").await?;
37	for (id, members, name) in &rooms {
38		writeln!(self, "{id} | Members: {members} | Name: {name}").await?;
39	}
40	write!(self, "```").await
41}