From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Kelvin White Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] Allow irc networks in erc-autojoin-channels-alist Date: Wed, 11 Mar 2015 05:34:07 +0000 Message-ID: References: <87lhj47ijs.fsf@fsfe.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=001a11475844c7453e0510fc9d0e X-Trace: ger.gmane.org 1426052067 30330 80.91.229.3 (11 Mar 2015 05:34:27 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 11 Mar 2015 05:34:27 +0000 (UTC) Cc: Kevin Brubeck Unhammer , Emacs development discussions To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Mar 11 06:34:23 2015 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1YVZHi-0003ua-Ea for ged-emacs-devel@m.gmane.org; Wed, 11 Mar 2015 06:34:22 +0100 Original-Received: from localhost ([::1]:52691 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YVZHh-0005zb-Jd for ged-emacs-devel@m.gmane.org; Wed, 11 Mar 2015 01:34:21 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59072) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YVZHZ-0005zT-Ih for emacs-devel@gnu.org; Wed, 11 Mar 2015 01:34:17 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YVZHV-0006ew-5t for emacs-devel@gnu.org; Wed, 11 Mar 2015 01:34:13 -0400 Original-Received: from mail-qc0-f172.google.com ([209.85.216.172]:39022) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YVZHV-0006es-0C for emacs-devel@gnu.org; Wed, 11 Mar 2015 01:34:09 -0400 Original-Received: by qcvs11 with SMTP id s11so7737433qcv.6 for ; Tue, 10 Mar 2015 22:34:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=mime-version:references:from:date:message-id:subject:to:cc :content-type; bh=417fPqEtPRLvSh6Sva39yXBSNX+cO3llWAQg1Rz74yI=; b=NKjUPSxyBxRVRngsxs9wL0z12mlbCjDV8zdP5zEQYUGSFxlKR9t8FvEwF8YgIe2fA4 +Vo3UcNT/WNKOV8uiSnck+XBe6dyR6c/enAk/lHhh95e0nyChMNCK+ZfZ5sTb4om1NcG Vlc3hX5WZxyP/fKyjStiUB7FQoPyT8qN4ccMyOetVobdt8xOSwesIhfTb8afvuex+iuR caHoexhK3aEET/jqXvA0/oKIWY1FrH6pQiXH5FO2WcktzbCNk10gtS6Mk7Pb71GGYg5w WCsaG05UK7bKu26ei+sPO3wSDA5q+Qx1fbQCkNdTaOY6w3seO5CDh0jsyYlylZdF2JXk /1MQ== X-Received: by 10.55.23.68 with SMTP id i65mr63075011qkh.59.1426052048436; Tue, 10 Mar 2015 22:34:08 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.216.172 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:183780 Archived-At: --001a11475844c7453e0510fc9d0e Content-Type: text/plain; charset=UTF-8 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. --001a11475844c7453e0510fc9d0e Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

=C2=A0Stefan Monnier <monnier@iro.umontreal.ca> wrote:
=C2=A0> Sorry, can't find the patch, can someone resend it?

lisp/erc/erc-join.el | 48 ++++++++++++++++++++++++++++++++++= --------------
=C2=A01 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 @@
=C2=A0(defcustom erc-autojoin-channels-alist nil
=C2=A0 =C2=A0"Alist of channels to autojoin on IRC networks.
=C2=A0Every 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.=C2=A0 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).

=C2=A0If the channel(s) require channel keys for joining, th= e passwords
=C2=A0are found via auth-source.=C2=A0 For instance, if you use ~/.authinfo=
@@ -122,6 +126,14 @@ This is called from a timer set up by
`erc-autojoin-channels'."
=C2=A0 =C2=A0 =C2=A0 =C2=A0(erc-log "Delayed autojoin started (no iden= t success detected yet)")
=C2=A0 =C2=A0 =C2=A0 =C2=A0(erc-autojoin-channels server nick))))

+(defun erc-autojoin-server-match (candidate)
+=C2=A0 "Match the current network or server against CANDIDATE, a key<= br> +from `erc-autojoin-channels-alist'."
+=C2=A0 (or (eq candidate erc-network)
+=C2=A0 =C2=A0 =C2=A0 (and (stringp candidate)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (string-match candidate (or erc-server-= announced-name
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 erc-session-ser= ver)))))
+
=C2=A0(defun erc-autojoin-after-ident (network nick)
=C2=A0 =C2=A0"Autojoin channels in `erc-autojoin-channels-alist'.<= br> =C2=A0This function is run from `erc-nickserv-identified-hook'." @@ -136,7 +148,7 @@ This function is run from `erc-nickserv-identified-hook= '."
=C2=A0 =C2=A0 =C2=A0 =C2=A0;; We may already be in these channels, e.g. bec= ause the
=C2=A0 =C2=A0 =C2=A0 =C2=A0;; autojoin timer went off.
=C2=A0 =C2=A0 =C2=A0 =C2=A0(dolist (l erc-autojoin-channels-alist)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0(when (string-match (car l) server)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0(when (erc-autojoin-server-match (car l))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (chan (cdr l))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless (erc-member-ignore-case c= han joined)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-server-join-channel s= erver chan)))))))
@@ -154,7 +166,7 @@ This function is run from `erc-nickserv-identified-hook= '."
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 server nick (current-buffer))))
=C2=A0 =C2=A0 =C2=A0;; `erc-autojoin-timing' is `connect':
=C2=A0 =C2=A0 =C2=A0(dolist (l erc-autojoin-channels-alist)
-=C2=A0 =C2=A0 =C2=A0 (when (string-match (car l) server)
+=C2=A0 =C2=A0 =C2=A0 (when (erc-autojoin-server-match (car l))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (dolist (chan (cdr l))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-server-join-channel server chan))))= )
=C2=A0 =C2=A0;; Return nil to avoid stomping on any other hook funcs.
@@ -175,20 +187,30 @@ This function is run from `erc-nickserv-identified-ho= ok'."
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(concat " " password= )
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"")))))

+(defun erc-autojoin-current-server ()
+=C2=A0 "Compute the current server for lookup in `erc-autojoin-channe= ls-alist'.
+Respects `erc-autojoin-domain-only'."
+=C2=A0 (let ((server (or erc-server-announced-name erc-session-server))) +=C2=A0 =C2=A0 (if (and erc-autojoin-domain-only
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (string-match "[^.\n]+\\.\\= ([^.\n]+\\.[^.\n]+\\)$" server))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0(match-string 1 server)
+=C2=A0 =C2=A0 =C2=A0 server)))
+
=C2=A0(defun erc-autojoin-add (proc parsed)
=C2=A0 =C2=A0"Add the channel being joined to `erc-autojoin-channels-a= list'."
=C2=A0 =C2=A0(let* ((chnl (erc-response.contents parsed))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(nick (car (erc-parse-user (erc-response.= sender parsed))))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(server (with-current-buffer (process-buf= fer proc)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (or erc-ser= ver-announced-name erc-session-server))))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-autojo= in-current-server))))
=C2=A0 =C2=A0 =C2=A0(when (erc-current-nick-p nick)
-=C2=A0 =C2=A0 =C2=A0 (when (and erc-autojoin-domain-only
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (string-match &quo= t;[^.\n]+\\.\\([^.\n]+\\.[^.\n]+\\)$" server))
-=C2=A0 =C2=A0 =C2=A0 =C2=A0(setq server (match-string 1 server)))
-=C2=A0 =C2=A0 =C2=A0 (let ((elem (assoc server erc-autojoin-channels-alist= )))
+=C2=A0 =C2=A0 =C2=A0 (let ((elem (or (assoc erc-network erc-autojoin-chann= els-alist)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0(assoc server erc-autojoin-channels-alist))))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (if elem
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless (member chnl (cdr elem))<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr elem (cons chnl (c= dr elem))))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; This always keys on server, not netwo= rk -- user can
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; override by simply adding a network t= o
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; `erc-autojoin-channels-alist'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq erc-autojoin-channels-alist
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cons (list server = chnl)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 erc-autojoin-channels-alist))))))
@@ -203,12 +225,10 @@ This function is run from `erc-nickserv-identified-ho= ok'."
=C2=A0 =C2=A0(let* ((chnl (car (erc-response.command-args parsed)))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(nick (car (erc-parse-user (erc-response.= sender parsed))))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(server (with-current-buffer (process-buf= fer proc)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (or erc-ser= ver-announced-name erc-session-server))))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (erc-autojo= in-current-server))))
=C2=A0 =C2=A0 =C2=A0(when (erc-current-nick-p nick)
-=C2=A0 =C2=A0 =C2=A0 (when (and erc-autojoin-domain-only
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (string-match &quo= t;[^.\n]+\\.\\([^.\n]+\\.[^.\n]+\\)$" server))
-=C2=A0 =C2=A0 =C2=A0 =C2=A0(setq server (match-string 1 server)))
-=C2=A0 =C2=A0 =C2=A0 (let ((elem (assoc server erc-autojoin-channels-alist= )))
+=C2=A0 =C2=A0 =C2=A0 (let ((elem (or (assoc erc-network erc-autojoin-chann= els-alist)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0(assoc server erc-autojoin-channels-alist))))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (when elem
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr elem (delete chnl (cdr elem))) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless (cdr elem)

On Tue, Mar 10, 2015, 9:23 PM=C2=A0Kelvin White <kwhite@gnu.org> wrote:

Sorry, I thought it was attached.


=C2=A0

--001a11475844c7453e0510fc9d0e--