Skip to main content

tuwunel_admin/room/info/
list_joined_members.rs

1use 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}