Re: Stray/unreferenced timeouts in erc-cmd-IGNORE?

Alcor <[email protected]> Mon, 01 Apr 2024 21:36:29 +0200
Newsgroups gmane.emacs.erc.general
Message-ID <[email protected]>
Short addendum: The attached patch is a short surgical fix for this
issue. It can be applied on top of Erc 5.6.

I'm not sure whether it's clean enough – but will leave it here for
posterity, just in case someone is interested in a quick solution for
this issue.

Cheers,
-A.
erc56-fix-ignore.diff (text/x-diff, 1.8 KB)
--- erc.el	2024-04-01 20:18:40.344312693 +0200
+++ erc.el	2024-04-01 21:07:44.068028858 +0200
@@ -4237,9 +4237,17 @@
                 "Add a timeout? (Blank for no, or a time spec like 2h): "))
               (buffer (current-buffer)))
           (when timeout
-            (run-at-time timeout nil
-                         (lambda ()
-                           (erc--unignore-user user buffer))))
+            (erc-with-server-buffer
+              (unless (and (boundp 'erc-ignore-timeouts) erc-ignore-timeouts)
+                (setq-local erc-ignore-timeouts (make-hash-table :test 'equal)))
+              (when-let ((existing (gethash user erc-ignore-timeouts)))
+                (cancel-timer existing)
+                (remhash user erc-ignore-timeouts))
+              (puthash user
+                       (run-at-time timeout nil
+                                    (lambda ()
+                                      (erc--unignore-user user buffer)))
+                       erc-ignore-timeouts)))
           (erc-display-message nil 'notice 'active
                                (format "Now ignoring %s" user))
           (erc-with-server-buffer (add-to-list 'erc-ignore-list user))))
@@ -4273,7 +4281,11 @@
       (erc-display-message nil 'notice 'active
                            (format "No longer ignoring %s" user))
       (erc-with-server-buffer
-        (setq erc-ignore-list (delete user erc-ignore-list))))))
+        (setq erc-ignore-list (delete user erc-ignore-list))
+        (when (and (boundp 'erc-ignore-timeouts) erc-ignore-timeouts)
+          (when-let ((existing (gethash user erc-ignore-timeouts)))
+            (cancel-timer existing))
+          (remhash user erc-ignore-timeouts))))))
 
 (defvar erc--pre-clear-functions nil
   "Abnormal hook run when truncating buffers.