* riece-message.el (riece-display-message-1): Call
[riece] / lisp / riece-log.el
index 8d98e66..352fa03 100644 (file)
@@ -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,22 +87,22 @@ 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)))
-    (let ((map (assoc channel riece-log-directory-map)))
-      (if map
-         (expand-file-name (cdr map) riece-log-directory)
-       (if (string-match (concat riece-channel-regexp
-                                 "\\([^:]+\\)\\(:\\*\\.\\(.*\\)\\)?") channel)
-           (let ((name (match-string 1 channel))
-                 (suffix (match-string 3 channel)))
-             (let ((name (if suffix (concat name "-" suffix) name)))
-               (if server
-                   (expand-file-name
-                    name
-                    (expand-file-name server riece-log-directory))
-                 (expand-file-name name riece-log-directory))))
-         riece-log-directory)))))
+  (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-strict-channel-regexp channel)
+          (let ((suffix (match-string 2 channel)))
+            (setq name (substring channel (match-end 1) (match-beginning 2)))
+            (when (and (stringp suffix)
+                       (string-match "^:\\*\\.\\(.*\\)" suffix))
+              (setq name (concat name "-" (match-string 1 suffix))))))
+         (t (setq name "priv")))
+    (if server
+       (expand-file-name name (expand-file-name server riece-log-directory))
+      (expand-file-name name riece-log-directory))))
 
 (defun riece-log-flashback (identity)
   (when riece-log-flashback
@@ -109,15 +119,32 @@ 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))))
+           (when (and (memq 'riece-button riece-addons)
+                      riece-button-enabled)
+             (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,
@@ -127,6 +154,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