|
6 | 6 | ;; |___/ |___/
|
7 | 7 |
|
8 | 8 | (require 'erc)
|
9 |
| -(require 'cl) |
| 9 | +(require 'cl-lib) |
10 | 10 |
|
11 | 11 | (defgroup erc-logger nil
|
12 | 12 | "erc-logger customizations."
|
13 | 13 | :group 'erc
|
14 | 14 | :package-version '(erc-logger . "0.3"))
|
15 | 15 |
|
16 |
| -(defcustom *erc-logger-log-directory* |
| 16 | +(defcustom erc-logger-log-directory |
17 | 17 | "~/erc/log"
|
18 | 18 | "This directory is used for storing messages of the current day,
|
19 | 19 | it is recommanded to be set on an SSD. "
|
20 | 20 | :type 'string
|
21 | 21 | :group 'erc-logger)
|
22 | 22 |
|
23 |
| -(defcustom *erc-logger-log-other-directory* |
| 23 | +(defcustom erc-logger-log-other-directory |
24 | 24 | "~/erc/otherlog"
|
25 | 25 | "This directory is used for storing all compressed messages organized by date,
|
26 | 26 | it is recommanded to be set on an HDD. "
|
27 | 27 | :type 'string
|
28 | 28 | :group 'erc-logger)
|
29 | 29 |
|
30 |
| -(defcustom *erc-logger-log-begin-time* |
| 30 | +(defcustom erc-logger-log-begin-time |
31 | 31 | "30 sec"
|
32 | 32 | "Time when to run `erc-logger-log-start' at.
|
33 | 33 | To specify a relative time as a string, use numbers followed by units. For
|
|
49 | 49 | :type 'string
|
50 | 50 | :group 'erc-logger)
|
51 | 51 |
|
52 |
| -(defcustom *erc-logger-log-interval* |
| 52 | +(defcustom erc-logger-log-interval |
53 | 53 | 10
|
54 | 54 | "The interval (second) to run `erc-log-buffers' repeatedly."
|
55 | 55 | :type 'float
|
56 | 56 | :group 'erc-logger)
|
57 | 57 |
|
58 |
| -(defvar *erc-logger-log-timer* nil) |
59 |
| -(defvar *erc-logger-log-date* nil) |
60 |
| -(defvar *erc-logger-log-todays-date* nil) |
61 |
| -(defvar *erc-logger-irc-buffer-size-map* nil) |
| 58 | +(defvar erc-logger-log-timer nil) |
| 59 | +(defvar erc-logger-log-date nil) |
| 60 | +(defvar erc-logger-log-todays-date nil) |
| 61 | +(defvar erc-logger-irc-buffer-size-map nil) |
62 | 62 |
|
63 | 63 | (defun erc-logger-write-file-immut (filename)
|
64 | 64 | (let ((cur-buffer (current-buffer)))
|
|
74 | 74 | (defun erc-logger-end-of-messages ()
|
75 | 75 | (save-excursion
|
76 | 76 | (goto-char (point-max))
|
77 |
| - (previous-line) |
78 |
| - (end-of-line) |
79 |
| - (end-of-line) |
80 |
| - (end-of-line) |
| 77 | + (search-backward-regexp "\nERC>[^z-a]*?") |
81 | 78 | (point)))
|
82 | 79 |
|
83 | 80 | (defun erc-logger-log-start ()
|
84 | 81 | (interactive)
|
85 |
| - (if (and *erc-logger-log-directory* *erc-logger-log-other-directory*) |
86 |
| - (setq *erc-logger-log-directory* (file-name-as-directory *erc-logger-log-directory*) |
87 |
| - *erc-logger-log-other-directory* (file-name-as-directory *erc-logger-log-other-directory*)) |
88 |
| - (error "Invalid directory name, please set variable `*erc-logger-log-directory*' and `*erc-logger-log-other-directory*' properly.")) |
89 |
| - (unless (and (file-exists-p *erc-logger-log-directory*) |
90 |
| - (file-exists-p *erc-logger-log-other-directory*)) |
91 |
| - (mkdir *erc-logger-log-directory* "-p") |
92 |
| - (mkdir *erc-logger-log-other-directory* "-p")) |
| 82 | + (if (and erc-logger-log-directory erc-logger-log-other-directory) |
| 83 | + (setq erc-logger-log-directory (file-name-as-directory erc-logger-log-directory) |
| 84 | + erc-logger-log-other-directory (file-name-as-directory erc-logger-log-other-directory)) |
| 85 | + (error "Invalid directory name, please set variable `erc-logger-log-directory' and `erc-logger-log-other-directory' properly.")) |
| 86 | + (unless (and (file-exists-p erc-logger-log-directory) |
| 87 | + (file-exists-p erc-logger-log-other-directory)) |
| 88 | + (mkdir erc-logger-log-directory t) |
| 89 | + (mkdir erc-logger-log-other-directory t)) |
93 | 90 | ;; initialize hash table
|
94 |
| - (setq *erc-logger-irc-buffer-size-map* (make-hash-table :test 'equal)) |
| 91 | + (setq erc-logger-irc-buffer-size-map (make-hash-table :test 'equal)) |
95 | 92 | (dolist (erc-buffer (erc-buffer-list))
|
96 | 93 | (save-excursion
|
97 |
| - (switch-to-buffer erc-buffer) |
98 |
| - (unless (gethash erc-buffer *erc-logger-irc-buffer-size-map*) |
99 |
| - (puthash erc-buffer (erc-logger-end-of-messages) |
100 |
| - *erc-logger-irc-buffer-size-map*)))) |
101 |
| - (setq *erc-logger-log-todays-date* (format-time-string "%Y-%m-%d") |
102 |
| - *erc-logger-log-timer* (run-at-time "1 sec" *erc-logger-log-interval* #'erc-log-buffers))) |
| 94 | + (with-current-buffer erc-buffer |
| 95 | + (unless (gethash erc-buffer erc-logger-irc-buffer-size-map) |
| 96 | + (puthash erc-buffer (erc-logger-end-of-messages) |
| 97 | + erc-logger-irc-buffer-size-map))))) |
| 98 | + (setq erc-logger-log-todays-date (format-time-string "%Y-%m-%d") |
| 99 | + erc-logger-log-timer (run-at-time erc-logger-log-begin-time erc-logger-log-interval #'erc-log-buffers))) |
103 | 100 |
|
104 | 101 | (defun erc-logger-log-stop ()
|
105 | 102 | (interactive)
|
106 |
| - (when *erc-logger-log-timer* |
107 |
| - (cancel-timer *erc-logger-log-timer*))) |
| 103 | + (when erc-logger-log-timer |
| 104 | + (cancel-timer erc-logger-log-timer))) |
108 | 105 |
|
109 | 106 | (defun erc-log-buffers ()
|
110 |
| - (if (and *erc-logger-log-directory* |
111 |
| - (file-directory-p *erc-logger-log-directory*)) |
| 107 | + (if (and erc-logger-log-directory |
| 108 | + (file-directory-p erc-logger-log-directory)) |
112 | 109 | (progn (save-excursion
|
113 | 110 | (dolist (erc-buffer (erc-buffer-list))
|
114 |
| - (switch-to-buffer erc-buffer) |
115 |
| - (let* ((file-name (concat (buffer-name erc-buffer) |
116 |
| - (format-time-string "_%Y-%m-%d.txt"))) |
117 |
| - (file-full-path (concat *erc-logger-log-directory* |
118 |
| - "/" file-name)) |
119 |
| - (current-message-point (gethash erc-buffer *erc-logger-irc-buffer-size-map*)) |
120 |
| - (end-of-message-point (erc-logger-end-of-messages))) |
121 |
| - (cl-flet ((save-buffer-graceful |
122 |
| - nil (unless current-message-point |
123 |
| - (let ((new-current-message-point (erc-logger-end-of-messages))) |
124 |
| - (puthash erc-buffer new-current-message-point |
125 |
| - *erc-logger-irc-buffer-size-map*) |
126 |
| - (setq current-message-point new-current-message-point))) |
127 |
| - (if (file-exists-p file-full-path) |
128 |
| - (when (not (= end-of-message-point current-message-point)) |
129 |
| - (append-to-file current-message-point end-of-message-point file-full-path)) |
130 |
| - (erc-logger-write-file-immut file-full-path)) |
131 |
| - (when (not (= end-of-message-point current-message-point)) |
132 |
| - (puthash erc-buffer end-of-message-point *erc-logger-irc-buffer-size-map*))) |
133 |
| - (buffer-read-write nil |
134 |
| - (setq-local inhibit-read-only t)) |
135 |
| - (buffer-read-only nil |
136 |
| - (setq-local inhibit-read-only nil)) |
137 |
| - (clear-previous-days-messages |
138 |
| - nil |
139 |
| - (delete-region (point-min) current-message-point) |
140 |
| - (setq end-of-message-point (erc-logger-end-of-messages) |
141 |
| - current-message-point end-of-message-point) |
142 |
| - (puthash erc-buffer end-of-message-point *erc-logger-irc-buffer-size-map*))) |
143 |
| - (if (string= *erc-logger-log-todays-date* (format-time-string "%Y-%m-%d")) |
144 |
| - (save-buffer-graceful) |
| 111 | + (with-current-buffer erc-buffer |
| 112 | + (let* ((file-name (concat (buffer-name erc-buffer) |
| 113 | + (format-time-string "_%Y-%m-%d.txt"))) |
| 114 | + (file-full-path (concat erc-logger-log-directory |
| 115 | + "/" file-name)) |
| 116 | + (current-message-point (gethash erc-buffer erc-logger-irc-buffer-size-map)) |
| 117 | + (end-of-message-point (erc-logger-end-of-messages))) |
| 118 | + (cl-flet ((save-buffer-graceful |
| 119 | + nil (unless current-message-point |
| 120 | + (let ((new-current-message-point (erc-logger-end-of-messages))) |
| 121 | + (puthash erc-buffer new-current-message-point |
| 122 | + erc-logger-irc-buffer-size-map) |
| 123 | + (setq current-message-point new-current-message-point))) |
| 124 | + (if (file-exists-p file-full-path) |
| 125 | + (when (not (= end-of-message-point current-message-point)) |
| 126 | + (append-to-file current-message-point end-of-message-point file-full-path)) |
| 127 | + (erc-logger-write-file-immut file-full-path)) |
| 128 | + (when (not (= end-of-message-point current-message-point)) |
| 129 | + (puthash erc-buffer end-of-message-point erc-logger-irc-buffer-size-map))) |
| 130 | + (buffer-read-write nil |
| 131 | + (setq-local inhibit-read-only t)) |
| 132 | + (buffer-read-only nil |
| 133 | + (setq-local inhibit-read-only nil)) |
| 134 | + (clear-previous-days-messages |
| 135 | + nil |
| 136 | + (delete-region (point-min) current-message-point) |
| 137 | + (setq end-of-message-point (erc-logger-end-of-messages) |
| 138 | + current-message-point end-of-message-point) |
| 139 | + (puthash erc-buffer end-of-message-point erc-logger-irc-buffer-size-map))) |
| 140 | + (if (string= erc-logger-log-todays-date (format-time-string "%Y-%m-%d")) |
| 141 | + (save-buffer-graceful) |
145 | 142 |
|
146 |
| - ;; compress log files and mv them to another directory on next day |
147 |
| - ;; and clear the buffer, save to new files |
148 |
| - (progn |
149 |
| - (buffer-read-write) |
150 |
| - (clear-previous-days-messages) |
151 |
| - (buffer-read-only) |
152 |
| - (save-buffer-graceful) |
153 |
| - (if (directory-name-p *erc-logger-log-other-directory*) |
154 |
| - (let* ((dir-name (file-name-as-directory (concat *erc-logger-log-other-directory* |
155 |
| - *erc-logger-log-todays-date*)))) |
156 |
| - (cl-flet ((transfer-file () |
157 |
| - (rename-file file-full-path dir-name t) |
158 |
| - (unless |
159 |
| - (= 0 (shell-command |
160 |
| - (concat "gzip -9f " |
161 |
| - dir-name |
162 |
| - file-name))) |
163 |
| - (message "failed to compress file!")))) |
164 |
| - (if (file-exists-p dir-name) |
165 |
| - (transfer-file) |
166 |
| - (progn (make-directory dir-name) |
167 |
| - (when (file-exists-p dir-name) |
168 |
| - (transfer-file)))))) |
169 |
| - (error "Invalid directory name, please set variable `*erc-logger-log-other-directory*' properly."))) |
170 |
| - ))))) |
171 |
| - (unless (string= *erc-logger-log-todays-date* (format-time-string "%Y-%m-%d")) |
172 |
| - (setq *erc-logger-log-todays-date* (format-time-string "%Y-%m-%d")))) |
173 |
| - (error "Invalid directory name, please set variable `*erc-logger-log-directory*' properly."))) |
| 143 | + ;; compress log files and mv them to another directory on next day |
| 144 | + ;; and clear the buffer, save to new files |
| 145 | + (progn |
| 146 | + (buffer-read-write) |
| 147 | + (clear-previous-days-messages) |
| 148 | + (buffer-read-only) |
| 149 | + (save-buffer-graceful) |
| 150 | + (if (directory-name-p erc-logger-log-other-directory) |
| 151 | + (let* ((dir-name (file-name-as-directory (concat erc-logger-log-other-directory |
| 152 | + erc-logger-log-todays-date)))) |
| 153 | + (cl-flet ((transfer-file () |
| 154 | + (rename-file file-full-path dir-name t) |
| 155 | + (unless |
| 156 | + (= 0 (shell-command |
| 157 | + (concat "gzip -9f " |
| 158 | + dir-name |
| 159 | + file-name))) |
| 160 | + (message "failed to compress file!")))) |
| 161 | + (if (file-exists-p dir-name) |
| 162 | + (transfer-file) |
| 163 | + (progn (make-directory dir-name) |
| 164 | + (when (file-exists-p dir-name) |
| 165 | + (transfer-file)))))) |
| 166 | + (error "Invalid directory name, please set variable `erc-logger-log-other-directory' properly."))) |
| 167 | + )))))) |
| 168 | + (unless (string= erc-logger-log-todays-date (format-time-string "%Y-%m-%d")) |
| 169 | + (setq erc-logger-log-todays-date (format-time-string "%Y-%m-%d")))) |
| 170 | + (error "Invalid directory name, please set variable `erc-logger-log-directory' properly."))) |
174 | 171 |
|
175 | 172 | (provide 'erc-logger)
|
0 commit comments