Skip to main content

tuwunel_admin/user/
force_leave_room.rs

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