* riece-handle.el (riece-handle-privmsg-message): Check own
[riece] / lisp / riece-log.el
index 8acc9da..4398f8b 100644 (file)
@@ -30,7 +30,8 @@
 
 ;;; Code:
 
-(eval-when-compile (require 'riece-message))
+(eval-when-compile (require 'riece-message)
+                  (require 'riece-button))
 
 (defgroup riece-log nil
   "Save irc log"
@@ -55,6 +56,11 @@ 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)
+
 (defun riece-log-display-message-function (message)
   (let ((open-bracket
         (funcall riece-message-make-open-bracket-function message))
@@ -62,14 +68,14 @@ If integer, flash back only this line numbers. t means all lines."
         (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))))
+       (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))
-    (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))))
+    (write-region (concat (format-time-string "%H:%M") " "
+                         open-bracket name close-bracket
+                         " " (riece-message-text message) "\n")
+                 nil file t 0)))
 
 (defun riece-log-get-file (identity)
   (expand-file-name
@@ -80,7 +86,7 @@ If integer, flash back only this line numbers. t means all lines."
   (let ((channel (riece-identity-prefix identity))
        (server (riece-identity-server identity))
        (map (assoc (riece-format-identity identity) riece-log-directory-map))
-        name)
+       name)
     (cond (map (setq name (cdr map)))
          ((string-match riece-channel-regexp channel)
           (let ((suffix (match-string 2 channel)))
@@ -108,6 +114,16 @@ 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))))))))
@@ -118,6 +134,10 @@ If integer, flash back only this line numbers. t means all lines."
       (find-file (riece-log-get-directory channel))
     (find-file riece-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,
   ;; notice, wallops and so on. But must add argument.