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

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

[elpa] externals/ement bed6e41128 1/4: Add/Change: (ement--original-even


From: ELPA Syncer
Subject: [elpa] externals/ement bed6e41128 1/4: Add/Change: (ement--original-event-for)
Date: Tue, 3 Oct 2023 00:58:02 -0400 (EDT)

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

    Add/Change: (ement--original-event-for)
    
    Use in (ement-room-edit-message).
    
    See #226, #227, #228.
    
    Reported-by: Phil Sainty <phil@catalyst.net.nz>
---
 ement-lib.el  | 16 ++++++++++++++++
 ement-room.el | 22 +++++++---------------
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/ement-lib.el b/ement-lib.el
index 46c29a18ed..9682aa8f23 100644
--- a/ement-lib.el
+++ b/ement-lib.el
@@ -1296,6 +1296,22 @@ m.replace metadata)."
       (ement--event-replaces-p a b)
       (ement--event-replaces-p b a)))
 
+(defun ement--original-event-for (event session)
+  "Return the original of EVENT in SESSION.
+If EVENT has metadata indicating that it replaces another event,
+return the replaced event; otherwise return EVENT.  If a replaced
+event can't be found in SESSION's events table, return an ersatz
+one that has the expected ID and same sender."
+  (pcase-let (((cl-struct ement-event sender
+                          (content (map ('m.relates_to
+                                         (map ('event_id replaced-event-id)
+                                              ('rel_type relation-type))))))
+               event))
+    (pcase relation-type
+      ("m.replace" (or (gethash replaced-event-id (ement-session-events 
session))
+                       (make-ement-event :id replaced-event-id :sender 
sender)))
+      (_ event))))
+
 (defun ement--format-room (room &optional topic)
   "Return ROOM formatted with name, alias, ID, and optionally TOPIC.
 Suitable for use in completion, etc."
diff --git a/ement-room.el b/ement-room.el
index ac77db1de6..ad6ead70e4 100644
--- a/ement-room.el
+++ b/ement-room.el
@@ -1702,23 +1702,17 @@ mentioning the ROOM and CONTENT."
 
 (defun ement-room-edit-message (event room session body)
   "Edit EVENT in ROOM on SESSION to have new BODY.
-The message must be one sent by the local user.  EVENT may be the
-`ement-event' or the event's ID string."
+The message must be one sent by the local user.  If EVENT is
+itself an edit of another event, the original event is edited."
   (interactive (ement-room-with-highlighted-event-at (point)
                  (cl-assert ement-session) (cl-assert ement-room)
                  (pcase-let* ((event (ewoc-data (ewoc-locate ement-ewoc)))
                               ((cl-struct ement-session user) ement-session)
-                              ((cl-struct ement-event sender
-                                          (content (map body ('m.relates_to
-                                                              (map ('event_id 
replaced-event-id)
-                                                                   ('rel_type 
relation-type))))))
-                               event)
-                              (ement-room-editing-event event))
+                              ((cl-struct ement-event sender (content (map 
body))) event)
+                              (ement-room-editing-event event)
+                              (edited-event (ement--original-event-for event 
ement-session)))
                    (unless (equal (ement-user-id sender) (ement-user-id user))
                      (user-error "You may only edit your own messages"))
-                   (pcase relation-type
-                     ("m.replace"  ;; Editing an already-edited event: use the 
original event ID.
-                      (setf event replaced-event-id)))
                    ;; Remove any leading asterisk from the plain-text body.
                    (setf body (replace-regexp-in-string (rx bos "*" (1+ 
space)) "" body t t))
                    (ement-room-with-typing
@@ -1729,7 +1723,7 @@ The message must be one sent by the local user.  EVENT 
may be the
                        (when (string-empty-p body)
                          (user-error "To delete a message, use command 
`ement-room-delete-message'"))
                        (when (yes-or-no-p (format "Edit message to: %S? " 
body))
-                         (list event ement-room ement-session body)))))))
+                         (list edited-event ement-room ement-session 
body)))))))
   (let* ((endpoint (format "rooms/%s/send/%s/%s" (url-hexify-string 
(ement-room-id room))
                            "m.room.message" (ement--update-transaction-id 
session)))
          (new-content (ement-alist "body" body
@@ -1741,9 +1735,7 @@ The message must be one sent by the local user.  EVENT 
may be the
                                "m.new_content" new-content
                                "m.relates_to" (ement-alist
                                                "rel_type" "m.replace"
-                                               "event_id" (cl-typecase event
-                                                            (string event)
-                                                            (ement-event 
(ement-event-id event)))))))
+                                               "event_id" (ement-event-id 
event)))))
     ;; Prepend the asterisk after the filter may have modified the content.  
Note that the
     ;; "m.new_content" body does not get the leading asterisk, only the 
"content" body,
     ;; which is intended as a fallback.



reply via email to

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