Skip to content

Commit

Permalink
Fix: ("m.room.redaction") Redacting edited events
Browse files Browse the repository at this point in the history
Fixes #228.

Reported-by: Phil Sainty <phil@catalyst.net.nz>
  • Loading branch information
alphapapa committed Oct 3, 2023
1 parent 84787ed commit 9a4bf42
Showing 1 changed file with 31 additions and 10 deletions.
41 changes: 31 additions & 10 deletions ement-room.el
Original file line number Diff line number Diff line change
Expand Up @@ -2490,15 +2490,27 @@ function to `ement-room-event-fns', which see."
(pcase-let* (((cl-struct ement-event (local (map ('redacts redacted-id)))) event)
((cl-struct ement-room timeline) ement-room)
(redacted-event (cl-find redacted-id timeline
:key #'ement-event-id :test #'equal)))
:key #'ement-event-id :test #'equal))
(redacted-edit-events (cl-remove-if-not (lambda (timeline-event)
(pcase-let (((cl-struct ement-event
(content
(map ('m.relates_to
(map ('event_id related-id)
('rel_type rel-type))))))
timeline-event))
(and (equal redacted-id related-id)
(equal "m.replace" rel-type))))
timeline)))
(ement-debug event redacted-event redacted-edit-events)
(cl-loop for edit-event in redacted-edit-events
do (cl-pushnew event (alist-get 'redacted-by (ement-event-local edit-event))))
(when redacted-event
(cl-pushnew event (alist-get 'redacted-by (ement-event-local redacted-event)))
(pcase-let* (((cl-struct ement-event (content
(map ('m.relates_to
(map ('event_id related-id)
('rel_type rel-type))))))
redacted-event))
;; Record the redaction in the redacted event's local slot.
(cl-pushnew event (alist-get 'redacted-by (ement-event-local redacted-event)))
(pcase rel-type
("m.annotation"
;; Redacted annotation/reaction. NOTE: Since we link annotations in a -room
Expand All @@ -2515,13 +2527,22 @@ function to `ement-room-event-fns', which see."
(lambda (data)
(and (ement-event-p data)
(equal related-id (ement-event-id data))))))
(ewoc-invalidate ement-ewoc node)))))
;; Invalidate the redacted event's node.
(when-let (node (ement-room--ewoc-last-matching ement-ewoc
(lambda (data)
(and (ement-event-p data)
(equal redacted-id (ement-event-id data))))))
(ewoc-invalidate ement-ewoc node))))))
(ewoc-invalidate ement-ewoc node)))))))
;; Invalidate the redacted event's node.
(when-let ((node (ement-room--ewoc-last-matching ement-ewoc
(lambda (data)
(and (ement-event-p data)
(pcase-let (((cl-struct ement-event id
(content
(map ('m.relates_to
(map ('event_id related-id)
('rel_type rel-type))))))
data))
(or (equal redacted-id id)
(and (equal "m.replace" rel-type)
(equal redacted-id related-id)))))))))
(ement-debug node)
(ewoc-invalidate ement-ewoc node))))

(ement-room-defevent "m.typing"
(pcase-let* (((cl-struct ement-session user) ement-session)
Expand Down

0 comments on commit 9a4bf42

Please sign in to comment.