diff --git a/src/base.rs b/src/base.rs index 76cc595..670168d 100644 --- a/src/base.rs +++ b/src/base.rs @@ -14,6 +14,7 @@ use matrix_sdk::{ ruma::{ events::{ reaction::ReactionEvent, + room::encrypted::RoomEncryptedEvent, room::message::{ OriginalRoomMessageEvent, Relation, @@ -484,6 +485,9 @@ impl RoomInfo { }; match &mut msg.event { + MessageEvent::Encrypted(_) => { + return; + }, MessageEvent::Original(orig) => { orig.content = *new_content; }, @@ -498,6 +502,15 @@ impl RoomInfo { msg.html = msg.event.html(); } + /// Inserts events that couldn't be decrypted into the scrollback. + pub fn insert_encrypted(&mut self, msg: RoomEncryptedEvent) { + let event_id = msg.event_id().to_owned(); + let key = (msg.origin_server_ts().into(), event_id.clone()); + + self.keys.insert(event_id, EventLocation::Message(key.clone())); + self.messages.insert(key, msg.into()); + } + pub fn insert_message(&mut self, msg: RoomMessageEvent) { let event_id = msg.event_id().to_owned(); let key = (msg.origin_server_ts().into(), event_id.clone()); diff --git a/src/message/mod.rs b/src/message/mod.rs index 67700db..4bf1fc8 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -12,6 +12,7 @@ use unicode_width::UnicodeWidthStr; use matrix_sdk::ruma::{ events::{ room::{ + encrypted::RoomEncryptedEvent, message::{ FormattedBody, MessageFormat, @@ -318,6 +319,7 @@ impl PartialOrd for MessageCursor { #[derive(Clone)] pub enum MessageEvent { + Encrypted(Box), Original(Box), Redacted(Box), Local(OwnedEventId, Box), @@ -326,6 +328,7 @@ pub enum MessageEvent { impl MessageEvent { pub fn event_id(&self) -> &EventId { match self { + MessageEvent::Encrypted(msg) => msg.event_id(), MessageEvent::Original(ev) => ev.event_id.as_ref(), MessageEvent::Redacted(ev) => ev.event_id.as_ref(), MessageEvent::Local(event_id, _) => event_id.as_ref(), @@ -334,6 +337,7 @@ impl MessageEvent { pub fn body(&self) -> Cow<'_, str> { match self { + MessageEvent::Encrypted(_) => "[Unable to decrypt message]".into(), MessageEvent::Original(ev) => body_cow_content(&ev.content), MessageEvent::Redacted(ev) => { let reason = ev @@ -355,6 +359,7 @@ impl MessageEvent { pub fn html(&self) -> Option { let content = match self { + MessageEvent::Encrypted(_) => return None, MessageEvent::Original(ev) => &ev.content, MessageEvent::Redacted(_) => return None, MessageEvent::Local(_, content) => content, @@ -373,6 +378,7 @@ impl MessageEvent { pub fn redact(&mut self, redaction: SyncRoomRedactionEvent, version: &RoomVersionId) { match self { + MessageEvent::Encrypted(_) => return, MessageEvent::Redacted(_) => return, MessageEvent::Local(_, _) => return, MessageEvent::Original(ev) => { @@ -548,6 +554,7 @@ impl Message { pub fn reply_to(&self) -> Option { let content = match &self.event { + MessageEvent::Encrypted(_) => return None, MessageEvent::Local(_, content) => content, MessageEvent::Original(ev) => &ev.content, MessageEvent::Redacted(_) => return None, @@ -771,6 +778,16 @@ impl Message { } } +impl From for Message { + fn from(event: RoomEncryptedEvent) -> Self { + let timestamp = event.origin_server_ts().into(); + let user_id = event.sender().to_owned(); + let content = MessageEvent::Encrypted(event.into()); + + Message::new(content, user_id, timestamp) + } +} + impl From for Message { fn from(event: OriginalRoomMessageEvent) -> Self { let timestamp = event.origin_server_ts.into(); diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index e30c2bf..25b1c58 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -294,6 +294,7 @@ impl ChatState { MessageAction::React(emoji) => { let room = self.get_joined(&store.application.worker)?; let event_id = match &msg.event { + MessageEvent::Encrypted(msg) => msg.event_id().to_owned(), MessageEvent::Original(ev) => ev.event_id.clone(), MessageEvent::Local(event_id, _) => event_id.clone(), MessageEvent::Redacted(_) => { @@ -313,6 +314,7 @@ impl ChatState { MessageAction::Redact(reason) => { let room = self.get_joined(&store.application.worker)?; let event_id = match &msg.event { + MessageEvent::Encrypted(msg) => msg.event_id().to_owned(), MessageEvent::Original(ev) => ev.event_id.clone(), MessageEvent::Local(event_id, _) => event_id.clone(), MessageEvent::Redacted(_) => { @@ -338,6 +340,7 @@ impl ChatState { MessageAction::Unreact(emoji) => { let room = self.get_joined(&store.application.worker)?; let event_id: &EventId = match &msg.event { + MessageEvent::Encrypted(msg) => msg.event_id(), MessageEvent::Original(ev) => ev.event_id.as_ref(), MessageEvent::Local(event_id, _) => event_id.as_ref(), MessageEvent::Redacted(_) => { diff --git a/src/worker.rs b/src/worker.rs index 25c4da8..c840293 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -234,6 +234,9 @@ async fn load_insert(room_id: OwnedRoomId, res: MessageFetchResult, store: Async let _ = presences.get_or_default(sender); match msg { + AnyMessageLikeEvent::RoomEncrypted(msg) => { + info.insert_encrypted(msg); + }, AnyMessageLikeEvent::RoomMessage(msg) => { info.insert(msg); },