[fractal] room: Move count_as_unread as a method of Event



commit b884635efad6b767b428adbc316ad56bfff99484
Author: Kévin Commaille <zecakeh tedomum fr>
Date:   Fri Jul 15 10:26:29 2022 +0200

    room: Move count_as_unread as a method of Event
    
    Reduce boilerplate when calling the method

 src/session/room/event/mod.rs             |  2 +-
 src/session/room/event/supported_event.rs | 40 ++++++++++++++++++++++++++++
 src/session/room/mod.rs                   | 44 +++++--------------------------
 3 files changed, 47 insertions(+), 39 deletions(-)
---
diff --git a/src/session/room/event/mod.rs b/src/session/room/event/mod.rs
index e199baf66..0ce3daf7b 100644
--- a/src/session/room/event/mod.rs
+++ b/src/session/room/event/mod.rs
@@ -13,7 +13,7 @@ use super::{
 mod supported_event;
 mod unsupported_event;
 
-pub use supported_event::SupportedEvent;
+pub use supported_event::{count_as_unread, SupportedEvent};
 pub use unsupported_event::UnsupportedEvent;
 
 #[derive(Clone, Debug, glib::Boxed)]
diff --git a/src/session/room/event/supported_event.rs b/src/session/room/event/supported_event.rs
index b3549b4ff..367f55f74 100644
--- a/src/session/room/event/supported_event.rs
+++ b/src/session/room/event/supported_event.rs
@@ -619,4 +619,44 @@ impl SupportedEvent {
             _ => true,
         }
     }
+
+    /// Whether this `SupportedEvent` can count as an unread message.
+    ///
+    /// This follows the algorithm in [MSC2654], excluding events that we don't
+    /// show in the timeline.
+    ///
+    /// [MSC2654]: https://github.com/matrix-org/matrix-spec-proposals/pull/2654
+    pub fn counts_as_unread(&self) -> bool {
+        count_as_unread(&self.matrix_event())
+    }
+}
+
+/// Whether the given event can count as an unread message.
+///
+/// This follows the algorithm in [MSC2654], excluding events that we don't
+/// show in the timeline.
+///
+/// [MSC2654]: https://github.com/matrix-org/matrix-spec-proposals/pull/2654
+pub fn count_as_unread(event: &AnySyncTimelineEvent) -> bool {
+    match event {
+        AnySyncTimelineEvent::MessageLike(message_event) => match message_event {
+            AnySyncMessageLikeEvent::RoomMessage(SyncMessageLikeEvent::Original(message)) => {
+                if matches!(message.content.msgtype, MessageType::Notice(_)) {
+                    return false;
+                }
+
+                if matches!(message.content.relates_to, Some(Relation::Replacement(_))) {
+                    return false;
+                }
+
+                true
+            }
+            AnySyncMessageLikeEvent::Sticker(SyncMessageLikeEvent::Original(_)) => true,
+            _ => false,
+        },
+        AnySyncTimelineEvent::State(AnySyncStateEvent::RoomTombstone(
+            SyncStateEvent::Original(_),
+        )) => true,
+        _ => false,
+    }
 }
diff --git a/src/session/room/mod.rs b/src/session/room/mod.rs
index eb424c679..92f627d61 100644
--- a/src/session/room/mod.rs
+++ b/src/session/room/mod.rs
@@ -26,17 +26,15 @@ use matrix_sdk::{
             receipt::{ReceiptEventContent, ReceiptType},
             room::{
                 member::MembershipState,
-                message::{MessageType, Relation},
                 name::RoomNameEventContent,
                 redaction::{OriginalSyncRoomRedactionEvent, RoomRedactionEventContent},
                 topic::RoomTopicEventContent,
             },
             room_key::ToDeviceRoomKeyEventContent,
             tag::{TagInfo, TagName},
-            AnyRoomAccountDataEvent, AnyStrippedStateEvent, AnySyncMessageLikeEvent,
-            AnySyncStateEvent, AnySyncTimelineEvent, EventContent, MessageLikeEventType,
-            MessageLikeUnsigned, OriginalSyncMessageLikeEvent, StateEventType,
-            SyncMessageLikeEvent, SyncStateEvent, ToDeviceEvent,
+            AnyRoomAccountDataEvent, AnyStrippedStateEvent, AnySyncStateEvent,
+            AnySyncTimelineEvent, EventContent, MessageLikeEventType, MessageLikeUnsigned,
+            OriginalSyncMessageLikeEvent, StateEventType, SyncStateEvent, ToDeviceEvent,
         },
         serde::Raw,
         EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, OwnedUserId, RoomId,
@@ -885,7 +883,7 @@ impl Room {
                         }
 
                         // The event is older than the read receipt so it has been read.
-                        if count_as_unread(&event.matrix_event())
+                        if event.counts_as_unread()
                             && event.origin_server_ts() <= read_receipt.origin_server_ts()
                         {
                             return Some(event.to_owned());
@@ -981,7 +979,7 @@ impl Room {
                         }
 
                         // The user hasn't read the latest message.
-                        if count_as_unread(&event.matrix_event()) {
+                        if event.counts_as_unread() {
                             return false;
                         }
                     }
@@ -1664,7 +1662,7 @@ impl Room {
         let mut latest_unread = self.latest_unread();
 
         for event in events {
-            if count_as_unread(event) {
+            if event::count_as_unread(event) {
                 latest_unread = latest_unread.max(event.origin_server_ts().get().into());
                 break;
             }
@@ -1744,33 +1742,3 @@ impl Room {
         Pill::for_room(self)
     }
 }
-
-/// Whether the given event can count as an unread message.
-///
-/// This follows the algorithm in [MSC2654], excluding events that we don't
-/// show in the timeline.
-///
-/// [MSC2654]: https://github.com/matrix-org/matrix-spec-proposals/pull/2654
-fn count_as_unread(event: &AnySyncTimelineEvent) -> bool {
-    match event {
-        AnySyncTimelineEvent::MessageLike(message_event) => match message_event {
-            AnySyncMessageLikeEvent::RoomMessage(SyncMessageLikeEvent::Original(message)) => {
-                if matches!(message.content.msgtype, MessageType::Notice(_)) {
-                    return false;
-                }
-
-                if matches!(message.content.relates_to, Some(Relation::Replacement(_))) {
-                    return false;
-                }
-
-                true
-            }
-            AnySyncMessageLikeEvent::Sticker(SyncMessageLikeEvent::Original(_)) => true,
-            _ => false,
-        },
-        AnySyncTimelineEvent::State(AnySyncStateEvent::RoomTombstone(
-            SyncStateEvent::Original(_),
-        )) => true,
-        _ => false,
-    }
-}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]