all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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: Wed, 11 Mar 2015 05:34:07 +0000	[thread overview]
Message-ID: <CAG-q9=ZznqeqBggepB+fFKNUwK7taY1Qfgg_4Y6vVk9DgSpWWg@mail.gmail.com> (raw)
In-Reply-To: CAG-q9=Zuqo=o1=8=vYunZaP+45SmrZgR8mp1kx1oiBr3XRKOuQ@mail.gmail.com

[-- Attachment #1: Type: text/plain, Size: 5564 bytes --]

 Stefan Monnier <monnier@iro.umontreal.ca> 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 <kwhite@gnu.org> wrote:

Sorry, I thought it was attached.

[-- Attachment #2: Type: text/html, Size: 7014 bytes --]

  reply	other threads:[~2015-03-11  5:34 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
2015-03-11  5:34         ` Kelvin White [this message]
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=ZznqeqBggepB+fFKNUwK7taY1Qfgg_4Y6vVk9DgSpWWg@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.