2021-02-11 21:30:23 +01:00
|
|
|
;;; erc-sound.el --- CTCP SOUND support for ERC -*- lexical-binding: t -*-
|
2006-01-29 13:08:58 +00:00
|
|
|
|
2024-01-02 09:47:10 +08:00
|
|
|
;; Copyright (C) 2002-2003, 2006-2024 Free Software Foundation, Inc.
|
2006-01-29 13:08:58 +00:00
|
|
|
|
2022-01-24 10:59:05 -05:00
|
|
|
;; Maintainer: Amin Bandali <bandali@gnu.org>, F. Jason Park <jp@neverwas.me>
|
Update ERC module URLs
* lisp/erc/erc-autoaway.el, lisp/erc/erc-button.el,
lisp/erc/erc-compat.el, lisp/erc/erc-fill.el, lisp/erc/erc-imenu.el,
lisp/erc/erc-join.el, lisp/erc/erc-lang.el, lisp/erc/erc-match.el,
lisp/erc/erc-pcomplete.el, lisp/erc/erc-ring.el,
lisp/erc/erc-spelling.el, lisp/erc/erc-stamp.el,
lisp/erc/erc-track.el: Update URL to friendlier form, over https.
* lisp/erc/erc-ibuffer.el: Remove URL to nonexistent page.
* lisp/erc/erc-list.el, lisp/erc/erc-log.el, lisp/erc/erc-notify.el,
lisp/erc/erc-replace.el, lisp/erc/erc-services.el,
lisp/erc/erc-sound.el, lisp/erc/erc-speedbar.el,
lisp/erc/erc-truncate.el: Add URL to corresponding EmacsWiki page.
2020-01-24 01:09:43 -05:00
|
|
|
;; URL: https://www.emacswiki.org/emacs/ErcSound
|
2019-05-25 13:43:06 -07:00
|
|
|
|
2006-01-29 13:08:58 +00:00
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
2008-05-06 03:36:21 +00:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
2006-01-29 13:08:58 +00:00
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 03:36:21 +00:00
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
2017-09-13 15:52:52 -07:00
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
2006-11-20 06:50:29 +00:00
|
|
|
;; Play sounds when users send you CTCP SOUND messages.
|
|
|
|
|
|
|
|
;; This file also defines the command /sound so that you can send
|
|
|
|
;; sound requests to other users.
|
|
|
|
|
|
|
|
;;; Usage:
|
|
|
|
|
|
|
|
;; Add the following to your .emacs if you want to play sounds.
|
|
|
|
;;
|
2007-09-19 03:29:03 +00:00
|
|
|
;; (require 'erc-sound)
|
2006-11-20 06:50:29 +00:00
|
|
|
;; (erc-sound-enable)
|
|
|
|
;;
|
|
|
|
;; To send requests to other users from within query buffers, type the
|
|
|
|
;; following:
|
|
|
|
;;
|
|
|
|
;; /sound filename optional-message-text
|
|
|
|
;;
|
|
|
|
;; You can also type the following:
|
|
|
|
;;
|
|
|
|
;; /ctcp nickname sound filename optional-message
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
(require 'erc)
|
|
|
|
|
2023-06-09 23:34:58 -07:00
|
|
|
(defgroup erc-sound nil
|
|
|
|
"Make ERC play bells and whistles while chatting with people."
|
|
|
|
:group 'erc)
|
|
|
|
|
2023-02-04 06:24:59 -08:00
|
|
|
;;;###autoload(put 'ctcp-sound 'erc--module 'sound)
|
Put most erc autoloads in a dedicated file erc-loaddefs.el
These are features that are only useful after erc.el is loaded.
* lisp/erc/erc.el (top-level): Load erc-loaddefs.
* lisp/erc/erc-autoaway.el, lisp/erc/erc-button.el:
* lisp/erc/erc-capab.el, lisp/erc/erc-compat.el:
* lisp/erc/erc-dcc.el, lisp/erc/erc-desktop-notifications.el:
* lisp/erc/erc-ezbounce.el, lisp/erc/erc-fill.el:
* lisp/erc/erc-identd.el, lisp/erc/erc-imenu.el:
* lisp/erc/erc-join.el, lisp/erc/erc-list.el, lisp/erc/erc-log.el:
* lisp/erc/erc-match.el, lisp/erc/erc-menu.el:
* lisp/erc/erc-netsplit.el, lisp/erc/erc-notify.el:
* lisp/erc/erc-page.el, lisp/erc/erc-pcomplete.el:
* lisp/erc/erc-replace.el, lisp/erc/erc-ring.el:
* lisp/erc/erc-services.el, lisp/erc/erc-sound.el:
* lisp/erc/erc-speedbar.el, lisp/erc/erc-spelling.el:
* lisp/erc/erc-stamp.el, lisp/erc/erc-track.el:
* lisp/erc/erc-truncate.el, lisp/erc/erc-xdcc.el:
Set generated-autoload-file to "erc-loaddefs.el".
2017-11-28 21:16:02 -05:00
|
|
|
;;;###autoload(autoload 'erc-sound-mode "erc-sound")
|
2006-01-29 13:08:58 +00:00
|
|
|
(define-erc-module sound ctcp-sound
|
|
|
|
"In ERC sound mode, the client will respond to CTCP SOUND requests
|
|
|
|
and play sound files as requested."
|
|
|
|
;; Enable:
|
2021-03-18 23:14:33 -04:00
|
|
|
((add-hook 'erc-ctcp-query-SOUND-hook #'erc-ctcp-query-SOUND)
|
|
|
|
(define-key erc-mode-map "\C-c\C-s" #'erc-toggle-sound))
|
2006-01-29 13:08:58 +00:00
|
|
|
;; Disable:
|
2021-03-18 23:14:33 -04:00
|
|
|
((remove-hook 'erc-ctcp-query-SOUND-hook #'erc-ctcp-query-SOUND)
|
|
|
|
(define-key erc-mode-map "\C-c\C-s" #'undefined)))
|
2006-01-29 13:08:58 +00:00
|
|
|
|
Define ERC message-formatting templates with defvar
* etc/ERC-NEWS: Mention convenience macro being preferred means of
defining message templates. Mention renaming of `notify' formatting
templates.
* lisp/erc/erc-common.el (erc--define-catalog,
erc-define-message-format-catalog): New macro and internal variant to
replace `erc-define-catalog-entry'. The internal variant allows us to
defer reindenting existing definitions until meaningfully edited.
* lisp/erc/erc-dcc.el (erc-message-english-dcc-chat-discarded,
erc-message-english-dcc-chat-ended,
erc-message-english-dcc-chat-no-request,
erc-message-english-dcc-chat-offered,
erc-message-english-dcc-chat-offer,
erc-message-english-dcc-chat-accept,
erc-message-english-dcc-chat-privmsg, erc-message-english-dcc-closed,
erc-message-english-dcc-command-undefined,
erc-message-english-dcc-ctcp-errmsg,
erc-message-english-dcc-ctcp-unknown,
erc-message-english-dcc-get-bytes-received,
erc-message-english-dcc-get-complete,
erc-message-english-dcc-get-failed,
erc-message-english-dcc-get-cmd-aborted,
erc-message-english-dcc-get-file-too-long,
erc-message-english-dcc-get-notfound,
erc-message-english-dcc-list-head, erc-message-english-dcc-list-line,
erc-message-english-dcc-list-item, erc-message-english-dcc-list-end,
erc-message-english-dcc-malformed,
erc-message-english-dcc-privileged-port,
erc-message-english-dcc-request-bogus,
erc-message-english-dcc-send-finished,
erc-message-english-dcc-send-offered,
erc-message-english-dcc-send-offer): Define at top level using
`defvar'.
* lisp/erc/erc-netsplit.el (erc-netsplit-mode, erc-netsplit-enable):
Don't call `erc-netsplit-install-message-catalogs'.
(erc-netsplit-install-message-catalogs): Deprecate function.
(erc-message-english-netsplit, erc-message-english-netjoin,
erc-message-english-netjoin-done, erc-message-english-netsplit-none,
erc-message-english-netsplit-wholeft): Define at top level using
`defvar'.
* lisp/erc/erc-notify.el (erc-notify-install-message-catalogs):
Deprecate, and rename all format templates with hyphens instead of
underscores.
(erc-notify-timer, erc-notify-JOIN, erc-notify-NICK, erc-notify-QUIT):
Use hyphenated template names.
(erc-cmd-NOTIFY): Use hyphenated template names. Load the module when
necessary and emit a warning. Otherwise, people who discover this
autoloaded command without being aware of the module's existence may
think it's "broken".
(pcomplete/erc-mode/NOTIFY): Replace top-level autoload with `require'
in function body. Include `erc-notify-list' in list of completions,
which makes removal easier if you don't share any channels with a
person, and they're not in `erc-server-users'. A better long-term
solution might be to WHOIS folks we're unsure about when they're
listed in a 303.
(erc-message-english-notify_current, erc-message-english-notify_list,
erc-message-english-notify_on, erc-message-english-notify_off): Define
at top level using `defvar'. Replace nonstandard underscores with
hyphens. Alias obsolete names.
* lisp/erc/erc-page.el (erc-message-english-CTCP-PAGE): Define at top
level using `defvar'.
* lisp/erc/erc-sasl.el (erc-message-english-s902,
erc-message-english-s904, erc-message-english-s905,
erc-message-english-s906, erc-message-english-s907,
erc-message-english-s908): Define at top level using `defvar'.
* lisp/erc/erc-sound.el (erc-message-english-CTCP-SOUND): Define using
`defvar'.
* lisp/erc/erc.el (erc--make-message-variable-name): New function to
replace `erc-make-message-variable-name' internally, where most uses
previously checked whether the returned variable was bound. This
helper now does that conditionally, when asked.
(erc-make-message-variable-name): Defer to internal variant,
`erc--make-message-variable-name'.
(erc-define-catalog-entry, erc-define-catalog): Deprecate.
(erc-retrieve-catalog-entry): Refactor to favor
`default-toplevel-value' of `erc-current-message-catalog' before
falling back to `english'. Not doing this was arguably a bug.
(erc-message-english-bad-ping-response,
erc-message-english-bad-syntax, erc-message-english-incorrect-args,
erc-message-english-cannot-find-file,
erc-message-english-cannot-read-file, erc-message-english-connect,
erc-message-english-country, erc-message-english-country-unknown,
erc-message-english-ctcp-empty, erc-message-english-ctcp-request,
erc-message-english-ctcp-request-to,
erc-message-english-ctcp-too-many, erc-message-english-flood-ctcp-off,
erc-message-english-flood-strict-mode,
erc-message-english-disconnected,
erc-message-english-disconnected-noreconnect,
erc-message-english-reconnecting,
erc-message-english-reconnect-canceled, erc-message-english-finished,
erc-message-english-terminated, erc-message-english-login,
erc-message-english-nick-in-use, erc-message-english-nick-too-long,
erc-message-english-no-default-channel,
erc-message-english-no-invitation, erc-message-english-no-target,
erc-message-english-ops, erc-message-english-ops-none,
erc-message-english-undefined-ctcp,
erc-message-english-user-mode-redundant-add,
erc-message-english-user-mode-redundant-drop,
erc-message-english-variable-not-bound, erc-message-english-ACTION,
erc-message-english-CTCP-CLIENTINFO, erc-message-english-CTCP-ECHO,
erc-message-english-CTCP-FINGER, erc-message-english-CTCP-PING,
erc-message-english-CTCP-TIME, erc-message-english-CTCP-UNKNOWN,
erc-message-english-CTCP-VERSION, erc-message-english-ERROR,
erc-message-english-INVITE, erc-message-english-JOIN,
erc-message-english-JOIN-you, erc-message-english-KICK,
erc-message-english-KICK-you, erc-message-english-KICK-by-you,
erc-message-english-MODE, erc-message-english-MODE-nick,
erc-message-english-NICK, erc-message-english-NICK-you,
erc-message-english-PART, erc-message-english-PING,
erc-message-english-PONG, erc-message-english-QUIT,
erc-message-english-TOPIC, erc-message-english-WALLOPS,
erc-message-english-s004, erc-message-english-s221,
erc-message-english-s252, erc-message-english-s253,
erc-message-english-s254, erc-message-english-s275,
erc-message-english-s301, erc-message-english-s303,
erc-message-english-s305, erc-message-english-s306,
erc-message-english-s307, erc-message-english-s311,
erc-message-english-s312, erc-message-english-s313,
erc-message-english-s314, erc-message-english-s317,
erc-message-english-s317-on-since, erc-message-english-s319,
erc-message-english-s320, erc-message-english-s321,
erc-message-english-s322, erc-message-english-s324,
erc-message-english-s328, erc-message-english-s329,
erc-message-english-s330, erc-message-english-s331,
erc-message-english-s332, erc-message-english-s333,
erc-message-english-s341, erc-message-english-s352,
erc-message-english-s353, erc-message-english-s367,
erc-message-english-s367-set-by, erc-message-english-s368,
erc-message-english-s379, erc-message-english-s391,
erc-message-english-s396, erc-message-english-s401,
erc-message-english-s402, erc-message-english-s403,
erc-message-english-s404, erc-message-english-s405,
erc-message-english-s406, erc-message-english-s412,
erc-message-english-s421, erc-message-english-s431,
erc-message-english-s432, erc-message-english-s442,
erc-message-english-s445, erc-message-english-s446,
erc-message-english-s451, erc-message-english-s461,
erc-message-english-s462, erc-message-english-s463,
erc-message-english-s464, erc-message-english-s465,
erc-message-english-s471, erc-message-english-s473,
erc-message-english-s474, erc-message-english-s475,
erc-message-english-s481, erc-message-english-s482,
erc-message-english-s483, erc-message-english-s484,
erc-message-english-s485, erc-message-english-s491,
erc-message-english-s501, erc-message-english-s502,
erc-message-english-s671): Define at top level using `defvar'.
* test/lisp/erc/erc-tests.el (erc-tests--string-to-propertized-parts,
erc-tests-pp-propertized-parts, erc--make-message-variable-name,
erc-retrieve-catalog-entry): New tests along with utility functions
and a convenience command for manipulating catalogs. (Bug#67677)
2023-11-28 16:51:36 -08:00
|
|
|
(defvar erc-message-english-CTCP-SOUND "%n (%u@%h) plays %s:%m"
|
|
|
|
"English template for a CTCP SOUND message.")
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
(defcustom erc-play-sound t
|
2012-04-09 21:05:48 +08:00
|
|
|
"Play sounds when you receive CTCP SOUND requests."
|
2006-01-29 13:08:58 +00:00
|
|
|
:type 'boolean)
|
|
|
|
|
|
|
|
(defcustom erc-sound-path nil
|
|
|
|
"List of directories that contain sound samples to play on SOUND events."
|
|
|
|
:type '(repeat directory))
|
|
|
|
|
|
|
|
(defcustom erc-default-sound nil
|
2006-11-20 06:50:29 +00:00
|
|
|
"Play this sound if the requested file was not found.
|
|
|
|
If this is set to nil or the file doesn't exist a beep will sound."
|
2006-01-29 13:08:58 +00:00
|
|
|
:type '(choice (const nil)
|
|
|
|
file))
|
|
|
|
|
2006-11-20 06:50:29 +00:00
|
|
|
(defvar erc-ctcp-query-SOUND-hook nil
|
|
|
|
"Hook to run after receiving a CTCP SOUND request.")
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
(defun erc-cmd-SOUND (line &optional force)
|
2006-11-20 06:50:29 +00:00
|
|
|
"Send a CTCP SOUND message to the default target.
|
|
|
|
If `erc-play-sound' is non-nil, play the sound as well.
|
|
|
|
|
|
|
|
/sound filename optional-message-text
|
|
|
|
|
|
|
|
LINE is the text entered, including the command."
|
2006-01-29 13:08:58 +00:00
|
|
|
(cond
|
|
|
|
((string-match "^\\s-*\\(\\S-+\\)\\(\\s-.*\\)?$" line)
|
|
|
|
(let ((file (match-string 1 line))
|
|
|
|
(msg (match-string 2 line))
|
|
|
|
(tgt (erc-default-target)))
|
|
|
|
(if (null msg)
|
|
|
|
(setq msg "")
|
|
|
|
;; remove the first white space
|
|
|
|
(setq msg (substring msg 1)))
|
|
|
|
(if tgt
|
|
|
|
(progn
|
|
|
|
(erc-send-ctcp-message tgt (format "SOUND %s %s" file msg) force)
|
|
|
|
(if erc-play-sound (erc-play-sound file)))
|
|
|
|
(erc-display-message nil 'error (current-buffer) 'no-target))
|
|
|
|
t))
|
|
|
|
(t nil)))
|
|
|
|
|
2021-02-11 21:30:23 +01:00
|
|
|
(defun erc-ctcp-query-SOUND (_proc nick login host _to msg)
|
2006-11-20 06:50:29 +00:00
|
|
|
"Display a CTCP SOUND message and play sound if `erc-play-sound' is non-nil."
|
2006-01-29 13:08:58 +00:00
|
|
|
(when (string-match "^SOUND\\s-+\\(\\S-+\\)\\(\\(\\s-+.*\\)\\|\\(\\s-*\\)\\)$" msg)
|
|
|
|
(let ((sound (match-string 1 msg))
|
|
|
|
(comment (match-string 2 msg)))
|
|
|
|
(when erc-play-sound (erc-play-sound sound))
|
|
|
|
(erc-display-message
|
|
|
|
nil 'notice nil
|
|
|
|
'CTCP-SOUND ?n nick ?u login ?h host ?s sound ?m comment)))
|
|
|
|
nil)
|
|
|
|
|
|
|
|
(defun erc-play-sound (file)
|
2006-11-20 06:50:29 +00:00
|
|
|
"Play a sound file located in one of the directories in `erc-sound-path'.
|
|
|
|
See also `play-sound-file'."
|
2006-01-29 13:08:58 +00:00
|
|
|
(let ((filepath (erc-find-file file erc-sound-path)))
|
|
|
|
(if (and (not filepath) erc-default-sound)
|
|
|
|
(setq filepath erc-default-sound))
|
|
|
|
(cond ((and filepath (file-exists-p filepath))
|
2007-09-08 03:07:09 +00:00
|
|
|
(play-sound-file filepath))
|
2006-01-29 13:08:58 +00:00
|
|
|
(t (beep)))
|
|
|
|
(erc-log (format "Playing sound file %S" filepath))))
|
|
|
|
|
|
|
|
(defun erc-toggle-sound (&optional arg)
|
2021-09-19 12:59:01 +02:00
|
|
|
"Toggle playing sounds on and off.
|
2021-09-14 08:43:18 +02:00
|
|
|
With positive argument, turns them on. With any other argument
|
|
|
|
turns sounds off."
|
2006-01-29 13:08:58 +00:00
|
|
|
(interactive "P")
|
|
|
|
(cond ((and (numberp arg) (> arg 0))
|
|
|
|
(setq erc-play-sound t))
|
|
|
|
(arg (setq erc-play-sound nil))
|
|
|
|
(t (setq erc-play-sound (not erc-play-sound))))
|
|
|
|
(message "ERC sound is %s" (if erc-play-sound "ON" "OFF")))
|
|
|
|
|
|
|
|
|
|
|
|
(provide 'erc-sound)
|
|
|
|
|
|
|
|
;;; erc-sound.el ends here
|
2007-09-08 03:07:09 +00:00
|
|
|
;;
|
|
|
|
;; Local Variables:
|
Put most erc autoloads in a dedicated file erc-loaddefs.el
These are features that are only useful after erc.el is loaded.
* lisp/erc/erc.el (top-level): Load erc-loaddefs.
* lisp/erc/erc-autoaway.el, lisp/erc/erc-button.el:
* lisp/erc/erc-capab.el, lisp/erc/erc-compat.el:
* lisp/erc/erc-dcc.el, lisp/erc/erc-desktop-notifications.el:
* lisp/erc/erc-ezbounce.el, lisp/erc/erc-fill.el:
* lisp/erc/erc-identd.el, lisp/erc/erc-imenu.el:
* lisp/erc/erc-join.el, lisp/erc/erc-list.el, lisp/erc/erc-log.el:
* lisp/erc/erc-match.el, lisp/erc/erc-menu.el:
* lisp/erc/erc-netsplit.el, lisp/erc/erc-notify.el:
* lisp/erc/erc-page.el, lisp/erc/erc-pcomplete.el:
* lisp/erc/erc-replace.el, lisp/erc/erc-ring.el:
* lisp/erc/erc-services.el, lisp/erc/erc-sound.el:
* lisp/erc/erc-speedbar.el, lisp/erc/erc-spelling.el:
* lisp/erc/erc-stamp.el, lisp/erc/erc-track.el:
* lisp/erc/erc-truncate.el, lisp/erc/erc-xdcc.el:
Set generated-autoload-file to "erc-loaddefs.el".
2017-11-28 21:16:02 -05:00
|
|
|
;; generated-autoload-file: "erc-loaddefs.el"
|
2007-09-08 03:07:09 +00:00
|
|
|
;; End:
|