tuwunel_admin/room/info/
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 list_joined_members(&self, room_id: OwnedRoomId, local_only: bool) -> Result {
9 let room_name = self
10 .services
11 .state_accessor
12 .get_name(&room_id)
13 .await
14 .unwrap_or_else(|_| room_id.to_string());
15
16 let member_info: Vec<_> = self
17 .services
18 .state_cache
19 .room_members(&room_id)
20 .ready_filter(|user_id| {
21 local_only
22 .then(|| self.services.globals.user_is_local(user_id))
23 .unwrap_or(true)
24 })
25 .map(ToOwned::to_owned)
26 .filter_map(async |user_id| {
27 Some((
28 self.services
29 .profile
30 .displayname(&user_id)
31 .await
32 .unwrap_or_else(|_| user_id.to_string()),
33 user_id,
34 ))
35 })
36 .collect()
37 .await;
38
39 let num = member_info.len();
40 write!(self, "{num} Members in Room \"{room_name}\":\n```\n").await?;
41 for (displayname, mxid) in &member_info {
42 writeln!(self, "{mxid} | {displayname}").await?;
43 }
44 write!(self, "```").await
45}