[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Erc-commit] [commit][emacs22] Handle near-simultaneous IRC server conne
From: |
mwolson |
Subject: |
[Erc-commit] [commit][emacs22] Handle near-simultaneous IRC server connections better. |
Date: |
Sun, 14 Oct 2007 00:48:27 -0400 |
commit 620e3f3dd9262bb06a46cc420fb7512bff85f0c5
Author: Michael Olson <address@hidden>
Date: Sun Aug 20 06:52:21 2006 +0000
Handle near-simultaneous IRC server connections better.
* erc-identd.el (erc-identd): New customization group.
(erc-identd-port): New option that specifies the port to use if
none is given as an argument to erc-identd-start.
(identd): Place erc-identd-quickstart in erc-connect-pre-hook
instead of erc-identd-start so that we deal with the different
meaning of the first argument.
(erc-identd-start): Use erc-identd-port.
(erc-identd-quickstart): New function that ignores any arguments
and calls erc-identd-start.
* erc.el (erc): Set up the prompt before connecting rather than after.
Run erc-connect-pre-hook with the buffer as an argument, instead of no
arguments.
(erc-initialize-log-marker): Accept a `buffer' argument.
(erc-connect-pre-hook): Docfix.
(erc-connection-established): Make sure this runs in the correct
buffer.
(erc-set-initial-user-mode): Accept a `buffer' argument.
* erc-spelling.el (erc-spelling-init): Use erc-with-server-buffer.
Accept `buffer' argument.
(spelling): Call erc-spelling-init with the `buffer' argument.
* erc-log.el (log): Pass `buffer' argument to erc-log-setup-logging
instead of setting the current buffer. Ditto for
erc-log-disable-logging.
(erc-log-setup-logging, erc-log-disable-loggin): Accept a `buffer'
argument.
* erc-backend.el (erc-server-connect)
(erc-server-setup-periodical-ping): Accept `buffer' argument.
* erc-autoaway.el (erc-autoaway-last-sent-time)
(erc-autoaway-caused-away): Move higher in file to fix byte-compile
warning.
git-archimport-id: address@hidden/erc--main--0--patch-46
diff --git a/ChangeLog b/ChangeLog
index 8647850..1b876a4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2006-08-20 Michael Olson <address@hidden>
+ * erc-identd.el (erc-identd): New customization group.
+ (erc-identd-port): New option that specifies the port to use if
+ none is given as an argument to erc-identd-start.
+ (identd): Place erc-identd-quickstart in erc-connect-pre-hook
+ instead of erc-identd-start so that we deal with the different
+ meaning of the first argument.
+ (erc-identd-start): Use erc-identd-port.
+ (erc-identd-quickstart): New function that ignores any arguments
+ and calls erc-identd-start.
+
* erc.el (erc-with-server-buffer): New macro that switches to the
current ERC server buffer and runs some code. If no server buffer
is available, return nil. This is a useful way to access
@@ -21,7 +31,9 @@
though it isn't really needed here.
(erc-away): Mention erc-away-time.
(erc): Don't propagate the erc-away setting, since it makes more
- sense to access it from the server buffer.
+ sense to access it from the server buffer. Set up the prompt
+ before connecting rather than after. Run erc-connect-pre-hook
+ with the buffer as an argument, instead of no arguments.
(erc-cmd-GAWAY): Use erc-open-server-buffer-p instead of
erc-server-buffer-p so that only open connections are set away.
(erc-cmd-GQUIT): Use erc-open-server-buffer-p.
@@ -32,10 +44,17 @@
(erc-away-time): Rename from erc-away-p, since this is no longer a
boolean-style predicate.
(erc-format-away-status): Use it.
+ (erc-initialize-log-marker): Accept a `buffer' argument.
+ (erc-connect-pre-hook): Docfix.
+ (erc-connection-established): Make sure this runs in the correct
+ buffer.
+ (erc-set-initial-user-mode): Accept a `buffer' argument.
* erc-stamp.el (erc-add-timestamp): Use erc-away-time.
- * erc-spelling.el (erc-spelling-init): Use erc-with-server-buffer.
+ * erc-spelling.el (erc-spelling-init): Use
+ erc-with-server-buffer. Accept `buffer' argument.
+ (spelling): Call erc-spelling-init with the `buffer' argument.
* erc-speedbar.el (erc-speedbar-buttons): Use erc-server-buffer-p.
@@ -54,6 +73,10 @@
erc-away-time.
* erc-log.el (log): Use erc-away-time. Remove unnecessary check.
+ Pass `buffer' argument to erc-log-setup-logging instead of setting
+ the current buffer. Ditto for erc-log-disable-logging.
+ (erc-log-setup-logging, erc-log-disable-loggin): Accept a `buffer'
+ argument.
* erc-list.el (erc-chanlist): Use erc-with-server-buffer.
@@ -78,6 +101,8 @@
not given.
(erc-server-send): Simplify slightly.
(erc-call-hooks): Use erc-with-server-buffer.
+ (erc-server-connect, erc-server-setup-periodical-ping): Accept
+ `buffer' argument.
* erc-autoaway.el (erc-autoaway-reestablish-idletimer): Move
higher to avoid an automatic load snafu.
@@ -103,6 +128,8 @@
(erc-autoaway-possibly-set-away, erc-autoaway-set-away): Use it.
(erc-autoaway-set-away): Accept a `notest' argument which is used
to avoid testing the same thing twice.
+ (erc-autoaway-last-sent-time, erc-autoaway-caused-away): Move
+ higher in file to fix byte-compile warning.
2006-08-20 Diane Murray <address@hidden>
diff --git a/erc-autoaway.el b/erc-autoaway.el
index af6f84b..fe8a667 100644
--- a/erc-autoaway.el
+++ b/erc-autoaway.el
@@ -40,6 +40,13 @@ yourself back when you type something."
"The Emacs idletimer.
This is only used when `erc-autoaway-use-emacs-idle' is non-nil.")
+(defvar erc-autoaway-last-sent-time (erc-current-time)
+ "The last time the user sent something.")
+
+(defvar erc-autoaway-caused-away nil
+ "Indicates whether this module was responsible for setting the
+user's away status.")
+
(eval-when-compile (defvar erc-autoaway-idle-seconds))
(defun erc-autoaway-reestablish-idletimer ()
@@ -195,13 +202,6 @@ in seconds."
:group 'erc-autoaway
:type 'string)
-(defvar erc-autoaway-last-sent-time (erc-current-time)
- "The last time the user sent something.")
-
-(defvar erc-autoaway-caused-away nil
- "Indicates whether this module was responsible for setting the
-user's away status.")
-
(defun erc-autoaway-reset-idle-user (&rest stuff)
"Reset the stored user idle time.
This is one global variable since a user talking on one net can
diff --git a/erc-backend.el b/erc-backend.el
index bedddea..e9e0596 100644
--- a/erc-backend.el
+++ b/erc-backend.el
@@ -437,17 +437,19 @@ Additionally, detect whether the IRC process has hung."
(erc-cancel-timer (cdr timer))
(setcdr timer nil)))))
-(defun erc-server-setup-periodical-ping (&rest ignore)
- "Set up a timer to periodically ping the current server."
- (and erc-server-ping-handler (erc-cancel-timer erc-server-ping-handler))
- (when erc-server-send-ping-interval
- (setq erc-server-ping-handler (run-with-timer
- 4 erc-server-send-ping-interval
- #'erc-server-send-ping
- (current-buffer)))
- (setq erc-server-ping-timer-alist (cons (cons (current-buffer)
- erc-server-ping-handler)
- erc-server-ping-timer-alist))))
+(defun erc-server-setup-periodical-ping (buffer)
+ "Set up a timer to periodically ping the current server.
+The current buffer is given by BUFFER."
+ (with-current-buffer buffer
+ (and erc-server-ping-handler (erc-cancel-timer erc-server-ping-handler))
+ (when erc-server-send-ping-interval
+ (setq erc-server-ping-handler (run-with-timer
+ 4 erc-server-send-ping-interval
+ #'erc-server-send-ping
+ buffer))
+ (setq erc-server-ping-timer-alist (cons (cons buffer
+ erc-server-ping-handler)
+ erc-server-ping-timer-alist)))))
(defun erc-server-process-alive ()
"Return non-nil when `erc-server-process' is open or running."
@@ -457,43 +459,45 @@ Additionally, detect whether the IRC process has hung."
;;;; Connecting to a server
-(defun erc-server-connect (server port)
- "Perform the connection and login.
-We will store server variables in the current buffer."
+(defun erc-server-connect (server port buffer)
+ "Perform the connection and login using the specified SERVER and PORT.
+We will store server variables in the buffer given by BUFFER."
(let ((msg (erc-format-message 'connect ?S server ?p port)))
(message "%s" msg)
- (setq erc-server-process
- (funcall erc-server-connect-function
- (format "erc-%s-%s" server port)
- (current-buffer) server port))
- (message "%s...done" msg))
- ;; Misc server variables
- (setq erc-server-quitting nil)
- (setq erc-server-timed-out nil)
- (setq erc-server-banned nil)
- (let ((time (erc-current-time)))
- (setq erc-server-last-sent-time time)
- (setq erc-server-last-ping-time time)
- (setq erc-server-last-received-time time))
- (setq erc-server-lines-sent 0)
- ;; last peers (sender and receiver)
- (setq erc-server-last-peers '(nil . nil))
- ;; process handlers
- (set-process-sentinel erc-server-process 'erc-process-sentinel)
- (set-process-filter erc-server-process 'erc-server-filter-function)
- ;; we do our own encoding and decoding
- (when (fboundp 'set-process-coding-system)
- (set-process-coding-system erc-server-process 'raw-text))
- (set-marker (process-mark erc-server-process) (point))
+ (let ((process (funcall erc-server-connect-function
+ (format "erc-%s-%s" server port)
+ nil server port)))
+ (message "%s...done" msg)
+ ;; Misc server variables
+ (with-current-buffer buffer
+ (setq erc-server-process process)
+ (setq erc-server-quitting nil)
+ (setq erc-server-timed-out nil)
+ (setq erc-server-banned nil)
+ (let ((time (erc-current-time)))
+ (setq erc-server-last-sent-time time)
+ (setq erc-server-last-ping-time time)
+ (setq erc-server-last-received-time time))
+ (setq erc-server-lines-sent 0)
+ ;; last peers (sender and receiver)
+ (setq erc-server-last-peers '(nil . nil)))
+ ;; we do our own encoding and decoding
+ (when (fboundp 'set-process-coding-system)
+ (set-process-coding-system process 'raw-text))
+ ;; process handlers
+ (set-process-sentinel process 'erc-process-sentinel)
+ (set-process-filter process 'erc-server-filter-function)
+ (set-process-buffer process buffer)))
(erc-log "\n\n\n********************************************\n")
- (message (erc-format-message 'login ?n (erc-current-nick)))
+ (message (erc-format-message
+ 'login ?n
+ (with-current-buffer buffer (erc-current-nick))))
;; wait with script loading until we receive a confirmation (first
;; MOTD line)
(if (eq erc-server-connect-function 'open-network-stream-nowait)
;; it's a bit unclear otherwise that it's attempting to establish a
;; connection
- (erc-display-message nil nil (current-buffer)
- "Opening connection..\n")
+ (erc-display-message nil nil buffer "Opening connection..\n")
(erc-login)))
(defun erc-server-filter-function (process string)
diff --git a/erc-identd.el b/erc-identd.el
index 32bfa33..3bac6fa 100644
--- a/erc-identd.el
+++ b/erc-identd.el
@@ -42,12 +42,26 @@
(defvar erc-identd-process nil)
+(defgroup erc-identd nil
+ "Run a local identd server."
+ :group 'erc)
+
+(defcustom erc-identd-port 8113
+ "Port to run the identd server on if not specified in the argument for
+`erc-identd-start'.
+
+This can be either a string or a number."
+ :group 'erc-identd
+ :type '(choice (const :tag "None" nil)
+ (integer :tag "Port number")
+ (string :tag "Port string")))
+
;;;###autoload (autoload 'erc-identd-mode "erc-identd")
(define-erc-module identd nil
"This mode launches an identd server on port 8113."
- ((add-hook 'erc-connect-pre-hook 'erc-identd-start)
+ ((add-hook 'erc-connect-pre-hook 'erc-identd-quickstart)
(add-hook 'erc-disconnected-hook 'erc-identd-stop))
- ((remove-hook 'erc-connect-pre-hook 'erc-identd-start)
+ ((remove-hook 'erc-connect-pre-hook 'erc-identd-quickstart)
(remove-hook 'erc-disconnected-hook 'erc-identd-stop)))
(defun erc-identd-filter (proc string)
@@ -71,12 +85,11 @@ run from inetd. The idea is to provide a simple identd
server
when you need one, without having to install one globally on your
system."
(interactive (list (read-string "Serve identd requests on port: " "8113")))
- (if (null port)
- (setq port 8113)
- (if (stringp port)
- (setq port (string-to-number port))))
- (if erc-identd-process
- (delete-process erc-identd-process))
+ (unless port (setq port erc-identd-port))
+ (when (stringp port)
+ (setq port (string-to-number port)))
+ (when erc-identd-process
+ (delete-process erc-identd-process))
(setq erc-identd-process
(if (fboundp 'make-network-process)
(make-network-process :name "identd"
@@ -89,6 +102,11 @@ system."
"identd" (generate-new-buffer " *erc-identd*")
port nil 'erc-identd-filter)))))
+(defun erc-identd-quickstart (&rest ignored)
+ "Start the identd server with the default port.
+The default port is specified by `erc-identd-port'."
+ (erc-identd-start))
+
;;;###autoload
(defun erc-identd-stop (&rest ignore)
(interactive)
diff --git a/erc-log.el b/erc-log.el
index e1b47c8..0124219 100644
--- a/erc-log.el
+++ b/erc-log.el
@@ -218,7 +218,7 @@ also be a predicate function. To only log when you are not
set away, use:
;; append, so that 'erc-initialize-log-marker runs first
(add-hook 'erc-connect-pre-hook 'erc-log-setup-logging 'append)
(dolist (buffer (erc-buffer-list))
- (with-current-buffer buffer (erc-log-setup-logging))))
+ (erc-log-setup-logging buffer)))
;; disable
((remove-hook 'erc-insert-post-hook 'erc-save-buffer-in-logs)
(remove-hook 'erc-send-post-hook 'erc-save-buffer-in-logs)
@@ -228,35 +228,38 @@ also be a predicate function. To only log when you are
not set away, use:
(remove-hook 'erc-part-hook 'erc-conditional-save-buffer)
(remove-hook 'erc-connect-pre-hook 'erc-log-setup-logging)
(dolist (buffer (erc-buffer-list))
- (with-current-buffer buffer (erc-log-disable-logging)))))
+ (erc-log-disable-logging buffer))))
(define-key erc-mode-map "\C-c\C-l" 'erc-save-buffer-in-logs)
;;; functionality referenced from erc.el
-(defun erc-log-setup-logging ()
+(defun erc-log-setup-logging (buffer)
"Setup the buffer-local logging variables in the current buffer.
-This function is destined to be run from `erc-connect-pre-hook'."
- (when (erc-logging-enabled)
- (auto-save-mode -1)
- (setq buffer-file-name nil)
- (cond ((boundp 'write-file-functions)
- (set (make-local-variable 'write-file-functions)
- '(erc-save-buffer-in-logs)))
- ((boundp 'local-write-file-hooks)
- (setq local-write-file-hooks '(erc-save-buffer-in-logs)))
- (t
- (set (make-local-variable 'write-file-hooks)
- '(erc-save-buffer-in-logs))))
- (when erc-log-insert-log-on-open
- (ignore-errors (insert-file-contents (erc-current-logfile))
- (move-marker erc-last-saved-position
- (1- (point-max)))))))
-
-(defun erc-log-disable-logging ()
- "Disable logging in the current buffer."
- (when (erc-logging-enabled)
- (setq buffer-offer-save nil
- erc-enable-logging nil)))
+This function is destined to be run from `erc-connect-pre-hook'.
+The current buffer is given by BUFFER."
+ (when (erc-logging-enabled buffer)
+ (with-current-buffer buffer
+ (auto-save-mode -1)
+ (setq buffer-file-name nil)
+ (cond ((boundp 'write-file-functions)
+ (set (make-local-variable 'write-file-functions)
+ '(erc-save-buffer-in-logs)))
+ ((boundp 'local-write-file-hooks)
+ (setq local-write-file-hooks '(erc-save-buffer-in-logs)))
+ (t
+ (set (make-local-variable 'write-file-hooks)
+ '(erc-save-buffer-in-logs))))
+ (when erc-log-insert-log-on-open
+ (ignore-errors (insert-file-contents (erc-current-logfile))
+ (move-marker erc-last-saved-position
+ (1- (point-max))))))))
+
+(defun erc-log-disable-logging (buffer)
+ "Disable logging in BUFFER."
+ (when (erc-logging-enabled buffer)
+ (with-current-buffer buffer
+ (setq buffer-offer-save nil
+ erc-enable-logging nil))))
(defun erc-log-all-but-server-buffers (buffer)
"Returns t if logging should be enabled in BUFFER.
diff --git a/erc-spelling.el b/erc-spelling.el
index d2e61e8..a7a8535 100644
--- a/erc-spelling.el
+++ b/erc-spelling.el
@@ -41,12 +41,10 @@
;; called AFTER the server buffer is initialized.
((add-hook 'erc-connect-pre-hook 'erc-spelling-init)
(dolist (buffer (erc-buffer-list))
- (when (buffer-live-p buffer)
- (with-current-buffer buffer (erc-spelling-init)))))
+ (erc-spelling-init buffer)))
((remove-hook 'erc-connect-pre-hook 'erc-spelling-init)
(dolist (buffer (erc-buffer-list))
- (when (buffer-live-p buffer)
- (with-current-buffer buffer (flyspell-mode 0))))))
+ (with-current-buffer buffer (flyspell-mode 0)))))
(defcustom erc-spelling-dictionaries nil
"An alist mapping buffer names to dictionaries.
@@ -60,20 +58,22 @@ name here."
(string :tag "Dictionary"))))
:group 'erc-spelling)
-(defun erc-spelling-init ()
- "Enable flyspell mode in an ERC buffer."
- (let ((name (downcase (buffer-name)))
- (dicts erc-spelling-dictionaries))
- (when dicts
- (while (and dicts
- (not (string= name (downcase (caar dicts)))))
- (setq dicts (cdr dicts)))
- (setq ispell-local-dictionary
- (if dicts
- (cadr (car dicts))
- (erc-with-server-buffer ispell-local-dictionary)))))
- (setq flyspell-generic-check-word-p 'erc-spelling-flyspell-verify)
- (flyspell-mode 1))
+(defun erc-spelling-init (buffer)
+ "Enable flyspell mode in an ERC buffer.
+The current buffer is given by BUFFER."
+ (with-current-buffer buffer
+ (let ((name (downcase (buffer-name)))
+ (dicts erc-spelling-dictionaries))
+ (when dicts
+ (while (and dicts
+ (not (string= name (downcase (caar dicts)))))
+ (setq dicts (cdr dicts)))
+ (setq ispell-local-dictionary
+ (if dicts
+ (cadr (car dicts))
+ (erc-with-server-buffer ispell-local-dictionary)))))
+ (setq flyspell-generic-check-word-p 'erc-spelling-flyspell-verify)
+ (flyspell-mode 1)))
(defun erc-spelling-unhighlight-word (word)
"Unhighlight the given WORD.
diff --git a/erc.el b/erc.el
index a7952f4..d1fe2d3 100644
--- a/erc.el
+++ b/erc.el
@@ -326,7 +326,7 @@ Each function should accept two arguments, NEW-NICK and
OLD-NICK."
(defcustom erc-connect-pre-hook '(erc-initialize-log-marker)
"Hook called just before `erc' calls `erc-connect'.
-Functions are run in the buffer-to-be."
+Functions are passed a buffer as the first argument."
:group 'erc-hooks
:type 'hook)
@@ -1968,25 +1968,25 @@ Returns the buffer for the given server or channel."
(setq erc-dbuf
(when erc-log-p
(get-buffer-create (concat "*ERC-DEBUG: " server "*"))))
- (erc-determine-parameters server port nick full-name)
-
- ;; Saving log file on exit
- (run-hooks 'erc-connect-pre-hook)
-
- (when connect
- (erc-server-connect erc-session-server erc-session-port))
- (erc-update-mode-line)
- (set-marker erc-insert-marker (point))
+ ;; set up prompt
(unless continued-session
(goto-char (point-max))
(insert "\n"))
- (set-marker (process-mark erc-server-process) (point))
(if continued-session
(goto-char (point-max))
(set-marker erc-insert-marker (point))
(erc-display-prompt)
(goto-char (point-max)))
+ (erc-determine-parameters server port nick full-name)
+
+ ;; Saving log file on exit
+ (run-hook-with-args 'erc-connect-pre-hook buffer)
+
+ (when connect
+ (erc-server-connect erc-session-server erc-session-port buffer))
+ (erc-update-mode-line)
+
;; Now display the buffer in a window as per user wishes.
(unless (eq buffer old-buffer)
(when erc-log-p
@@ -1997,11 +1997,13 @@ Returns the buffer for the given server or channel."
buffer))
-(defun erc-initialize-log-marker ()
- "Initialize the `erc-last-saved-position' marker to a sensible position."
+(defun erc-initialize-log-marker (buffer)
+ "Initialize the `erc-last-saved-position' marker to a sensible position.
+BUFFER is the current buffer."
+ (with-current-buffer buffer
(setq erc-last-saved-position (make-marker))
(move-marker erc-last-saved-position
- (1- (marker-position erc-insert-marker))))
+ (1- (marker-position erc-insert-marker)))))
;; interactive startup
@@ -4074,24 +4076,29 @@ See also: `erc-echo-notice-in-user-buffers',
"Run just after connection.
Set user modes and run `erc-after-connect hook'."
- (unless erc-server-connected ; only once per session
- (let ((server (or erc-server-announced-name (erc-response.sender parsed)))
- (nick (car (erc-response.command-args parsed ))))
- (setq erc-server-connected t)
- (erc-update-mode-line)
- (erc-set-initial-user-mode nick)
- (erc-server-setup-periodical-ping)
- (run-hook-with-args 'erc-after-connect server nick))))
-
-(defun erc-set-initial-user-mode (nick)
- "If `erc-user-mode' is non-nil for NICK, set the user modes."
- (when erc-user-mode
- (let ((mode (if (functionp erc-user-mode)
- (funcall erc-user-mode)
- erc-user-mode)))
- (when (stringp mode)
- (erc-log (format "changing mode for %s to %s" nick mode))
- (erc-server-send (format "MODE %s %s" nick mode))))))
+ (with-current-buffer (process-buffer proc)
+ (unless erc-server-connected ; only once per session
+ (let ((server (or erc-server-announced-name
+ (erc-response.sender parsed)))
+ (nick (car (erc-response.command-args parsed)))
+ (buffer (process-buffer proc)))
+ (setq erc-server-connected t)
+ (erc-update-mode-line)
+ (erc-set-initial-user-mode nick buffer)
+ (erc-server-setup-periodical-ping buffer)
+ (run-hook-with-args 'erc-after-connect server nick)))))
+
+(defun erc-set-initial-user-mode (nick buffer)
+ "If `erc-user-mode' is non-nil for NICK, set the user modes.
+The server buffer is given by BUFFER."
+ (with-current-buffer buffer
+ (when erc-user-mode
+ (let ((mode (if (functionp erc-user-mode)
+ (funcall erc-user-mode)
+ erc-user-mode)))
+ (when (stringp mode)
+ (erc-log (format "changing mode for %s to %s" nick mode))
+ (erc-server-send (format "MODE %s %s" nick mode)))))))
(defun erc-display-error-notice (parsed string)
"Display STRING as an error notice.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Erc-commit] [commit][emacs22] Handle near-simultaneous IRC server connections better.,
mwolson <=