@@ -26,8 +26,9 @@ use ruma::{
2626 } ,
2727 assign,
2828 events:: {
29- AnyMessageLikeEventContent , AnyStateEventContent , AnySyncTimelineEvent , AnyTimelineEvent ,
30- MessageLikeEventType , StateEventType , TimelineEventType ,
29+ AnyMessageLikeEventContent , AnyStateEventContent , AnySyncMessageLikeEvent ,
30+ AnySyncStateEvent , AnySyncTimelineEvent , AnyTimelineEvent , MessageLikeEventType ,
31+ StateEventType , TimelineEventType ,
3132 } ,
3233 serde:: { from_raw_json_value, Raw } ,
3334 EventId , RoomId , TransactionId ,
@@ -177,21 +178,39 @@ impl MatrixDriver {
177178 pub ( crate ) fn events ( & self ) -> EventReceiver {
178179 let ( tx, rx) = unbounded_channel ( ) ;
179180 let room_id = self . room . room_id ( ) . to_owned ( ) ;
180- let handle = self . room . add_event_handler ( move |raw : Raw < AnySyncTimelineEvent > | {
181- let _ = tx. send ( attach_room_id ( & raw , & room_id) ) ;
181+
182+ // Get only message like events from the timeline section of the sync.
183+ let _tx = tx. clone ( ) ;
184+ let _room_id = room_id. clone ( ) ;
185+ let handle_msg_like =
186+ self . room . add_event_handler ( move |raw : Raw < AnySyncMessageLikeEvent > | {
187+ let _ = _tx. send ( attach_room_id ( raw. cast_ref ( ) , & _room_id) ) ;
188+ async { }
189+ } ) ;
190+ let drop_guard_msg_like = self . room . client ( ) . event_handler_drop_guard ( handle_msg_like) ;
191+
192+ // Get only all state events from the state section of the sync.
193+ let handle_state = self . room . add_event_handler ( move |raw : Raw < AnySyncStateEvent > | {
194+ let _ = tx. send ( attach_room_id ( raw. cast_ref ( ) , & room_id) ) ;
182195 async { }
183196 } ) ;
184-
185- let drop_guard = self . room . client ( ) . event_handler_drop_guard ( handle) ;
186- EventReceiver { rx, _drop_guard : drop_guard }
197+ let drop_guard_state = self . room . client ( ) . event_handler_drop_guard ( handle_state) ;
198+
199+ // The receiver will get a combination of state and message like events.
200+ // The state events will come from the state section of the sync (to always
201+ // represent current resolved state). All state events in the timeline
202+ // section of the sync will not be forwarded to the widget.
203+ // TODO annotate the events and send both timeline and state section state
204+ // events.
205+ EventReceiver { rx, _drop_guards : [ drop_guard_msg_like, drop_guard_state] }
187206 }
188207}
189208
190209/// A simple entity that wraps an `UnboundedReceiver`
191210/// along with the drop guard for the room event handler.
192211pub ( crate ) struct EventReceiver {
193212 rx : UnboundedReceiver < Raw < AnyTimelineEvent > > ,
194- _drop_guard : EventHandlerDropGuard ,
213+ _drop_guards : [ EventHandlerDropGuard ; 2 ] ,
195214}
196215
197216impl EventReceiver {
0 commit comments