X-Git-Url: https://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-log.el;h=bf347826d69ff67199523d50df70dcc611a2fc67;hp=84ff244a3984b577bcbcfe42aa2d8af7b93a849a;hb=5ae6ff9f4cc56994aaefb46e4f62d476796ec0b4;hpb=c30e91d2aab53d96b08beb1fea43e10fc769d863 diff --git a/lisp/riece-log.el b/lisp/riece-log.el index 84ff244..bf34782 100644 --- a/lisp/riece-log.el +++ b/lisp/riece-log.el @@ -30,7 +30,8 @@ ;;; Code: -(eval-when-compile (require 'riece-message)) +(require 'riece-message) +(require 'riece-button) (defgroup riece-log nil "Save irc log" @@ -55,21 +56,30 @@ If integer, flash back only this line numbers. t means all lines." (boolean :tag "flash back or not")) :group 'riece-log) +(defcustom riece-log-coding-system nil + "*Coding system used for log files." + :type 'symbol + :group 'riece-log) + +(defcustom riece-log-open-directory-function 'find-file + "*Function for opening a directory." + :type 'function + :group 'riece-log) + +(defvar riece-log-enabled nil) + +(defconst riece-log-description + "Saving IRC logs") + (defun riece-log-display-message-function (message) - (let ((open-bracket - (funcall riece-message-make-open-bracket-function message)) - (close-bracket - (funcall riece-message-make-close-bracket-function message)) - (name - (funcall riece-message-make-name-function message)) - (file (riece-log-get-file (riece-message-target message)))) - (unless (file-directory-p (file-name-directory file)) - (make-directory (file-name-directory file) t)) - (with-temp-buffer - (insert (concat (format-time-string "%H:%M") " " - open-bracket name close-bracket - " " (riece-message-text message) "\n")) - (write-region (point-min) (point-max) file t 0)))) + (if riece-log-enabled + (let ((file (riece-log-get-file (riece-message-target message))) + (coding-system-for-write riece-log-coding-system)) + (unless (file-directory-p (file-name-directory file)) + (make-directory (file-name-directory file) t)) + (write-region (concat (format-time-string "%H:%M") " " + (riece-format-message message)) + nil file t 0)))) (defun riece-log-get-file (identity) (expand-file-name @@ -77,12 +87,13 @@ If integer, flash back only this line numbers. t means all lines." (riece-log-get-directory identity))) (defun riece-log-get-directory (identity) - (let* ((channel (riece-identity-prefix identity)) - (server (riece-identity-server identity)) - (map (assoc channel riece-log-directory-map)) - name) + (let ((channel (riece-identity-canonicalize-prefix + (riece-identity-prefix identity))) + (server (riece-identity-server identity)) + (map (assoc (riece-format-identity identity) riece-log-directory-map)) + name) (cond (map (setq name (cdr map))) - ((string-match riece-channel-regexp channel) + ((string-match riece-strict-channel-regexp channel) (let ((suffix (match-string 2 channel))) (setq name (substring channel (match-end 1) (match-beginning 2))) (when (and (stringp suffix) @@ -108,15 +119,31 @@ If integer, flash back only this line numbers. t means all lines." (let (buffer-read-only) (goto-char (point-max)) (insert string) + (goto-char (point-min)) + (while (re-search-forward + "^[0-9][0-9]:[0-9][0-9] [<>]\\([^<>]+\\)[<>] " nil t) + (put-text-property (match-beginning 1) (match-end 1) + 'riece-identity + (riece-make-identity + (riece-match-string-no-properties 1) + (riece-identity-server identity)))) + (if (memq 'riece-button riece-addons) + (riece-button-update-buffer)) (goto-char (point-max)) (set-window-point (get-buffer-window (current-buffer)) (point)))))))) (defun riece-log-open-directory (&optional channel) (interactive) - (if channel - (find-file (riece-log-get-directory channel)) - (find-file riece-log-directory))) + (let ((directory (riece-log-get-directory + (or channel riece-current-channel)))) + (if (file-directory-p directory) + (funcall riece-log-open-directory-function directory) + (error "No log directory")))) + +(defun riece-log-requires () + (if (memq 'riece-button riece-addons) + '(riece-button))) (defun riece-log-insinuate () ;; FIXME: Use `riece-after-insert-functions' for trapping change, @@ -126,6 +153,15 @@ If integer, flash back only this line numbers. t means all lines." (add-hook 'riece-channel-buffer-create-functions 'riece-log-flashback)) +(defvar riece-command-mode-map) +(defun riece-log-enable () + (define-key riece-command-mode-map "\C-cd" 'riece-log-open-directory) + (setq riece-log-enabled t)) + +(defun riece-log-disable () + (define-key riece-command-mode-map "\C-cd" nil) + (setq riece-log-enabled nil)) + (provide 'riece-log) ;;; riece-log.el ends here