diff --git a/bindings/matrix-sdk-ffi/src/api.udl b/bindings/matrix-sdk-ffi/src/api.udl index b16f8c29e..037a3b6f5 100644 --- a/bindings/matrix-sdk-ffi/src/api.udl +++ b/bindings/matrix-sdk-ffi/src/api.udl @@ -104,6 +104,9 @@ interface Room { [Throws=ClientError] void send(MessageEventContent msg, string? txn_id); + + [Throws=ClientError] + void redact(string event_id, string? reason, string? txn_id); }; interface BackwardsStream { diff --git a/bindings/matrix-sdk-ffi/src/room.rs b/bindings/matrix-sdk-ffi/src/room.rs index 38ce71c6d..189d1a14d 100644 --- a/bindings/matrix-sdk-ffi/src/room.rs +++ b/bindings/matrix-sdk-ffi/src/room.rs @@ -4,7 +4,7 @@ use anyhow::{bail, Result}; use futures_util::{pin_mut, StreamExt}; use matrix_sdk::{ room::Room as MatrixRoom, - ruma::{events::room::message::RoomMessageEventContent, UserId}, + ruma::{events::room::message::RoomMessageEventContent, EventId, UserId}, }; use super::{ @@ -162,6 +162,34 @@ impl Room { Ok(()) } + + /// Redacts an event from the room. + /// + /// # Arguments + /// + /// * `event_id` - The ID of the event to redact + /// + /// * `reason` - The reason for the event being redacted (optional). + /// + /// * `txn_id` - A unique ID that can be attached to this event as + /// its transaction ID (optional). If not given one is created. + pub fn redact( + &self, + event_id: String, + reason: Option, + txn_id: Option, + ) -> Result<()> { + let room = match &self.room { + MatrixRoom::Joined(j) => j.clone(), + _ => bail!("Can't redact in a room that isn't in joined state"), + }; + + RUNTIME.block_on(async move { + let event_id = EventId::parse(event_id)?; + room.redact(&event_id, reason.as_deref(), txn_id.map(Into::into)).await?; + Ok(()) + }) + } } impl std::ops::Deref for Room {