From 96384d944730f7a1eb7aadacaa7439b1c9dc6efa Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Wed, 31 Aug 2022 13:42:05 +0200 Subject: [PATCH] feat(bindings): Add account data interaction to sdk-ffi Co-authored-by: Doug --- bindings/matrix-sdk-ffi/src/api.udl | 6 ++++++ bindings/matrix-sdk-ffi/src/client.rs | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/bindings/matrix-sdk-ffi/src/api.udl b/bindings/matrix-sdk-ffi/src/api.udl index c007a6274..d2c37d874 100644 --- a/bindings/matrix-sdk-ffi/src/api.udl +++ b/bindings/matrix-sdk-ffi/src/api.udl @@ -62,6 +62,12 @@ interface Client { [Throws=ClientError] string device_id(); + [Throws=ClientError] + string? account_data(string event_type); + + [Throws=ClientError] + void set_account_data(string event_type, string content); + sequence rooms(); [Throws=ClientError] diff --git a/bindings/matrix-sdk-ffi/src/client.rs b/bindings/matrix-sdk-ffi/src/client.rs index 3dff33eb7..c743e3174 100644 --- a/bindings/matrix-sdk-ffi/src/client.rs +++ b/bindings/matrix-sdk-ffi/src/client.rs @@ -12,6 +12,7 @@ use matrix_sdk::{ sync::sync_events::v3::Filter, }, events::room::MediaSource, + serde::Raw, TransactionId, }, Client as MatrixClient, LoopCtrl, Session, @@ -223,6 +224,28 @@ impl Client { Ok(device_id.to_string()) } + /// Get the content of the event of the given type out of the account data + /// store. + /// + /// It will be returned as a JSON string. + pub fn account_data(&self, event_type: String) -> anyhow::Result> { + RUNTIME.block_on(async move { + let event = self.client.account().account_data_raw(event_type.into()).await?; + Ok(event.map(|e| e.json().get().to_owned())) + }) + } + + /// Set the given account data content for the given event type. + /// + /// It should be supplied as a JSON string. + pub fn set_account_data(&self, event_type: String, content: String) -> anyhow::Result<()> { + RUNTIME.block_on(async move { + let raw_content = Raw::from_json_string(content)?; + self.client.account().set_account_data_raw(event_type.into(), raw_content).await?; + Ok(()) + }) + } + pub fn get_media_content(&self, media_source: Arc) -> anyhow::Result> { let l = self.client.clone(); let source = (*media_source).clone();