: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))
"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'."
(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)
: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)
\f
(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)
(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)
(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)))))
(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))))
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)
(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'.")
(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
"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
(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 ()
(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"
(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)
(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))
(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)
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)
(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)))))
\f
;;; 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."
(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))
(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)))
(delete nick rcirc-ignore-list))))
\f
;;; 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
(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."
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 " ")))
\f
(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."
"://"
(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)
'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)
(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))
(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)))
(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)
(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
;; 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)
(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))
(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")))
(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)
: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))