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