Mercurial > emacs
changeset 76444:aa83dbd3dea1
(rcirc-timeout-seconds): New variable.
(rcirc-keepalive-seconds): Remove variable.
(rcirc-server-name, rcirc-timeout-timer, rcirc-connecting)
(rcirc-process, rcirc-user-disconnect): New variables.
(rcirc-connect): Initalize new variables.
(rcirc-keepalive): Don't send keepalive pings before connection is completed.
(rcirc-sentinel): Do mark all channels with activity when
connection is dropped. Run hook with process buffer local.
(rcirc-reschedule-timeout, rcirc-delete-process): New functions.
(rcirc-buffer-process): Return value of rcirc-process if rcirc-server-buffer
is nil.
(rcirc-server-name): Return the reported server name.
(rcirc-update-prompt): Simplify computation of the server name.
(rcirc-format-response-string): Likewise.
(rcirc-handler-001): Mark server as connected, record the reported server name,
and schedule a timeout.
(rcirc-track-nick): Add a spec for the tty class.
(rcirc-user-non-nick): Remove function.
(rcirc-nick-prefix-chars): Add variable.
(rcirc-user-nick): Use above variable.
author | Eli Zaretskii <eliz@gnu.org> |
---|---|
date | Sat, 10 Mar 2007 19:31:38 +0000 |
parents | d4c3036c74b8 |
children | 46f411e71e42 |
files | lisp/net/rcirc.el |
diffstat | 1 files changed, 59 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/net/rcirc.el Sat Mar 10 19:23:29 2007 +0000 +++ b/lisp/net/rcirc.el Sat Mar 10 19:31:38 2007 +0000 @@ -312,9 +312,8 @@ "List of urls seen in the current buffer.") (put 'rcirc-urls 'permanent-local t) -(defvar rcirc-keepalive-seconds 60 - "Number of seconds between keepalive pings. -If nil, do not send keepalive pings.") +(defvar rcirc-timeout-seconds 60 + "Kill connection after this many seconds if there is no activity.") (defconst rcirc-id-string (concat "rcirc on GNU Emacs " emacs-version)) @@ -357,7 +356,12 @@ (defvar rcirc-topic nil) (defvar rcirc-keepalive-timer nil) (defvar rcirc-last-server-message-time nil) -(defvar rcirc-server nil) +(defvar rcirc-server nil) ; server provided by server +(defvar rcirc-server-name nil) ; server name given by 001 response +(defvar rcirc-timeout-timer nil) +(defvar rcirc-user-disconnect nil) +(defvar rcirc-connecting nil) +(defvar rcirc-process nil) ;;;###autoload (defun rcirc-connect (&optional server port nick user-name full-name startup-channels) @@ -374,7 +378,7 @@ (user-name (or user-name rcirc-default-user-name)) (full-name (or full-name rcirc-default-user-full-name)) (startup-channels startup-channels) - (process (open-network-stream server nil server port-number))) + (process (make-network-process :name server :host server :service port-number))) ;; set up process (set-process-coding-system process 'raw-text 'raw-text) (switch-to-buffer (rcirc-generate-new-buffer-name process nil)) @@ -382,8 +386,12 @@ (rcirc-mode process nil) (set-process-sentinel process 'rcirc-sentinel) (set-process-filter process 'rcirc-filter) + (make-local-variable 'rcirc-process) + (setq rcirc-process process) (make-local-variable 'rcirc-server) (setq rcirc-server server) + (make-local-variable 'rcirc-server-name) + (setq rcirc-server-name server) ; update when we get 001 response (make-local-variable 'rcirc-buffer-alist) (setq rcirc-buffer-alist nil) (make-local-variable 'rcirc-nick-table) @@ -396,6 +404,12 @@ (setq rcirc-startup-channels startup-channels) (make-local-variable 'rcirc-last-server-message-time) (setq rcirc-last-server-message-time (current-time)) + (make-local-variable 'rcirc-timeout-timer) + (setq rcirc-timeout-timer nil) + (make-local-variable 'rcirc-user-disconnect) + (setq rcirc-user-disconnect nil) + (make-local-variable 'rcirc-connecting) + (setq rcirc-connecting t) ;; identify (rcirc-send-string process (concat "NICK " nick)) @@ -404,10 +418,9 @@ full-name)) ;; setup ping timer if necessary - (when rcirc-keepalive-seconds - (unless rcirc-keepalive-timer - (setq rcirc-keepalive-timer - (run-at-time 0 rcirc-keepalive-seconds 'rcirc-keepalive)))) + (unless rcirc-keepalive-timer + (setq rcirc-keepalive-timer + (run-at-time 0 (/ rcirc-timeout-seconds 2) 'rcirc-keepalive))) (message "Connecting to %s...done" server) @@ -430,12 +443,11 @@ last ping." (if (rcirc-process-list) (mapc (lambda (process) - (with-rcirc-process-buffer process - (if (> (cadr (time-since rcirc-last-server-message-time)) - rcirc-keepalive-seconds) - (kill-process process) - (rcirc-send-string process (concat "PING " rcirc-server))))) + (with-rcirc-process-buffer process + (when (not rcirc-connecting) + (rcirc-send-string process (concat "PING " (rcirc-server-name process)))))) (rcirc-process-list)) + ;; no processes, clean up timer (cancel-timer rcirc-keepalive-timer) (setq rcirc-keepalive-timer nil))) @@ -472,12 +484,12 @@ (format "%s: %s (%S)" (process-name process) sentinel - (process-status process)) t) + (process-status process)) (not rcirc-target)) ;; remove the prompt from buffers (let ((inhibit-read-only t)) (delete-region rcirc-prompt-start-marker - rcirc-prompt-end-marker))))) - (run-hook-with-args 'rcirc-sentinel-hooks process sentinel))) + rcirc-prompt-end-marker)))) + (run-hook-with-args 'rcirc-sentinel-hooks process sentinel)))) (defun rcirc-process-list () "Return a list of rcirc processes." @@ -496,6 +508,7 @@ (defun rcirc-filter (process output) "Called when PROCESS receives OUTPUT." (rcirc-debug process output) + (rcirc-reschedule-timeout process) (with-rcirc-process-buffer process (setq rcirc-last-server-message-time (current-time)) (setq rcirc-process-output (concat rcirc-process-output output)) @@ -506,6 +519,19 @@ (split-string rcirc-process-output "[\n\r]" t)) (setq rcirc-process-output nil)))) +(defun rcirc-reschedule-timeout (process) + (with-rcirc-process-buffer process + (when (not rcirc-connecting) + (with-rcirc-process-buffer process + (when rcirc-timeout-timer (cancel-timer rcirc-timeout-timer)) + (setq rcirc-timeout-timer (run-at-time rcirc-timeout-seconds nil + 'rcirc-delete-process + process)))))) + +(defun rcirc-delete-process (process) + (message "delete process %S" process) + (delete-process process)) + (defvar rcirc-trap-errors-flag t) (defun rcirc-process-server-response (process text) (if rcirc-trap-errors-flag @@ -557,15 +583,16 @@ (defun rcirc-buffer-process (&optional buffer) "Return the process associated with channel BUFFER. With no argument or nil as argument, use the current buffer." - (get-buffer-process (if buffer - (with-current-buffer buffer - rcirc-server-buffer) - rcirc-server-buffer))) + (or (get-buffer-process (if buffer + (with-current-buffer buffer + rcirc-server-buffer) + rcirc-server-buffer)) + rcirc-process)) (defun rcirc-server-name (process) "Return PROCESS server name, given by the 001 response." (with-rcirc-process-buffer process - (or rcirc-server rcirc-default-server))) + (or rcirc-server-name rcirc-default-server))) (defun rcirc-nick (process) "Return PROCESS nick." @@ -790,7 +817,7 @@ (setq prompt (replace-regexp-in-string (car rep) (cdr rep) prompt))) (list (cons "%n" (rcirc-buffer-nick)) - (cons "%s" (with-rcirc-server-buffer (or rcirc-server ""))) + (cons "%s" (with-rcirc-server-buffer rcirc-server-name)) (cons "%t" (or rcirc-target "")))) (save-excursion (delete-region rcirc-prompt-start-marker rcirc-prompt-end-marker) @@ -1079,9 +1106,7 @@ "%") ((or (eq key ?n) (eq key ?N)) ;; %n/%N -- nick - (let ((nick (concat (if (string= (with-rcirc-process-buffer - process - rcirc-server) + (let ((nick (concat (if (string= (rcirc-server-name process) sender) "" sender) @@ -1302,19 +1327,15 @@ (rcirc-cmd-join channel process))))) ;;; nick management +(defvar rcirc-nick-prefix-chars "~&@%+") (defun rcirc-user-nick (user) "Return the nick from USER. Remove any non-nick junk." (save-match-data - (if (string-match "^[@%+]?\\([^! ]+\\)!?" (or user "")) + (if (string-match (concat "^[" rcirc-nick-prefix-chars + "]?\\([^! ]+\\)!?") (or user "")) (match-string 1 user) user))) -(defun rcirc-user-non-nick (user) - "Return the non-nick portion of USER." - (if (string-match "^[@+]?[^! ]+!?\\(.*\\)" (or user "")) - (match-string 1 user) - user)) - (defun rcirc-nick-channels (process nick) "Return list of channels for NICK." (with-rcirc-process-buffer process @@ -2009,7 +2030,9 @@ (rcirc-handler-generic process "001" sender args text) ;; set the real server name (with-rcirc-process-buffer process - (setq rcirc-server sender) + (setq rcirc-connecting nil) + (rcirc-reschedule-timeout process) + (setq rcirc-server-name sender) (setq rcirc-nick (car args)) (rcirc-update-prompt) (when rcirc-auto-authenticate-flag (rcirc-authenticate)) @@ -2419,7 +2442,8 @@ :group 'rcirc-faces) (defface rcirc-track-nick - '((t (:inverse-video t))) + '((((type tty)) (:inherit default)) + (t (:inverse-video t))) "The face used in the mode-line when your nick is mentioned." :group 'rcirc-faces)