Skip to main content

tuwunel_admin/user/
redact_event.rs

1use 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}