emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 529e46f128 13/25: Add eventual replacement for erc-default-recipi


From: F. Jason Park
Subject: master 529e46f128 13/25: Add eventual replacement for erc-default-recipients
Date: Thu, 30 Jun 2022 18:29:53 -0400 (EDT)

branch: master
commit 529e46f1287ddb6fc16779a3f14016d0c305037c
Author: F. Jason Park <jp@neverwas.me>
Commit: F. Jason Park <jp@neverwas.me>

    Add eventual replacement for erc-default-recipients
    
    * lisp/erc/erc.el (erc--target, erc--target-channel,
    erc--target-channel-local): Add new structs to hold info on a buffer's
    target; stored in a local variable of the same name.
    (erc--target-from-string): Add standalone constructor for
    `erc--target'.
    (erc--default-target): Add temporary internal getter to ease
    transition to `erc--target' everywhere.
    (erc-open): Create above items in non-server buffers.
    
    * lisp/erc/erc-backend.el (erc-server-NICK): Recreate `erc--target'
    when necessary.
---
 lisp/erc/erc-backend.el    |  4 ++--
 lisp/erc/erc.el            | 40 ++++++++++++++++++++++++++++++++++++++++
 test/lisp/erc/erc-tests.el | 12 ++++++++++++
 3 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index 3534a937b8..bb423eadc0 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -1427,8 +1427,8 @@ add things to `%s' instead."
       (erc-buffer-filter
        (lambda ()
          (when (equal (erc-default-target) nick)
-           (setq erc-default-recipients
-                 (cons nn (cdr erc-default-recipients)))
+           (setq erc-default-recipients (cons nn (cdr erc-default-recipients))
+                 erc--target (erc--target-from-string nn))
            (rename-buffer nn t)         ; bug#12002
            (erc-update-mode-line)
            (cl-pushnew (current-buffer) bufs))))
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index d4cf28a86d..078a446a1c 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -1391,6 +1391,45 @@ if ARG is omitted or nil.
        (put ',enable  'definition-name ',name)
        (put ',disable 'definition-name ',name))))
 
+;; The rationale for favoring inheritance here (nicer dispatch) is
+;; kinda flimsy since there aren't yet any actual methods.
+
+(cl-defstruct erc--target
+  (string "" :type string :documentation "Received name of target.")
+  (symbol nil :type symbol :documentation "Case-mapped name as symbol."))
+
+;; These should probably take on a `joined' field to track joinedness,
+;; which should be toggled by `erc-server-JOIN', `erc-server-PART',
+;; etc.  Functions like `erc--current-buffer-joined-p' (bug#48598) may
+;; find it useful.
+
+(cl-defstruct (erc--target-channel (:include erc--target)))
+
+(cl-defstruct (erc--target-channel-local (:include erc--target-channel)))
+
+;; At some point, it may make sense to add a query type with an
+;; account field, which may help support reassociation across
+;; reconnects and nick changes (likely requires v3 extensions).
+
+(defun erc--target-from-string (string)
+  "Construct an `erc--target' variant from STRING."
+  (funcall (if (erc-channel-p string)
+               (if (erc--valid-local-channel-p string)
+                   #'make-erc--target-channel-local
+                 #'make-erc--target-channel)
+             #'make-erc--target)
+           :string string :symbol (intern (erc-downcase string))))
+
+(defvar-local erc--target nil
+  "Info about a buffer's target, if any.")
+
+;; Temporary internal getter to ease transition to `erc--target'
+;; everywhere.  Will be replaced by updated `erc-default-target'.
+(defun erc--default-target ()
+  "Return target string or nil."
+  (when erc--target
+    (erc--target-string erc--target)))
+
 (defun erc-once-with-server-event (event f)
   "Run function F the next time EVENT occurs in the `current-buffer'.
 
@@ -2091,6 +2130,7 @@ Returns the buffer for the given server or channel."
     (set-marker erc-insert-marker (point))
     ;; stack of default recipients
     (setq erc-default-recipients tgt-list)
+    (setq erc--target (and channel (erc--target-from-string channel)))
     (setq erc-server-current-nick nil)
     ;; Initialize erc-server-users and erc-channel-users
     (if connect
diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el
index 4026ebaf33..5b04bff617 100644
--- a/test/lisp/erc/erc-tests.el
+++ b/test/lisp/erc/erc-tests.el
@@ -478,6 +478,18 @@
       (should-not (erc--valid-local-channel-p "#chan"))
       (should (erc--valid-local-channel-p "&local")))))
 
+(ert-deftest erc--target-from-string ()
+  (should (equal (erc--target-from-string "#chan")
+                 #s(erc--target-channel "#chan" \#chan)))
+
+  (should (equal (erc--target-from-string "Bob")
+                 #s(erc--target "Bob" bob)))
+
+  (let ((erc--isupport-params (make-hash-table)))
+    (puthash 'CHANTYPES  '("&#") erc--isupport-params)
+    (should (equal (erc--target-from-string "&Bitlbee")
+                   #s(erc--target-channel-local "&Bitlbee" &bitlbee)))))
+
 (ert-deftest erc-ring-previous-command-base-case ()
   (ert-info ("Create ring when nonexistent and do nothing")
     (let (erc-input-ring



reply via email to

[Prev in Thread] Current Thread [Next in Thread]