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: Tue, 10 Mar 2015 21:23:40 -0400 Message-ID: References: <87lhj47ijs.fsf@fsfe.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Trace: ger.gmane.org 1426037037 28769 80.91.229.3 (11 Mar 2015 01:23:57 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 11 Mar 2015 01:23:57 +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 02:23:50 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 1YVVNF-0003Tf-MS for ged-emacs-devel@m.gmane.org; Wed, 11 Mar 2015 02:23:49 +0100 Original-Received: from localhost ([::1]:52181 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YVVNE-0005zz-Nr for ged-emacs-devel@m.gmane.org; Tue, 10 Mar 2015 21:23:48 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:35740) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YVVNB-0005zt-D9 for emacs-devel@gnu.org; Tue, 10 Mar 2015 21:23:46 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YVVN7-0005Ep-7Q for emacs-devel@gnu.org; Tue, 10 Mar 2015 21:23:45 -0400 Original-Received: from mail-qg0-x235.google.com ([2607:f8b0:400d:c04::235]:41848) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YVVN7-0005Ed-2g for emacs-devel@gnu.org; Tue, 10 Mar 2015 21:23:41 -0400 Original-Received: by qgea108 with SMTP id a108so6629856qge.8 for ; Tue, 10 Mar 2015 18:23:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=ezYsO2YE6HxCVJR31AH4IU9hqNeu60HfN7XSDyzqnjs=; b=Wihxbt4lzon/5CqsvMX1wg8kvJA7vRIKA8J1wuoWHCBfxl+XAwqgwKtsQ145cK4UKS F6xl6kMaCedMwza1pV4ZBPu3gA/8H9CeocC5CzikosgA+5DVRI5zptZ4kYj2n9kdKMAO Utch5D9wZFWX6KzUHK2cJXFc6kysyjUQwpzOk4fFvfDLHW+fE5733uHcX0Rsp87t/Q9m eAPxCbo1OqpJ2efoXI26PDWRsM0NZU9CkOzRB3q1wHQGk317su/Mgjnb1WNTAthHglqQ rDP4tnmDsgIw1XibiYRdLJGo1rE2p7/s2BBx0QpGGKHqLt+QkWoR5vghVqg27I/v1p7p qOYQ== X-Received: by 10.55.23.68 with SMTP id i65mr61783455qkh.59.1426037020711; Tue, 10 Mar 2015 18:23:40 -0700 (PDT) Original-Received: by 10.140.100.213 with HTTP; Tue, 10 Mar 2015 18:23:40 -0700 (PDT) In-Reply-To: X-Google-Sender-Auth: Hpr3xPe7L4ZQR0gBixmAXbblnso X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400d:c04::235 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:183777 Archived-At: Stefan Monnier 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)