[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.