Format timeline events in a human-readable way
This commit is contained in:
@ -26,7 +26,8 @@ use matrix_sdk::ruma::OwnedRoomId;
|
|||||||
use matrix_sdk::Client;
|
use matrix_sdk::Client;
|
||||||
use matrix_sdk::Room;
|
use matrix_sdk::Room;
|
||||||
use matrix_sdk_ui::timeline::{
|
use matrix_sdk_ui::timeline::{
|
||||||
BackPaginationStatus, PaginationOptions, RoomExt, Timeline, TimelineItem,
|
BackPaginationStatus, PaginationOptions, RoomExt, Timeline, TimelineItem, TimelineItemKind,
|
||||||
|
VirtualTimelineItem,
|
||||||
};
|
};
|
||||||
use ratatui::text::Text;
|
use ratatui::text::Text;
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
@ -52,11 +53,153 @@ impl SingleClientRoomBuffer {
|
|||||||
}
|
}
|
||||||
if let Some(changes) = self.stream.next().await {
|
if let Some(changes) = self.stream.next().await {
|
||||||
for change in changes {
|
for change in changes {
|
||||||
change.map(|timeline_item| format!("{:#?}", timeline_item)).apply(&mut self.items);
|
change
|
||||||
|
.map(|item| self.format_timeline_item(item))
|
||||||
|
.apply(&mut self.items);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn format_timeline_item(&self, tl_item: impl AsRef<TimelineItem>) -> String {
|
||||||
|
match tl_item.as_ref().kind() {
|
||||||
|
TimelineItemKind::Event(event) => {
|
||||||
|
use matrix_sdk_ui::timeline::TimelineItemContent::*;
|
||||||
|
let sender = event
|
||||||
|
.sender()
|
||||||
|
.as_str()
|
||||||
|
.strip_prefix("@")
|
||||||
|
.expect("missing @ prefix");
|
||||||
|
match event.content() {
|
||||||
|
Message(message) => format!(" <{}> {}", sender, message.body().replace("\n", "\n ")),
|
||||||
|
RedactedMessage => format!("xx <{}> [redacted]", sender),
|
||||||
|
Sticker(sticker) => format!("st <{}> {}", sender, sticker.content().body),
|
||||||
|
UnableToDecrypt(_) => format!("xx <{}> [unable to decrypt]", sender),
|
||||||
|
MembershipChange(change) => {
|
||||||
|
use matrix_sdk_ui::timeline::MembershipChange::*;
|
||||||
|
if change.user_id() == event.sender() {
|
||||||
|
let Some(change_kind) = change.change() else {
|
||||||
|
return format!("--- {} made incomprehensible changes to themselves", sender);
|
||||||
|
};
|
||||||
|
match change_kind {
|
||||||
|
None => format!("--- {} made no discernable changes to themselves", sender),
|
||||||
|
Error => format!(
|
||||||
|
"xxx {} made a change to themselves that made matrix-sdk-ui error",
|
||||||
|
sender
|
||||||
|
),
|
||||||
|
Joined => format!("--> {} joined", sender),
|
||||||
|
Left => format!("<-- {} left", sender),
|
||||||
|
Banned => format!("-x- {} banned themselves", sender),
|
||||||
|
Unbanned => format!("-x- {} unbanned themselves", sender),
|
||||||
|
Kicked => format!("<!- {} kicked themselves", sender),
|
||||||
|
Invited => format!("-o- {} invited themselves", sender),
|
||||||
|
KickedAndBanned => format!("<!x {} kicked and banned themselves", sender),
|
||||||
|
InvitationAccepted => format!("-o> {} accepted an invite", sender),
|
||||||
|
InvitationRejected => format!("-ox {} rejected an invite", sender),
|
||||||
|
InvitationRevoked => format!("--x {} revoked an invite", sender),
|
||||||
|
Knocked => format!("-?> {} knocked", sender),
|
||||||
|
KnockAccepted => format!("-?o {} accepted a knock", sender),
|
||||||
|
KnockRetracted => format!("-?x {} retracted a knock", sender),
|
||||||
|
KnockDenied => format!("-?x {} denied a knock", sender),
|
||||||
|
NotImplemented => format!(
|
||||||
|
"xxx {} made a change matrix-sdk-ui does not support yet",
|
||||||
|
sender
|
||||||
|
),
|
||||||
|
}
|
||||||
|
} else if change.user_id() == "" {
|
||||||
|
let Some(change_kind) = change.change() else {
|
||||||
|
return format!("--- {} made incomprehensible changes", sender);
|
||||||
|
};
|
||||||
|
match change_kind {
|
||||||
|
None => format!("--- {} made no discernable changes", sender),
|
||||||
|
Error => format!("xxx {} made a change that made matrix-sdk-ui error", sender),
|
||||||
|
Joined | Left | Banned | Unbanned | Kicked | Invited | KickedAndBanned
|
||||||
|
| InvitationAccepted | InvitationRejected | InvitationRevoked | Knocked
|
||||||
|
| KnockAccepted | KnockRetracted | KnockDenied => {
|
||||||
|
format!("--> {} made a non-sensical change: {:?}", sender, change)
|
||||||
|
},
|
||||||
|
NotImplemented => format!(
|
||||||
|
"xxx {} made a change matrix-sdk-ui does not support yet",
|
||||||
|
sender
|
||||||
|
),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let target = change
|
||||||
|
.user_id()
|
||||||
|
.as_str()
|
||||||
|
.strip_prefix("@")
|
||||||
|
.expect("missing @ prefix");
|
||||||
|
let Some(change_kind) = change.change() else {
|
||||||
|
return format!("--- {} made incomprehensible changes to {}", sender, target);
|
||||||
|
};
|
||||||
|
match change_kind {
|
||||||
|
None => format!("--- {} made no discernable changes to {}", sender, target),
|
||||||
|
Error => format!(
|
||||||
|
"xxx {} made a change to {} that made matrix-sdk-ui error",
|
||||||
|
sender, target
|
||||||
|
),
|
||||||
|
Joined | Left => format!(
|
||||||
|
"--> {} made a non-sensical change to {}: {:?}",
|
||||||
|
sender, target, change
|
||||||
|
),
|
||||||
|
Banned => format!("-x- {} banned {}", sender, target),
|
||||||
|
Unbanned => format!("-x- {} unbanned {}", sender, target),
|
||||||
|
Kicked => format!("<!- {} kicked {}", sender, target),
|
||||||
|
Invited => format!("-o- {} invited {}", sender, target),
|
||||||
|
KickedAndBanned => format!("<!x {} kicked and banned {}", sender, target),
|
||||||
|
InvitationAccepted => format!("-o> {} accepted an invite to {}", sender, target),
|
||||||
|
InvitationRejected => format!("-ox {} rejected an invite to {}", sender, target),
|
||||||
|
InvitationRevoked => format!("--x {} revoked an invite to {}", sender, target),
|
||||||
|
Knocked => format!("-?> {} made {} knock", sender, target),
|
||||||
|
KnockAccepted => format!("-?o {} accepted {}'s knock", sender, target),
|
||||||
|
KnockRetracted => format!("-?x {} retracted {}'s knock", sender, target),
|
||||||
|
KnockDenied => format!("-?x {} denied {}'s knock", sender, target),
|
||||||
|
NotImplemented => format!(
|
||||||
|
"xxx {} made a change to {} that matrix-sdk-ui does not support yet",
|
||||||
|
sender, target
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
ProfileChange(_) => format!("--- {} updated their profile", sender),
|
||||||
|
OtherState(state) => {
|
||||||
|
if state.state_key() == "" {
|
||||||
|
format!("--- {} changed the room: {:?}", sender, state.content())
|
||||||
|
} else {
|
||||||
|
format!(
|
||||||
|
"--- {} changed {}: {:?}",
|
||||||
|
sender,
|
||||||
|
state.state_key(),
|
||||||
|
state.content()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
FailedToParseMessageLike { event_type, error } => format!(
|
||||||
|
"xxx {} sent a {} message that made matrix-sdk-ui error: {:?}",
|
||||||
|
sender, event_type, error
|
||||||
|
),
|
||||||
|
FailedToParseState {
|
||||||
|
event_type,
|
||||||
|
state_key,
|
||||||
|
error,
|
||||||
|
} => {
|
||||||
|
format!(
|
||||||
|
"xxx {} made a {} change to {} that made matrix-sdk-ui error: {:?}",
|
||||||
|
sender, event_type, state_key, error
|
||||||
|
)
|
||||||
|
},
|
||||||
|
Poll(_) => format!("-?- {} acted on a poll", sender),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
TimelineItemKind::Virtual(VirtualTimelineItem::ReadMarker) => {
|
||||||
|
format!("---- read marker ----")
|
||||||
|
},
|
||||||
|
TimelineItemKind::Virtual(VirtualTimelineItem::DayDivider(day_divider)) => {
|
||||||
|
format!("---- day divider: {:?} ----", day_divider)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async fn spawn_back_pagination(&self, num: u16) {
|
async fn spawn_back_pagination(&self, num: u16) {
|
||||||
let room_id = self.room_id.clone();
|
let room_id = self.room_id.clone();
|
||||||
let timeline = self.timeline.clone();
|
let timeline = self.timeline.clone();
|
||||||
|
Reference in New Issue
Block a user