diff --git a/crates/matrix-sdk/src/room/common.rs b/crates/matrix-sdk/src/room/common.rs index 95d807d82..65b54aa39 100644 --- a/crates/matrix-sdk/src/room/common.rs +++ b/crates/matrix-sdk/src/room/common.rs @@ -18,7 +18,8 @@ use ruma::{ events::{ room::{history_visibility::HistoryVisibility, MediaSource}, tag::{TagInfo, TagName}, - AnyStateEvent, AnySyncStateEvent, EventContent, StateEventType, StaticEventContent, + AnyRoomAccountDataEvent, AnyStateEvent, AnySyncStateEvent, EventContent, + RoomAccountDataEvent, RoomAccountDataEventType, StateEventType, StaticEventContent, SyncStateEvent, }, serde::Raw, @@ -706,6 +707,41 @@ impl Common { Ok(self.get_state_event(C::TYPE.into(), state_key).await?.map(Raw::cast)) } + /// Get account data in this room. + pub async fn account_data( + &self, + data_type: RoomAccountDataEventType, + ) -> Result>> { + self.client + .store() + .get_room_account_data_event(self.room_id(), data_type) + .await + .map_err(Into::into) + } + + /// Get account data of statically-known type in this room. + /// + /// # Example + /// + /// ```no_run + /// # async { + /// # let room: matrix_sdk::room::Common = todo!(); + /// use matrix_sdk::ruma::events::fully_read::FullyReadEventContent; + /// + /// match room.account_data_static::().await? { + /// Some(fully_read) => println!("Found read marker: {:?}", fully_read.deserialize()?), + /// None => println!("No read marker for this room"), + /// } + /// # anyhow::Ok(()) + /// # }; + /// ``` + pub async fn account_data_static(&self) -> Result>>> + where + C: StaticEventContent + EventContent, + { + Ok(self.account_data(C::TYPE.into()).await?.map(Raw::cast)) + } + /// Check if all members of this room are verified and all their devices are /// verified. ///