@@ -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) => {
0 commit comments