@@ -16,21 +16,15 @@ use std::sync::Arc;
1616
1717use as_variant:: as_variant;
1818use matrix_sdk:: crypto:: types:: events:: UtdCause ;
19- use matrix_sdk_base:: latest_event:: { PossibleLatestEvent , is_suitable_for_latest_event} ;
2019use ruma:: {
2120 OwnedDeviceId , OwnedEventId , OwnedMxcUri , OwnedUserId , UserId ,
2221 events:: {
23- AnyFullStateEventContent , AnySyncTimelineEvent , FullStateEventContent , Mentions ,
24- MessageLikeEventType , StateEventType ,
25- call:: { invite:: SyncCallInviteEvent , notify:: SyncCallNotifyEvent } ,
22+ AnyFullStateEventContent , FullStateEventContent , Mentions , MessageLikeEventType ,
23+ StateEventType ,
2624 policy:: rule:: {
2725 room:: PolicyRuleRoomEventContent , server:: PolicyRuleServerEventContent ,
2826 user:: PolicyRuleUserEventContent ,
2927 } ,
30- poll:: unstable_start:: {
31- NewUnstablePollStartEventContent , SyncUnstablePollStartEvent ,
32- UnstablePollStartEventContent ,
33- } ,
3428 room:: {
3529 aliases:: RoomAliasesEventContent ,
3630 avatar:: RoomAvatarEventContent ,
@@ -41,23 +35,22 @@ use ruma::{
4135 guest_access:: RoomGuestAccessEventContent ,
4236 history_visibility:: RoomHistoryVisibilityEventContent ,
4337 join_rules:: RoomJoinRulesEventContent ,
44- member:: { Change , RoomMemberEventContent , SyncRoomMemberEvent } ,
45- message:: { MessageType , Relation , SyncRoomMessageEvent } ,
38+ member:: { Change , RoomMemberEventContent } ,
39+ message:: MessageType ,
4640 name:: RoomNameEventContent ,
4741 pinned_events:: RoomPinnedEventsEventContent ,
48- power_levels:: { RoomPowerLevels , RoomPowerLevelsEventContent } ,
42+ power_levels:: RoomPowerLevelsEventContent ,
4943 server_acl:: RoomServerAclEventContent ,
5044 third_party_invite:: RoomThirdPartyInviteEventContent ,
5145 tombstone:: RoomTombstoneEventContent ,
5246 topic:: RoomTopicEventContent ,
5347 } ,
5448 space:: { child:: SpaceChildEventContent , parent:: SpaceParentEventContent } ,
55- sticker:: { StickerEventContent , SyncStickerEvent } ,
49+ sticker:: StickerEventContent ,
5650 } ,
5751 html:: RemoveReplyFallback ,
5852 room_version_rules:: RedactionRules ,
5953} ;
60- use tracing:: warn;
6154
6255mod message;
6356mod msg_like;
@@ -121,222 +114,6 @@ pub enum TimelineItemContent {
121114}
122115
123116impl 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-
340117 pub fn as_msglike ( & self ) -> Option < & MsgLikeContent > {
341118 as_variant ! ( self , TimelineItemContent :: MsgLike )
342119 }
0 commit comments