Skip to content

Commit 34c991c

Browse files
Merge pull request #211 from kcexn/fix-tail-plain-text-event
Fix #207: Add support for PlainText events when tailing.
2 parents 5fef685 + ecb325a commit 34c991c

2 files changed

Lines changed: 53 additions & 40 deletions

File tree

src/listen.rs

Lines changed: 49 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ use matrix_sdk::{
4949
FileMessageEventContent,
5050
ImageMessageEventContent,
5151
MessageType,
52-
// NoticeMessageEventContent,
52+
NoticeMessageEventContent,
5353
// OriginalRoomMessageEvent, OriginalSyncRoomMessageEvent,
5454
// RedactedRoomMessageEventContent, RoomMessageEvent,
5555
// OriginalSyncRoomEncryptedEvent,
@@ -165,6 +165,15 @@ fn handle_originalsyncmessagelikeevent(
165165
body, room_id, ev.sender, ev.event_id, source, info,
166166
);
167167
}
168+
MessageType::Notice(noticemessageeventcontent) => {
169+
let NoticeMessageEventContent {
170+
body, formatted, ..
171+
} = noticemessageeventcontent;
172+
println!(
173+
"Message: type Notice: body {:?}, room {:?}, sender {:?}, event id {:?}, formatted {:?}, ",
174+
body, room_id, ev.sender, ev.event_id, formatted,
175+
);
176+
}
168177
_ => {
169178
debug!("Not handling this event: {:?}", ev);
170179
warn!(
@@ -678,45 +687,47 @@ pub(crate) async fn listen_tail(
678687
let anytimelineevent = &chunk[chunk.len() - 1 - index]; // reverse ordering, getting older msg first
679688
// Todo : dump the JSON serialized string via Json API
680689

681-
let rawevent = if let TimelineEventKind::Decrypted(decrypted) = &anytimelineevent.kind {
682-
&decrypted.event
683-
} else {
684-
// The event could not be decrypted (unable-to-decrypt, UTD) or it
685-
// is a plaintext event. Previously this branch did `panic!()`,
686-
// so a single UTD event in the tail window crashed the whole
687-
// program. Instead, emit a notice and carry on with the next
688-
// event. To read encrypted history, the device must be verified
689-
// and the room keys present; '--restore-backup' can fetch keys
690-
// from the server-side key backup.
691-
let utdraw = anytimelineevent.raw();
692-
let event_id = anytimelineevent
693-
.event_id()
694-
.map(|e| e.to_string())
695-
.unwrap_or_default();
696-
let sender = utdraw
697-
.deserialize()
698-
.ok()
699-
.map(|e| e.sender().to_string())
700-
.unwrap_or_default();
701-
if !output.is_text() {
702-
println!("{}", utdraw.json());
703-
} else {
704-
println!(
705-
"Message: type Encrypted: room {:?}, sender {:?}, event_id {:?}, message could not be decrypted",
706-
roomid, sender, event_id,
707-
);
690+
let rawevent = match &anytimelineevent.kind {
691+
TimelineEventKind::Decrypted(decrypted) => &decrypted.event,
692+
TimelineEventKind::PlainText { event } => {
693+
// cast_ref_unchecked is needed to convert from AnySyncTimelineEvent to AnyTimelineEvent.
694+
// AnyTimelineEvent differs from AnySyncTimelineEvent in that the event has an additional room_id field.
695+
// However all room messages are required to have a room_id field as specified in the
696+
// [client-server-api spec](https://spec.matrix.org/latest/client-server-api/#room-event-format).
697+
// Therefore, it is fine to cast from AnySyncTimelineEvent to AnyTimelineEvent **here** since the
698+
// rawevent will always deserialize correctly.
699+
event.cast_ref_unchecked::<AnyTimelineEvent>()
700+
}
701+
_ => {
702+
// The event could not be decrypted (unable-to-decrypt, UTD) or it
703+
// is a plaintext event. Previously this branch did `panic!()`,
704+
// so a single UTD event in the tail window crashed the whole
705+
// program. Instead, emit a notice and carry on with the next
706+
// event. To read encrypted history, the device must be verified
707+
// and the room keys present; '--restore-backup' can fetch keys
708+
// from the server-side key backup.
709+
let utdraw = anytimelineevent.raw();
710+
let event_id = anytimelineevent
711+
.event_id()
712+
.map(|e| e.to_string())
713+
.unwrap_or_default();
714+
let sender = utdraw
715+
.deserialize()
716+
.ok()
717+
.map(|e| e.sender().to_string())
718+
.unwrap_or_default();
719+
if !output.is_text() {
720+
println!("{}", utdraw.json());
721+
} else {
722+
println!(
723+
"Message: type Encrypted: room {:?}, sender {:?}, event_id {:?}, message could not be decrypted",
724+
roomid, sender, event_id,
725+
);
726+
}
727+
err_count += 1;
728+
continue;
708729
}
709-
err_count += 1;
710-
continue;
711730
};
712-
// print_type_of(&rawevent); // ruma_common::events::enums::AnyTimelineEvent
713-
debug!("rawevent = value is {:?}\n", rawevent);
714-
// rawevent = Ok(MessageLike(RoomMessage(Original(OriginalMessageLikeEvent { content: RoomMessageEventContent {
715-
// msgtype: Text(TextMessageEventContent { body: "54", formatted: None }), relates_to: Some(_Custom) }, event_id: "$xxx", sender: "@u:some.homeserver.org", origin_server_ts: MilliSecondsSinceUnixEpoch(123), room_id: "!rrr:some.homeserver.org", unsigned: MessageLikeUnsigned { age: Some(123), transaction_id: None, relations: None } }))))
716-
if !output.is_text() {
717-
println!("{}", rawevent.json());
718-
continue;
719-
}
720731

721732
match rawevent.deserialize().unwrap() {
722733
AnyTimelineEvent::MessageLike(anymessagelikeevent) => {

src/mclient.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ use matrix_sdk::{
3232
// encryption::CryptoStoreError,
3333
// deserialized_responses::RawSyncOrStrippedState,
3434
authentication::{matrix::MatrixSession, SessionTokens},
35-
cross_process_lock::CrossProcessLockConfig,
3635
config::{RequestConfig, StoreConfig, SyncSettings},
36+
cross_process_lock::CrossProcessLockConfig,
3737
media::{MediaFormat, MediaRequestParameters},
3838
room,
3939
room::{Room, RoomMember},
@@ -498,7 +498,9 @@ async fn create_client(homeserver: &Url, ap: &Args) -> Result<Client, Error> {
498498
// let builder = if let Some(proxy) = cli.proxy { builder.proxy(proxy) } else { builder };
499499
let builder = Client::builder()
500500
.homeserver_url(homeserver)
501-
.store_config(StoreConfig::new(CrossProcessLockConfig::MultiProcess { holder_name: "".to_owned()}))
501+
.store_config(StoreConfig::new(CrossProcessLockConfig::MultiProcess {
502+
holder_name: "".to_owned(),
503+
}))
502504
.request_config(RequestConfig::new().timeout(Duration::from_secs(ap.timeout)));
503505
let client = builder
504506
.sqlite_store(sqlitestorehome, None)

0 commit comments

Comments
 (0)