@@ -16,21 +16,15 @@ use std::sync::Arc;
16
16
17
17
use as_variant:: as_variant;
18
18
use matrix_sdk:: crypto:: types:: events:: UtdCause ;
19
- use matrix_sdk_base:: latest_event:: { PossibleLatestEvent , is_suitable_for_latest_event} ;
20
19
use ruma:: {
21
20
OwnedDeviceId , OwnedEventId , OwnedMxcUri , OwnedUserId , UserId ,
22
21
events:: {
23
- AnyFullStateEventContent , AnySyncTimelineEvent , FullStateEventContent , Mentions ,
24
- MessageLikeEventType , StateEventType ,
25
- call:: { invite:: SyncCallInviteEvent , notify:: SyncCallNotifyEvent } ,
22
+ AnyFullStateEventContent , FullStateEventContent , Mentions , MessageLikeEventType ,
23
+ StateEventType ,
26
24
policy:: rule:: {
27
25
room:: PolicyRuleRoomEventContent , server:: PolicyRuleServerEventContent ,
28
26
user:: PolicyRuleUserEventContent ,
29
27
} ,
30
- poll:: unstable_start:: {
31
- NewUnstablePollStartEventContent , SyncUnstablePollStartEvent ,
32
- UnstablePollStartEventContent ,
33
- } ,
34
28
room:: {
35
29
aliases:: RoomAliasesEventContent ,
36
30
avatar:: RoomAvatarEventContent ,
@@ -41,23 +35,22 @@ use ruma::{
41
35
guest_access:: RoomGuestAccessEventContent ,
42
36
history_visibility:: RoomHistoryVisibilityEventContent ,
43
37
join_rules:: RoomJoinRulesEventContent ,
44
- member:: { Change , RoomMemberEventContent , SyncRoomMemberEvent } ,
45
- message:: { MessageType , Relation , SyncRoomMessageEvent } ,
38
+ member:: { Change , RoomMemberEventContent } ,
39
+ message:: MessageType ,
46
40
name:: RoomNameEventContent ,
47
41
pinned_events:: RoomPinnedEventsEventContent ,
48
- power_levels:: { RoomPowerLevels , RoomPowerLevelsEventContent } ,
42
+ power_levels:: RoomPowerLevelsEventContent ,
49
43
server_acl:: RoomServerAclEventContent ,
50
44
third_party_invite:: RoomThirdPartyInviteEventContent ,
51
45
tombstone:: RoomTombstoneEventContent ,
52
46
topic:: RoomTopicEventContent ,
53
47
} ,
54
48
space:: { child:: SpaceChildEventContent , parent:: SpaceParentEventContent } ,
55
- sticker:: { StickerEventContent , SyncStickerEvent } ,
49
+ sticker:: StickerEventContent ,
56
50
} ,
57
51
html:: RemoveReplyFallback ,
58
52
room_version_rules:: RedactionRules ,
59
53
} ;
60
- use tracing:: warn;
61
54
62
55
mod message;
63
56
mod msg_like;
@@ -121,222 +114,6 @@ pub enum TimelineItemContent {
121
114
}
122
115
123
116
impl TimelineItemContent {
124
- /// If the supplied event is suitable to be used as a `latest_event` in a
125
- /// message preview, extract its contents and wrap it as a
126
- /// `TimelineItemContent`.
127
- pub ( crate ) fn from_latest_event_content (
128
- event : AnySyncTimelineEvent ,
129
- power_levels_info : Option < ( & UserId , & RoomPowerLevels ) > ,
130
- ) -> Option < TimelineItemContent > {
131
- match is_suitable_for_latest_event ( & event, power_levels_info) {
132
- PossibleLatestEvent :: YesRoomMessage ( m) => {
133
- Some ( Self :: from_suitable_latest_event_content ( m) )
134
- }
135
- PossibleLatestEvent :: YesSticker ( s) => {
136
- Some ( Self :: from_suitable_latest_sticker_content ( s) )
137
- }
138
- PossibleLatestEvent :: YesPoll ( poll) => {
139
- Some ( Self :: from_suitable_latest_poll_event_content ( poll) )
140
- }
141
- PossibleLatestEvent :: YesCallInvite ( call_invite) => {
142
- Some ( Self :: from_suitable_latest_call_invite_content ( call_invite) )
143
- }
144
- PossibleLatestEvent :: YesCallNotify ( call_notify) => {
145
- Some ( Self :: from_suitable_latest_call_notify_content ( call_notify) )
146
- }
147
- PossibleLatestEvent :: NoUnsupportedEventType => {
148
- // TODO: when we support state events in message previews, this will need change
149
- warn ! ( "Found a state event cached as latest_event! ID={}" , event. event_id( ) ) ;
150
- None
151
- }
152
- PossibleLatestEvent :: NoUnsupportedMessageLikeType => {
153
- // TODO: When we support reactions in message previews, this will need to change
154
- warn ! (
155
- "Found an event cached as latest_event, but I don't know how \
156
- to wrap it in a TimelineItemContent. type={}, ID={}",
157
- event. event_type( ) . to_string( ) ,
158
- event. event_id( )
159
- ) ;
160
- None
161
- }
162
- PossibleLatestEvent :: YesKnockedStateEvent ( member) => {
163
- Some ( Self :: from_suitable_latest_knock_state_event_content ( member) )
164
- }
165
- PossibleLatestEvent :: NoEncrypted => {
166
- warn ! ( "Found an encrypted event cached as latest_event! ID={}" , event. event_id( ) ) ;
167
- None
168
- }
169
- }
170
- }
171
-
172
- /// Given some message content that is from an event that we have already
173
- /// determined is suitable for use as a latest event in a message preview,
174
- /// extract its contents and wrap it as a `TimelineItemContent`.
175
- fn from_suitable_latest_event_content ( event : & SyncRoomMessageEvent ) -> TimelineItemContent {
176
- match event {
177
- SyncRoomMessageEvent :: Original ( event) => {
178
- // Grab the content of this event
179
- let event_content = event. content . clone ( ) ;
180
-
181
- // Feed the bundled edit, if present, or we might miss showing edited content.
182
- let edit = event
183
- . unsigned
184
- . relations
185
- . replace
186
- . as_ref ( )
187
- . and_then ( |boxed| match & boxed. content . relates_to {
188
- Some ( Relation :: Replacement ( re) ) => Some ( re. new_content . clone ( ) ) ,
189
- _ => {
190
- warn ! ( "got m.room.message event with an edit without a valid m.replace relation" ) ;
191
- None
192
- }
193
- } ) ;
194
-
195
- // We're not interested in aggregations for the latest preview item.
196
- let reactions = Default :: default ( ) ;
197
- let thread_root = None ;
198
- let in_reply_to = None ;
199
- let thread_summary = None ;
200
-
201
- let msglike = MsgLikeContent {
202
- kind : MsgLikeKind :: Message ( Message :: from_event (
203
- event_content. msgtype ,
204
- event_content. mentions ,
205
- edit,
206
- RemoveReplyFallback :: Yes ,
207
- ) ) ,
208
- reactions,
209
- thread_root,
210
- in_reply_to,
211
- thread_summary,
212
- } ;
213
-
214
- TimelineItemContent :: MsgLike ( msglike)
215
- }
216
-
217
- SyncRoomMessageEvent :: Redacted ( _) => {
218
- TimelineItemContent :: MsgLike ( MsgLikeContent :: redacted ( ) )
219
- }
220
- }
221
- }
222
-
223
- fn from_suitable_latest_knock_state_event_content (
224
- event : & SyncRoomMemberEvent ,
225
- ) -> TimelineItemContent {
226
- match event {
227
- SyncRoomMemberEvent :: Original ( event) => {
228
- let content = event. content . clone ( ) ;
229
- let prev_content = event. prev_content ( ) . cloned ( ) ;
230
- TimelineItemContent :: room_member (
231
- event. state_key . to_owned ( ) ,
232
- FullStateEventContent :: Original { content, prev_content } ,
233
- event. sender . to_owned ( ) ,
234
- )
235
- }
236
- SyncRoomMemberEvent :: Redacted ( _) => {
237
- TimelineItemContent :: MsgLike ( MsgLikeContent :: redacted ( ) )
238
- }
239
- }
240
- }
241
-
242
- /// Given some sticker content that is from an event that we have already
243
- /// determined is suitable for use as a latest event in a message preview,
244
- /// extract its contents and wrap it as a `TimelineItemContent`.
245
- fn from_suitable_latest_sticker_content ( event : & SyncStickerEvent ) -> TimelineItemContent {
246
- match event {
247
- SyncStickerEvent :: Original ( event) => {
248
- // Grab the content of this event
249
- let event_content = event. content . clone ( ) ;
250
-
251
- // We're not interested in aggregations for the latest preview item.
252
- let reactions = Default :: default ( ) ;
253
- let thread_root = None ;
254
- let in_reply_to = None ;
255
- let thread_summary = None ;
256
-
257
- let msglike = MsgLikeContent {
258
- kind : MsgLikeKind :: Sticker ( Sticker { content : event_content } ) ,
259
- reactions,
260
- thread_root,
261
- in_reply_to,
262
- thread_summary,
263
- } ;
264
-
265
- TimelineItemContent :: MsgLike ( msglike)
266
- }
267
- SyncStickerEvent :: Redacted ( _) => {
268
- TimelineItemContent :: MsgLike ( MsgLikeContent :: redacted ( ) )
269
- }
270
- }
271
- }
272
-
273
- /// Extracts a `TimelineItemContent` from a poll start event for use as a
274
- /// latest event in a message preview.
275
- fn from_suitable_latest_poll_event_content (
276
- event : & SyncUnstablePollStartEvent ,
277
- ) -> TimelineItemContent {
278
- let SyncUnstablePollStartEvent :: Original ( event) = event else {
279
- return TimelineItemContent :: MsgLike ( MsgLikeContent :: redacted ( ) ) ;
280
- } ;
281
-
282
- // Feed the bundled edit, if present, or we might miss showing edited content.
283
- let edit =
284
- event. unsigned . relations . replace . as_ref ( ) . and_then ( |boxed| match & boxed. content {
285
- UnstablePollStartEventContent :: Replacement ( re) => {
286
- Some ( re. relates_to . new_content . clone ( ) )
287
- }
288
- _ => {
289
- warn ! ( "got poll event with an edit without a valid m.replace relation" ) ;
290
- None
291
- }
292
- } ) ;
293
-
294
- let mut poll = PollState :: new ( NewUnstablePollStartEventContent :: new (
295
- event. content . poll_start ( ) . clone ( ) ,
296
- ) ) ;
297
- if let Some ( edit) = edit {
298
- poll = poll. edit ( edit) . expect ( "the poll can't be ended yet!" ) ; // TODO or can it?
299
- }
300
-
301
- // We're not interested in aggregations for the latest preview item.
302
- let reactions = Default :: default ( ) ;
303
- let thread_root = None ;
304
- let in_reply_to = None ;
305
- let thread_summary = None ;
306
-
307
- let msglike = MsgLikeContent {
308
- kind : MsgLikeKind :: Poll ( poll) ,
309
- reactions,
310
- thread_root,
311
- in_reply_to,
312
- thread_summary,
313
- } ;
314
-
315
- TimelineItemContent :: MsgLike ( msglike)
316
- }
317
-
318
- fn from_suitable_latest_call_invite_content (
319
- event : & SyncCallInviteEvent ,
320
- ) -> TimelineItemContent {
321
- match event {
322
- SyncCallInviteEvent :: Original ( _) => TimelineItemContent :: CallInvite ,
323
- SyncCallInviteEvent :: Redacted ( _) => {
324
- TimelineItemContent :: MsgLike ( MsgLikeContent :: redacted ( ) )
325
- }
326
- }
327
- }
328
-
329
- fn from_suitable_latest_call_notify_content (
330
- event : & SyncCallNotifyEvent ,
331
- ) -> TimelineItemContent {
332
- match event {
333
- SyncCallNotifyEvent :: Original ( _) => TimelineItemContent :: CallNotify ,
334
- SyncCallNotifyEvent :: Redacted ( _) => {
335
- TimelineItemContent :: MsgLike ( MsgLikeContent :: redacted ( ) )
336
- }
337
- }
338
- }
339
-
340
117
pub fn as_msglike ( & self ) -> Option < & MsgLikeContent > {
341
118
as_variant ! ( self , TimelineItemContent :: MsgLike )
342
119
}
0 commit comments