summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorF. Jason Park <jp@neverwas.me>2021-08-16 05:01:16 -0700
committerF. Jason Park <jp@neverwas.me>2022-06-30 15:03:26 -0700
commit1c24af0fcb8a8326fe5cdc75672bf4099b191a00 (patch)
treee6015d2a97e73b22f9208b406f34543a1dcfb287
parent4e312c07f7a6998a818901e46341356316d248e0 (diff)
downloademacs-1c24af0fcb8a8326fe5cdc75672bf4099b191a00.tar.gz
Add helper to determine local channels in ERC
* lisp/erc/erc.el (erc--valid-local-channel-p): Add internal helper to determine whether an IRC channel is local according to its network's CHANTYPES ISUPPORT parameter. * test/lisp/erc/erc-tests.el (erc--valid-local-channel-p): Add test for this helper.
-rw-r--r--lisp/erc/erc.el8
-rw-r--r--test/lisp/erc/erc-tests.el12
2 files changed, 20 insertions, 0 deletions
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index 4c54ef2ef9c..d4cf28a86d9 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -3251,6 +3251,14 @@ For a list of user commands (/join /part, ...):
(concat " " password)
"")))))
+(defun erc--valid-local-channel-p (channel)
+ "Non-nil when channel is server-local on a network that allows them."
+ (and-let* (((eq ?& (aref channel 0)))
+ (chan-types (erc--get-isupport-entry 'CHANTYPES 'single))
+ ((if (>= emacs-major-version 28)
+ (string-search "&" chan-types)
+ (string-match-p "&" chan-types))))))
+
(defun erc-cmd-JOIN (channel &optional key)
"Join the channel given in CHANNEL, optionally with KEY.
If CHANNEL is specified as \"-invite\", join the channel to which you
diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el
index cffb61f7084..4026ebaf335 100644
--- a/test/lisp/erc/erc-tests.el
+++ b/test/lisp/erc/erc-tests.el
@@ -466,6 +466,18 @@
(should (equal (erc-downcase "Tilde~") "tilde~" ))
(should (equal (erc-downcase "\\O/") "|o/" )))))
+(ert-deftest erc--valid-local-channel-p ()
+ (ert-info ("Local channels not supported")
+ (let ((erc--isupport-params (make-hash-table)))
+ (puthash 'CHANTYPES '("#") erc--isupport-params)
+ (should-not (erc--valid-local-channel-p "#chan"))
+ (should-not (erc--valid-local-channel-p "&local"))))
+ (ert-info ("Local channels supported")
+ (let ((erc--isupport-params (make-hash-table)))
+ (puthash 'CHANTYPES '("&#") erc--isupport-params)
+ (should-not (erc--valid-local-channel-p "#chan"))
+ (should (erc--valid-local-channel-p "&local")))))
+
(ert-deftest erc-ring-previous-command-base-case ()
(ert-info ("Create ring when nonexistent and do nothing")
(let (erc-input-ring