|
| 1 | +;; _ |
| 2 | +;; ___ _ __ ___ | | ___ __ _ __ _ ___ _ __ |
| 3 | +;; / _ \ '__/ __|____| |/ _ \ / _` |/ _` |/ _ \ '__| |
| 4 | +;; | __/ | | (_|_____| | (_) | (_| | (_| | __/ | |
| 5 | +;; \___|_| \___| |_|\___/ \__, |\__, |\___|_| |
| 6 | +;; |___/ |___/ |
| 7 | + |
| 8 | +(defvar *erc-logger-log-directory* nil) |
| 9 | +(defvar *erc-logger-log-other-directory* nil) |
| 10 | +(defvar *erc-logger-log-timer* nil) |
| 11 | +(defvar *erc-logger-log-date* nil) |
| 12 | +(defvar *erc-logger-log-todays-date* nil) |
| 13 | +(defvar *erc-logger-irc-buffer-size-map* |
| 14 | + (make-hash-table :test 'equal)) |
| 15 | + |
| 16 | +(defun write-file-immut (filename) |
| 17 | + (let ((cur-buffer (current-buffer))) |
| 18 | + (with-temp-buffer |
| 19 | + (insert-buffer cur-buffer) |
| 20 | + (write-file filename)))) |
| 21 | + |
| 22 | +(defun erc-logger-log-start () |
| 23 | + (interactive) |
| 24 | + (setq *erc-logger-log-directory* (file-name-as-directory *erc-logger-log-directory*) |
| 25 | + *erc-logger-log-other-directory* (file-name-as-directory *erc-logger-log-other-directory*)) |
| 26 | + ;; initialize hash table |
| 27 | + (dolist (erc-buffer (erc-buffer-list)) |
| 28 | + (with-current-buffer (current-buffer) |
| 29 | + (switch-to-buffer erc-buffer) |
| 30 | + (unless (gethash erc-buffer *erc-logger-irc-buffer-size-map*) |
| 31 | + (puthash erc-buffer (buffer-size) *erc-logger-irc-buffer-size-map*)))) |
| 32 | + (setq *erc-logger-log-todays-date* (datetime-format "%Y-%m-%d") |
| 33 | + *erc-logger-log-timer* (run-at-time "1 sec" 10 #'erc-log-buffers))) |
| 34 | + |
| 35 | +(defun erc-logger-log-stop () |
| 36 | + (interactive) |
| 37 | + (when *erc-logger-log-timer* |
| 38 | + (cancel-timer *erc-logger-log-timer*))) |
| 39 | + |
| 40 | +(defun erc-log-buffers () |
| 41 | + (if (and *erc-logger-log-directory* |
| 42 | + (file-directory-p *erc-logger-log-directory*)) |
| 43 | + (progn (with-current-buffer (current-buffer) |
| 44 | + (dolist (erc-buffer (erc-buffer-list)) |
| 45 | + (switch-to-buffer erc-buffer) |
| 46 | + (let* ((file-name (concat (buffer-name erc-buffer) |
| 47 | + ;;(datetime-format "_%Y-%m-%d_%H:%M:%S.txt") |
| 48 | + (datetime-format "_%Y-%m-%d.txt"))) |
| 49 | + (file-full-path (concat *erc-logger-log-directory* |
| 50 | + "/" file-name)) |
| 51 | + (buffer-size (buffer-size))) |
| 52 | + (if (string= *erc-logger-log-todays-date* (datetime-format "%Y-%m-%d")) |
| 53 | + (progn |
| 54 | + (when (not (= buffer-size (gethash erc-buffer *erc-logger-irc-buffer-size-map*))) |
| 55 | + (write-file-immut file-full-path) |
| 56 | + (puthash erc-buffer buffer-size *erc-logger-irc-buffer-size-map*))) |
| 57 | + |
| 58 | + ;; compress log files and mv them to another directory on next day |
| 59 | + ;; and clear the buffer, save to new files |
| 60 | + (progn (write-file-immut file-full-path) |
| 61 | + (if (directory-name-p *erc-logger-log-other-directory*) |
| 62 | + (let* ((dir-name (concat *erc-logger-log-other-directory* |
| 63 | + (datetime-format "%Y-%m-%d") "/"))) |
| 64 | + (cl-flet ((transfer-file () |
| 65 | + (rename-file file-full-path dir-name t) |
| 66 | + (unless |
| 67 | + (= 0 (shell-command |
| 68 | + (concat "gzip -9 -f " |
| 69 | + dir-name |
| 70 | + file-name))) |
| 71 | + (message "failed to compress file!")))) |
| 72 | + (if (file-exists-p dir-name) |
| 73 | + (transfer-file) |
| 74 | + (progn (make-directory dir-name) |
| 75 | + (when (file-exists-p dir-name) |
| 76 | + (transfer-file)))))) |
| 77 | + (error "Invalid directory name, please set variable `*erc-logger-log-other-directory*' properly."))) |
| 78 | + )))) |
| 79 | + (unless (string= *erc-logger-log-todays-date* (datetime-format "%Y-%m-%d")) |
| 80 | + (setq *erc-logger-log-todays-date* (datetime-format "%Y-%m-%d")))) |
| 81 | + (error "Invalid directory name, please set variable `*erc-logger-log-directory*' properly."))) |
0 commit comments