Skip to main content

tuwunel_admin/room/
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 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}