Skip to content

Commit c500608

Browse files
authored
feat(bindings): Add method for sending plain text replies
1 parent bb62437 commit c500608

File tree

4 files changed

+54
-17
lines changed

4 files changed

+54
-17
lines changed

bindings/matrix-sdk-ffi/src/api.udl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,11 @@ interface Room {
103103
void stop_live_event_listener();
104104

105105
[Throws=ClientError]
106-
void send(MessageEventContent msg, string? txn_id);
107-
106+
void send(RoomMessageEventContent msg, string? txn_id);
107+
108+
[Throws=ClientError]
109+
void send_reply(string msg, string in_reply_to_event_id, string? txn_id);
110+
108111
[Throws=ClientError]
109112
void redact(string event_id, string? reason, string? txn_id);
110113
};
@@ -113,7 +116,7 @@ interface BackwardsStream {
113116
sequence<AnyMessage> paginate_backwards(u64 count);
114117
};
115118

116-
interface MessageEventContent {};
119+
interface RoomMessageEventContent {};
117120

118121
interface AnyMessage {
119122
TextMessage? text_message();

bindings/matrix-sdk-ffi/src/lib.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,5 @@ fn setup_tracing(configuration: String) {
6666
}
6767

6868
mod uniffi_types {
69-
pub use matrix_sdk::ruma::events::room::{
70-
message::RoomMessageEventContent as MessageEventContent, MediaSource,
71-
};
69+
pub use matrix_sdk::ruma::events::room::{message::RoomMessageEventContent, MediaSource};
7270
}

bindings/matrix-sdk-ffi/src/messages.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
use std::sync::Arc;
22

33
use extension_trait::extension_trait;
4-
pub use matrix_sdk::ruma::events::room::{
5-
message::RoomMessageEventContent as MessageEventContent, MediaSource,
6-
};
4+
pub use matrix_sdk::ruma::events::room::{message::RoomMessageEventContent, MediaSource};
75
use matrix_sdk::{
86
deserialized_responses::SyncTimelineEvent,
97
ruma::events::{
@@ -241,8 +239,8 @@ pub fn media_source_from_url(url: String) -> Arc<MediaSource> {
241239
}
242240

243241
#[uniffi::export]
244-
pub fn message_event_content_from_markdown(md: String) -> Arc<MessageEventContent> {
245-
Arc::new(MessageEventContent::text_markdown(md))
242+
pub fn message_event_content_from_markdown(md: String) -> Arc<RoomMessageEventContent> {
243+
Arc::new(RoomMessageEventContent::text_markdown(md))
246244
}
247245

248246
#[extension_trait]

bindings/matrix-sdk-ffi/src/room.rs

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
use std::sync::{Arc, RwLock};
1+
use std::{
2+
convert::TryFrom,
3+
sync::{Arc, RwLock},
4+
};
25

3-
use anyhow::{bail, Result};
6+
use anyhow::{bail, Context, Result};
47
use futures_util::{pin_mut, StreamExt};
58
use matrix_sdk::{
69
room::Room as MatrixRoom,
7-
ruma::{events::room::message::RoomMessageEventContent, EventId, UserId},
10+
ruma::{
11+
events::room::message::{RoomMessageEvent, RoomMessageEventContent},
12+
EventId, UserId,
13+
},
814
};
915

1016
use super::{
@@ -157,10 +163,42 @@ impl Room {
157163
};
158164

159165
RUNTIME.block_on(async move {
160-
room.send((*msg).to_owned(), txn_id.as_deref().map(Into::into)).await
161-
})?;
166+
room.send((*msg).to_owned(), txn_id.as_deref().map(Into::into)).await?;
167+
Ok(())
168+
})
169+
}
162170

163-
Ok(())
171+
pub fn send_reply(
172+
&self,
173+
msg: String,
174+
in_reply_to_event_id: String,
175+
txn_id: Option<String>,
176+
) -> Result<()> {
177+
let room = match &self.room {
178+
MatrixRoom::Joined(j) => j.clone(),
179+
_ => bail!("Can't send to a room that isn't in joined state"),
180+
};
181+
182+
let event_id: &EventId =
183+
in_reply_to_event_id.as_str().try_into().context("Failed to create EventId.")?;
184+
185+
RUNTIME.block_on(async move {
186+
let timeline_event = room.event(event_id).await.context("Couldn't find event.")?;
187+
188+
let event_content = timeline_event
189+
.event
190+
.deserialize_as::<RoomMessageEvent>()
191+
.context("Couldn't deserialise event")?;
192+
193+
let original_message =
194+
event_content.as_original().context("Couldn't retrieve original message.")?;
195+
196+
let reply_content = RoomMessageEventContent::text_reply_plain(msg, original_message);
197+
198+
room.send(reply_content, txn_id.as_deref().map(Into::into)).await?;
199+
200+
Ok(())
201+
})
164202
}
165203

166204
/// Redacts an event from the room.

0 commit comments

Comments
 (0)