Subject: bug#36843: 26.2; ERC lurker feature broken

From: Amin Bandali <[email-masked]>
Date: Tue, 27 Aug 2019 10:31:00 -0400

Noam Postavsky <[email-masked]> writes:

> Amin Bandali <[email-masked]> writes:
>
>> From: Amin Bandali <[email-masked]>
>
> This address seems to be different than what's in the copyright list.
> Could you use that one, since otherwise it's a bit confusing as to
> whether I'm actually looking at the entry of the right person.
>

Thanks for bringing this to my attention.  I’d changed my email back in
December 2018 and had notified the copyright clerk about it, but it
seems that their change hadn’t properly propagated to copyright.list.
It should be there now.

>
>> Date: Sat, 17 Aug 2019 14:09:11 -0400
>> Subject: [PATCH] Fix erc-lurker-update-status
>>
>> Fix erc-lurker-update-status (bug#36843), broken since
>> d0fcaff514d2be16ccf73817f658318cf85221e3.
>>
>> * lisp/erc/erc.el: define `erc-message-parsed', lexically bind it in
>
> Instead of "lexically" I believe you actually mean "dynamically"
> (binding lexically is the cause of the bug).  And I would reformat like
> this:
>

Good catch!  I rebased on latest master and reformatted per your
suggestion.  I’ve attached an updated patch below.

Thanks for your feedback.

>From 2bc8f35e4a0f76e7b59950738fbfdc3c3e48263c Mon Sep 17 00:00:00 2001
From: Amin Bandali <[email-masked]>
Date: Sat, 17 Aug 2019 14:09:11 -0400
Subject: [PATCH] Fix erc-lurker-update-status (bug#36843)

Broken since 2013-08-22 "* lisp/erc/erc.el: Use lexical-binding".

* lisp/erc/erc.el (erc-message-parsed): New variable.
(erc-display-message): Dynamically bind it.
(erc-lurker-update-status): Check it instead of using `parsed'
directly.  This results in `erc-lurker-state' being properly updated
to keep track of non-lurkers, and thus `erc-lurker-p' returning
correct results rather than return t for everyone.
---
 lisp/erc/erc.el | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index f5c9decc3a..9ea9e608ac 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -2594,6 +2594,8 @@ erc-lurker-cleanup-interval
 consumption of lurker state during long Emacs sessions and/or ERC
 sessions with large numbers of incoming PRIVMSGs.")
 
+(defvar erc-message-parsed)
+
 (defun erc-lurker-update-status (_message)
   "Update `erc-lurker-state' if necessary.
 
@@ -2603,18 +2605,20 @@ erc-lurker-update-status
 current time.  Otherwise, take no action.
 
 This function depends on the fact that `erc-display-message'
-dynamically binds `parsed', which is used to check if the current
-message is a PRIVMSG and to determine its sender.  See also
-`erc-lurker-trim-nicks' and `erc-lurker-ignore-chars'.
+dynamically binds `erc-message-parsed', which is used to check if
+the current message is a PRIVMSG and to determine its sender.
+See also `erc-lurker-trim-nicks' and `erc-lurker-ignore-chars'.
 
 In order to limit memory consumption, this function also calls
 `erc-lurker-cleanup' once every `erc-lurker-cleanup-interval'
 updates of `erc-lurker-state'."
-  (when (and (boundp 'parsed) (erc-response-p parsed))
-    (let* ((command (erc-response.command parsed))
+  (when (and (boundp 'erc-message-parsed)
+	     (erc-response-p erc-message-parsed))
+    (let* ((command (erc-response.command erc-message-parsed))
            (sender
             (erc-lurker-maybe-trim
-             (car (erc-parse-user (erc-response.sender parsed)))))
+             (car (erc-parse-user
+		   (erc-response.sender erc-message-parsed)))))
            (server
             (erc-canonicalize-server-name erc-server-announced-name)))
       (when (equal command "PRIVMSG")
@@ -2704,7 +2708,8 @@ erc-display-message
 See also `erc-format-message' and `erc-display-line'."
   (let ((string (if (symbolp msg)
                     (apply #'erc-format-message msg args)
-                  msg)))
+                  msg))
+	(erc-message-parsed parsed))
     (setq string
           (cond
            ((null type)
-- 
2.23.0