From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Kevin Brubeck Unhammer Newsgroups: gmane.emacs.devel Subject: [PATCH] Allow irc networks in erc-autojoin-channels-alist Date: Wed, 4 Mar 2015 12:06:27 +0100 Message-ID: <1425467187-22491-1-git-send-email-unhammer@fsfe.org> NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1425467236 22600 80.91.229.3 (4 Mar 2015 11:07:16 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 4 Mar 2015 11:07:16 +0000 (UTC) Cc: Kevin Brubeck Unhammer To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Mar 04 12:07:06 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 1YT78r-00068b-Sw for ged-emacs-devel@m.gmane.org; Wed, 04 Mar 2015 12:07:06 +0100 Original-Received: from localhost ([::1]:43178 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YT78r-000585-8L for ged-emacs-devel@m.gmane.org; Wed, 04 Mar 2015 06:07:05 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:36876) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YT78Y-00050r-C0 for emacs-devel@gnu.org; Wed, 04 Mar 2015 06:06:52 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YT78S-00083j-IN for emacs-devel@gnu.org; Wed, 04 Mar 2015 06:06:46 -0500 Original-Received: from out2-smtp.messagingengine.com ([66.111.4.26]:55071) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YT78S-00083W-A6 for emacs-devel@gnu.org; Wed, 04 Mar 2015 06:06:40 -0500 Original-Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id 06A59205F6; Wed, 4 Mar 2015 06:06:38 -0500 (EST) Original-Received: from frontend1 ([10.202.2.160]) by compute5.internal (MEProxy); Wed, 04 Mar 2015 06:06:39 -0500 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=x-sasl-enc:from:to:cc:subject:date :message-id; s=smtpout; bh=J6eK1CPQJbBYflv4vF4BFYSYbkY=; b=R6dPH tA9YZpwo5eZ166IwBHNZ0o2njmyguDFDwT4ZZkbzROFyV/TTQbElK3Y0tKdzlB9C ggPW3JFuWgzwaxnZUPicrENpjfvyANdeC+3ejCEGEwNb44ZU9zcqBmOSmorvIJMY 4N7mw29MJvsn9OD0y6ndhYhVOWhOaRiwJDhWvU= X-Sasl-enc: 5mokc2FMrG12BTRaocnrPnQWLWZ/APT0vkcsjRt92wiN 1425467198 Original-Received: from kiwiarch.lan (unknown [84.210.14.246]) by mail.messagingengine.com (Postfix) with ESMTPA id 81861C0029D; Wed, 4 Mar 2015 06:06:38 -0500 (EST) X-Mailer: git-send-email 2.3.1 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 66.111.4.26 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:183632 Archived-At: 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