1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
;;; erc-sound.el --- CTCP SOUND support for ERC
;; Copyright (C) 2002, 2003 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.
;; 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
;; along with GNU Emacs; see the file COPYING. If not, write to the
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;;; Commentary:
;; This used to be in erc.el, I (Jorgen) just extracted it from there
;; and put it in this file. Bugs and features are those of the
;; original author.
;;; Code:
(require 'erc)
;;;###autoload (autoload 'erc-sound-mode "erc-sound")
(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:
((define-key erc-mode-map "\C-c\C-s" 'erc-toggle-sound))
;; Disable:
((define-key erc-mode-map "\C-c\C-s" 'undefined)))
(erc-define-catalog-entry 'english 'CTCP-SOUND "%n (%u@%h) plays %s:%m")
(defgroup erc-sound nil
"Make ERC play bells and whistles while chatting with people."
:group 'erc)
(defcustom erc-play-sound t
"*Play sound on SOUND ctcp requests (used in ICQ chat)."
:group 'erc-sound
:type 'boolean)
(defcustom erc-sound-path nil
"List of directories that contain sound samples to play on SOUND events."
:group 'erc-sound
:type '(repeat directory))
(defcustom erc-default-sound nil
"Play this sound if the requested file was not found."
:group 'erc-sound
:type '(choice (const nil)
file))
(defcustom erc-play-command "play"
"Command for playing sound samples."
:group 'erc-sound
:type 'string)
(defun erc-cmd-SOUND (line &optional force)
"Play the sound given in LINE."
(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)))
(defvar erc-ctcp-query-SOUND-hook '(erc-ctcp-query-SOUND))
(defun erc-ctcp-query-SOUND (proc nick login host to msg)
(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)
"Plays a sound file located in one of the directories in `erc-sound-path'
with a command `erc-play-command'."
(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))
(if (and (fboundp 'device-sound-enabled-p)
(device-sound-enabled-p))
; For XEmacs
(play-sound-file filepath)
; (start-process "erc-sound" nil erc-play-command filepath)
(start-process "erc-sound" nil "/bin/tcsh" "-c"
(concat erc-play-command " " filepath))))
(t (beep)))
(erc-log (format "Playing sound file %S" filepath))))
;(defun erc-play-sound (file)
; "Plays a sound file located in one of the directories in `erc-sound-path'
; with a command `erc-play-command'."
; (let ((filepath nil)
; (paths erc-sound-path))
; (while (and paths
; (progn (setq filepath (expand-file-name file (car paths)))
; (not (file-exists-p filepath))))
; (setq paths (cdr paths)))
; (if (and (not (and filepath (file-exists-p filepath)))
; erc-default-sound)
; (setq filepath erc-default-sound))
; (cond ((and filepath (file-exists-p filepath))
;; (start-process "erc-sound" nil erc-play-command filepath)
; (start-process "erc-sound" nil "/bin/tcsh" "-c"
; (concat erc-play-command " " filepath))
; )
; (t (beep)))
; (erc-log (format "Playing sound file %S" filepath))))
(defun erc-toggle-sound (&optional arg)
"Toggles playing sounds on and off. With positive argument,
turns them on. With any other argument turns sounds off."
(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)
;; arch-tag: 53657d1d-007f-4a20-91c1-588e71cf0cee
;;; erc-sound.el ends here
|