mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-24 10:38:38 +00:00
(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.
This commit is contained in:
parent
063cd226b9
commit
db58efbf51
@ -1,3 +1,40 @@
|
||||
2006-02-08 Ryan Yeske <rcyeske@gmail.com>
|
||||
|
||||
* net/rcirc.el (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): New 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.
|
||||
|
||||
2006-02-08 Mathias Megyei <Mathias.Megyei@micronas.com> (tiny change)
|
||||
|
||||
* Makefile.in (compile): Append "|| true" to the end of the `find'
|
||||
|
@ -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 @@ underneath each nick."
|
||||
"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 @@ number. If zero or nil, no truncating is done."
|
||||
(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 @@ Called with 5 arguments, PROCESS, SENDER, RESPONSE, TARGET and TEXT."
|
||||
: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 @@ Called with 5 arguments, PROCESS, SENDER, RESPONSE, TARGET and TEXT."
|
||||
|
||||
(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: "
|
||||
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-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)
|
||||
"[, ]+" 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 @@ respectively."
|
||||
(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 @@ Functions are called with PROCESS and SENTINEL arguments.")
|
||||
(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
|
||||
(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
|
||||
(with-current-buffer (or buffer (current-buffer))
|
||||
(let ((inhibit-read-only t))
|
||||
(delete-region rcirc-prompt-start-marker
|
||||
rcirc-prompt-end-marker)))))
|
||||
@ -428,7 +437,8 @@ Function is called with PROCESS, COMMAND, SENDER, ARGS and LINE.")
|
||||
|
||||
(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 @@ If NOTICEP is non-nil, send a notice instead of privmsg."
|
||||
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-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 @@ If buffer is nil, return the target of the current buffer."
|
||||
(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 @@ This is used for the initial name given to IRC buffers."
|
||||
(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 @@ if there is no existing buffer for TARGET, otherwise return nil."
|
||||
"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,35 +787,44 @@ Create the buffer if it doesn't exist."
|
||||
(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)))
|
||||
(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" (current-buffer) args)
|
||||
"ACTION" rcirc-target args)
|
||||
(rcirc-print rcirc-process (rcirc-nick rcirc-process)
|
||||
"COMMAND" (current-buffer) input))
|
||||
"COMMAND" rcirc-target line))
|
||||
(set-marker rcirc-prompt-end-marker (point))
|
||||
(if (fboundp fun)
|
||||
(funcall fun args rcirc-process target)
|
||||
(funcall fun args rcirc-process rcirc-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"))))
|
||||
;; add to input-ring
|
||||
(save-excursion
|
||||
(ring-insert rcirc-input-ring input)
|
||||
(setq rcirc-input-ring-index 0)))))))
|
||||
(concat command " " args)))))))
|
||||
|
||||
(defvar rcirc-parent-buffer nil)
|
||||
(defvar rcirc-window-configuration nil)
|
||||
@ -828,7 +843,8 @@ Create the buffer if it doesn't exist."
|
||||
(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,7 +910,9 @@ Create the buffer if it doesn't exist."
|
||||
(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
|
||||
@ -914,31 +932,41 @@ Create the buffer if it doesn't exist."
|
||||
(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 @@ record activity."
|
||||
(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 @@ record activity."
|
||||
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 @@ record activity."
|
||||
(defun rcirc-join-channels (process channels)
|
||||
"Join CHANNELS."
|
||||
(save-window-excursion
|
||||
(mapc (lambda (channel)
|
||||
(dolist (channel channels)
|
||||
(with-rcirc-process-buffer process
|
||||
(rcirc-cmd-join channel process)))
|
||||
channels)))
|
||||
(rcirc-cmd-join channel process)))))
|
||||
|
||||
;;; nick management
|
||||
(defun rcirc-user-nick (user)
|
||||
"Return the nick from USER. Remove any non-nick junk."
|
||||
(save-match-data
|
||||
(if (string-match "^[@%+]?\\([^! ]+\\)!?" (or user ""))
|
||||
(match-string 1 user)
|
||||
user))
|
||||
user)))
|
||||
|
||||
(defun rcirc-user-non-nick (user)
|
||||
"Return the non-nick portion of USER."
|
||||
@ -1076,16 +1104,14 @@ record activity."
|
||||
|
||||
(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)))))
|
||||
(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))
|
||||
(let* ((chans (gethash nick rcirc-nick-table))
|
||||
(record (assoc-string channel chans t)))
|
||||
(if record
|
||||
(setcdr record (current-time))
|
||||
@ -1101,8 +1127,7 @@ record activity."
|
||||
(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 @@ if NICK is also on `rcirc-ignore-list-automatic'."
|
||||
(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))
|
||||
(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")))
|
||||
"Notice activity in this buffer"))
|
||||
(force-mode-line-update))
|
||||
|
||||
(defvar rcirc-switch-to-buffer-function 'switch-to-buffer
|
||||
@ -1229,11 +1270,8 @@ activity. Only run if the buffer is not visible and
|
||||
(defun rcirc-update-activity-string ()
|
||||
"Update mode-line string."
|
||||
(setq rcirc-activity-string
|
||||
(cond (rcirc-ignore-all-activity-flag
|
||||
" DND")
|
||||
((not rcirc-activity)
|
||||
"")
|
||||
(t
|
||||
(if (not rcirc-activity)
|
||||
""
|
||||
(concat " ["
|
||||
(mapconcat
|
||||
(lambda (b)
|
||||
@ -1243,7 +1281,7 @@ activity. Only run if the buffer is not visible and
|
||||
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 @@ Ignore NICK, unignore NICK if already ignored, or list ignored
|
||||
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
|
||||
(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))))
|
||||
(rcirc-print process (rcirc-nick process) "IGNORE" target
|
||||
(mapconcat
|
||||
(lambda (nick)
|
||||
(concat nick
|
||||
(if (member nick rcirc-ignore-list-automatic)
|
||||
"*" "")))
|
||||
rcirc-ignore-list " "))
|
||||
(if (member nick rcirc-ignore-list)
|
||||
(setq rcirc-ignore-list (delete nick rcirc-ignore-list))
|
||||
(setq rcirc-ignore-list (cons nick rcirc-ignore-list)))))
|
||||
|
||||
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 @@ ones added to the list automatically are marked with an asterisk."
|
||||
"://"
|
||||
(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 @@ FUNCTION takes 3 arguments, MATCH-START, MATCH-END, and STRING."
|
||||
'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 @@ FUNCTION takes 3 arguments, MATCH-START, MATCH-END, and STRING."
|
||||
(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 @@ FUNCTION takes 3 arguments, MATCH-START, MATCH-END, and STRING."
|
||||
(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 @@ FUNCTION takes 3 arguments, MATCH-START, MATCH-END, and STRING."
|
||||
(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 @@ FUNCTION takes 3 arguments, MATCH-START, MATCH-END, and STRING."
|
||||
(caddr args)))
|
||||
|
||||
(defun rcirc-handler-QUIT (process sender args text)
|
||||
(rcirc-ignore-update-automatic (rcirc-user-nick sender))
|
||||
(let ((nick (rcirc-user-nick sender)))
|
||||
(rcirc-ignore-update-automatic sender)
|
||||
(mapc (lambda (channel)
|
||||
(rcirc-print process sender "QUIT" channel (apply 'concat args)))
|
||||
(rcirc-nick-channels process nick))
|
||||
(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))))
|
||||
(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 @@ FUNCTION takes 3 arguments, MATCH-START, MATCH-END, and STRING."
|
||||
|
||||
;; 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,18 +1864,13 @@ FUNCTION takes 3 arguments, MATCH-START, MATCH-END, and STRING."
|
||||
|
||||
(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)
|
||||
(dolist (i rcirc-authinfo)
|
||||
(let ((server (car i))
|
||||
(nick (cadr i))
|
||||
(method (caddr i))
|
||||
(nick (caddr i))
|
||||
(method (cadr i))
|
||||
(args (cdddr i)))
|
||||
(when (and (string-match server rcirc-server)
|
||||
(string-match nick rcirc-nick))
|
||||
@ -1860,14 +1885,14 @@ Passwords are read from `rcirc-authinfo-file-name' (which see)."
|
||||
rcirc-process
|
||||
(concat
|
||||
"PRIVMSG chanserv :identify "
|
||||
(car args) " " (cadr args))))
|
||||
(cadr args) " " (car args))))
|
||||
((equal method 'bitlbee)
|
||||
(rcirc-send-string
|
||||
rcirc-process
|
||||
(concat "PRIVMSG #bitlbee :identify " (car args))))
|
||||
(concat "PRIVMSG &bitlbee :identify " (car args))))
|
||||
(t
|
||||
(message "No %S authentication method defined"
|
||||
method)))))))))
|
||||
method))))))))
|
||||
|
||||
(defun rcirc-handler-INVITE (process sender args text)
|
||||
(rcirc-print process sender "INVITE" nil (mapconcat 'identity args " ") t))
|
||||
@ -1879,22 +1904,19 @@ Passwords are read from `rcirc-authinfo-file-name' (which see)."
|
||||
(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 @@ Passwords are read from `rcirc-authinfo-file-name' (which see)."
|
||||
|
||||
(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 @@ Passwords are read from `rcirc-authinfo-file-name' (which see)."
|
||||
: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))
|
||||
|
Loading…
Reference in New Issue
Block a user