feat(sliding-sync): properly handle all timeline event types

This commit is contained in:
Benjamin Kampmann
2022-11-25 12:20:03 +00:00
parent f919ee3b7d
commit 83d0abc6d7
2 changed files with 52 additions and 13 deletions

View File

@@ -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 {

View File

@@ -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::<Local>::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::<Local>::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::<Local>::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::<Local>::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::<Local>::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::<Local>::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);