tuwunel_admin/room/
list_joined_members.rs1use futures::StreamExt;
2use ruma::OwnedRoomId;
3use tuwunel_core::{Result, utils::ReadyExt};
4
5use crate::admin_command;
6
7#[admin_command]
8pub(super) async fn room_list_joined_members(
9 &self,
10 room_id: OwnedRoomId,
11 local_only: bool,
12) -> Result {
13 let room_name = self
14 .services
15 .state_accessor
16 .get_name(&room_id)
17 .await
18 .unwrap_or_else(|_| room_id.to_string());
19
20 let member_info: Vec<_> = self
21 .services
22 .state_cache
23 .room_members(&room_id)
24 .ready_filter(|user_id| {
25 local_only
26 .then(|| self.services.globals.user_is_local(user_id))
27 .unwrap_or(true)
28 })
29 .map(ToOwned::to_owned)
30 .filter_map(async |user_id| {
31 Some((
32 self.services
33 .profile
34 .displayname(&user_id)
35 .await
36 .unwrap_or_else(|_| user_id.to_string()),
37 user_id,
38 ))
39 })
40 .collect()
41 .await;
42
43 let num = member_info.len();
44 write!(self, "{num} Members in Room \"{room_name}\":\n```\n").await?;
45 for (displayname, mxid) in &member_info {
46 writeln!(self, "{mxid} | {displayname}").await?;
47 }
48 write!(self, "```").await
49}