>From a46f0bc6f452aec9be43b1534f5dc385dc39e72e Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Mon, 11 Jul 2022 05:14:57 -0700 Subject: [PATCH 07/10] [POC] Support one-off JOIN handlers in ERC * lisp/erc/erc.el (erc--join-with-callback, erc-cmd-JOIN): Factor out joining logic for use in things like URL handlers for external integrations. Accept a callback to run when channel is joined. --- lisp/erc/erc.el | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 39ec11c94b..371612b085 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -3542,6 +3542,26 @@ erc--valid-local-channel-p (string-search "&" chan-types) (string-match-p "&" chan-types)))))) +(defun erc--join-with-callback (chnl key on-join) + (if-let* ((existing (erc-get-buffer chnl erc-server-process)) + ((with-current-buffer existing + (erc-get-channel-user (erc-current-nick))))) + (progn (switch-to-buffer existing) + (when on-join (funcall on-join))) + (let ((callback + (and on-join + (lambda (_ parsed) + (unless (equal chnl + (car (erc-response.command-args parsed))) + (signal 'erc-once-again nil)) + (with-current-buffer (erc-get-buffer chnl erc-server-process) + (funcall on-join)) + nil)))) + (setq erc--server-last-reconnect-count 0) + (when callback + (erc-once-with-server-event 'JOIN callback 90)) + (erc-server-join-channel nil chnl key)))) + (defun erc-cmd-JOIN (channel &optional key) "Join the channel given in CHANNEL, optionally with KEY. If CHANNEL is specified as \"-invite\", join the channel to which you @@ -3554,12 +3574,7 @@ erc-cmd-JOIN (setq chnl (erc-ensure-channel-name channel))) (when chnl ;; Prevent double joining of same channel on same server. - (if-let* ((existing (erc-get-buffer chnl erc-server-process)) - ((with-current-buffer existing - (erc-get-channel-user (erc-current-nick))))) - (switch-to-buffer existing) - (setq erc--server-last-reconnect-count 0) - (erc-server-join-channel nil chnl key)))) + (erc--join-with-callback chnl key nil))) t) (defalias 'erc-cmd-CHANNEL #'erc-cmd-JOIN) -- 2.36.1