emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/ement 24c83355ff: Fix: (ement-room-goto-fully-read-mark


From: ELPA Syncer
Subject: [elpa] externals/ement 24c83355ff: Fix: (ement-room-goto-fully-read-marker) For missing marker node
Date: Mon, 19 Sep 2022 18:57:35 -0400 (EDT)

branch: externals/ement
commit 24c83355ff3ed94e3fbab6349918f446cdcb19c4
Author: Adam Porter <adam@alphapapa.net>
Commit: Adam Porter <adam@alphapapa.net>

    Fix: (ement-room-goto-fully-read-marker) For missing marker node
    
    Not sure how this can happen, but sometimes it does.  Not including in
    the changelog because it may be caused by changes in this pre-release
    version, and it would be difficult to describe to users, anyway.
---
 ement-room.el | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/ement-room.el b/ement-room.el
index 7641a33c85..7a462d282c 100644
--- a/ement-room.el
+++ b/ement-room.el
@@ -2506,16 +2506,24 @@ To be called from timer stored in
 (defun ement-room-goto-fully-read-marker ()
   "Move to the fully-read marker in the current room."
   (interactive)
-  (let ((fully-read-pos (when ement-room-fully-read-marker
-                          (ewoc-location ement-room-fully-read-marker))))
-    (if fully-read-pos
-        (setf (point) fully-read-pos (window-start) fully-read-pos)
-      ;; Unlike the fully-read marker, there doesn't seem to be a
-      ;; simple way to get the user's read-receipt marker.  So if
-      ;; we haven't seen either marker in the retrieved events, we
-      ;; go back to the fully-read marker.
-      (if-let* ((fully-read-event (alist-get "m.fully_read" 
(ement-room-account-data ement-room) nil nil #'equal))
-                (fully-read-event-id (map-nested-elt fully-read-event 
'(content event_id))))
+  (if-let ((fully-read-pos (when ement-room-fully-read-marker
+                             (ewoc-location ement-room-fully-read-marker))))
+      (setf (point) fully-read-pos (window-start) fully-read-pos)
+    ;; Unlike the fully-read marker, there doesn't seem to be a
+    ;; simple way to get the user's read-receipt marker.  So if
+    ;; we haven't seen either marker in the retrieved events, we
+    ;; go back to the fully-read marker.
+    (if-let* ((fully-read-event (alist-get "m.fully_read" 
(ement-room-account-data ement-room) nil nil #'equal))
+              (fully-read-event-id (map-nested-elt fully-read-event '(content 
event_id))))
+        ;; Fully-read account-data event is known.
+        (if (gethash fully-read-event-id (ement-session-events ement-session))
+            ;; The fully-read event (i.e. the message event that was read, not 
the
+            ;; account-data event) is already retrieved, but the marker is not 
present in
+            ;; the buffer (this shouldn't happen, but somehow, it can): Reset 
the marker,
+            ;; which should work around the problem.
+            (ement-room-mark-read ement-room ement-session
+              :fully-read-event (gethash fully-read-event-id 
(ement-session-events ement-session)))
+          ;; Fully-read event not retrieved: search for it in room history.
           (let ((buffer (current-buffer)))
             (message "Searching for first unread event...")
             (ement-room-retro-to ement-room ement-session fully-read-event-id
@@ -2523,8 +2531,8 @@ To be called from timer stored in
                       (with-current-buffer buffer
                         ;; HACK: Should probably call this function elsewhere, 
in a hook or something.
                         (ement-room-move-read-markers ement-room)
-                        (ement-room-goto-fully-read-marker)))))
-        (error "Room has no fully-read event")))))
+                        (ement-room-goto-fully-read-marker))))))
+      (error "Room has no fully-read event"))))
 
 (cl-defun ement-room-mark-read (room session &key read-event fully-read-event)
   "Mark ROOM on SESSION as read on the server.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]