diff lisp/erc/erc-autojoin.el @ 68451:fc745b05e928

Revision: emacs@sv.gnu.org/emacs--devo--0--patch-22 Creator: Michael Olson <mwolson@gnu.org> Install ERC.
author Miles Bader <miles@gnu.org>
date Sun, 29 Jan 2006 13:08:58 +0000
parents
children 86c478cccc57
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/erc/erc-autojoin.el	Sun Jan 29 13:08:58 2006 +0000
@@ -0,0 +1,139 @@
+;;; erc-autojoin.el --- autojoin channels on connect and reconnects
+
+;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+
+;; Author: Alex Schroeder <alex@gnu.org>
+;; Keywords: irc
+;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcAutoJoin
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This allows us to customize an `erc-autojoin-channels-alist'.  As
+;; we /JOIN and /PART channels, this alist is updated to reflect our
+;; current setup, so that when we reconnect, we rejoin the same
+;; channels.  The alist can be customized, so that the customized
+;; value will be used when we reconnect in our next Emacs session.
+
+;;; Code:
+
+(require 'erc)
+;;; Minor Mode
+
+(defgroup erc-autojoin nil
+  "Enable autojoining."
+  :group 'erc)
+
+;;;###autoload (autoload 'erc-autojoin-mode "erc-autojoin" nil t)
+(define-erc-module autojoin nil
+  "Makes ERC autojoin on connects and reconnects."
+  ((add-hook 'erc-after-connect 'erc-autojoin-channels)
+   (add-hook 'erc-server-JOIN-functions 'erc-autojoin-add)
+   (add-hook 'erc-server-PART-functions 'erc-autojoin-remove))
+  ((remove-hook 'erc-after-connect 'erc-autojoin-channels)
+   (remove-hook 'erc-server-JOIN-functions 'erc-autojoin-add)
+   (remove-hook 'erc-server-PART-functions 'erc-autojoin-remove)))
+
+(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.
+
+Customize this variable to set the value for your first connect.
+Once you are connected and join and part channels, this alist
+keeps track of what channels you are on, and will join them
+again when you get disconnected.  When you restart Emacs, however,
+those changes are lost, and the customization you saved the last
+time is used again."
+  :group 'erc-autojoin
+  :type '(repeat (cons :tag "Server"
+		       (regexp :tag "Name")
+		       (repeat :tag "Channels"
+			       (string :tag "Name")))))
+
+(defcustom erc-autojoin-domain-only t
+  "Truncate host name to the domain name when joining a server.
+If non-nil, and a channel on the server a.b.c is joined, then
+only b.c is used as the server for `erc-autojoin-channels-alist'.
+This is important for networks that redirect you to other
+servers, presumably in the same domain."
+  :group 'erc-autojoin
+  :type 'boolean)
+
+(defun erc-autojoin-channels (server nick)
+  "Autojoin channels in `erc-autojoin-channels-alist'."
+  (dolist (l erc-autojoin-channels-alist)
+    (when (string-match (car l) server)
+      (dolist (chan (cdr l))
+	(erc-server-send (concat "join " chan))))))
+
+(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))))
+    (when (erc-current-nick-p nick)
+      (when (and erc-autojoin-domain-only
+		 (string-match "[^.]+\\.\\([^.]+\\.[^.]+\\)$" server))
+	(setq server (match-string 1 server)))
+      (let ((elem (assoc server erc-autojoin-channels-alist)))
+	(if elem
+	    (unless (member chnl (cdr elem))
+	      (setcdr elem (cons chnl (cdr elem))))
+	  (setq erc-autojoin-channels-alist
+		(cons (list server chnl)
+		      erc-autojoin-channels-alist))))))
+  ;; We must return nil to tell ERC to continue running the other
+  ;; functions.
+  nil)
+
+;; (erc-parse-user "kensanata!~user@dclient217-162-233-228.hispeed.ch")
+
+(defun erc-autojoin-remove (proc parsed)
+  "Remove the channel being left from `erc-autojoin-channels-alist'."
+  (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))))
+    (when (erc-current-nick-p nick)
+      (when (and erc-autojoin-domain-only
+		 (string-match "[^.]+\\.\\([^.]+\\.[^.]+\\)$" server))
+	(setq server (match-string 1 server)))
+      (let ((elem (assoc server erc-autojoin-channels-alist)))
+	(when elem
+	  (setcdr elem (delete chnl (cdr elem)))
+	  (unless (cdr elem)
+	    (setq erc-autojoin-channels-alist
+		  (delete elem erc-autojoin-channels-alist)))))))
+  ;; We must return nil to tell ERC to continue running the other
+  ;; functions.
+  nil)
+
+(provide 'erc-autojoin)
+
+;;; erc-autojoin.el ends here
+;;
+;; Local Variables:
+;; indent-tabs-mode: t
+;; tab-width: 8
+;; End:
+
+;; arch-tag: d62d8b15-8e31-49d6-8a73-12f11e717414