From ce9519f9fa0ecae4dd538d83f12293c238b52c53 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Fri, 11 Nov 2022 00:05:00 -0800 Subject: [PATCH 0/1] *** NOT A PATCH *** *** BLURB HERE *** F. Jason Park (1): Improve auto-reconnect visibility in ERC lisp/erc/erc-backend.el | 77 ++++++++++++++----- lisp/erc/erc.el | 40 ++++++---- test/lisp/erc/erc-scenarios-base-reconnect.el | 46 +++++++++++ 3 files changed, 130 insertions(+), 33 deletions(-) Interdiff: diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 5f592a2458..bcba2ed40b 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -404,6 +404,16 @@ erc-server-reconnect-timeout If a key is pressed while ERC is waiting, it will stop waiting." :type 'number) +(defcustom erc-server-reconnect-function 'erc-server-delayed-reconnect + "Function called by the reconnect timer to create a new connection. +Called with a server buffer as its only argument. Potential uses +include exponential backoff and checking for connectivity prior +to connecting. Use `erc-schedule-reconnect' to instead defer by +scheduling another round." + :package-version '(ERC . "5.4.1") ; FIXME on next release + :type '(choice (function-item erc-server-delayed-reconnect) + function)) + (defcustom erc-split-line-length 440 "The maximum length of a single message. If a message exceeds this size, it is broken into multiple ones. @@ -782,6 +792,22 @@ erc--cancel-auto-reconnect-timer (setq erc--server-reconnect-timer nil) (erc-update-mode-line))) +(defun erc-schedule-reconnect (buffer &optional incr) + "Create and return a reconnect timer for BUFFER. +When `erc-server-reconnect-attempts' is a number, increment +`erc-server-reconnect-count' by INCR unconditionally." + (let ((count (and (integerp erc-server-reconnect-attempts) + (- erc-server-reconnect-attempts + (cl-incf erc-server-reconnect-count (or incr 1)))))) + (erc-display-message nil 'error (current-buffer) 'reconnecting + ?m erc-server-reconnect-timeout + ?n (or count "unlimited") + ?s (if (eql 1 count) "" "s")) + (setq erc-server-reconnecting nil + erc--server-reconnect-timer + (run-at-time erc-server-reconnect-timeout nil + erc-server-reconnect-function buffer)))) + (defun erc-process-sentinel-2 (event buffer) "Called when `erc-process-sentinel-1' has detected an unexpected disconnect." (when (buffer-live-p buffer) @@ -798,17 +824,7 @@ erc-process-sentinel-2 'terminated ?e event) (set-buffer-modified-p nil)) ;; reconnect - (let ((count (and (integerp erc-server-reconnect-attempts) - (- erc-server-reconnect-attempts - (cl-incf erc-server-reconnect-count))))) - (erc-display-message nil 'error (current-buffer) 'reconnecting - ?m erc-server-reconnect-timeout - ?n (or count "unlimited") - ?s (if (eql 1 count) "" "s")) - (setq erc-server-reconnecting nil - erc--server-reconnect-timer - (run-at-time erc-server-reconnect-timeout nil - #'erc-server-delayed-reconnect buffer)))))) + (erc-schedule-reconnect buffer)))) (erc-update-mode-line))) (defun erc-process-sentinel-1 (event buffer) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 0ead2941a2..4c92e4ce0d 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -6923,7 +6923,7 @@ erc-define-catalog (disconnected . "\n\nConnection failed! Re-establishing connection...\n") (disconnected-noreconnect . "\n\nConnection failed! Not re-establishing connection.\n") - (reconnecting . "Reconnecting in %ms: %n attempt%s remaining...") + (reconnecting . "Reconnecting in %ms: %n additional attempt%s remaining...") (reconnect-canceled . "Canceled %u reconnect timer with %cs to go...") (finished . "\n\n*** ERC finished ***\n") (terminated . "\n\n*** ERC terminated: %e\n") -- 2.38.1