2013-08-22 04:06:45 +00:00
|
|
|
;;; erc-notify.el --- Online status change notification -*- lexical-binding:t -*-
|
2006-01-29 13:08:58 +00:00
|
|
|
|
2019-01-01 00:59:58 +00:00
|
|
|
;; Copyright (C) 2002-2004, 2006-2019 Free Software Foundation, Inc.
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;; Author: Mario Lang <mlang@lexx.delysid.org>
|
2019-05-25 20:43:06 +00:00
|
|
|
;; Maintainer: emacs-devel@gnu.org
|
2006-01-29 13:08:58 +00:00
|
|
|
;; Keywords: comm
|
|
|
|
|
|
|
|
;; 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 22:52:52 +00:00
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
|
|
;; This module defines a new command, /NOTIFY
|
|
|
|
;; See the docstring of `erc-cmd-NOTIFY' for details.
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
(require 'erc)
|
2006-02-08 02:41:23 +00:00
|
|
|
(require 'erc-networks)
|
Use cl-lib instead of cl, and interactive-p => called-interactively-p.
* lisp/erc/erc-track.el, lisp/erc/erc-networks.el, lisp/erc/erc-netsplit.el:
* lisp/erc/erc-dcc.el, lisp/erc/erc-backend.el: Use cl-lib, nth, pcase, and
called-interactively-p instead of cl.
* lisp/erc/erc-speedbar.el, lisp/erc/erc-services.el:
* lisp/erc/erc-pcomplete.el, lisp/erc/erc-notify.el, lisp/erc/erc-match.el:
* lisp/erc/erc-log.el, lisp/erc/erc-join.el, lisp/erc/erc-ezbounce.el:
* lisp/erc/erc-capab.el: Don't require cl since we don't use it.
* lisp/erc/erc.el: Use cl-lib, nth, pcase, and called-interactively-p i.s.o cl.
(erc-lurker-ignore-chars, erc-common-server-suffixes): Move before first use.
* lisp/json.el: Don't require cl since we don't use it.
* lisp/color.el: Don't require cl.
(color-complement): `caddr' -> `nth 2'.
* test/automated/ert-x-tests.el: Use cl-lib.
* test/automated/ert-tests.el: Use lexical-binding and cl-lib.
2012-11-19 17:24:12 +00:00
|
|
|
(eval-when-compile (require 'pcomplete))
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;;;; Customizable variables
|
|
|
|
|
|
|
|
(defgroup erc-notify nil
|
|
|
|
"Track online status of certain nicknames."
|
|
|
|
:group 'erc)
|
|
|
|
|
|
|
|
(defcustom erc-notify-list nil
|
2012-04-09 13:05:48 +00:00
|
|
|
"List of nicknames you want to be notified about online/offline
|
2006-01-29 13:08:58 +00:00
|
|
|
status change."
|
|
|
|
:group 'erc-notify
|
|
|
|
:type '(repeat string))
|
|
|
|
|
|
|
|
(defcustom erc-notify-interval 60
|
2012-04-09 13:05:48 +00:00
|
|
|
"Time interval (in seconds) for checking online status of notified
|
2006-01-29 13:08:58 +00:00
|
|
|
people."
|
|
|
|
:group 'erc-notify
|
|
|
|
:type 'integer)
|
|
|
|
|
|
|
|
(defcustom erc-notify-signon-hook nil
|
2012-04-09 13:05:48 +00:00
|
|
|
"Hook run after someone on `erc-notify-list' has signed on.
|
2006-01-29 13:08:58 +00:00
|
|
|
Two arguments are passed to the function, SERVER and NICK, both
|
|
|
|
strings."
|
|
|
|
:group 'erc-notify
|
|
|
|
:type 'hook
|
|
|
|
:options '(erc-notify-signon))
|
|
|
|
|
|
|
|
(defcustom erc-notify-signoff-hook nil
|
2012-04-09 13:05:48 +00:00
|
|
|
"Hook run after someone on `erc-notify-list' has signed off.
|
2006-01-29 13:08:58 +00:00
|
|
|
Two arguments are passed to the function, SERVER and NICK, both
|
|
|
|
strings."
|
|
|
|
:group 'erc-notify
|
|
|
|
:type 'hook
|
|
|
|
:options '(erc-notify-signoff))
|
|
|
|
|
|
|
|
(defun erc-notify-signon (server nick)
|
|
|
|
(message "%s signed on at %s" nick server))
|
|
|
|
|
|
|
|
(defun erc-notify-signoff (server nick)
|
|
|
|
(message "%s signed off from %s" nick server))
|
|
|
|
|
|
|
|
;;;; Internal variables
|
|
|
|
|
|
|
|
(defvar erc-last-ison nil
|
|
|
|
"Last ISON information received through `erc-notify-timer'.")
|
|
|
|
(make-variable-buffer-local 'erc-last-ison)
|
|
|
|
|
|
|
|
(defvar erc-last-ison-time 0
|
|
|
|
"Last time ISON was sent to the server in `erc-notify-timer'.")
|
|
|
|
(make-variable-buffer-local 'erc-last-ison-time)
|
|
|
|
|
|
|
|
;;;; Setup
|
|
|
|
|
|
|
|
(defun erc-notify-install-message-catalogs ()
|
|
|
|
(erc-define-catalog
|
|
|
|
'english
|
2011-11-14 06:27:12 +00:00
|
|
|
'((notify_current . "Notified people online: %l")
|
2006-01-29 13:08:58 +00:00
|
|
|
(notify_list . "Current notify list: %l")
|
|
|
|
(notify_on . "Detected %n on IRC network %m")
|
|
|
|
(notify_off . "%n has left IRC network %m"))))
|
|
|
|
|
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-29 02:16:02 +00:00
|
|
|
;;;###autoload(autoload 'erc-notify-mode "erc-notify" nil t)
|
2006-01-29 13:08:58 +00:00
|
|
|
(define-erc-module notify nil
|
|
|
|
"Periodically check for the online status of certain users and report
|
|
|
|
changes."
|
|
|
|
((add-hook 'erc-timer-hook 'erc-notify-timer)
|
|
|
|
(add-hook 'erc-server-JOIN-functions 'erc-notify-JOIN)
|
|
|
|
(add-hook 'erc-server-NICK-functions 'erc-notify-NICK)
|
|
|
|
(add-hook 'erc-server-QUIT-functions 'erc-notify-QUIT))
|
|
|
|
((remove-hook 'erc-timer-hook 'erc-notify-timer)
|
|
|
|
(remove-hook 'erc-server-JOIN-functions 'erc-notify-JOIN)
|
|
|
|
(remove-hook 'erc-server-NICK-functions 'erc-notify-NICK)
|
|
|
|
(remove-hook 'erc-server-QUIT-functions 'erc-notify-QUIT)))
|
|
|
|
|
|
|
|
;;;; Timer handler
|
|
|
|
|
|
|
|
(defun erc-notify-timer (now)
|
2007-11-29 22:36:38 +00:00
|
|
|
(when (and erc-server-connected
|
|
|
|
erc-notify-list
|
2006-01-29 13:08:58 +00:00
|
|
|
(> (erc-time-diff
|
|
|
|
erc-last-ison-time now)
|
|
|
|
erc-notify-interval))
|
|
|
|
(erc-once-with-server-event
|
|
|
|
303
|
2013-08-22 04:06:45 +00:00
|
|
|
(lambda (proc parsed)
|
|
|
|
(let* ((server (erc-response.sender parsed))
|
|
|
|
(ison-list (delete "" (split-string
|
|
|
|
(erc-response.contents parsed))))
|
|
|
|
(new-list ison-list)
|
|
|
|
(old-list (erc-with-server-buffer erc-last-ison)))
|
|
|
|
(while new-list
|
|
|
|
(when (not (erc-member-ignore-case (car new-list) old-list))
|
|
|
|
(run-hook-with-args 'erc-notify-signon-hook server (car new-list))
|
|
|
|
(erc-display-message
|
|
|
|
parsed 'notice proc
|
|
|
|
'notify_on ?n (car new-list) ?m (erc-network-name)))
|
|
|
|
(setq new-list (cdr new-list)))
|
|
|
|
(while old-list
|
|
|
|
(when (not (erc-member-ignore-case (car old-list) ison-list))
|
|
|
|
(run-hook-with-args 'erc-notify-signoff-hook server (car old-list))
|
|
|
|
(erc-display-message
|
|
|
|
parsed 'notice proc
|
|
|
|
'notify_off ?n (car old-list) ?m (erc-network-name)))
|
|
|
|
(setq old-list (cdr old-list)))
|
|
|
|
(setq erc-last-ison ison-list)
|
|
|
|
t)))
|
2006-01-29 13:08:58 +00:00
|
|
|
(erc-server-send
|
|
|
|
(concat "ISON " (mapconcat 'identity erc-notify-list " ")))
|
|
|
|
(setq erc-last-ison-time now)))
|
|
|
|
|
|
|
|
(defun erc-notify-JOIN (proc parsed)
|
|
|
|
"Check if channel joiner is on `erc-notify-list' and not on `erc-last-ison'.
|
|
|
|
If this condition is satisfied, produce a notify_on message and add the nick
|
|
|
|
to `erc-last-ison' to prevent any further notifications."
|
|
|
|
(let ((nick (erc-extract-nick (erc-response.sender parsed))))
|
|
|
|
(when (and (erc-member-ignore-case nick erc-notify-list)
|
|
|
|
(not (erc-member-ignore-case nick erc-last-ison)))
|
|
|
|
(add-to-list 'erc-last-ison nick)
|
|
|
|
(run-hook-with-args 'erc-notify-signon-hook
|
|
|
|
(or erc-server-announced-name erc-session-server)
|
|
|
|
nick)
|
|
|
|
(erc-display-message
|
|
|
|
parsed 'notice proc
|
|
|
|
'notify_on ?n nick ?m (erc-network-name)))
|
|
|
|
nil))
|
|
|
|
|
|
|
|
(defun erc-notify-NICK (proc parsed)
|
|
|
|
"Check if new nick is on `erc-notify-list' and not on `erc-last-ison'.
|
|
|
|
If this condition is satisfied, produce a notify_on message and add the nick
|
|
|
|
to `erc-last-ison' to prevent any further notifications."
|
|
|
|
(let ((nick (erc-response.contents parsed)))
|
|
|
|
(when (and (erc-member-ignore-case nick erc-notify-list)
|
|
|
|
(not (erc-member-ignore-case nick erc-last-ison)))
|
|
|
|
(add-to-list 'erc-last-ison nick)
|
|
|
|
(run-hook-with-args 'erc-notify-signon-hook
|
|
|
|
(or erc-server-announced-name erc-session-server)
|
|
|
|
nick)
|
|
|
|
(erc-display-message
|
|
|
|
parsed 'notice proc
|
|
|
|
'notify_on ?n nick ?m (erc-network-name)))
|
|
|
|
nil))
|
|
|
|
|
|
|
|
(defun erc-notify-QUIT (proc parsed)
|
|
|
|
"Check if quitter is on `erc-notify-list' and on `erc-last-ison'.
|
|
|
|
If this condition is satisfied, produce a notify_off message and remove the
|
|
|
|
nick from `erc-last-ison' to prevent any further notifications."
|
|
|
|
(let ((nick (erc-extract-nick (erc-response.sender parsed))))
|
|
|
|
(when (and (erc-member-ignore-case nick erc-notify-list)
|
|
|
|
(erc-member-ignore-case nick erc-last-ison))
|
2013-08-22 04:06:45 +00:00
|
|
|
(setq erc-last-ison (erc-delete-if
|
|
|
|
(let ((nick-down (erc-downcase nick)))
|
|
|
|
(lambda (el)
|
|
|
|
(string= nick-down (erc-downcase el))))
|
|
|
|
erc-last-ison))
|
2006-01-29 13:08:58 +00:00
|
|
|
(run-hook-with-args 'erc-notify-signoff-hook
|
|
|
|
(or erc-server-announced-name erc-session-server)
|
|
|
|
nick)
|
|
|
|
(erc-display-message
|
|
|
|
parsed 'notice proc
|
|
|
|
'notify_off ?n nick ?m (erc-network-name)))
|
|
|
|
nil))
|
|
|
|
|
|
|
|
;;;; User level command
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
(defun erc-cmd-NOTIFY (&rest args)
|
|
|
|
"Change `erc-notify-list' or list current notify-list members online.
|
2011-11-14 21:00:24 +00:00
|
|
|
Without args, list the current list of notified people online,
|
2006-01-29 13:08:58 +00:00
|
|
|
with args, toggle notify status of people."
|
|
|
|
(cond
|
|
|
|
((null args)
|
2011-11-14 21:00:24 +00:00
|
|
|
;; Print current notified people (online)
|
2007-04-01 13:36:38 +00:00
|
|
|
(let ((ison (erc-with-server-buffer erc-last-ison)))
|
2006-01-29 13:08:58 +00:00
|
|
|
(if (not ison)
|
|
|
|
(erc-display-message
|
|
|
|
nil 'notice 'active "No ison-list yet!")
|
|
|
|
(erc-display-message
|
|
|
|
nil 'notice 'active
|
|
|
|
'notify_current ?l ison))))
|
|
|
|
((string= (car args) "-l")
|
|
|
|
(erc-display-message nil 'notice 'active
|
|
|
|
'notify_list ?l (mapconcat 'identity erc-notify-list
|
|
|
|
" ")))
|
|
|
|
(t
|
|
|
|
(while args
|
|
|
|
(if (erc-member-ignore-case (car args) erc-notify-list)
|
|
|
|
(progn
|
|
|
|
(setq erc-notify-list (delete (car args) erc-notify-list))
|
|
|
|
;; Remove the nick from the value of erc-last-ison in
|
|
|
|
;; every server buffer. This prevents seeing a signoff
|
|
|
|
;; notification for a nick that you have just _removed_
|
|
|
|
;; from your notify list.
|
|
|
|
(dolist (buf (erc-buffer-list))
|
|
|
|
(with-current-buffer buf
|
|
|
|
(if (erc-server-buffer-p)
|
|
|
|
(setq erc-last-ison (delete (car args) erc-last-ison))))))
|
|
|
|
(setq erc-notify-list (cons (erc-string-no-properties (car args))
|
|
|
|
erc-notify-list)))
|
|
|
|
(setq args (cdr args)))
|
|
|
|
(erc-display-message
|
|
|
|
nil 'notice 'active
|
|
|
|
'notify_list ?l (mapconcat 'identity erc-notify-list " "))))
|
|
|
|
t)
|
|
|
|
|
2009-10-24 03:54:58 +00:00
|
|
|
(autoload 'pcomplete-erc-all-nicks "erc-pcomplete")
|
|
|
|
|
2013-05-21 07:25:14 +00:00
|
|
|
;; "--" is not a typo.
|
|
|
|
(declare-function pcomplete--here "pcomplete"
|
|
|
|
(&optional form stub paring form-only))
|
|
|
|
|
2006-01-29 13:08:58 +00:00
|
|
|
;;;###autoload
|
|
|
|
(defun pcomplete/erc-mode/NOTIFY ()
|
2013-05-21 07:25:14 +00:00
|
|
|
(require 'pcomplete)
|
2006-01-29 13:08:58 +00:00
|
|
|
(pcomplete-here (pcomplete-erc-all-nicks)))
|
|
|
|
|
|
|
|
(erc-notify-install-message-catalogs)
|
|
|
|
|
|
|
|
(provide 'erc-notify)
|
|
|
|
|
|
|
|
;;; erc-notify.el ends here
|
|
|
|
;;
|
|
|
|
;; 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-29 02:16:02 +00:00
|
|
|
;; generated-autoload-file: "erc-loaddefs.el"
|
2006-01-29 13:08:58 +00:00
|
|
|
;; indent-tabs-mode: t
|
|
|
|
;; tab-width: 8
|
|
|
|
;; End:
|