1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

Store one string per user in erc--spkr msg prop

* lisp/erc/erc.el (erc--msg-props): Mention that the `erc--spkr'
msg-prop value is taken from the `nickname' slot of the user's
`erc-server-users' entry.
(erc--speakerize-nick): Avoid using the provided NICK parameter for
the `erc--spkr' property.  Instead, use the version from the
`nickname' slot of its `erc-server-users' item, which is itself an
`erc-server-user' object.  These text props were originally introduced
in ERC 5.6 as part of bug#67677.
* test/lisp/erc/erc-tests.el (erc--refresh-prompt)
(erc--check-prompt-input-functions, erc-send-current-line)
(erc--check-prompt-input-for-multiline-blanks)
(erc-send-whitespace-lines): Use more convenient helper utility to
create fake server buffer where possible.
(erc--speakerize-nick): New test.
* test/lisp/erc/resources/erc-tests-common.el
(erc-tests-common-make-server-buf): Don't use ERT temp buffer's name
for dialed server, etc., because it contains unwanted chars.
(erc-tests-common-with-process-input-spy): Defer to each test to set
up its own prompt, etc.  (Bug#72736)
This commit is contained in:
F. Jason Park 2024-08-06 19:13:51 -07:00
parent 8f326e0ba2
commit b0ebb82076
3 changed files with 81 additions and 28 deletions

View file

@ -173,7 +173,8 @@ as of ERC 5.6:
and help text, and on outgoing messages unless echoed back by and help text, and on outgoing messages unless echoed back by
the server (assuming future support) the server (assuming future support)
- `erc--spkr': a string, the nick of the person speaking - `erc--spkr': a string, the non-case-mapped nick of the speaker as
stored in the `nickname' slot of its `erc-server-users' item
- `erc--ctcp': a CTCP command, like `ACTION' - `erc--ctcp': a CTCP command, like `ACTION'
@ -6339,20 +6340,18 @@ rely on their presence, and cleaner ways exist)."
"Template for a CTCP ACTION status message from current client.") "Template for a CTCP ACTION status message from current client.")
(defun erc--speakerize-nick (nick &optional disp) (defun erc--speakerize-nick (nick &optional disp)
"Propertize NICK with `erc--speaker' if not already present. "Return propertized NICK with canonical NICK in `erc--speaker'.
Do so to DISP instead if it's non-nil. In either case, assign Return propertized DISP instead if given. As a side effect, pair NICK
NICK, sans properties, as the `erc--speaker' value. As a side with `erc--spkr' in the \"msg prop\" environment for any imminent
effect, pair the latter string (the same `eq'-able object) with `erc-display-message' invocations, and include any overrides defined in
the symbol `erc--spkr' in the \"msg prop\" environment for any `erc--message-speaker-catalog'. Expect NICK (but not necessarily DISP)
imminent `erc-display-message' invocations. While doing so, to be absent of any existing text properties."
include any overrides defined in `erc--message-speaker-catalog'." (when-let ((erc-server-process)
(let ((plain-nick (substring-no-properties nick))) (cusr (erc-get-server-user nick)))
(erc--ensure-spkr-prop plain-nick (get erc--message-speaker-catalog (setq nick (erc-server-user-nickname cusr)))
'erc--msg-prop-overrides)) (erc--ensure-spkr-prop nick (get erc--message-speaker-catalog
(if (text-property-not-all 0 (length (or disp nick)) 'erc--msg-prop-overrides))
'erc--speaker nil (or disp nick)) (propertize (or disp nick) 'erc--speaker nick))
(or disp nick)
(propertize (or disp nick) 'erc--speaker plain-nick))))
(defun erc--determine-speaker-message-format-args (defun erc--determine-speaker-message-format-args
(nick message queryp privmsgp inputp &optional statusmsg prefix disp-nick) (nick message queryp privmsgp inputp &optional statusmsg prefix disp-nick)

View file

@ -330,16 +330,12 @@
(ert-info ("Server buffer") (ert-info ("Server buffer")
(with-current-buffer (get-buffer-create "ServNet") (with-current-buffer (get-buffer-create "ServNet")
(erc-tests-common-prep-for-insertion) (erc-tests-common-make-server-buf "ServNet")
(goto-char erc-insert-marker) (goto-char erc-insert-marker)
(should (looking-at-p "ServNet 3>")) (should (looking-at-p "ServNet 3>"))
(erc-tests-common-init-server-proc "sleep" "1") (erc-tests-common-init-server-proc "sleep" "1")
(set-process-sentinel erc-server-process #'ignore) (set-process-sentinel erc-server-process #'ignore)
(setq erc-network 'ServNet (setq erc-server-current-nick "tester")
erc-server-current-nick "tester"
erc-networks--id (erc-networks--id-create nil)
erc-server-users (make-hash-table :test 'equal))
(set-process-query-on-exit-flag erc-server-process nil)
;; Incoming message redraws prompt ;; Incoming message redraws prompt
(erc-display-message nil 'notice nil "Welcome") (erc-display-message nil 'notice nil "Welcome")
(should (looking-at-p (rx "*** Welcome"))) (should (looking-at-p (rx "*** Welcome")))
@ -364,6 +360,8 @@
(should-not (search-forward (rx (any "3-5") ">") nil t))))) (should-not (search-forward (rx (any "3-5") ">") nil t)))))
(ert-info ("Channel buffer") (ert-info ("Channel buffer")
;; Create buffer manually instead of using `erc--open-target' in
;; order to show prompt before/after network is known.
(with-current-buffer (get-buffer-create "#chan") (with-current-buffer (get-buffer-create "#chan")
(erc-tests-common-prep-for-insertion) (erc-tests-common-prep-for-insertion)
(goto-char erc-insert-marker) (goto-char erc-insert-marker)
@ -1521,6 +1519,7 @@
(ert-deftest erc--check-prompt-input-functions () (ert-deftest erc--check-prompt-input-functions ()
(erc-tests-common-with-process-input-spy (erc-tests-common-with-process-input-spy
(lambda (next) (lambda (next)
(erc-tests-common-prep-for-insertion)
(ert-info ("Errors when point not in prompt area") ; actually just dings (ert-info ("Errors when point not in prompt area") ; actually just dings
(insert "/msg #chan hi") (insert "/msg #chan hi")
@ -1556,7 +1555,7 @@
(ert-deftest erc-send-current-line () (ert-deftest erc-send-current-line ()
(erc-tests-common-with-process-input-spy (erc-tests-common-with-process-input-spy
(lambda (next) (lambda (next)
(erc-tests-common-init-server-proc "sleep" "1") (erc-tests-common-make-server-buf (buffer-name))
(should (= 0 erc-last-input-time)) (should (= 0 erc-last-input-time))
(ert-info ("Simple command") (ert-info ("Simple command")
@ -1639,7 +1638,8 @@
(ert-with-message-capture messages (ert-with-message-capture messages
(erc-tests-common-with-process-input-spy (erc-tests-common-with-process-input-spy
(lambda (next) (lambda (next)
(erc-tests-common-init-server-proc "sleep" "300") (erc-tests-common-make-server-buf (buffer-name))
(should-not erc-send-whitespace-lines) (should-not erc-send-whitespace-lines)
(should erc-warn-about-blank-lines) (should erc-warn-about-blank-lines)
@ -1717,7 +1717,8 @@
(ert-deftest erc-send-whitespace-lines () (ert-deftest erc-send-whitespace-lines ()
(erc-tests-common-with-process-input-spy (erc-tests-common-with-process-input-spy
(lambda (next) (lambda (next)
(erc-tests-common-init-server-proc "sleep" "1") (erc-tests-common-make-server-buf (buffer-name))
(setq-local erc-send-whitespace-lines t) (setq-local erc-send-whitespace-lines t)
(ert-info ("Multiline hunk with blank line correctly split") (ert-info ("Multiline hunk with blank line correctly split")
@ -2653,6 +2654,58 @@
(erc--determine-speaker-message-format-args nick msg privp msgp (erc--determine-speaker-message-format-args nick msg privp msgp
inputp nil pfx)))) inputp nil pfx))))
;; This test demonstrates that ERC uses the same string for the
;; `erc--spkr' and `erc--speaker' text properties, which it gets from
;; the `nickname' shot of the speaker's server user.
(ert-deftest erc--speakerize-nick ()
(erc-tests-common-make-server-buf)
(setq erc-server-current-nick "tester")
(let ((sentinel "alice"))
(with-current-buffer (erc--open-target "#chan")
(erc-update-current-channel-member "bob" "bob" t nil nil nil nil nil
"example.org" "~u" "bob")
(erc-update-current-channel-member "alice" sentinel t nil nil nil nil nil
"fsf.org" "~u" "alice"))
(erc-call-hooks nil (make-erc-response
:sender "alice!~u@fsf.org"
:command "PRIVMSG"
:command-args '("#chan" "one")
:contents "one"
:unparsed ":alice!~u@fsf.org PRIVMSG #chan :one"))
(erc-call-hooks nil (make-erc-response
:sender "bob!~u@example.org"
:command "PRIVMSG"
:command-args '("#chan" "hi")
:contents "hi"
:unparsed ":bob!~u@example.org PRIVMSG #chan :hi"))
(erc-call-hooks nil (make-erc-response
:sender "alice!~u@fsf.org"
:command "PRIVMSG"
:command-args '("#chan" "two")
:contents "two"
:unparsed ":alice!~u@fsf.org PRIVMSG #chan :two"))
(with-current-buffer (get-buffer "#chan")
(should (eq sentinel
(erc-server-user-nickname (erc-get-server-user "alice"))))
(goto-char (point-min))
(should (search-forward "<a" nil t))
(should (looking-at "lice> one"))
(should (eq (get-text-property (point) 'erc--speaker) sentinel))
(should (eq (erc--get-inserted-msg-prop 'erc--spkr) sentinel))
(should (search-forward "<bob> hi" nil t))
(should (search-forward "<a" nil t))
(should (looking-at "lice> two"))
(should (eq (get-text-property (point) 'erc--speaker) sentinel))
(should (eq (erc--get-inserted-msg-prop 'erc--spkr) sentinel))
(when noninteractive (kill-buffer)))))
;; This asserts that `erc--determine-speaker-message-format-args' ;; This asserts that `erc--determine-speaker-message-format-args'
;; behaves identically to `erc-format-privmessage', the function whose ;; behaves identically to `erc-format-privmessage', the function whose
;; role it basically replaced. ;; role it basically replaced.

View file

@ -103,16 +103,17 @@ recently passed to the mocked `erc-process-input-line'. Make
(lambda (&rest r) (push r calls))) (lambda (&rest r) (push r calls)))
((symbol-function 'erc-server-buffer) ((symbol-function 'erc-server-buffer)
(lambda () (current-buffer)))) (lambda () (current-buffer))))
(erc-tests-common-prep-for-insertion)
(funcall test-fn (lambda () (pop calls))))) (funcall test-fn (lambda () (pop calls)))))
(when noninteractive (kill-buffer)))) (when noninteractive (kill-buffer))))
(defun erc-tests-common-make-server-buf (&optional name) (defun erc-tests-common-make-server-buf (&optional name)
"Return a server buffer named NAME, creating it if necessary. "Return a server buffer named NAME, creating it if necessary.
Use NAME for the network and the session server as well." Use NAME for the network and the session server as well."
(unless name (with-current-buffer (if name
(cl-assert (string-prefix-p " *temp*" (setq name (buffer-name))))) (get-buffer-create name)
(with-current-buffer (get-buffer-create name) (and (string-search "temp" (buffer-name))
(setq name "foonet")
(buffer-name)))
(erc-tests-common-prep-for-insertion) (erc-tests-common-prep-for-insertion)
(erc-tests-common-init-server-proc "sleep" "1") (erc-tests-common-init-server-proc "sleep" "1")
(setq erc-session-server (concat "irc." name ".org") (setq erc-session-server (concat "irc." name ".org")