X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Friece-ignore.el;h=99ad31066be02c47a53db7bfe48c271e3a19d4b2;hb=04d08dc43bda68d16802401c2e1a79fff609f217;hp=c8a6383f3f56c16ec230ab204a917fac7e3b979e;hpb=21290cb15e3b73ec3d7528885a5c2bad990d4b8d;p=riece diff --git a/lisp/riece-ignore.el b/lisp/riece-ignore.el index c8a6383..99ad310 100644 --- a/lisp/riece-ignore.el +++ b/lisp/riece-ignore.el @@ -33,33 +33,115 @@ (require 'riece-identity) (require 'riece-message) -(defvar riece-ignored-user nil) +(defgroup riece-ignore nil + "Ignore messages in IRC buffers." + :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) + +(defvar riece-ignore-enabled nil) + +(defconst riece-ignore-description + "Ignore 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 riece-ignore-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-enable () + (define-key riece-command-mode-map + "\C-ck" 'riece-ignore-user) + (setq riece-ignore-enabled t)) + +(defun riece-ignore-disable () (define-key riece-command-mode-map - "\C-ck" 'riece-ignore-by-user)) + "\C-ck" nil) + (setq riece-ignore-enabled nil)) (provide 'riece-ignore)