[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master a0ed463baba 4/4: Spoof channel users in erc-button--phantom-users
From: |
F. Jason Park |
Subject: |
master a0ed463baba 4/4: Spoof channel users in erc-button--phantom-users-mode |
Date: |
Sun, 17 Sep 2023 19:24:05 -0400 (EDT) |
branch: master
commit a0ed463babaa6301dfe2fecc27e2a6c92eb0d90c
Author: F. Jason Park <jp@neverwas.me>
Commit: F. Jason Park <jp@neverwas.me>
Spoof channel users in erc-button--phantom-users-mode
* lisp/erc/erc-backend.el (erc--cmem-from-nick-function): Update
forward declaration.
(erc-server-PRIVMSG): Use new name for `erc--user-from-nick-function',
now `erc--cmem-from-nick-function'.
* lisp/erc/erc-button.el (erc-button--phantom-users,
erc-button--phantom-cmems): Rename former to latter.
(erc-button--fallback-user-function,
erc-button--fallback-cmem-function): Rename former to latter.
(erc--phantom-channel-user, erc--phantom-server-user): New superficial
`cl-struct' definitions "subclassing" `erc-channel-user' and
`erc-server-user'. Note that these symbols lack an `erc-button'
prefix.
(erc-button--add-phantom-speaker): Look for channel member instead of
server user, creating one if necessary. Return a made-up
`erc-channel-user' along with a fake `erc-server-user'.
(erc-button--get-phantom-user, erc-button--get-phantom-cmem): Rename
former to latter.
(erc-button--phantom-users-mode, erc-button--phantom-users-enable,
erc-button--phantom-users-disable): Use updated "cmem" names for
function-valued interface variables and their implementing functions.
Remove obsolete comment.
(erc-button-add-nickname-buttons): Attempt to query fallback function
for channel member instead of server user.
* lisp/erc/erc.el (erc--user-from-nick-function,
erc--cmem-from-nick-function): Rename former to latter.
(erc--examine-nick, erc--cmem-get-existing): Rename former to
latter. (Bug#60933)
---
lisp/erc/erc-backend.el | 4 ++--
lisp/erc/erc-button.el | 64 +++++++++++++++++++++++++++----------------------
lisp/erc/erc.el | 17 ++++++-------
3 files changed, 46 insertions(+), 39 deletions(-)
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index 9e121ec1e92..fb10ee31c78 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -104,7 +104,7 @@
(defvar erc--called-as-input-p)
(defvar erc--display-context)
(defvar erc--target)
-(defvar erc--user-from-nick-function)
+(defvar erc--cmem-from-nick-function)
(defvar erc-channel-list)
(defvar erc-channel-users)
(defvar erc-default-nicks)
@@ -1944,7 +1944,7 @@ add things to `%s' instead."
;; at this point.
(erc-update-channel-member (if privp nick tgt) nick nick
privp nil nil nil nil nil host login
nil nil t)
- (let ((cdata (funcall erc--user-from-nick-function
+ (let ((cdata (funcall erc--cmem-from-nick-function
(erc-downcase nick) sndr parsed)))
(setq fnick (funcall erc-format-nick-function
(car cdata) (cdr cdata))))))
diff --git a/lisp/erc/erc-button.el b/lisp/erc/erc-button.el
index 8c1188e64a2..596f896d9c5 100644
--- a/lisp/erc/erc-button.el
+++ b/lisp/erc/erc-button.el
@@ -380,32 +380,37 @@ buttonizing ought to proceed and nil otherwise. While
running,
all faces defined in `erc-button' are bound temporarily and can
be updated at will.")
-(defvar-local erc-button--phantom-users nil)
+(defvar-local erc-button--phantom-cmems nil)
-(defvar erc-button--fallback-user-function #'ignore
- "Function to determine `erc-server-user' if not found in the usual places.
+(defvar erc-button--fallback-cmem-function #'ignore
+ "Function to determine channel member if not found in the usual places.
Called with DOWNCASED-NICK, NICK, and NICK-BOUNDS when
`erc-button-add-nickname-buttons' cannot find a user object for
DOWNCASED-NICK in `erc-channel-users' or `erc-server-users'.")
+;; Historical or fictitious users. As long as these two structs
+;; remain superficial "subclasses" with the same slots and defaults,
+;; they can live here instead of in erc-common.el.
+(cl-defstruct (erc--phantom-channel-user (:include erc-channel-user)))
+(cl-defstruct (erc--phantom-server-user (:include erc-server-user)))
+
(defun erc-button--add-phantom-speaker (downcased nuh _parsed)
- "Stash fictitious `erc-server-user' while processing \"PRIVMSG\".
-Expect DOWNCASED to be the downcased nickname, NUH to be a triple
-of (NICK LOGIN HOST), and parsed to be an `erc-response' object."
(pcase-let* ((`(,nick ,login ,host) nuh)
- (user (or (gethash downcased erc-button--phantom-users)
- (make-erc-server-user
+ (cmem (gethash downcased erc-button--phantom-cmems))
+ (user (or (car cmem)
+ (make-erc--phantom-server-user
:nickname nick
:host (and (not (string-empty-p host)) host)
- :login (and (not (string-empty-p login)) login)))))
- (list (puthash downcased user erc-button--phantom-users))))
+ :login (and (not (string-empty-p login)) login))))
+ (cuser (or (cdr cmem)
+ (make-erc--phantom-channel-user
+ :last-message-time (current-time)))))
+ (puthash downcased (cons user cuser) erc-button--phantom-cmems)
+ (cons user cuser)))
-(defun erc-button--get-phantom-user (down _word _bounds)
- (gethash down erc-button--phantom-users))
+(defun erc-button--get-phantom-cmem (down _word _bounds)
+ (gethash down erc-button--phantom-cmems))
-;; In the future, we'll most likely create temporary
-;; `erc-channel-users' tables during BATCH chathistory playback, thus
-;; obviating the need for this mode entirely.
(define-minor-mode erc-button--phantom-users-mode
"Minor mode to recognize unknown speakers.
Expect to be used by module setup code for creating placeholder
@@ -415,22 +420,22 @@ appeared in a prior \"353\" message and are thus a known
member
of the channel. However, don't bother creating an actual
`erc-channel-user' object because their status prefix is unknown.
Instead, just spoof an `erc-server-user' and stash it during
-\"PRIVMSG\" handling via `erc--user-from-nick-function' and
+\"PRIVMSG\" handling via `erc--cmem-from-nick-function' and
retrieve it during buttonizing via
`erc-button--fallback-user-function'."
:interactive nil
(if erc-button--phantom-users-mode
(progn
- (add-function :after-until (local 'erc--user-from-nick-function)
- #'erc-button--add-phantom-speaker '((depth . -50)))
- (add-function :after-until (local 'erc-button--fallback-user-function)
- #'erc-button--get-phantom-user '((depth . 50)))
- (setq erc-button--phantom-users (make-hash-table :test #'equal)))
- (remove-function (local 'erc--user-from-nick-function)
+ (add-function :after-until (local 'erc--cmem-from-nick-function)
+ #'erc-button--add-phantom-speaker '((depth . 30)))
+ (add-function :after-until (local 'erc-button--fallback-cmem-function)
+ #'erc-button--get-phantom-cmem '((depth . 50)))
+ (setq erc-button--phantom-cmems (make-hash-table :test #'equal)))
+ (remove-function (local 'erc--cmem-from-nick-function)
#'erc-button--add-phantom-speaker)
- (remove-function (local 'erc-button--fallback-user-function)
- #'erc-button--get-phantom-user)
- (kill-local-variable 'erc-nicks--phantom-users)))
+ (remove-function (local 'erc-button--fallback-cmem-function)
+ #'erc-button--get-phantom-cmem)
+ (kill-local-variable 'erc-button--phantom-cmems)))
(defun erc-button-add-nickname-buttons (entry)
"Search through the buffer for nicknames, and add buttons."
@@ -451,11 +456,12 @@ retrieve it during buttonizing via
(down (erc-downcase word)))
(let* ((erc-button-mouse-face erc-button-mouse-face)
(erc-button-nickname-face erc-button-nickname-face)
- (cuser (and erc-channel-users (gethash down erc-channel-users)))
+ (cuser (and erc-channel-users
+ (or (gethash down erc-channel-users)
+ (funcall erc-button--fallback-cmem-function
+ down word bounds))))
(user (or (and cuser (car cuser))
- (and erc-server-users (gethash down erc-server-users))
- (funcall erc-button--fallback-user-function
- down word bounds)))
+ (and erc-server-users (gethash down erc-server-users))))
(data (list word)))
(when (or (not (functionp form))
(and-let* ((user)
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index 07ba32d1cca..ec4fae548c7 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -5262,14 +5262,15 @@ Assume buffer is narrowed to the confines of an
inserted message."
(next-single-property-change (point-min) 'erc-speaker))))
(cons beg (next-single-property-change beg 'erc-speaker)))))
-(defvar erc--user-from-nick-function #'erc--examine-nick
- "Function to possibly consider unknown user.
-Must return either nil or a cons of an `erc-server-user' and a
-possibly nil `erc-channel-user' for formatting a server user's
-nick. Called in the appropriate buffer with the downcased nick,
-the parsed NUH, and the original `erc-response' object.")
-
-(defun erc--examine-nick (downcased _nuh _parsed)
+(defvar erc--cmem-from-nick-function #'erc--cmem-get-existing
+ "Function maybe returning a \"channel member\" cons from a nick.
+Must return either nil or a cons of an `erc-server-user' and an
+`erc-channel-user' (see `erc-channel-users') for use in
+formatting a user's nick prior to insertion. Called in the
+appropriate target buffer with the downcased nick, the parsed
+NUH, and the current `erc-response' object.")
+
+(defun erc--cmem-get-existing (downcased _nuh _parsed)
(and erc-channel-users (gethash downcased erc-channel-users)))
(defun erc-format-privmessage (nick msg privp msgp)