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

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

[elpa] externals/ement d44338e701 3/4: Add: (ement-room-join) THEN argum


From: ELPA Syncer
Subject: [elpa] externals/ement d44338e701 3/4: Add: (ement-room-join) THEN argument
Date: Thu, 15 Sep 2022 13:57:42 -0400 (EDT)

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

    Add: (ement-room-join) THEN argument
---
 ement-room.el | 41 ++++++++++++++++++++++++-----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/ement-room.el b/ement-room.el
index 2227953d52..eb927f5578 100644
--- a/ement-room.el
+++ b/ement-room.el
@@ -1218,8 +1218,11 @@ Interactively, set the current buffer's ROOM's TOPIC."
         (scroll-up-command)
       (end-of-buffer (set-window-point nil (point-max))))))
 
-(defun ement-room-join (id-or-alias session)
-  "Join room by ID-OR-ALIAS on SESSION."
+(cl-defun ement-room-join (id-or-alias session &key then)
+  "Join room by ID-OR-ALIAS on SESSION.
+THEN may be a function to call after joining the room (and when
+`ement-room-join-view-buffer' is non-nil, after viewing the room
+buffer).  It receives two arguments, the room and the session."
   (interactive (list (read-string "Join room (ID or alias): ")
                      (or ement-session
                          (ement-complete-session))))
@@ -1243,21 +1246,25 @@ Interactively, set the current buffer's ROOM's TOPIC."
               ;; which removes the symbol from the hook, removing itself from 
the hook.
               ;; TODO: When requiring Emacs 27, use `letrec'.
               (pcase-let* (((map ('room_id room-id)) data)
-                           (join-fn-symbol (gensym (format "ement-join-%s" 
id-or-alias)))
-                           (join-fn
-                            (lambda (session)
-                              (when-let ((room (cl-loop for room in 
(ement-session-rooms session)
-                                                        when (equal room-id 
(ement-room-id room))
-                                                        return room)))
-                                ;; In case the join event is not in this next 
sync
-                                ;; response, make sure the room is found 
before removing
-                                ;; the function and joining the room.
-                                (remove-hook 'ement-sync-callback-hook 
join-fn-symbol)
-                                ;; FIXME: Probably need to unintern the symbol.
-                                (ement-view-room room session)))))
-                (setf (symbol-function join-fn-symbol) join-fn)
-                (when ement-room-join-view-buffer
-                  (add-hook 'ement-sync-callback-hook join-fn-symbol))
+                           (then-fns (delq nil
+                                           (list (when 
ement-room-join-view-buffer
+                                                   (lambda (room session)
+                                                     (ement-view-room room 
session)))
+                                                 then)))
+                           (then-fn-symbol (gensym (format "ement-join-%s" 
id-or-alias)))
+                           (then-fn (lambda (session)
+                                      (when-let ((room (cl-loop for room in 
(ement-session-rooms session)
+                                                                when (equal 
room-id (ement-room-id room))
+                                                                return room)))
+                                        ;; In case the join event is not in 
this next sync
+                                        ;; response, make sure the room is 
found before removing
+                                        ;; the function and joining the room.
+                                        (remove-hook 'ement-sync-callback-hook 
then-fn-symbol)
+                                        ;; FIXME: Probably need to unintern 
the symbol.
+                                        (dolist (fn then-fns)
+                                          (funcall fn room session))))))
+                (setf (symbol-function then-fn-symbol) then-fn)
+                (add-hook 'ement-sync-callback-hook then-fn-symbol)
                 (message "Joined room: %s" room-id)))
       :else (lambda (plz-error)
               (pcase-let* (((cl-struct plz-error response) plz-error)



reply via email to

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