Skip to main content

tuwunel_admin/user/
force_leave_room.rs

1use futures::FutureExt;
2use ruma::OwnedRoomOrAliasId;
3use tuwunel_core::{Err, Result};
4
5use crate::{admin_command, utils::parse_local_user_id};
6
7#[admin_command]
8pub(super) async fn force_leave_room(
9	&self,
10	user_id: String,
11	room_id: OwnedRoomOrAliasId,
12) -> Result {
13	let user_id = parse_local_user_id(self.services, &user_id)?;
14	let room_id = self
15		.services
16		.alias
17		.maybe_resolve(&room_id)
18		.await?;
19
20	assert!(
21		self.services.globals.user_is_local(&user_id),
22		"Parsed user_id must be a local user"
23	);
24
25	if !self
26		.services
27		.state_cache
28		.is_joined(&user_id, &room_id)
29		.await
30	{
31		return Err!("{user_id} is not joined in the room");
32	}
33
34	let state_lock = self.services.state.mutex.lock(&room_id).await;
35
36	self.services
37		.membership
38		.leave(&user_id, &room_id, None, false, &state_lock)
39		.boxed()
40		.await?;
41
42	drop(state_lock);
43
44	write!(self, "{user_id} has left {room_id}.").await
45}