all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Kevin Brubeck Unhammer <unhammer@fsfe.org>
To: emacs-devel@gnu.org
Cc: Kevin Brubeck Unhammer <unhammer@fsfe.org>
Subject: [PATCH] Allow irc networks in erc-autojoin-channels-alist
Date: Wed,  4 Mar 2015 12:06:27 +0100	[thread overview]
Message-ID: <1425467187-22491-1-git-send-email-unhammer@fsfe.org> (raw)

This can be useful when connecting to an IRC proxy that relays several
networks under the same server (where keying on the server name means
we end up joining a channel on all networks when we join on one
network).

Networks are simply stored as symbols instead of regexes, since that's
how `erc-network' works.

The `erc-autojoin-add' function will still auto-add servers as strings
if the network doesn't have at least one entry in
`erc-autojoin-channels-alist'.

Question: `erc-autojoin-after-ident' never did any string-match to
strip the server down to domain, should 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)
-- 
2.3.1




             reply	other threads:[~2015-03-04 11:06 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-04 11:06 Kevin Brubeck Unhammer [this message]
2015-03-05 14:54 ` [PATCH] Allow irc networks in erc-autojoin-channels-alist 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
  -- strict thread matches above, loose matches on Subject: below --
2015-03-09 19:55 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
2015-03-11 13:49         ` Stefan Monnier
2015-03-11 14:58           ` Kevin Brubeck Unhammer
2015-03-11 15:13             ` Kelvin White

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=1425467187-22491-1-git-send-email-unhammer@fsfe.org \
    --to=unhammer@fsfe.org \
    --cc=emacs-devel@gnu.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.