Stefan Monnier wrote: > Sorry, can't find the patch, can someone resend it? lisp/erc/erc-join.el | 48 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/lisp/erc/erc-join.el b/lisp/erc/erc-join.el index 4c99898..aafd916 100644 --- a/lisp/erc/erc-join.el +++ b/lisp/erc/erc-join.el @@ -54,8 +54,12 @@ (defcustom erc-autojoin-channels-alist nil "Alist of channels to autojoin on IRC networks. Every element in the alist has the form (SERVER . CHANNELS). -SERVER is a regexp matching the server, and channels is the -list of channels to join. +SERVER is a regexp matching the server, and channels is the list +of channels to join. SERVER can also be a symbol, in which case +it is matched against the value of `erc-network' instead of +`erc-server-announced-name' or `erc-session-server' (this can be +useful when connecting to an IRC proxy that relays several +networks under the same server). If the channel(s) require channel keys for joining, the passwords are found via auth-source. For instance, if you use ~/.authinfo @@ -122,6 +126,14 @@ This is called from a timer set up by `erc-autojoin-channels'." (erc-log "Delayed autojoin started (no ident success detected yet)") (erc-autojoin-channels server nick)))) +(defun erc-autojoin-server-match (candidate) + "Match the current network or server against CANDIDATE, a key +from `erc-autojoin-channels-alist'." + (or (eq candidate erc-network) + (and (stringp candidate) + (string-match candidate (or erc-server-announced-name + erc-session-server))))) + (defun erc-autojoin-after-ident (network nick) "Autojoin channels in `erc-autojoin-channels-alist'. This function is run from `erc-nickserv-identified-hook'." @@ -136,7 +148,7 @@ This function is run from `erc-nickserv-identified-hook'." ;; We may already be in these channels, e.g. because the ;; autojoin timer went off. (dolist (l erc-autojoin-channels-alist) - (when (string-match (car l) server) + (when (erc-autojoin-server-match (car l)) (dolist (chan (cdr l)) (unless (erc-member-ignore-case chan joined) (erc-server-join-channel server chan))))))) @@ -154,7 +166,7 @@ This function is run from `erc-nickserv-identified-hook'." server nick (current-buffer)))) ;; `erc-autojoin-timing' is `connect': (dolist (l erc-autojoin-channels-alist) - (when (string-match (car l) server) + (when (erc-autojoin-server-match (car l)) (dolist (chan (cdr l)) (erc-server-join-channel server chan))))) ;; Return nil to avoid stomping on any other hook funcs. @@ -175,20 +187,30 @@ This function is run from `erc-nickserv-identified-hook'." (concat " " password) ""))))) +(defun erc-autojoin-current-server () + "Compute the current server for lookup in `erc-autojoin-channels-alist'. +Respects `erc-autojoin-domain-only'." + (let ((server (or erc-server-announced-name erc-session-server))) + (if (and erc-autojoin-domain-only + (string-match "[^.\n]+\\.\\([^.\n]+\\.[^.\n]+\\)$" server)) + (match-string 1 server) + server))) + (defun erc-autojoin-add (proc parsed) "Add the channel being joined to `erc-autojoin-channels-alist'." (let* ((chnl (erc-response.contents parsed)) (nick (car (erc-parse-user (erc-response.sender parsed)))) (server (with-current-buffer (process-buffer proc) - (or erc-server-announced-name erc-session-server)))) + (erc-autojoin-current-server)))) (when (erc-current-nick-p nick) - (when (and erc-autojoin-domain-only - (string-match "[^.\n]+\\.\\([^.\n]+\\.[^.\n]+\\)$" server)) - (setq server (match-string 1 server))) - (let ((elem (assoc server erc-autojoin-channels-alist))) + (let ((elem (or (assoc erc-network erc-autojoin-channels-alist) + (assoc server erc-autojoin-channels-alist)))) (if elem (unless (member chnl (cdr elem)) (setcdr elem (cons chnl (cdr elem)))) + ;; This always keys on server, not network -- user can + ;; override by simply adding a network to + ;; `erc-autojoin-channels-alist' (setq erc-autojoin-channels-alist (cons (list server chnl) erc-autojoin-channels-alist)))))) @@ -203,12 +225,10 @@ This function is run from `erc-nickserv-identified-hook'." (let* ((chnl (car (erc-response.command-args parsed))) (nick (car (erc-parse-user (erc-response.sender parsed)))) (server (with-current-buffer (process-buffer proc) - (or erc-server-announced-name erc-session-server)))) + (erc-autojoin-current-server)))) (when (erc-current-nick-p nick) - (when (and erc-autojoin-domain-only - (string-match "[^.\n]+\\.\\([^.\n]+\\.[^.\n]+\\)$" server)) - (setq server (match-string 1 server))) - (let ((elem (assoc server erc-autojoin-channels-alist))) + (let ((elem (or (assoc erc-network erc-autojoin-channels-alist) + (assoc server erc-autojoin-channels-alist)))) (when elem (setcdr elem (delete chnl (cdr elem))) (unless (cdr elem) On Tue, Mar 10, 2015, 9:23 PM Kelvin White wrote: Sorry, I thought it was attached.