tuwunel_admin/user/
force_leave_room.rs1use 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}