From 7d5908beef5bc9ae4ce99aada607b5a2a04523dc Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Wed, 19 Apr 2023 18:50:49 +0200 Subject: [PATCH] sdk: Add more data to RemoteEventTimelineItem Debug string --- .../src/room/timeline/event_handler.rs | 23 ++++++++-- .../src/room/timeline/event_item/mod.rs | 5 ++- .../src/room/timeline/event_item/remote.rs | 43 ++++++++++++++++--- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/crates/matrix-sdk/src/room/timeline/event_handler.rs b/crates/matrix-sdk/src/room/timeline/event_handler.rs index 0d6cd5cb9..c4908c8e5 100644 --- a/crates/matrix-sdk/src/room/timeline/event_handler.rs +++ b/crates/matrix-sdk/src/room/timeline/event_handler.rs @@ -44,8 +44,8 @@ use tracing::{debug, error, field::debug, info, instrument, trace, warn}; use super::{ event_item::{ AnyOtherFullStateEventContent, BundledReactions, EventSendState, EventTimelineItemKind, - LocalEventTimelineItem, MemberProfileChange, OtherState, Profile, RemoteEventTimelineItem, - RoomMembershipChange, Sticker, + LocalEventTimelineItem, MemberProfileChange, OtherState, Profile, RemoteEventOrigin, + RemoteEventTimelineItem, RoomMembershipChange, Sticker, }, find_read_marker, read_receipts::maybe_add_implicit_read_receipt, @@ -558,7 +558,7 @@ impl<'a> TimelineEventHandler<'a> { LocalEventTimelineItem { send_state, transaction_id } } .into(), - Flow::Remote { event_id, raw_event, .. } => { + Flow::Remote { event_id, raw_event, position, .. } => { // Drop pending reactions if the message is redacted. if let TimelineItemContent::RedactedMessage = content { if !reactions.is_empty() { @@ -566,15 +566,30 @@ impl<'a> TimelineEventHandler<'a> { } } + let origin = match position { + TimelineItemPosition::Start => RemoteEventOrigin::Pagination, + // We only paginate backwards for now, so End only happens for syncs + TimelineItemPosition::End => RemoteEventOrigin::Sync, + #[cfg(feature = "e2e-encryption")] + TimelineItemPosition::Update(idx) => self.items[*idx] + .as_event() + .and_then(|ev| Some(ev.as_remote()?.origin)) + .unwrap_or_else(|| { + error!("Decryption retried on a local event"); + RemoteEventOrigin::Unknown + }), + }; + RemoteEventTimelineItem { event_id: event_id.clone(), reactions, read_receipts: self.meta.read_receipts.clone(), is_own: self.meta.is_own_event, + is_highlighted: self.meta.is_highlighted, encryption_info: self.meta.encryption_info.clone(), original_json: raw_event.clone(), latest_edit_json: None, - is_highlighted: self.meta.is_highlighted, + origin, } .into() } diff --git a/crates/matrix-sdk/src/room/timeline/event_item/mod.rs b/crates/matrix-sdk/src/room/timeline/event_item/mod.rs index 1145d7f3a..26384cb92 100644 --- a/crates/matrix-sdk/src/room/timeline/event_item/mod.rs +++ b/crates/matrix-sdk/src/room/timeline/event_item/mod.rs @@ -35,7 +35,10 @@ pub use self::content::{ MemberProfileChange, MembershipChange, Message, OtherState, ReactionGroup, RepliedToEvent, RoomMembershipChange, Sticker, TimelineItemContent, }; -pub(super) use self::{local::LocalEventTimelineItem, remote::RemoteEventTimelineItem}; +pub(super) use self::{ + local::LocalEventTimelineItem, + remote::{RemoteEventOrigin, RemoteEventTimelineItem}, +}; /// An item in the timeline that represents at least one event. /// diff --git a/crates/matrix-sdk/src/room/timeline/event_item/remote.rs b/crates/matrix-sdk/src/room/timeline/event_item/remote.rs index 0125035da..a91cdf05c 100644 --- a/crates/matrix-sdk/src/room/timeline/event_item/remote.rs +++ b/crates/matrix-sdk/src/room/timeline/event_item/remote.rs @@ -26,6 +26,8 @@ pub(in crate::room::timeline) struct RemoteEventTimelineItem { pub read_receipts: IndexMap, /// Whether the event has been sent by the the logged-in user themselves. pub is_own: bool, + /// Whether the item should be highlighted in the timeline. + pub is_highlighted: bool, /// Encryption information. pub encryption_info: Option, /// JSON of the original event. @@ -35,8 +37,8 @@ pub(in crate::room::timeline) struct RemoteEventTimelineItem { pub original_json: Raw, /// JSON of the latest edit to this item. pub latest_edit_json: Option>, - /// Whether the item should be highlighted in the timeline. - pub is_highlighted: bool, + /// Where we got this event from: A sync response or pagination. + pub origin: RemoteEventOrigin, } impl RemoteEventTimelineItem { @@ -63,15 +65,42 @@ impl RemoteEventTimelineItem { } } +/// Where we got an event from. +#[derive(Clone, Copy, Debug)] +pub(in crate::room::timeline) enum RemoteEventOrigin { + /// The event came from a sync response. + Sync, + /// The event came from pagination. + Pagination, + /// We don't know. + #[cfg(feature = "e2e-encryption")] + Unknown, +} + #[cfg(not(tarpaulin_include))] impl fmt::Debug for RemoteEventTimelineItem { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // skip raw JSON, too noisy + let Self { + event_id, + reactions, + read_receipts, + is_own, + encryption_info, + original_json: _, + latest_edit_json: _, + is_highlighted, + origin, + } = self; + f.debug_struct("RemoteEventTimelineItem") - .field("event_id", &self.event_id) - .field("reactions", &self.reactions) - .field("is_own", &self.is_own) - .field("encryption_info", &self.encryption_info) - // skip raw, too noisy + .field("event_id", event_id) + .field("reactions", reactions) + .field("read_receipts", read_receipts) + .field("is_own", is_own) + .field("is_highlighted", is_highlighted) + .field("encryption_info", encryption_info) + .field("origin", origin) .finish_non_exhaustive() } }