tuwunel_admin/federation/
remote_user_in_rooms.rs1use 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}