Make erc-cmd-AMSG session local; add /GMSG, /AME and /GME

* etc/ERC-NEWS: Mention new slash commands.
* lisp/erc/erc.el (erc-cmd-AMSG): Make it consistent with the doc
string by only affecting the current connection.
(erc-cmd-GMSG, erc-cmd-AME, erc-cmd-GME): New IRC slash commands.
* test/lisp/erc/erc-scenarios-misc-commands.el
(erc-scenarios-misc-commands--AMSG-GMSG-AME-GME): New test.
* test/lisp/erc/resources/commands/amsg-barnet.eld: New file.
* test/lisp/erc/resources/commands/amsg-foonet.eld: New file.
(Bug#68401)
This commit is contained in:
Emanuel Berg 2024-01-23 14:21:49 +01:00 committed by F. Jason Park
parent 56706254a8
commit 15a140a246
5 changed files with 239 additions and 8 deletions

View file

@ -334,6 +334,11 @@ has changed in some way. At present, ERC does not perform this step
automatically on your behalf, even if a change was made in a
'Custom-mode' buffer or via 'setopt'.
** New broadcast-oriented slash commands /AME, /GME, and /GMSG.
Also available as the library functions 'erc-cmd-AME', 'erc-cmd-GME',
and 'erc-cmd-GMSG', these new slash commands can prove handy in test
environments.
** Miscellaneous UX changes.
Some minor quality-of-life niceties have finally made their way to
ERC. For example, fool visibility has become togglable with the new
@ -1375,7 +1380,7 @@ reconnection attempts that ERC will make per server.
in seconds, that ERC will wait between successive reconnect attempts.
*** erc-server-send-ping-timeout: Determines when to consider a connection
stalled and restart it. The default is after 120 seconds.
stalled and restart it. The default is after 120 seconds.
*** erc-system-name: Determines the system name to use when logging in.
The default is to figure this out by calling `system-name'.
@ -2336,7 +2341,7 @@ in XEmacs.
Please use M-x customize-variable RET erc-modules RET to change the
default if it does not suite your needs.
** THe symbol used in `erc-nickserv-passwords' for debian.org IRC servers
** The symbol used in `erc-nickserv-passwords' for debian.org IRC servers
(formerly called OpenProjects, now FreeNode) has changed from
openprojects to freenode. You may need to update your configuration
for a successful automatic nickserv identification.

View file

@ -4046,16 +4046,42 @@ this function from interpreting the line as a command."
;; Input commands handlers
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun erc-cmd-AMSG (line)
"Send LINE to all channels of the current server that you are on."
(interactive "sSend to all channels you're on: ")
(setq line (erc-trim-string line))
(defun erc--connected-and-joined-p ()
(and (erc--current-buffer-joined-p)
erc-server-connected))
(defun erc-cmd-GMSG (line)
"Send LINE to all channels on all networks you are on."
(setq line (string-remove-prefix " " line))
(erc-with-all-buffers-of-server nil
(lambda ()
(erc-channel-p (erc-default-target)))
#'erc--connected-and-joined-p
(erc-send-message line)))
(put 'erc-cmd-GMSG 'do-not-parse-args t)
(defun erc-cmd-AMSG (line)
"Send LINE to all channels of the current network.
Interactively, prompt for the line of text to send."
(interactive "sSend to all channels on this network: ")
(setq line (string-remove-prefix " " line))
(erc-with-all-buffers-of-server erc-server-process
#'erc--connected-and-joined-p
(erc-send-message line)))
(put 'erc-cmd-AMSG 'do-not-parse-args t)
(defun erc-cmd-GME (line)
"Send LINE as an action to all channels on all networks you are on."
(erc-with-all-buffers-of-server nil
#'erc--connected-and-joined-p
(erc-cmd-ME line)))
(put 'erc-cmd-GME 'do-not-parse-args t)
(defun erc-cmd-AME (line)
"Send LINE as an action to all channels on the current network."
(erc-with-all-buffers-of-server erc-server-process
#'erc--connected-and-joined-p
(erc-cmd-ME line)))
(put 'erc-cmd-AME 'do-not-parse-args t)
(defun erc-cmd-SAY (line)
"Send LINE to the current query or channel as a message, not a command.

View file

@ -123,4 +123,94 @@
(should (string= (erc-server-user-host (erc-get-server-user "tester"))
"some.host.test.cc"))))))
;; This tests four related slash commands, /AMSG, /GMSG, /AME, /GME,
;; the latter three introduced by bug#68401. It mainly asserts
;; correct routing behavior, especially not sending or inserting
;; messages in buffers belonging to disconnected sessions. Left
;; unaddressed are interactions with the `command-indicator' module
;; (`erc-noncommands-list') and whatever future `echo-message'
;; implementation manifests out of bug#49860.
(ert-deftest erc-scenarios-misc-commands--AMSG-GMSG-AME-GME ()
(erc-scenarios-common-with-cleanup
((erc-scenarios-common-dialog "commands")
(erc-server-flood-penalty 0.1)
(dumb-server-foonet (erc-d-run "localhost" t "srv-foonet" 'amsg-foonet))
(dumb-server-barnet (erc-d-run "localhost" t "srv-barnet" 'amsg-barnet))
(expect (erc-d-t-make-expecter)))
(ert-info ("Connect to foonet and join #foo")
(with-current-buffer
(erc :server "127.0.0.1"
:port (process-contact dumb-server-foonet :service)
:nick "tester")
(funcall expect 10 "debug mode")
(erc-cmd-JOIN "#foo")))
(ert-info ("Connect to barnet and join #bar")
(with-current-buffer
(erc :server "127.0.0.1"
:port (process-contact dumb-server-barnet :service)
:nick "tester")
(funcall expect 10 "debug mode")
(erc-cmd-JOIN "#bar")))
(with-current-buffer (erc-d-t-wait-for 10 (get-buffer "#foo"))
(funcall expect 10 "welcome"))
(with-current-buffer (erc-d-t-wait-for 10 (get-buffer "#bar"))
(funcall expect 10 "welcome"))
(ert-info ("/AMSG only sent to issuing context's server")
(with-current-buffer "foonet"
(erc-scenarios-common-say "/amsg 1 foonet only"))
(with-current-buffer "barnet"
(erc-scenarios-common-say "/amsg 2 barnet only"))
(with-current-buffer "#foo"
(funcall expect 10 "<tester> 1 foonet only")
(funcall expect 10 "<alice> bob: Our queen and all"))
(with-current-buffer "#bar"
(funcall expect 10 "<tester> 2 barnet only")
(funcall expect 10 "<joe> mike: And secretly to greet")))
(ert-info ("/AME only sent to issuing context's server")
(with-current-buffer "foonet"
(erc-scenarios-common-say "/ame 3 foonet only"))
(with-current-buffer "barnet"
(erc-scenarios-common-say "/ame 4 barnet only"))
(with-current-buffer "#foo"
(funcall expect 10 "* tester 3 foonet only")
(funcall expect 10 "<alice> bob: You have discharged this"))
(with-current-buffer "#bar"
(funcall expect 10 "* tester 4 barnet only")
(funcall expect 10 "<joe> mike: That same Berowne")))
(ert-info ("/GMSG and /GME sent to all servers")
(with-current-buffer "foonet"
(erc-scenarios-common-say "/gmsg 5 all nets")
(erc-scenarios-common-say "/gme 6 all nets"))
(with-current-buffer "#bar"
(funcall expect 10 "<tester> 5 all nets")
(funcall expect 10 "* tester 6 all nets")
(funcall expect 10 "<joe> mike: Mehercle! if their sons")))
(ert-info ("/GMSG and /GME only sent to connected servers")
(with-current-buffer "barnet"
(erc-cmd-QUIT "")
(funcall expect 10 "ERC finished"))
(with-current-buffer "#foo"
(funcall expect 10 "<tester> 5 all nets")
(funcall expect 10 "* tester 6 all nets")
(funcall expect 10 "<alice> bob: Stand you!"))
(with-current-buffer "foonet"
(erc-scenarios-common-say "/gmsg 7 all live nets")
(erc-scenarios-common-say "/gme 8 all live nets"))
;; Message *not* inserted in disconnected buffer.
(with-current-buffer "#bar"
(funcall expect -0.1 "<tester> 7 all live nets")
(funcall expect -0.1 "* tester 8 all live nets")))
(with-current-buffer "#foo"
(funcall expect 10 "<tester> 7 all live nets")
(funcall expect 10 "* tester 8 all live nets")
(funcall expect 10 "<bob> alice: Live, and be prosperous;"))))
;;; erc-scenarios-misc-commands.el ends here

View file

@ -0,0 +1,54 @@
;; -*- mode: lisp-data; -*-
((nick 10 "NICK tester"))
((user 10 "USER user 0 * :unknown")
(0 ":irc.barnet.org 001 tester :Welcome to the barnet IRC Network tester")
(0 ":irc.barnet.org 002 tester :Your host is irc.barnet.org, running version oragono-2.6.0-7481bf0385b95b16")
(0 ":irc.barnet.org 003 tester :This server was created Tue, 04 May 2021 05:06:19 UTC")
(0 ":irc.barnet.org 004 tester irc.barnet.org oragono-2.6.0-7481bf0385b95b16 BERTZios CEIMRUabefhiklmnoqstuv Iabefhkloqv")
(0 ":irc.barnet.org 005 tester AWAYLEN=390 BOT=B CASEMAPPING=ascii CHANLIMIT=#:100 CHANMODES=Ibe,k,fl,CEMRUimnstu CHANNELLEN=64 CHANTYPES=# ELIST=U EXCEPTS EXTBAN=,m FORWARD=f INVEX KICKLEN=390 :are supported by this server")
(0 ":irc.barnet.org 005 tester MAXLIST=beI:60 MAXTARGETS=4 MODES MONITOR=100 NETWORK=barnet NICKLEN=32 PREFIX=(qaohv)~&@%+ STATUSMSG=~&@%+ TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,USERHOST:10,PRIVMSG:4,TAGMSG:4,NOTICE:4,MONITOR:100 TOPICLEN=390 UTF8MAPPING=rfc8265 UTF8ONLY WHOX :are supported by this server")
(0 ":irc.barnet.org 005 tester draft/CHATHISTORY=100 :are supported by this server")
(0 ":irc.barnet.org 251 tester :There are 0 users and 3 invisible on 1 server(s)")
(0 ":irc.barnet.org 252 tester 0 :IRC Operators online")
(0 ":irc.barnet.org 253 tester 0 :unregistered connections")
(0 ":irc.barnet.org 254 tester 1 :channels formed")
(0 ":irc.barnet.org 255 tester :I have 3 clients and 0 servers")
(0 ":irc.barnet.org 265 tester 3 3 :Current local users 3, max 3")
(0 ":irc.barnet.org 266 tester 3 3 :Current global users 3, max 3")
(0 ":irc.barnet.org 422 tester :MOTD File is missing"))
((mode-user 10 "MODE tester +i")
(0 ":irc.barnet.org 221 tester +i")
(0 ":irc.barnet.org NOTICE tester :This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect."))
((join 10 "JOIN #bar")
(0 ":tester!~u@jnu48g2wrycbw.irc JOIN #bar")
(0 ":irc.barnet.org 353 tester = #bar :@mike joe tester")
(0 ":irc.barnet.org 366 tester #bar :End of NAMES list"))
((mode-bar 10 "MODE #bar")
(0 ":irc.barnet.org 324 tester #bar +nt")
(0 ":irc.barnet.org 329 tester #bar 1620104779")
(0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :tester, welcome!")
(0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :tester, welcome!")
(0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :joe: Whipp'd first, sir, and hang'd after.")
(0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :mike: We have yet many among us can gripe as hard as Cassibelan; I do not say I am one, but I have a hand. Why tribute ? why should we pay tribute ? If C sar can hide the sun from us with a blanket, or put the moon in his pocket, we will pay him tribute for light; else, sir, no more tribute, pray you now."))
((privmsg-2 10 "PRIVMSG #bar :2 barnet only")
(0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :joe: Double and treble admonition, and still forfeit in the same kind ? This would make mercy swear, and play the tyrant.")
(0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :mike: And secretly to greet the empress' friends."))
((privmsg-4 10 "PRIVMSG #bar :\1ACTION 4 barnet only\1")
(0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :joe: You have not been inquired after: I have sat here all day.")
(0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :mike: That same Berowne I'll torture ere I go."))
((privmsg-5 10 "PRIVMSG #bar :5 all nets"))
((privmsg-6 10 "PRIVMSG #bar :\1ACTION 6 all nets\1")
(0.1 ":mike!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :joe: For mine own part,no offence to the general, nor any man of quality,I hope to be saved.")
(0.1 ":joe!~u@kd7gmjbnbkn8c.irc PRIVMSG #bar :mike: Mehercle! if their sons be ingenuous, they shall want no instruction; if their daughters be capable, I will put it to them. But, vir sapit qui pauca loquitur. A soul feminine saluteth us."))
((quit 5 "QUIT :\2ERC\2")
(0 ":tester!~u@jnu48g2wrycbw.irc QUIT :Quit"))
((drop 0 DROP))

View file

@ -0,0 +1,56 @@
;; -*- mode: lisp-data; -*-
((nick 10 "NICK tester"))
((user 10 "USER user 0 * :unknown")
(0 ":irc.foonet.org 001 tester :Welcome to the foonet IRC Network tester")
(0 ":irc.foonet.org 002 tester :Your host is irc.foonet.org, running version oragono-2.6.0-7481bf0385b95b16")
(0 ":irc.foonet.org 003 tester :This server was created Tue, 04 May 2021 05:06:18 UTC")
(0 ":irc.foonet.org 004 tester irc.foonet.org oragono-2.6.0-7481bf0385b95b16 BERTZios CEIMRUabefhiklmnoqstuv Iabefhkloqv")
(0 ":irc.foonet.org 005 tester AWAYLEN=390 BOT=B CASEMAPPING=ascii CHANLIMIT=#:100 CHANMODES=Ibe,k,fl,CEMRUimnstu CHANNELLEN=64 CHANTYPES=# ELIST=U EXCEPTS EXTBAN=,m FORWARD=f INVEX KICKLEN=390 :are supported by this server")
(0 ":irc.foonet.org 005 tester MAXLIST=beI:60 MAXTARGETS=4 MODES MONITOR=100 NETWORK=foonet NICKLEN=32 PREFIX=(qaohv)~&@%+ STATUSMSG=~&@%+ TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,USERHOST:10,PRIVMSG:4,TAGMSG:4,NOTICE:4,MONITOR:100 TOPICLEN=390 UTF8MAPPING=rfc8265 UTF8ONLY WHOX :are supported by this server")
(0 ":irc.foonet.org 005 tester draft/CHATHISTORY=100 :are supported by this server")
(0 ":irc.foonet.org 251 tester :There are 0 users and 3 invisible on 1 server(s)")
(0 ":irc.foonet.org 252 tester 0 :IRC Operators online")
(0 ":irc.foonet.org 253 tester 0 :unregistered connections")
(0 ":irc.foonet.org 254 tester 1 :channels formed")
(0 ":irc.foonet.org 255 tester :I have 3 clients and 0 servers")
(0 ":irc.foonet.org 265 tester 3 3 :Current local users 3, max 3")
(0 ":irc.foonet.org 266 tester 3 3 :Current global users 3, max 3")
(0 ":irc.foonet.org 422 tester :MOTD File is missing"))
((mode-user 10 "MODE tester +i")
(0 ":irc.foonet.org 221 tester +i")
(0 ":irc.foonet.org NOTICE tester :This server is in debug mode and is logging all user I/O. If you do not wish for everything you send to be readable by the server owner(s), please disconnect."))
((join 10 "JOIN #foo")
(0 ":tester!~u@9g6b728983yd2.irc JOIN #foo")
(0 ":irc.foonet.org 353 tester = #foo :alice tester @bob")
(0 ":irc.foonet.org 366 tester #foo :End of NAMES list"))
((mode-foo 10 "MODE #foo")
(0 ":irc.foonet.org 324 tester #foo +nt")
(0 ":irc.foonet.org 329 tester #foo 1620104779")
(0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :tester, welcome!")
(0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :tester, welcome!")
(0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: But, as it seems, did violence on herself.")
(0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: Well, this is the forest of Arden."))
((privmsg-1 10 "PRIVMSG #foo :1 foonet only")
(0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: Signior Iachimo will not from it. Pray, let us follow 'em.")
(0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: Our queen and all her elves come here anon."))
((privmsg-3 10 "PRIVMSG #foo :\1ACTION 3 foonet only\1")
(0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: The ground is bloody; search about the churchyard.")
(0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: You have discharged this honestly: keep it to yourself. Many likelihoods informed me of this before, which hung so tottering in the balance that I could neither believe nor misdoubt. Pray you, leave me: stall this in your bosom; and I thank you for your honest care. I will speak with you further anon."))
((privmsg-5 10 "PRIVMSG #foo :5 all nets"))
((privmsg-6 10 "PRIVMSG #foo :\1ACTION 6 all nets\1")
(0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: Give me that mattock, and the wrenching iron.")
(0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: Stand you! You have land enough of your own; but he added to your having, gave you some ground."))
((privmsg-6 10 "PRIVMSG #foo :7 all live nets")
(0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: Excellent workman! Thou canst not paint a man so bad as is thyself."))
((privmsg-6 10 "PRIVMSG #foo :\1ACTION 8 all live nets\1")
(0.1 ":alice!~u@rz2v467q4rwhy.irc PRIVMSG #foo :bob: And will you, being a man of your breeding, be married under a bush, like a beggar ? Get you to church, and have a good priest that can tell you what marriage is: this fellow will but join you together as they join wainscot; then one of you will prove a shrunk panel, and like green timber, warp, warp.")
(0.1 ":bob!~u@rz2v467q4rwhy.irc PRIVMSG #foo :alice: Live, and be prosperous; and farewell, good fellow."))