1 ;;; erc-notify.el --- Online status change notification
3 ;; Copyright (C) 2002, 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
5 ;; Author: Mario Lang <mlang@lexx.delysid.org>
8 ;; This file is part of GNU Emacs.
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 3, or (at your option)
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 ;; Boston, MA 02110-1301, USA.
27 ;; This module defines a new command, /NOTIFY
28 ;; See the docstring of `erc-cmd-NOTIFY' for details.
33 (require 'erc-networks
)
38 ;;;; Customizable variables
40 (defgroup erc-notify nil
41 "Track online status of certain nicknames."
44 (defcustom erc-notify-list nil
45 "*List of nicknames you want to be notified about online/offline
48 :type
'(repeat string
))
50 (defcustom erc-notify-interval
60
51 "*Time interval (in seconds) for checking online status of notificated
56 (defcustom erc-notify-signon-hook nil
57 "*Hook run after someone on `erc-notify-list' has signed on.
58 Two arguments are passed to the function, SERVER and NICK, both
62 :options
'(erc-notify-signon))
64 (defcustom erc-notify-signoff-hook nil
65 "*Hook run after someone on `erc-notify-list' has signed off.
66 Two arguments are passed to the function, SERVER and NICK, both
70 :options
'(erc-notify-signoff))
72 (defun erc-notify-signon (server nick
)
73 (message "%s signed on at %s" nick server
))
75 (defun erc-notify-signoff (server nick
)
76 (message "%s signed off from %s" nick server
))
78 ;;;; Internal variables
80 (defvar erc-last-ison nil
81 "Last ISON information received through `erc-notify-timer'.")
82 (make-variable-buffer-local 'erc-last-ison
)
84 (defvar erc-last-ison-time
0
85 "Last time ISON was sent to the server in `erc-notify-timer'.")
86 (make-variable-buffer-local 'erc-last-ison-time
)
90 (defun erc-notify-install-message-catalogs ()
93 '((notify_current .
"Notificated people online: %l")
94 (notify_list .
"Current notify list: %l")
95 (notify_on .
"Detected %n on IRC network %m")
96 (notify_off .
"%n has left IRC network %m"))))
98 ;;;###autoload (autoload 'erc-notify-mode "erc-notify" nil t)
99 (define-erc-module notify nil
100 "Periodically check for the online status of certain users and report
102 ((add-hook 'erc-timer-hook
'erc-notify-timer
)
103 (add-hook 'erc-server-JOIN-functions
'erc-notify-JOIN
)
104 (add-hook 'erc-server-NICK-functions
'erc-notify-NICK
)
105 (add-hook 'erc-server-QUIT-functions
'erc-notify-QUIT
))
106 ((remove-hook 'erc-timer-hook
'erc-notify-timer
)
107 (remove-hook 'erc-server-JOIN-functions
'erc-notify-JOIN
)
108 (remove-hook 'erc-server-NICK-functions
'erc-notify-NICK
)
109 (remove-hook 'erc-server-QUIT-functions
'erc-notify-QUIT
)))
113 (defun erc-notify-timer (now)
114 (when (and erc-server-connected
117 erc-last-ison-time now
)
118 erc-notify-interval
))
119 (erc-once-with-server-event
121 '(let* ((server (erc-response.sender parsed
))
122 (ison-list (delete "" (split-string
123 (erc-response.contents parsed
))))
125 (old-list (erc-with-server-buffer erc-last-ison
)))
127 (when (not (erc-member-ignore-case (car new-list
) old-list
))
128 (run-hook-with-args 'erc-notify-signon-hook server
(car new-list
))
131 'notify_on ?n
(car new-list
) ?m
(erc-network-name)))
132 (setq new-list
(cdr new-list
)))
134 (when (not (erc-member-ignore-case (car old-list
) ison-list
))
135 (run-hook-with-args 'erc-notify-signoff-hook server
(car old-list
))
138 'notify_off ?n
(car old-list
) ?m
(erc-network-name)))
139 (setq old-list
(cdr old-list
)))
140 (setq erc-last-ison ison-list
)
143 (concat "ISON " (mapconcat 'identity erc-notify-list
" ")))
144 (setq erc-last-ison-time now
)))
146 (defun erc-notify-JOIN (proc parsed
)
147 "Check if channel joiner is on `erc-notify-list' and not on `erc-last-ison'.
148 If this condition is satisfied, produce a notify_on message and add the nick
149 to `erc-last-ison' to prevent any further notifications."
150 (let ((nick (erc-extract-nick (erc-response.sender parsed
))))
151 (when (and (erc-member-ignore-case nick erc-notify-list
)
152 (not (erc-member-ignore-case nick erc-last-ison
)))
153 (add-to-list 'erc-last-ison nick
)
154 (run-hook-with-args 'erc-notify-signon-hook
155 (or erc-server-announced-name erc-session-server
)
159 'notify_on ?n nick ?m
(erc-network-name)))
162 (defun erc-notify-NICK (proc parsed
)
163 "Check if new nick is on `erc-notify-list' and not on `erc-last-ison'.
164 If this condition is satisfied, produce a notify_on message and add the nick
165 to `erc-last-ison' to prevent any further notifications."
166 (let ((nick (erc-response.contents parsed
)))
167 (when (and (erc-member-ignore-case nick erc-notify-list
)
168 (not (erc-member-ignore-case nick erc-last-ison
)))
169 (add-to-list 'erc-last-ison nick
)
170 (run-hook-with-args 'erc-notify-signon-hook
171 (or erc-server-announced-name erc-session-server
)
175 'notify_on ?n nick ?m
(erc-network-name)))
178 (defun erc-notify-QUIT (proc parsed
)
179 "Check if quitter is on `erc-notify-list' and on `erc-last-ison'.
180 If this condition is satisfied, produce a notify_off message and remove the
181 nick from `erc-last-ison' to prevent any further notifications."
182 (let ((nick (erc-extract-nick (erc-response.sender parsed
))))
183 (when (and (erc-member-ignore-case nick erc-notify-list
)
184 (erc-member-ignore-case nick erc-last-ison
))
185 (setq erc-last-ison
(erc-delete-if `(lambda (el)
186 (string= ,(erc-downcase nick
)
189 (run-hook-with-args 'erc-notify-signoff-hook
190 (or erc-server-announced-name erc-session-server
)
194 'notify_off ?n nick ?m
(erc-network-name)))
197 ;;;; User level command
200 (defun erc-cmd-NOTIFY (&rest args
)
201 "Change `erc-notify-list' or list current notify-list members online.
202 Without args, list the current list of notificated people online,
203 with args, toggle notify status of people."
206 ;; Print current notificated people (online)
207 (let ((ison (erc-with-server-buffer erc-last-ison
)))
210 nil
'notice
'active
"No ison-list yet!")
213 'notify_current ?l ison
))))
214 ((string= (car args
) "-l")
215 (erc-display-message nil
'notice
'active
216 'notify_list ?l
(mapconcat 'identity erc-notify-list
220 (if (erc-member-ignore-case (car args
) erc-notify-list
)
222 (setq erc-notify-list
(delete (car args
) erc-notify-list
))
223 ;; Remove the nick from the value of erc-last-ison in
224 ;; every server buffer. This prevents seeing a signoff
225 ;; notification for a nick that you have just _removed_
226 ;; from your notify list.
227 (dolist (buf (erc-buffer-list))
228 (with-current-buffer buf
229 (if (erc-server-buffer-p)
230 (setq erc-last-ison
(delete (car args
) erc-last-ison
))))))
231 (setq erc-notify-list
(cons (erc-string-no-properties (car args
))
233 (setq args
(cdr args
)))
236 'notify_list ?l
(mapconcat 'identity erc-notify-list
" "))))
240 (defun pcomplete/erc-mode
/NOTIFY
()
241 (pcomplete-here (pcomplete-erc-all-nicks)))
243 (erc-notify-install-message-catalogs)
245 (provide 'erc-notify
)
247 ;;; erc-notify.el ends here
250 ;; indent-tabs-mode: t
254 ;; arch-tag: 0fb19dd0-1359-458a-89b7-81dc195a588e