diff lisp/net/rcirc.el @ 68731:85be285e3494

(rcirc-startup-channels-alist): Add irc.freenode.net and #emacs as defaults. (rcirc-ignore-all-activity-flag): Remove variable. (rcirc-authinfo): New variable. (rcirc-authinfo-filename): Remove variable. (rcirc-always-use-server-buffer-flag): New flag. (rcirc): M-x rcirc will automatically connect without prompting. C-u M-x rcirc will prompt. Use rcirc-connect to create a connection in lisp. (rcirc-process-server-response-1): Remove everything but the nick portion of the sender so it doesn't need to be done everywhere else. Update related code. (global-map): Remove global keybindings. (rcirc-get-buffer-create): Make sure rcirc-topic is set. (rcirc-send-input): Split into several functions. (rcirc-process-input-line, rcirc-process-message, rcirc-process-command): New functions. (rcirc-target-buffer): Add function to determine where to route messages. (rcirc-user-nick): Save match data. (rcirc-toggle-ignore-buffer-activity) (rcirc-update-activity-string): Remove global ignore functionality, which can be done now by toggling rcirc-track-minor-mode. (rcirc-track-minor-mode-map): New keymap. (rcirc-track-minor-mode): New minor-mode. (ignore): Make the ignore output nicer. Always print it when adding or removing nicks. (rcirc-url-regexp): Improve. (rcirc-mangle-text): Remove properties before using text in the modeline. (rcirc-authenticate): Authentication data comes from rcirc-authinfo, not the file pointed to by rcirc-authinfo-file. (rcirc-server-prefix): Inherit from rcirc-server.
author Eli Zaretskii <eliz@gnu.org>
date Wed, 08 Feb 2006 17:36:36 +0000
parents 067115a6e738
children 7ba97c461db7 4b3d39451150
line wrap: on
line diff
--- a/lisp/net/rcirc.el	Wed Feb 08 17:32:09 2006 +0000
+++ b/lisp/net/rcirc.el	Wed Feb 08 17:36:36 2006 +0000
@@ -79,7 +79,7 @@
   :type 'string
   :group 'rcirc)
 
