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();