X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Friece-ignore.el;h=4a7af89bc1dd461bcdc50622395e2bdae8dd563e;hb=3bbafb08e0671b6995b3a386cc43c80dbc3e3f57;hp=c8a6383f3f56c16ec230ab204a917fac7e3b979e;hpb=c5fb39002fbf00cf516d3f06eba8231799a64575;p=elisp%2Friece.git diff --git a/lisp/riece-ignore.el b/lisp/riece-ignore.el index c8a6383..4a7af89 100644 --- a/lisp/riece-ignore.el +++ b/lisp/riece-ignore.el @@ -1,4 +1,4 @@ -;;; riece-ignore.el --- ignore user +;;; riece-ignore.el --- ignore messages from some users ;; Copyright (C) 1998-2004 Daiki Ueno ;; Author: Daiki Ueno @@ -19,13 +19,12 @@ ;; 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., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: -;; To use, add the following line to your ~/.riece/init.el: -;; (add-to-list 'riece-addons 'riece-ignore) +;; NOTE: This is an add-on module for Riece. ;;; Code: @@ -33,33 +32,116 @@ (require 'riece-identity) (require 'riece-message) -(defvar riece-ignored-user nil) +(defgroup riece-ignore nil + "Ignore messages from some users." + :prefix "riece-" + :group 'riece) -(defun riece-ignore-by-user (user) +(defcustom riece-ignore-discard-message 'log + "If t, messages from ignored user are completely discarded. +If 'log, messages are removed from IRC buffers, but they are saved in +`riece-ignore-buffer'. +Otherwise, they are not removed from IRC buffers, but are hidden with +'invisible text-property." + :group 'riece-ignore + :type '(choice (const :tag "Discard completely" t) + (const :tag "Discard but save logs" log) + (const :tag "Make messages invisible" nil))) + +(defcustom riece-ignore-buffer-name "*Ignore*" + "The name of buffer where ignored messages are stored." + :group 'riece-ignore + :type 'string) + +(defcustom riece-startup-ignored-user-list nil + "List of user names whose messages are ignored." + :group 'riece-ignore + :type '(repeat string)) + +(defvar riece-ignore-buffer nil) + +(defconst riece-ignore-description + "Ignore messages from some users.") +(defvar riece-ignored-user-list nil) + +(defun riece-ignore-user-rename-signal-function (signal handback) + (let ((pointer (riece-identity-member (car (riece-signal-args signal)) + riece-ignored-user-list))) + (if pointer + (setcar pointer (nth 1 (riece-signal-args signal)))))) + +(defun riece-ignore-user (user toggle) (interactive (let ((completion-ignore-case t)) - (list (riece-completing-read-identity - "User: " - (riece-get-users-on-server (riece-current-server-name)))))) - (setq riece-ignored-user (cons user riece-ignored-user)) - (riece-connect-signal - 'user-renamed - (lambda (signal handback) - (let ((pointer (riece-identity-member (car (riece-signal-args signal)) - riece-ignored-user))) - (if pointer - (setcar pointer (nth 1 (riece-signal-args signal)))))))) + (list (if current-prefix-arg + (riece-completing-read-identity + "Unignore user: " + riece-ignored-user-list) + (riece-completing-read-identity + "Ignore user: " + (riece-get-users-on-server (riece-current-server-name)) + (lambda (user) + (not (riece-identity-member + (riece-parse-identity (car user)) + riece-ignored-user-list))))) + (not current-prefix-arg)))) + (if toggle + (progn + (setq riece-ignored-user-list (cons user riece-ignored-user-list)) + (riece-connect-signal + 'user-renamed + #'riece-ignore-user-rename-signal-function)) + (let ((pointer (riece-identity-member user riece-ignored-user-list))) + (setq riece-ignored-user-list (delq (car pointer) + riece-ignored-user-list)) + (riece-disconnect-signal + 'user-renamed + #'riece-ignore-user-rename-signal-function)))) +(eval-when-compile + (autoload 'riece-dialogue-mode "riece")) (defun riece-ignore-message-filter (message) - (unless (riece-identity-member (riece-message-speaker message) - riece-ignored-user) + (if (and (get 'riece-ignore 'riece-addon-enabled) + (riece-identity-member (riece-message-speaker message) + riece-ignored-user-list)) + (if riece-ignore-discard-message + (when (eq riece-ignore-discard-message 'log) + (unless riece-ignore-buffer + (with-current-buffer (setq riece-ignore-buffer + (riece-get-buffer-create + riece-ignore-buffer-name + 'riece-dialogue-mode)) + (riece-dialogue-mode))) + (save-excursion + (set-buffer riece-ignore-buffer) + (goto-char (point-max)) + (let ((inhibit-read-only t) + buffer-read-only) + (insert (concat (format-time-string "%H:%M") " " + (riece-format-message message t)))))) + (put-text-property 0 (length (riece-message-text message)) + 'invisible 'riece-ignore + (riece-message-text message)) + message) message)) (defvar riece-command-mode-map) (defun riece-ignore-insinuate () - (add-hook 'riece-message-filter-functions 'riece-ignore-message-filter) + (setq riece-ignored-user-list + (mapcar #'riece-parse-identity riece-startup-ignored-user-list)) + (add-hook 'riece-message-filter-functions 'riece-ignore-message-filter)) + +(defun riece-ignore-uninstall () + (setq riece-ignored-user-list nil) + (remove-hook 'riece-message-filter-functions 'riece-ignore-message-filter)) + +(defun riece-ignore-enable () + (define-key riece-command-mode-map + "\C-ck" 'riece-ignore-user)) + +(defun riece-ignore-disable () (define-key riece-command-mode-map - "\C-ck" 'riece-ignore-by-user)) + "\C-ck" nil)) (provide 'riece-ignore)