diff --git a/matrix_sdk/src/client.rs b/matrix_sdk/src/client.rs index 1de3d00e..e5a27994 100644 --- a/matrix_sdk/src/client.rs +++ b/matrix_sdk/src/client.rs @@ -67,6 +67,7 @@ use matrix_sdk_common::{ account::register, device::{delete_devices, get_devices}, directory::{get_public_rooms, get_public_rooms_filtered}, + filter::{create_filter::Request as FilterUploadRequest, FilterDefinition}, media::create_content, membership::{ ban_user, forget_room, get_member_events, @@ -606,6 +607,27 @@ impl Client { self.send(request).await } + /// Get or upload a sync filter. + pub async fn get_or_upload_filter( + &self, + filter_name: &str, + definition: FilterDefinition<'_>, + ) -> Result { + if let Some(filter) = self.base_client.get_filter(filter_name).await { + Ok(filter) + } else { + let user_id = self.user_id().await.ok_or(Error::AuthenticationRequired)?; + let request = FilterUploadRequest::new(&user_id, definition); + let response = self.send(request).await?; + + self.base_client + .receive_filter_upload(filter_name, &response) + .await; + + Ok(response.filter_id) + } + } + /// Join a room by `RoomId`. /// /// Returns a `join_room_by_id::Response` consisting of the diff --git a/matrix_sdk_base/src/client.rs b/matrix_sdk_base/src/client.rs index b0bb0a4f..2df00a58 100644 --- a/matrix_sdk_base/src/client.rs +++ b/matrix_sdk_base/src/client.rs @@ -49,7 +49,7 @@ use matrix_sdk_crypto::{ Device, EncryptionSettings, IncomingResponse, OlmError, OlmMachine, OutgoingRequest, Sas, ToDeviceRequest, UserDevices, }; -use tracing::{info, warn}; +use tracing::info; use zeroize::Zeroizing; use crate::{ @@ -629,6 +629,20 @@ impl BaseClient { Ok(()) } + pub async fn receive_filter_upload( + &self, + filter_name: &str, + response: &api::filter::create_filter::Response, + ) { + self.store + .save_filter(filter_name, &response.filter_id) + .await; + } + + pub async fn get_filter(&self, filter_name: &str) -> Option { + self.store.get_filter(filter_name).await + } + /// Should the client share a group session for the given room. /// /// Returns true if a session needs to be shared before room messages can be diff --git a/matrix_sdk_base/src/store.rs b/matrix_sdk_base/src/store.rs index efd46d92..44a70fb5 100644 --- a/matrix_sdk_base/src/store.rs +++ b/matrix_sdk_base/src/store.rs @@ -452,6 +452,19 @@ impl Store { Store::open_helper(db) } + pub async fn save_filter(&self, filter_name: &str, filter_id: &str) { + self.session + .insert(&format!("filter{}", filter_name), filter_id) + .unwrap(); + } + + pub async fn get_filter(&self, filter_name: &str) -> Option { + self.session + .get(&format!("filter{}", filter_name)) + .unwrap() + .map(|f| String::from_utf8_lossy(&f).to_string()) + } + pub async fn save_changes(&self, changes: &StateChanges) { let ret: TransactionResult<()> = ( &self.session,