From: Kelvin White <kwhite@gnu.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: Kevin Brubeck Unhammer <unhammer@fsfe.org>,
Emacs development discussions <emacs-devel@gnu.org>
Subject: Re: [PATCH] Allow irc networks in erc-autojoin-channels-alist
Date: Tue, 10 Mar 2015 21:23:40 -0400 [thread overview]
Message-ID: <CAG-q9=Zuqo=o1=8=vYunZaP+45SmrZgR8mp1kx1oiBr3XRKOuQ@mail.gmail.com> (raw)
In-Reply-To: <jwv1tkw73w8.fsf-monnier+emacs@gnu.org>
Stefan Monnier <monnier@iro.umontreal.ca> wrote:
> Sorry, can't find the patch, can someone resend it?
Sorry, I thought it was attached.
---
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)
next prev parent reply other threads:[~2015-03-11 1:23 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-09 19:55 [PATCH] Allow irc networks in erc-autojoin-channels-alist Kelvin White
2015-03-10 19:34 ` Kevin Brubeck Unhammer
2015-03-10 20:10 ` Kelvin White
2015-03-11 0:51 ` Stefan Monnier
2015-03-11 1:23 ` Kelvin White [this message]
2015-03-11 5:34 ` Kelvin White
2015-03-11 13:49 ` Stefan Monnier
2015-03-11 14:58 ` Kevin Brubeck Unhammer
2015-03-11 15:13 ` Kelvin White
-- strict thread matches above, loose matches on Subject: below --
2015-03-04 11:06 Kevin Brubeck Unhammer
2015-03-05 14:54 ` Kelvin White
2015-03-09 9:48 ` Kevin Brubeck Unhammer
2018-02-22 10:16 ` Kevin Brubeck Unhammer
2018-06-17 21:45 ` Amin Bandali
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAG-q9=Zuqo=o1=8=vYunZaP+45SmrZgR8mp1kx1oiBr3XRKOuQ@mail.gmail.com' \
--to=kwhite@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=monnier@iro.umontreal.ca \
--cc=unhammer@fsfe.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.