From 83d0abc6d702acc9da4d9b9bf5b85d7bc9d73bbe Mon Sep 17 00:00:00 2001 From: Benjamin Kampmann Date: Fri, 25 Nov 2022 12:20:03 +0000 Subject: [PATCH] feat(sliding-sync): properly handle all timeline event types --- labs/jack-in/src/client/state.rs | 2 +- labs/jack-in/src/components/details.rs | 63 +++++++++++++++++++++----- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/labs/jack-in/src/client/state.rs b/labs/jack-in/src/client/state.rs index d0a8bfacd..353454678 100644 --- a/labs/jack-in/src/client/state.rs +++ b/labs/jack-in/src/client/state.rs @@ -61,7 +61,7 @@ impl SlidingSyncState { { let current_timeline = self.current_timeline.clone(); let handle = tokio::spawn(async move { - let timeline = room.timeline().await; + let timeline = room.timeline().await.unwrap(); let listener = timeline.stream(); pin_mut!(listener); while let Some(diff) = listener.next().await { diff --git a/labs/jack-in/src/components/details.rs b/labs/jack-in/src/components/details.rs index dc8b2c570..9df35c056 100644 --- a/labs/jack-in/src/components/details.rs +++ b/labs/jack-in/src/components/details.rs @@ -1,6 +1,7 @@ use std::collections::BTreeMap; use chrono::{offset::Local, DateTime}; +use matrix_sdk::room::timeline::TimelineItemContent; use tuirealm::{ command::{Cmd, CmdResult}, event::{Key, KeyEvent, KeyModifiers}, @@ -74,18 +75,56 @@ impl Details { .lock_ref() .iter() .filter_map(|t| t.as_event()) // we ignore virtual events - .filter_map(|e| e.content().as_message().map(|m| (e, m))) - .map(|(e, m)| { - format!( - "[{}] {}: {}", - e.origin_server_ts() - .and_then(|r| r.to_system_time()) - .map(|s| DateTime::::from(s).format("%Y-%m-%dT%T").to_string()) - .unwrap_or_default(), - e.sender(), - m.body() - ) - }) + .map(|e| + match e.content() { + TimelineItemContent::Message(m) => format!( + "[{}] {}: {}", + e.origin_server_ts() + .and_then(|r| r.to_system_time()) + .map(|s| DateTime::::from(s).format("%Y-%m-%dT%T").to_string()) + .unwrap_or_default(), + e.sender(), + m.body() + ), + TimelineItemContent::RedactedMessage => format!( + "[{}] {} - redacted -", + e.origin_server_ts() + .and_then(|r| r.to_system_time()) + .map(|s| DateTime::::from(s).format("%Y-%m-%dT%T").to_string()) + .unwrap_or_default(), + e.sender(), + ), + TimelineItemContent::UnableToDecrypt(_) => format!( + "[{}] {} - unable to decrypt -", + e.origin_server_ts() + .and_then(|r| r.to_system_time()) + .map(|s| DateTime::::from(s).format("%Y-%m-%dT%T").to_string()) + .unwrap_or_default(), + e.sender(), + ), + TimelineItemContent::FailedToParseState { event_type, state_key, error }=> format!( + "[{}] {} - failed to parse {}({}): {}", + e.origin_server_ts() + .and_then(|r| r.to_system_time()) + .map(|s| DateTime::::from(s).format("%Y-%m-%dT%T").to_string()) + .unwrap_or_default(), + e.sender(), + event_type, + state_key, + error, + ), + TimelineItemContent::FailedToParseMessageLike { event_type, error } => format!( + "[{}] {} - failed to parse {}: {}", + e.origin_server_ts() + .and_then(|r| r.to_system_time()) + .map(|s| DateTime::::from(s).format("%Y-%m-%dT%T").to_string()) + .unwrap_or_default(), + e.sender(), + event_type, + error, + ), + } + ) .collect(); self.current_room_timeline = timeline; self.name = Some(name);