-(defcustom rcirc-startup-channels-alist nil
+(defcustom rcirc-startup-channels-alist '(("^irc.freenode.net$" "#emacs"))
   "Alist of channels to join at startup.
 Each element looks like (SERVER-REGEXP . CHANNEL-LIST)."
   :type '(alist :key-type string :value-type (repeat string))
@@ -111,11 +111,6 @@
   "If non-nil, ignore activity in this buffer.")
 (make-variable-buffer-local 'rcirc-ignore-buffer-activity-flag)
 
-(defcustom rcirc-ignore-all-activity-flag nil
-  "*Non-nil means do not indicate any activity in the modeline."
-  :type 'boolean
-  :group 'rcirc)
-
 (defcustom rcirc-time-format "%H:%M "
   "*Describes how timestamps are printed.
 Used as the first arg to `format-time-string'."
@@ -140,29 +135,42 @@
 		 (integer :tag "Number of lines"))
   :group 'rcirc)
 
-(defcustom rcirc-authinfo-file-name
-  "~/.rcirc-authinfo"
-  "File containing rcirc authentication passwords.
-The file consists of a single list, with each element itself a
-list with a SERVER-REGEXP string, a NICK-REGEXP string, a METHOD
-and the remaining method specific ARGUMENTS.  The valid METHOD
-symbols are `nickserv', `chanserv' and `bitlbee'.
+(defcustom rcirc-authinfo nil
+  "List of authentication passwords.
+Each element of the list is a list with a SERVER-REGEXP string
+and a method symbol followed by method specific arguments.
+
+The valid METHOD symbols are `nickserv', `chanserv' and
+`bitlbee'.
 
 The required ARGUMENTS for each METHOD symbol are:
-  `nickserv': PASSWORD
-  `chanserv': CHANNEL PASSWORD
-  `bitlbee': PASSWORD
+  `nickserv': NICK PASSWORD
+  `chanserv': NICK CHANNEL PASSWORD
+  `bitlbee': NICK PASSWORD
 
 Example:
- ((\"freenode\" \"bob\" nickserv \"p455w0rd\")
-  (\"freenode\" \"bob\" chanserv \"#bobland\" \"passwd99\")
-  (\"bitlbee\" \"robert\" bitlbee \"sekrit\"))"
-  :type 'string
+ ((\"freenode\" nickserv \"bob\" \"p455w0rd\")
+  (\"freenode\" chanserv \"bob\" \"#bobland\" \"passwd99\")
+  (\"bitlbee\" bitlbee \"robert\" \"sekrit\"))"
+  :type '(alist :key-type (string :tag "Server")
+		:value-type (choice (list :tag "NickServ"
+					  (const nickserv)
+					  (string :tag "Nick")
+					  (string :tag "Password"))
+				    (list :tag "ChanServ"
+					  (const chanserv)
+					  (string :tag "Nick")
+					  (string :tag "Channel")
+					  (string :tag "Password"))
+				    (list :tag "BitlBee"
+					  (const bitlbee)
+					  (string :tag "Nick")
+					  (string :tag "Password"))))
   :group 'rcirc)
 
-(defcustom rcirc-auto-authenticate-flag (file-readable-p rcirc-authinfo-file-name)
+(defcustom rcirc-auto-authenticate-flag t
   "*Non-nil means automatically send authentication string to server.
-See also `rcirc-authinfo-file-name'."
+See also `rcirc-authinfo'."
   :type 'boolean
   :group 'rcirc)
 
@@ -199,6 +207,11 @@
   :type 'hook
   :group 'rcirc)
 
+(defcustom rcirc-always-use-server-buffer-flag nil
+  "Non-nil means messages without a channel target will go to the server buffer."
+  :type 'boolean
+  :group 'rcirc)
+
 (defvar rcirc-prompt-start-marker nil)
 (defvar rcirc-prompt-end-marker nil)
 
@@ -238,37 +251,35 @@
 
 (defvar rcirc-startup-channels nil)
 ;;;###autoload
-(defun rcirc (&optional server port nick channels)
+(defun rcirc (arg)
   "Connect to IRC.
-
-If any of the the optional SERVER, PORT, NICK or CHANNELS are not
-supplied, they are taken from the variables `rcirc-server',
-`rcirc-port', `rcirc-nick', and `rcirc-startup-channels-alist',
-respectively."
-  (interactive (list (read-string "IRC Server: " rcirc-server)
-		     (read-string "IRC Port: " (number-to-string rcirc-port))
-		     (read-string "IRC Nick: " rcirc-nick)))
-  (or server (setq server rcirc-server))
-  (or port (setq port rcirc-port))
-  (or nick (setq nick rcirc-nick))
-  (or channels
-      (setq channels
-	    (if (interactive-p)
-		(split-string
-		 (read-string "Channels: "
-			      (mapconcat 'identity
-					 (rcirc-startup-channels server)
-					 " "))
-			 "[, ]+" t)
-	      (rcirc-startup-channels server))))
-  (or global-mode-string (setq global-mode-string '("")))
-  (and (not (memq 'rcirc-activity-string global-mode-string))
-       (setq global-mode-string
-	     (append global-mode-string '(rcirc-activity-string))))
-  (add-hook 'window-configuration-change-hook
-	    'rcirc-window-configuration-change)
-  (rcirc-connect server port nick rcirc-user-name rcirc-user-full-name
-		 channels))
+If ARG is non-nil, prompt for a server to connect to."
+  (interactive "P")
+  (if arg
+      (let* ((server (read-string "IRC Server: " rcirc-server))
+	     (port (read-string "IRC Port: " (number-to-string rcirc-port)))
+	     (nick (read-string "IRC Nick: " rcirc-nick))
+	     (channels (split-string
+			(read-string "IRC Channels: "
+				     (mapconcat 'identity
+						(rcirc-startup-channels server)
+						" "))
+			"[, ]+" t)))
+	(rcirc-connect server port nick rcirc-user-name rcirc-user-full-name
+		       channels))
+    ;; make new connection using defaults unless already connected to
+    ;; the default rcirc-server
+    (let ((default-server (default-value 'rcirc-server))
+	  connected)
+      (dolist (p (rcirc-process-list))
+	(when (string= default-server (process-name p))
+	  (setq connected p)))
+      (if (not connected)
+	  (rcirc-connect rcirc-server rcirc-port rcirc-nick
+			 rcirc-user-name rcirc-user-full-name
+			 (rcirc-startup-channels rcirc-server))
+	(switch-to-buffer (process-buffer connected))
+	(message "Connected to %s" rcirc-server)))))
 
 ;;;###autoload
 (defalias 'irc 'rcirc)
@@ -279,11 +290,9 @@
 (defvar rcirc-keepalive-timer nil)
 (defvar rcirc-last-server-message-time nil)
 (defun rcirc-connect (server port nick user-name full-name startup-channels)
-  "Return a connection to SERVER on PORT.
+  (add-hook 'window-configuration-change-hook
+	    'rcirc-window-configuration-change)
 
-User will identify using the values of NICK, USER-NAME and
-FULL-NAME.  The variable list of channel names in
-STARTUP-CHANNELS will automatically be joined on startup."
   (save-excursion
     (message "Connecting to %s..." server)
     (let* ((inhibit-eol-conversion)
@@ -377,13 +386,13 @@
     (rcirc-debug process (format "SENTINEL: %S %S\n" process sentinel))
     (with-rcirc-process-buffer process
       (dolist (buffer (cons nil (mapcar 'cdr rcirc-buffer-alist)))
-        (rcirc-print process "rcirc.el" "ERROR" buffer
-                     (format "%s: %s (%S)"
-                             (process-name process)
-                             sentinel
-                             (process-status process)) t)
-	;; remove the prompt from buffers
 	(with-current-buffer (or buffer (current-buffer))
+	  (rcirc-print process "rcirc.el" "ERROR" rcirc-target
+		       (format "%s: %s (%S)"
+			       (process-name process)
+			       sentinel
+			       (process-status process)) t)
+	  ;; remove the prompt from buffers
 	  (let ((inhibit-read-only t))
 	    (delete-region rcirc-prompt-start-marker
 			   rcirc-prompt-end-marker)))))
@@ -428,7 +437,8 @@
 
 (defun rcirc-process-server-response-1 (process text)
   (if (string-match "^\\(:\\([^ ]+\\) \\)?\\([^ ]+\\) \\(.+\\)$" text)
-      (let* ((sender (match-string 2 text))
+      (let* ((user (match-string 2 text))
+	     (sender (rcirc-user-nick user))
              (cmd (match-string 3 text))
              (args (match-string 4 text))
              (handler (intern-soft (concat "rcirc-handler-" cmd))))
@@ -487,12 +497,10 @@
                  text))
          (more (if oversize
                    (substring message rcirc-max-message-length))))
-    (rcirc-print process (rcirc-nick process) response
-		 (rcirc-get-buffer-create process target)
-		 text)
+    (rcirc-get-buffer-create process target)
+    (rcirc-print process (rcirc-nick process) response target text)
     (rcirc-send-string process (concat response " " target " :" text))
-    (if more
-        (rcirc-send-message process target more noticep))))
+    (when more (rcirc-send-message process target more noticep))))
 
 (defvar rcirc-input-ring nil)
 (defvar rcirc-input-ring-index 0)
@@ -582,10 +590,6 @@
 (define-key rcirc-mode-map (kbd "C-c C-s") 'rcirc-switch-to-server-buffer)
 (define-key rcirc-mode-map (kbd "C-c C-a") 'rcirc-jump-to-first-unread-line)
 
-(define-key global-map (kbd "C-c `") 'rcirc-next-active-buffer)
-(define-key global-map (kbd "C-c C-@") 'rcirc-next-active-buffer)
-(define-key global-map (kbd "C-c C-SPC") 'rcirc-next-active-buffer)
-
 (defvar rcirc-browse-url-map (make-sparse-keymap)
   "Keymap used for browsing URLs in `rcirc-mode'.")
 
@@ -730,8 +734,6 @@
 (defun rcirc-get-buffer (process target &optional server)
   "Return the buffer associated with the PROCESS and TARGET.
 
-If TARGET is nil, return the server buffer.
-
 If optional argument SERVER is non-nil, return the server buffer
 if there is no existing buffer for TARGET, otherwise return nil."
   (with-rcirc-process-buffer process
@@ -744,7 +746,11 @@
   "Return the buffer associated with the PROCESS and TARGET.
 Create the buffer if it doesn't exist."
   (let ((buffer (rcirc-get-buffer process target)))
-    (or buffer
+    (if buffer
+	(progn
+	  (when (not rcirc-target)
+	    (setq rcirc-target target))
+	  buffer)
 	;; create the buffer
 	(with-rcirc-process-buffer process
 	  (let ((new-buffer (get-buffer-create
@@ -781,36 +787,45 @@
 	  (delete-backward-char 1))
 	(let ((input (buffer-substring-no-properties
 		      rcirc-prompt-end-marker (point))))
-	  ;; process a /cmd
-	  (if (string-match "^/\\([^ ]+\\) ?\\(.*\\)$" input)
-	      (let* ((command (match-string 1 input))
-		     (fun (intern-soft (concat "rcirc-cmd-" command)))
-		     (args (match-string 2 input)))
-		(newline)
-		(with-current-buffer (current-buffer)
-		  (delete-region rcirc-prompt-end-marker (point))
-		  (if (string= command "me")
-		      (rcirc-print rcirc-process (rcirc-nick rcirc-process)
-				   "ACTION" (current-buffer) args)
-		    (rcirc-print rcirc-process (rcirc-nick rcirc-process)
-				 "COMMAND" (current-buffer) input))
-		  (set-marker rcirc-prompt-end-marker (point))
-		  (if (fboundp fun)
-		      (funcall fun args rcirc-process target)
-		    (rcirc-send-string rcirc-process
-				       (concat command " " args)))))
-	    ;; send message to server
-	    (if (not rcirc-target)
-		(message "Not joined")
-	      (delete-region rcirc-prompt-end-marker (point))
-	      (mapc (lambda (message)
-		      (rcirc-send-message rcirc-process target message))
-		    (split-string input "\n"))))
+	  (dolist (line (split-string input "\n"))
+	    (rcirc-process-input-line rcirc-process target line))
 	  ;; add to input-ring
 	  (save-excursion
 	    (ring-insert rcirc-input-ring input)
 	    (setq rcirc-input-ring-index 0)))))))
 
+(defun rcirc-process-input-line (process target line)
+  (if (string-match "^/\\([^ ]+\\) ?\\(.*\\)$" line)
+      (rcirc-process-command (match-string 1 line)
+			     (match-string 2 line)
+			     line)
+    (rcirc-process-message line)))
+
+(defun rcirc-process-message (line)
+  (if (not rcirc-target)
+      (message "Not joined")
+    (delete-region rcirc-prompt-end-marker (point))
+    (rcirc-send-message rcirc-process rcirc-target line)))
+
+(defun rcirc-process-command (command args line)
+  (if (eq (aref command 0) ?/)
+      ;; "//text" will send "/text" as a message
+      (rcirc-process-message (substring line 1))
+    (let* ((fun (intern-soft (concat "rcirc-cmd-" command))))
+      (newline)
+      (with-current-buffer (current-buffer)
+	(delete-region rcirc-prompt-end-marker (point))
+	(if (string= command "me")
+	    (rcirc-print rcirc-process (rcirc-nick rcirc-process)
+			 "ACTION" rcirc-target args)
+	  (rcirc-print rcirc-process (rcirc-nick rcirc-process)
+		       "COMMAND" rcirc-target line))
+	(set-marker rcirc-prompt-end-marker (point))
+	(if (fboundp fun)
+	    (funcall fun args rcirc-process rcirc-target)
+	  (rcirc-send-string rcirc-process
+			     (concat command " " args)))))))
+
 (defvar rcirc-parent-buffer nil)
 (defvar rcirc-window-configuration nil)
 (defun rcirc-edit-multiline ()
@@ -828,7 +843,8 @@
       (setq rcirc-parent-buffer parent)
       (setq rcirc-process process)
       (insert text)
-      (and (> pos 0) (goto-char pos)))))
+      (and (> pos 0) (goto-char pos))
+      (message "Type C-c C-c to return text to %s, or C-c C-k to cancel" parent))))
 
 (define-derived-mode rcirc-multiline-edit-mode
   text-mode "rcirc multi"
@@ -894,13 +910,15 @@
                          (t
                           (setq first "[" middle " " end "]")))
                    (concat first
-                           (rcirc-facify (rcirc-user-nick sender)
+                           (rcirc-facify (concat
+					  sender
+					  (when target (concat "," target)))
                                          (if (string= sender
                                                       (rcirc-nick process))
                                              'rcirc-my-nick
                                            'rcirc-other-nick))
-                           middle
-                           (rcirc-mangle-text process text)
+			   middle
+			   (rcirc-mangle-text process text)
                            end)))
                 ((string= response "COMMAND")
                  text)
@@ -914,31 +932,41 @@
 			  (rcirc-facify
 			   (concat
 			    (when (not (string= sender (rcirc-server process)))
-			      (concat (rcirc-user-nick sender) " "))
+			      (concat sender " "))
 			    (when (zerop (string-to-number response))
 			      (concat response " "))
 			    text)
 			   'rcirc-server)))))))
 
+(defun rcirc-target-buffer (process sender response target text)
+  "Return a buffer to print the server response."
+  (assert (not (bufferp target)))
+  (with-rcirc-process-buffer process
+    (cond ((not target)
+	   (if rcirc-always-use-server-buffer-flag
+	       (process-buffer process)
+	     (rcirc-get-any-buffer process)))
+	  ((not (rcirc-channel-p target))
+	   ;; message from another user
+	   (if (string= response "PRIVMSG")
+	       (rcirc-get-buffer-create process (if (string= sender rcirc-nick)
+						    target
+						  sender))
+	     (rcirc-get-buffer process target t)))
+	  ((or (rcirc-get-buffer process target)
+	       (rcirc-get-any-buffer process))))))
+
 (defvar rcirc-activity-type nil)
 (make-variable-buffer-local 'rcirc-activity-type)
 (defun rcirc-print (process sender response target text &optional activity)
   "Print TEXT in the buffer associated with TARGET.
 Format based on SENDER and RESPONSE.  If ACTIVITY is non-nil,
 record activity."
-  (unless (or (member (rcirc-user-nick sender) rcirc-ignore-list)
+  (unless (or (member sender rcirc-ignore-list)
 	      (member (with-syntax-table rcirc-nick-syntax-table
 			(when (string-match "^\\([^/]\\w*\\)[:,]" text)
 			  (match-string 1 text))) rcirc-ignore-list))
-    (let* ((buffer (cond ((bufferp target)
-			  target)
-			 ((not target)
-			  (rcirc-get-any-buffer process))
-			 ((not (rcirc-channel-p target))
-			  (rcirc-get-buffer-create process
-						   (rcirc-user-nick sender)))
-			 ((or (rcirc-get-buffer process target)
-			      (rcirc-get-any-buffer process)))))
+    (let* ((buffer (rcirc-target-buffer process sender response target text))
 	   (inhibit-read-only t))
       (with-current-buffer buffer
 	(let ((moving (= (point) rcirc-prompt-end-marker))
@@ -961,7 +989,7 @@
 	  (set-marker-insertion-type rcirc-prompt-start-marker t)
 	  (set-marker-insertion-type rcirc-prompt-end-marker t)
 	  (insert
-	   (rcirc-format-response-string process sender response target text)
+	   (rcirc-format-response-string process sender response nil text)
 	   (propertize "\n" 'hard t))
 	  (set-marker-insertion-type rcirc-prompt-start-marker nil)
 	  (set-marker-insertion-type rcirc-prompt-end-marker nil)
@@ -978,10 +1006,10 @@
 			     0)
 			   (cond ((or (string= response "PRIVMSG")
 				      (string= response "NOTICE"))
-				  (+ (length (rcirc-user-nick sender))
+				  (+ (length sender)
 				     2)) ; <>
 				 ((string= response "ACTION")
-				  (+ (length (rcirc-user-nick sender))
+				  (+ (length sender)
 				     1))	; [
 				 (t 3))		; ***
 			   1)
@@ -1056,17 +1084,17 @@
 (defun rcirc-join-channels (process channels)
   "Join CHANNELS."
   (save-window-excursion
-    (mapc (lambda (channel)
-            (with-rcirc-process-buffer process
-              (rcirc-cmd-join channel process)))
-          channels)))
+    (dolist (channel channels)
+      (with-rcirc-process-buffer process
+	(rcirc-cmd-join channel process)))))
 
 ;;; nick management
 (defun rcirc-user-nick (user)
   "Return the nick from USER.  Remove any non-nick junk."
-  (if (string-match "^[@%+]?\\([^! ]+\\)!?" (or user ""))
-      (match-string 1 user)
-    user))
+  (save-match-data
+    (if (string-match "^[@%+]?\\([^! ]+\\)!?" (or user ""))
+	(match-string 1 user)
+      user)))
 
 (defun rcirc-user-non-nick (user)
   "Return the non-nick portion of USER."
@@ -1076,17 +1104,15 @@
 
 (defun rcirc-nick-channels (process nick)
   "Return list of channels for NICK."
-  (let ((nick (rcirc-user-nick nick)))
-    (with-rcirc-process-buffer process
-      (mapcar (lambda (x) (car x))
-              (gethash nick rcirc-nick-table)))))
+  (with-rcirc-process-buffer process
+    (mapcar (lambda (x) (car x))
+	    (gethash nick rcirc-nick-table))))
 
 (defun rcirc-put-nick-channel (process nick channel)
   "Add CHANNEL to list associated with NICK."
   (with-rcirc-process-buffer process
-    (let* ((nick (rcirc-user-nick nick))
-           (chans (gethash nick rcirc-nick-table))
-           (record (assoc-string channel chans t)))
+    (let* ((chans (gethash nick rcirc-nick-table))
+	   (record (assoc-string channel chans t)))
       (if record
           (setcdr record (current-time))
         (puthash nick (cons (cons channel (current-time))
@@ -1101,8 +1127,7 @@
 (defun rcirc-remove-nick-channel (process nick channel)
   "Remove the CHANNEL from list associated with NICK."
   (with-rcirc-process-buffer process
-    (let* ((nick (rcirc-user-nick nick))
-           (chans (gethash nick rcirc-nick-table))
+    (let* ((chans (gethash nick rcirc-nick-table))
            (newchans
 	    ;; instead of assoc-string-delete-all:
 	    (let ((record (assoc-string channel chans t)))
@@ -1136,28 +1161,44 @@
 	    (delete nick rcirc-ignore-list))))
 
 ;;; activity tracking
+(defvar rcirc-track-minor-mode-map (make-sparse-keymap)
+  "Keymap for rcirc track minor mode.")
+
+(define-key rcirc-track-minor-mode-map (kbd "C-c `") 'rcirc-next-active-buffer)
+(define-key rcirc-track-minor-mode-map (kbd "C-c C-@") 'rcirc-next-active-buffer)
+(define-key rcirc-track-minor-mode-map (kbd "C-c C-SPC") 'rcirc-next-active-buffer)
+
+;;; FIXME: the code to insert `rcirc-activity-string' into
+;;; `global-mode-string' isn't called when the mode is activated by
+;;; customize.  I don't know how to set that up.
+(define-minor-mode rcirc-track-minor-mode
+  "Global minor mode for tracking activity in rcirc buffers."
+  :init-value nil
+  :lighter ""
+  :keymap rcirc-track-minor-mode-map
+  :global t
+  :group 'rcirc
+  (or global-mode-string (setq global-mode-string '("")))
+  ;; toggle the mode-line channel indicator
+  (if rcirc-track-minor-mode
+      (and (not (memq 'rcirc-activity-string global-mode-string))
+	   (setq global-mode-string
+		 (append global-mode-string '(rcirc-activity-string))))
+    (setq global-mode-string 
+	  (delete 'rcirc-activity-string global-mode-string))))
+
 (or (assq 'rcirc-ignore-buffer-activity-flag minor-mode-alist)
     (setq minor-mode-alist
           (cons '(rcirc-ignore-buffer-activity-flag " Ignore") minor-mode-alist)))
 
-(defun rcirc-toggle-ignore-buffer-activity (&optional all)
-  "Toggle the value of `rcirc-ignore-buffer-activity-flag'.
-If ALL is non-nil, instead toggle the value of
-`rcirc-ignore-all-activity-flag'."
-  (interactive "P")
-  (if all
-      (progn
-        (setq rcirc-ignore-all-activity-flag
-              (not rcirc-ignore-all-activity-flag))
-        (message (if rcirc-ignore-all-activity-flag
-		     "Hide all buffer activity"
-		   "Display buffer activity"))
-        (rcirc-update-activity-string))
-    (setq rcirc-ignore-buffer-activity-flag
-          (not rcirc-ignore-buffer-activity-flag))
-    (message (if rcirc-ignore-buffer-activity-flag
-		 "Ignore activity in this buffer"
-	       "Notice activity in this buffer")))
+(defun rcirc-toggle-ignore-buffer-activity ()
+  "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
+  (interactive)
+  (setq rcirc-ignore-buffer-activity-flag
+	(not rcirc-ignore-buffer-activity-flag))
+  (message (if rcirc-ignore-buffer-activity-flag
+	       "Ignore activity in this buffer"
+	     "Notice activity in this buffer"))
   (force-mode-line-update))
 
 (defvar rcirc-switch-to-buffer-function 'switch-to-buffer
@@ -1229,21 +1270,18 @@
 (defun rcirc-update-activity-string ()
   "Update mode-line string."
   (setq rcirc-activity-string
-	(cond (rcirc-ignore-all-activity-flag
-	       " DND")
-	      ((not rcirc-activity)
-	       "")
-	      (t
-	       (concat " ["
-		       (mapconcat
-			(lambda (b)
-			  (let ((s (rcirc-short-buffer-name b)))
-			    (with-current-buffer b
-			      (if (not (eq rcirc-activity-type 'nick))
-				  s
-				(rcirc-facify s 'rcirc-mode-line-nick)))))
-			rcirc-activity ",")
-		       "]")))))
+	(if (not rcirc-activity)
+	       ""
+	  (concat " ["
+		  (mapconcat
+		   (lambda (b)
+		     (let ((s (rcirc-short-buffer-name b)))
+		       (with-current-buffer b
+			 (if (not (eq rcirc-activity-type 'nick))
+			     s
+			   (rcirc-facify s 'rcirc-mode-line-nick)))))
+		   rcirc-activity ",")
+		  "]"))))
 
 (defun rcirc-short-buffer-name (buffer)
   "Return a short name for BUFFER to use in the modeline indicator."
@@ -1488,23 +1526,22 @@
 nicks when no NICK is given.  When listing ignored nicks, the
 ones added to the list automatically are marked with an asterisk."
   (interactive "sToggle ignoring of nick: ")
-  (if (string= "" nick)
-      (rcirc-print process (rcirc-nick process) "NOTICE" target
-		   (mapconcat
-		    (lambda (nick)
-		      (concat nick
-			      (if (member nick rcirc-ignore-list-automatic)
-				  "*" "")))
-		    rcirc-ignore-list " "))
+  (when (not (string= "" nick))
     (if (member nick rcirc-ignore-list)
 	(setq rcirc-ignore-list (delete nick rcirc-ignore-list))
-      (setq rcirc-ignore-list (cons nick rcirc-ignore-list)))))
-
+      (setq rcirc-ignore-list (cons nick rcirc-ignore-list))))
+  (rcirc-print process (rcirc-nick process) "IGNORE" target 
+	       (mapconcat
+		(lambda (nick)
+		  (concat nick
+			  (if (member nick rcirc-ignore-list-automatic)
+			      "*" "")))
+		rcirc-ignore-list " ")))
 
 
 (defun rcirc-message-leader (sender face)
   "Return a string with SENDER propertized with FACE."
-  (rcirc-facify (concat "<" (rcirc-user-nick sender) "> ") face))
+  (rcirc-facify (concat "<" sender "> ") face))
 
 (defun rcirc-facify (string face)
   "Return a copy of STRING with FACE property added."
@@ -1518,8 +1555,8 @@
 	       "://"
 	       (1+ (char "a-zA-Z0-9_."))
 	       (optional ":" (1+ (char "0-9")))))
-      (1+ (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;.,"))
-      (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;"))
+      (1+ (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;.,{}[]"))
+      (char "-a-zA-Z0-9_=#$\@~`%&*+|\\/:;{}[]"))
   "Regexp matching URLs.  Set to nil to disable URL features in rcirc.")
 
 (defun rcirc-browse-url (&optional arg)
@@ -1603,7 +1640,7 @@
 					'mouse-face 'highlight
 					'keymap rcirc-browse-url-map)
 				  string))
-	     (push (substring string start end) rcirc-urls))
+	     (push (substring-no-properties string start end) rcirc-urls))
 	   rcirc-url-regexp
 	   text))
   text)
@@ -1627,7 +1664,7 @@
 (defun rcirc-handler-PRIVMSG (process sender args text)
   (let ((target (if (rcirc-channel-p (car args))
                     (car args)
-                  (rcirc-user-nick sender)))
+                  sender))
         (message (or (cadr args) "")))
     (if (string-match "^\C-a\\(.*\\)\C-a$" message)
         (rcirc-handler-CTCP process target sender (match-string 1 message))
@@ -1650,25 +1687,21 @@
 			  (match-string 1 message))
 			 (sender
 			  (if (string= sender (rcirc-server process))
-			      (process-buffer process)
-			    (rcirc-user-nick sender))))
+			      nil	; server notice
+			    sender)))
                  message t))))
-    ;; do we need this:
-    ;;(and sender (rcirc-put-nick-channel process sender target))))
 
 (defun rcirc-handler-WALLOPS (process sender args text)
-  (let ((target (rcirc-user-nick sender)))
-    (rcirc-print process sender "WALLOPS" target (car args) t)))
+  (rcirc-print process sender "WALLOPS" sender (car args) t))
 
 (defun rcirc-handler-JOIN (process sender args text)
-  (let ((channel (car args))
-        (nick (rcirc-user-nick sender)))
+  (let ((channel (car args)))
     (rcirc-get-buffer-create process channel)
     (rcirc-print process sender "JOIN" channel "")
 
     ;; print in private chat buffer if it exists
-    (when (rcirc-get-buffer rcirc-process nick)
-      (rcirc-print process sender "JOIN" nick channel))
+    (when (rcirc-get-buffer rcirc-process sender)
+      (rcirc-print process sender "JOIN" sender channel))
 
     (rcirc-put-nick-channel process sender channel)))
 
@@ -1695,9 +1728,9 @@
 	  (setq rcirc-target nil))))))
 
 (defun rcirc-handler-PART (process sender args text)
-  (rcirc-ignore-update-automatic (rcirc-user-nick sender))
+  (rcirc-ignore-update-automatic sender)
   (rcirc-handler-PART-or-KICK process "PART"
-                              (car args) sender (rcirc-user-nick sender)
+                              (car args) sender sender
                               (cadr args)))
 
 (defun rcirc-handler-KICK (process sender args text)
@@ -1705,21 +1738,19 @@
                               (caddr args)))
 
 (defun rcirc-handler-QUIT (process sender args text)
-  (rcirc-ignore-update-automatic (rcirc-user-nick sender))
-  (let ((nick (rcirc-user-nick sender)))
-    (mapc (lambda (channel)
-            (rcirc-print process sender "QUIT" channel (apply 'concat args)))
-          (rcirc-nick-channels process nick))
+  (rcirc-ignore-update-automatic sender)
+  (mapc (lambda (channel)
+	  (rcirc-print process sender "QUIT" channel (apply 'concat args)))
+	(rcirc-nick-channels process sender))
 
-    ;; print in private chat buffer if it exists
-    (let ((buffer (rcirc-get-buffer rcirc-process nick)))
-      (when buffer
-	(rcirc-print process sender "QUIT" buffer (apply 'concat args))))
+  ;; print in private chat buffer if it exists
+  (when (rcirc-get-buffer rcirc-process sender)
+    (rcirc-print process sender "QUIT" sender (apply 'concat args)))
 
-    (rcirc-nick-remove process nick)))
+  (rcirc-nick-remove process sender))
 
 (defun rcirc-handler-NICK (process sender args text)
-  (let* ((old-nick (rcirc-user-nick sender))
+  (let* ((old-nick sender)
          (new-nick (car args))
          (channels (rcirc-nick-channels process old-nick)))
     ;; update list of ignored nicks
@@ -1796,9 +1827,8 @@
 
     ;; print in private chat buffers if they exist
     (mapc (lambda (nick)
-	    (let ((existing-buffer (rcirc-get-buffer process nick)))
-	      (when existing-buffer
-		(rcirc-print process sender "MODE" existing-buffer msg))))
+	    (when (rcirc-get-buffer process nick)
+	      (rcirc-print process sender "MODE" nick msg)))
 	  (cddr args))))
 
 (defun rcirc-get-temp-buffer-create (process channel)
@@ -1834,40 +1864,35 @@
 
 (defun rcirc-authenticate ()
   "Send authentication to process associated with current buffer.
-Passwords are read from `rcirc-authinfo-file-name' (which see)."
+Passwords are stored in `rcirc-authinfo' (which see)."
   (interactive)
-  (let ((password-alist
-         (with-temp-buffer
-           (insert-file-contents-literally rcirc-authinfo-file-name)
-           (goto-char (point-min))
-           (read (current-buffer)))))
-    (with-rcirc-process-buffer rcirc-process
-      (dolist (i password-alist)
-        (let ((server (car i))
-              (nick (cadr i))
-              (method (caddr i))
-              (args (cdddr i)))
-          (when (and (string-match server rcirc-server)
-                     (string-match nick rcirc-nick))
-            (cond ((equal method 'nickserv)
-                   (rcirc-send-string
-                    rcirc-process
-                    (concat
-                     "PRIVMSG nickserv :identify "
-		     (car args))))
-                  ((equal method 'chanserv)
-                   (rcirc-send-string
-                    rcirc-process
-                    (concat
-                     "PRIVMSG chanserv :identify "
-		     (car args) " " (cadr args))))
-                  ((equal method 'bitlbee)
-                   (rcirc-send-string
-                    rcirc-process
-                    (concat "PRIVMSG #bitlbee :identify " (car args))))
-                  (t
-                   (message "No %S authentication method defined"
-			    method)))))))))
+  (with-rcirc-process-buffer rcirc-process
+    (dolist (i rcirc-authinfo)
+      (let ((server (car i))
+	    (nick (caddr i))
+	    (method (cadr i))
+	    (args (cdddr i)))
+	(when (and (string-match server rcirc-server)
+		   (string-match nick rcirc-nick))
+	  (cond ((equal method 'nickserv)
+		 (rcirc-send-string
+		  rcirc-process
+		  (concat
+		   "PRIVMSG nickserv :identify "
+		   (car args))))
+		((equal method 'chanserv)
+		 (rcirc-send-string
+		  rcirc-process
+		  (concat
+		   "PRIVMSG chanserv :identify "
+		   (cadr args) " " (car args))))
+		((equal method 'bitlbee)
+		 (rcirc-send-string
+		  rcirc-process
+		  (concat "PRIVMSG &bitlbee :identify " (car args))))
+		(t
+		 (message "No %S authentication method defined"
+			  method))))))))
 
 (defun rcirc-handler-INVITE (process sender args text)
   (rcirc-print process sender "INVITE" nil (mapconcat 'identity args " ") t))
@@ -1879,22 +1904,19 @@
   (if (string-match "^\\([^ ]+\\) *\\(.*\\)$" text)
       (let* ((request (upcase (match-string 1 text)))
              (args (match-string 2 text))
-             (nick (rcirc-user-nick sender))
              (handler (intern-soft (concat "rcirc-handler-ctcp-" request))))
         (if (not (fboundp handler))
-            (rcirc-print process sender "ERROR"
-			 (rcirc-get-buffer process target)
-                         (format "%s sent unsupported ctcp: %s" nick text)
+            (rcirc-print process sender "ERROR" target
+                         (format "%s sent unsupported ctcp: %s" sender text)
 			 t)
           (funcall handler process target sender args)
           (if (not (string= request "ACTION"))
-              (rcirc-print process sender "CTCP"
-			   (rcirc-get-buffer process target)
+              (rcirc-print process sender "CTCP" target
 			   (format "%s" text) t))))))
 
 (defun rcirc-handler-ctcp-VERSION (process target sender args)
   (rcirc-send-string process
-                     (concat "NOTICE " (rcirc-user-nick sender)
+                     (concat "NOTICE " sender
                              " :\C-aVERSION " rcirc-id-string
                              "\C-a")))
 
@@ -1903,7 +1925,7 @@
 
 (defun rcirc-handler-ctcp-TIME (process target sender args)
   (rcirc-send-string process
-                     (concat "NOTICE " (rcirc-user-nick sender)
+                     (concat "NOTICE " sender
                              " :\C-aTIME " (current-time-string) "\C-a")))
 
 (defun rcirc-handler-CTCP-response (process target sender message)
@@ -1960,7 +1982,7 @@
   :group 'rcirc-faces)
 
 (defface rcirc-server-prefix	 ; font-lock-comment-delimiter-face
-  '((default :inherit font-lock-comment-face)
+  '((default :inherit rcirc-server)
     (((class grayscale)))
     (((class color) (min-colors 16)))
     (((class color) (min-colors 8) (background light))