tuwunel_admin/user/
redact_event.rs1use ruma::{OwnedEventId, events::room::redaction::RoomRedactionEventContent};
2use tuwunel_core::{
3 Err, Result,
4 matrix::{Event, pdu::PduBuilder},
5};
6
7use crate::admin_command;
8
9#[admin_command]
10pub(super) async fn redact_event(&self, event_id: OwnedEventId) -> Result {
11 let Ok(event) = self
12 .services
13 .timeline
14 .get_non_outlier_pdu(&event_id)
15 .await
16 else {
17 return Err!("Event does not exist in our database.");
18 };
19
20 if event.is_redacted() {
21 return Err!("Event is already redacted.");
22 }
23
24 if !self
25 .services
26 .globals
27 .user_is_local(event.sender())
28 {
29 return Err!("This command only works on local users.");
30 }
31
32 let reason = format!(
33 "The administrator(s) of {} has redacted this user's message.",
34 self.services.globals.server_name()
35 );
36
37 let redaction_event_id = {
38 let state_lock = self
39 .services
40 .state
41 .mutex
42 .lock(event.room_id())
43 .await;
44
45 self.services
46 .timeline
47 .build_and_append_pdu(
48 PduBuilder {
49 redacts: Some(event.event_id().to_owned()),
50 ..PduBuilder::timeline(&RoomRedactionEventContent {
51 redacts: Some(event.event_id().to_owned()),
52 reason: Some(reason),
53 })
54 },
55 event.sender(),
56 event.room_id(),
57 &state_lock,
58 )
59 .await?
60 };
61
62 write!(self, "Successfully redacted event. Redaction event ID: {redaction_event_id}").await
63}