@@ -698,19 +698,20 @@ impl BaseClient {
698
698
/// Handle a m.direct event, updating rooms states if necessary.
699
699
///
700
700
/// Returns true if any room changed, false otherwise.
701
- pub ( crate ) async fn handle_direct ( & self , event : & DirectEvent ) -> bool {
702
- let mut update = false ;
701
+ pub ( crate ) async fn handle_direct ( & self , event : & DirectEvent ) -> Vec < Arc < RwLock < Room > > > {
702
+ let mut updated_rooms = vec ! [ ] ;
703
+
703
704
for ( user_id, rooms) in event. content . iter ( ) {
704
705
for room_id in rooms. iter ( ) {
705
- if let Some ( room) = self . get_joined_room ( room_id) . await {
706
- let mut room = room. write ( ) . await ;
707
- if room . handle_direct ( user_id) {
708
- update = true ;
706
+ if let Some ( room) = & self . get_joined_room ( room_id) . await {
707
+ let mut room_locked = room. write ( ) . await ;
708
+ if room_locked . handle_direct ( user_id) {
709
+ updated_rooms . push ( room . to_owned ( ) ) ;
709
710
}
710
711
}
711
712
}
712
713
}
713
- update
714
+ updated_rooms
714
715
}
715
716
716
717
/// Receive a timeline event for a joined room and update the client state.
@@ -893,7 +894,8 @@ impl BaseClient {
893
894
}
894
895
}
895
896
896
- /// Receive an account data event from a sync response and updates the client state.
897
+ /// Receive an account data event associated to a room from a sync
898
+ /// response and updates the client state.
897
899
///
898
900
/// Returns true if the state of the `Room` has changed, false otherwise.
899
901
///
@@ -902,16 +904,29 @@ impl BaseClient {
902
904
/// * `room_id` - The unique id of the room the event belongs to.
903
905
///
904
906
/// * `event` - The presence event for a specified room member.
907
+ pub async fn receive_room_account_data_event ( & self , _: & RoomId , event : & AnyBasicEvent ) -> bool {
908
+ match event {
909
+ AnyBasicEvent :: IgnoredUserList ( event) => self . handle_ignored_users ( event) . await ,
910
+ AnyBasicEvent :: PushRules ( event) => self . handle_push_rules ( event) . await ,
911
+ _ => false ,
912
+ }
913
+ }
914
+
915
+ /// Receive an account data event from a sync response and updates
916
+ /// the client state.
917
+ ///
918
+ /// Returns true if the state of any room has changed, false otherwise.
919
+ ///
920
+ /// # Arguments
921
+ ///
922
+ /// * `event` - The presence event for a specified room member.
905
923
pub async fn receive_account_data_event (
906
924
& self ,
907
- _: Option < & RoomId > ,
908
925
event : & AnyBasicEvent ,
909
- ) -> bool {
926
+ ) -> Vec < Arc < RwLock < Room > > > {
910
927
match event {
911
- AnyBasicEvent :: IgnoredUserList ( event) => self . handle_ignored_users ( event) . await ,
912
- AnyBasicEvent :: PushRules ( event) => self . handle_push_rules ( event) . await ,
913
928
AnyBasicEvent :: Direct ( event) => self . handle_direct ( event) . await ,
914
- _ => false ,
929
+ _ => vec ! [ ] ,
915
930
}
916
931
}
917
932
@@ -1076,7 +1091,7 @@ impl BaseClient {
1076
1091
// FIXME: receive_* and emit_* methods shouldn't be called in parallel. We
1077
1092
// should only pass events to receive_* methods and then let *them* emit.
1078
1093
if let Ok ( e) = account_data. deserialize ( ) {
1079
- if self . receive_account_data_event ( Some ( & room_id) , & e) . await {
1094
+ if self . receive_room_account_data_event ( & room_id, & e) . await {
1080
1095
updated = true ;
1081
1096
}
1082
1097
self . emit_account_data_event ( room_id, & e, RoomStateType :: Joined )
@@ -1201,13 +1216,18 @@ impl BaseClient {
1201
1216
{
1202
1217
// FIXME: emit_account_data_event assumes a room is given
1203
1218
if let Ok ( e) = account_data. deserialize ( ) {
1204
- if self . receive_account_data_event ( None , & e) . await {
1219
+ for room in self . receive_account_data_event ( & e) . await {
1220
+ if let Some ( store) = self . state_store . read ( ) . await . as_ref ( ) {
1221
+ // FIXME: currently only operate on Joined rooms
1222
+ store
1223
+ . store_room_state ( RoomState :: Joined ( room. read ( ) . await . deref ( ) ) )
1224
+ . await ?;
1225
+ }
1205
1226
updated = true ;
1206
1227
}
1207
1228
}
1208
1229
}
1209
1230
}
1210
- // FIXME store all rooms if updated?
1211
1231
Ok ( updated)
1212
1232
}
1213
1233
0 commit comments