unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: [PATCH] Allow irc networks in erc-autojoin-channels-alist
@ 2015-03-09 19:55 Kelvin White
  2015-03-10 19:34 ` Kevin Brubeck Unhammer
  0 siblings, 1 reply; 14+ messages in thread
From: Kelvin White @ 2015-03-09 19:55 UTC (permalink / raw)
  To: Kevin Brubeck Unhammer; +Cc: Emacs development discussions

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

In the Emacs 24.5 release there is an option to use network name as the
buffer name. Can you install this version and see if it solves the issue?
I'm still not quite sure where what your issue is specifically, where
you're seeing the problem exactly

Thanks

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

^ permalink raw reply	[flat|nested] 14+ messages in thread
* [PATCH] Allow irc networks in erc-autojoin-channels-alist
@ 2015-03-04 11:06 Kevin Brubeck Unhammer
  2015-03-05 14:54 ` Kelvin White
  2018-02-22 10:16 ` Kevin Brubeck Unhammer
  0 siblings, 2 replies; 14+ messages in thread
From: Kevin Brubeck Unhammer @ 2015-03-04 11:06 UTC (permalink / raw)
  To: emacs-devel; +Cc: Kevin Brubeck Unhammer

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




^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2018-06-17 21:45 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).