;;; Code:
-(eval-when-compile (require 'riece-message))
+(require 'riece-message)
+(require 'riece-button)
(defgroup riece-log nil
"Save irc log"
(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
(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 riece-channel-regexp channel)
- (let ((name (substring channel
- (match-end 1) (match-beginning 2)))
- (suffix (match-string 2 channel)))
- (when (and (stringp suffix)
- (string-match "^:\\*\\.\\(.*\\)" suffix))
- (setq name (concat name "-" (match-string 1 suffix))))
- (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
(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,
(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