15
15
use std:: sync:: Arc ;
16
16
17
17
use imbl:: Vector ;
18
- use matrix_sdk:: {
19
- crypto:: types:: events:: UtdCause ,
20
- deserialized_responses:: { TimelineEvent , TimelineEventKind } ,
21
- Room ,
22
- } ;
23
- use ruma:: {
24
- events:: {
25
- poll:: unstable_start:: UnstablePollStartEventContent , AnyMessageLikeEventContent ,
26
- AnySyncTimelineEvent ,
27
- } ,
28
- html:: RemoveReplyFallback ,
29
- OwnedEventId , OwnedUserId , UserId ,
30
- } ;
18
+ use matrix_sdk:: deserialized_responses:: TimelineEvent ;
19
+ use ruma:: { OwnedEventId , OwnedUserId , UserId } ;
31
20
use tracing:: { debug, instrument, warn} ;
32
21
33
22
use super :: TimelineItemContent ;
34
23
use crate :: timeline:: {
35
- event_item:: {
36
- content:: { MsgLikeContent , MsgLikeKind } ,
37
- extract_room_msg_edit_content, EventTimelineItem , Profile , TimelineDetails ,
38
- } ,
24
+ controller:: TimelineMetadata ,
25
+ event_handler:: TimelineAction ,
26
+ event_item:: { content:: MsgLikeContent , EventTimelineItem , Profile , TimelineDetails } ,
39
27
traits:: RoomDataProvider ,
40
- EncryptedMessage , Error as TimelineError , Message , PollState , ReactionsByKeyBySender , Sticker ,
41
- TimelineItem ,
28
+ Error as TimelineError , TimelineItem ,
42
29
} ;
43
30
44
31
/// Details about an event being replied to.
@@ -104,26 +91,23 @@ impl RepliedToEvent {
104
91
}
105
92
}
106
93
107
- /// Try to create a `RepliedToEvent` from a `TimelineEvent` by providing the
108
- /// room.
109
- pub async fn try_from_timeline_event_for_room (
110
- timeline_event : TimelineEvent ,
111
- room_data_provider : & Room ,
112
- ) -> Result < Self , TimelineError > {
113
- Self :: try_from_timeline_event ( timeline_event, room_data_provider) . await
114
- }
115
-
116
94
#[ instrument( skip_all) ]
117
95
pub ( in crate :: timeline) async fn try_from_timeline_event < P : RoomDataProvider > (
118
96
timeline_event : TimelineEvent ,
119
97
room_data_provider : & P ,
98
+ timeline_items : & Vector < Arc < TimelineItem > > ,
99
+ meta : & mut TimelineMetadata ,
120
100
) -> Result < Self , TimelineError > {
121
- let event = match timeline_event. raw ( ) . deserialize ( ) {
122
- Ok ( AnySyncTimelineEvent :: MessageLike ( event) ) => event,
123
- Ok ( _) => {
124
- warn ! ( "can't get details, event isn't a message-like event" ) ;
125
- return Err ( TimelineError :: UnsupportedEvent ) ;
126
- }
101
+ let ( raw_event, unable_to_decrypt_info) = match timeline_event. kind {
102
+ matrix_sdk:: deserialized_responses:: TimelineEventKind :: UnableToDecrypt {
103
+ utd_info,
104
+ event,
105
+ } => ( event, Some ( utd_info) ) ,
106
+ _ => ( timeline_event. kind . into_raw ( ) , None ) ,
107
+ } ;
108
+
109
+ let event = match raw_event. deserialize ( ) {
110
+ Ok ( event) => event,
127
111
Err ( err) => {
128
112
warn ! ( "can't get details, event couldn't be deserialized: {err}" ) ;
129
113
return Err ( TimelineError :: UnsupportedEvent ) ;
@@ -132,94 +116,24 @@ impl RepliedToEvent {
132
116
133
117
debug ! ( event_type = %event. event_type( ) , "got deserialized event" ) ;
134
118
135
- let content = match event. original_content ( ) {
136
- Some ( content) => match content {
137
- AnyMessageLikeEventContent :: RoomMessage ( c) => {
138
- // Assume we're not interested in aggregations in this context:
139
- // this is information for an embedded (replied-to) event, that will usually not
140
- // include detailed information like reactions.
141
- let reactions = ReactionsByKeyBySender :: default ( ) ;
142
- let thread_root = None ;
143
- let in_reply_to = None ;
144
- let thread_summary = None ;
145
-
146
- TimelineItemContent :: MsgLike ( MsgLikeContent {
147
- kind : MsgLikeKind :: Message ( Message :: from_event (
148
- c. msgtype ,
149
- c. mentions ,
150
- extract_room_msg_edit_content ( event. relations ( ) ) ,
151
- RemoveReplyFallback :: Yes ,
152
- ) ) ,
153
- reactions,
154
- thread_root,
155
- in_reply_to,
156
- thread_summary,
157
- } )
158
- }
159
-
160
- AnyMessageLikeEventContent :: Sticker ( content) => {
161
- // Assume we're not interested in aggregations in this context.
162
- // (See above an explanation as to why that's the case.)
163
- let reactions = Default :: default ( ) ;
164
- let thread_root = None ;
165
- let in_reply_to = None ;
166
- let thread_summary = None ;
167
-
168
- TimelineItemContent :: MsgLike ( MsgLikeContent {
169
- kind : MsgLikeKind :: Sticker ( Sticker { content } ) ,
170
- reactions,
171
- thread_root,
172
- in_reply_to,
173
- thread_summary,
174
- } )
175
- }
176
-
177
- AnyMessageLikeEventContent :: RoomEncrypted ( content) => {
178
- let utd_cause = match & timeline_event. kind {
179
- TimelineEventKind :: UnableToDecrypt { utd_info, .. } => UtdCause :: determine (
180
- timeline_event. raw ( ) ,
181
- room_data_provider. crypto_context_info ( ) . await ,
182
- utd_info,
183
- ) ,
184
- _ => UtdCause :: Unknown ,
185
- } ;
186
-
187
- TimelineItemContent :: MsgLike ( MsgLikeContent :: unable_to_decrypt (
188
- EncryptedMessage :: from_content ( content, utd_cause) ,
189
- ) )
190
- }
191
-
192
- AnyMessageLikeEventContent :: UnstablePollStart (
193
- UnstablePollStartEventContent :: New ( content) ,
194
- ) => {
195
- // Assume we're not interested in aggregations in this context.
196
- // (See above an explanation as to why that's the case.)
197
- let reactions = Default :: default ( ) ;
198
- let thread_root = None ;
199
- let in_reply_to = None ;
200
- let thread_summary = None ;
201
-
202
- // TODO: could we provide the bundled edit here?
203
- let poll_state = PollState :: new ( content) ;
204
- TimelineItemContent :: MsgLike ( MsgLikeContent {
205
- kind : MsgLikeKind :: Poll ( poll_state) ,
206
- reactions,
207
- thread_root,
208
- in_reply_to,
209
- thread_summary,
210
- } )
211
- }
212
-
213
- _ => {
214
- warn ! ( "unsupported event type" ) ;
215
- return Err ( TimelineError :: UnsupportedEvent ) ;
216
- }
217
- } ,
218
-
219
- None => TimelineItemContent :: MsgLike ( MsgLikeContent :: redacted ( ) ) ,
119
+ let sender = event. sender ( ) . to_owned ( ) ;
120
+ let action = TimelineAction :: from_event (
121
+ event,
122
+ & raw_event,
123
+ room_data_provider,
124
+ unable_to_decrypt_info,
125
+ timeline_items,
126
+ meta,
127
+ )
128
+ . await ;
129
+
130
+ let content = if let Some ( TimelineAction :: AddItem { content, .. } ) = action {
131
+ content
132
+ } else {
133
+ // TODO: need some kind of "unsupported" event here: return an option
134
+ TimelineItemContent :: MsgLike ( MsgLikeContent :: redacted ( ) )
220
135
} ;
221
136
222
- let sender = event. sender ( ) . to_owned ( ) ;
223
137
let sender_profile = TimelineDetails :: from_initial_value (
224
138
room_data_provider. profile_from_user_id ( & sender) . await ,
225
139
) ;
0 commit comments