matrix_sdk_base: save room states after successfully parsed account events
parent
d858940342
commit
2602c36ad0
|
@ -698,19 +698,20 @@ impl BaseClient {
|
||||||
/// Handle a m.direct event, updating rooms states if necessary.
|
/// Handle a m.direct event, updating rooms states if necessary.
|
||||||
///
|
///
|
||||||
/// Returns true if any room changed, false otherwise.
|
/// Returns true if any room changed, false otherwise.
|
||||||
pub(crate) async fn handle_direct(&self, event: &DirectEvent) -> bool {
|
pub(crate) async fn handle_direct(&self, event: &DirectEvent) -> Vec<Arc<RwLock<Room>>> {
|
||||||
let mut update = false;
|
let mut updated_rooms = vec![];
|
||||||
|
|
||||||
for (user_id, rooms) in event.content.iter() {
|
for (user_id, rooms) in event.content.iter() {
|
||||||
for room_id in rooms.iter() {
|
for room_id in rooms.iter() {
|
||||||
if let Some(room) = self.get_joined_room(room_id).await {
|
if let Some(room) = &self.get_joined_room(room_id).await {
|
||||||
let mut room = room.write().await;
|
let mut room_locked = room.write().await;
|
||||||
if room.handle_direct(user_id) {
|
if room_locked.handle_direct(user_id) {
|
||||||
update = true;
|
updated_rooms.push(room.to_owned());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
update
|
updated_rooms
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Receive a timeline event for a joined room and update the client state.
|
/// Receive a timeline event for a joined room and update the client state.
|
||||||
|
@ -893,7 +894,8 @@ impl BaseClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Receive an account data event from a sync response and updates the client state.
|
/// Receive an account data event associated to a room from a sync
|
||||||
|
/// response and updates the client state.
|
||||||
///
|
///
|
||||||
/// Returns true if the state of the `Room` has changed, false otherwise.
|
/// Returns true if the state of the `Room` has changed, false otherwise.
|
||||||
///
|
///
|
||||||
|
@ -902,19 +904,32 @@ impl BaseClient {
|
||||||
/// * `room_id` - The unique id of the room the event belongs to.
|
/// * `room_id` - The unique id of the room the event belongs to.
|
||||||
///
|
///
|
||||||
/// * `event` - The presence event for a specified room member.
|
/// * `event` - The presence event for a specified room member.
|
||||||
pub async fn receive_account_data_event(
|
pub async fn receive_room_account_data_event(&self, _: &RoomId, event: &AnyBasicEvent) -> bool {
|
||||||
&self,
|
|
||||||
_: Option<&RoomId>,
|
|
||||||
event: &AnyBasicEvent,
|
|
||||||
) -> bool {
|
|
||||||
match event {
|
match event {
|
||||||
AnyBasicEvent::IgnoredUserList(event) => self.handle_ignored_users(event).await,
|
AnyBasicEvent::IgnoredUserList(event) => self.handle_ignored_users(event).await,
|
||||||
AnyBasicEvent::PushRules(event) => self.handle_push_rules(event).await,
|
AnyBasicEvent::PushRules(event) => self.handle_push_rules(event).await,
|
||||||
AnyBasicEvent::Direct(event) => self.handle_direct(event).await,
|
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Receive an account data event from a sync response and updates
|
||||||
|
/// the client state.
|
||||||
|
///
|
||||||
|
/// Returns true if the state of any room has changed, false otherwise.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `event` - The presence event for a specified room member.
|
||||||
|
pub async fn receive_account_data_event(
|
||||||
|
&self,
|
||||||
|
event: &AnyBasicEvent,
|
||||||
|
) -> Vec<Arc<RwLock<Room>>> {
|
||||||
|
match event {
|
||||||
|
AnyBasicEvent::Direct(event) => self.handle_direct(event).await,
|
||||||
|
_ => vec![],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Receive an ephemeral event from a sync response and updates the client state.
|
/// Receive an ephemeral event from a sync response and updates the client state.
|
||||||
///
|
///
|
||||||
/// Returns true if the state of the `Room` has changed, false otherwise.
|
/// Returns true if the state of the `Room` has changed, false otherwise.
|
||||||
|
@ -1076,7 +1091,7 @@ impl BaseClient {
|
||||||
// FIXME: receive_* and emit_* methods shouldn't be called in parallel. We
|
// FIXME: receive_* and emit_* methods shouldn't be called in parallel. We
|
||||||
// should only pass events to receive_* methods and then let *them* emit.
|
// should only pass events to receive_* methods and then let *them* emit.
|
||||||
if let Ok(e) = account_data.deserialize() {
|
if let Ok(e) = account_data.deserialize() {
|
||||||
if self.receive_account_data_event(Some(&room_id), &e).await {
|
if self.receive_room_account_data_event(&room_id, &e).await {
|
||||||
updated = true;
|
updated = true;
|
||||||
}
|
}
|
||||||
self.emit_account_data_event(room_id, &e, RoomStateType::Joined)
|
self.emit_account_data_event(room_id, &e, RoomStateType::Joined)
|
||||||
|
@ -1201,13 +1216,18 @@ impl BaseClient {
|
||||||
{
|
{
|
||||||
// FIXME: emit_account_data_event assumes a room is given
|
// FIXME: emit_account_data_event assumes a room is given
|
||||||
if let Ok(e) = account_data.deserialize() {
|
if let Ok(e) = account_data.deserialize() {
|
||||||
if self.receive_account_data_event(None, &e).await {
|
for room in self.receive_account_data_event(&e).await {
|
||||||
|
if let Some(store) = self.state_store.read().await.as_ref() {
|
||||||
|
// FIXME: currently only operate on Joined rooms
|
||||||
|
store
|
||||||
|
.store_room_state(RoomState::Joined(room.read().await.deref()))
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
updated = true;
|
updated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// FIXME store all rooms if updated?
|
|
||||||
Ok(updated)
|
Ok(updated)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue