0
|
1 /* |
|
2 * logger.js -- plugin to log everything |
|
3 * |
|
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> |
|
5 * |
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
|
7 * purpose with or without fee is hereby granted, provided that the above |
|
8 * copyright notice and this permission notice appear in all copies. |
|
9 * |
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
17 */ |
|
18 |
|
19 /* Modules */ |
|
20 var Directory = Irccd.Directory; |
|
21 var File = Irccd.File; |
|
22 var Logger = Irccd.Logger; |
|
23 var Plugin = Irccd.Plugin; |
|
24 var Util = Irccd.Util; |
|
25 |
|
26 /* Plugin information */ |
|
27 info = { |
|
28 author: "David Demelier <markand@malikania.fr>", |
|
29 license: "ISC", |
|
30 summary: "A plugin to log everything", |
|
31 version: "@IRCCD_VERSION@" |
|
32 }; |
|
33 |
|
34 /** |
|
35 * All available formats. |
|
36 */ |
|
37 var formats = { |
|
38 "cmode": "%H:%M:%S :: #{nickname} changed the mode to: #{mode} #{arg}", |
|
39 "cnotice": "%H:%M:%S :: [notice] (#{channel}) #{nickname}: #{message}", |
|
40 "join": "%H:%M:%S >> #{nickname} joined #{channel}", |
|
41 "kick": "%H:%M:%S :: #{target} has been kicked by #{nickname} [reason: #{reason}]", |
|
42 "me": "%H:%M:%S * #{nickname} #{message}", |
|
43 "message": "%H:%M:%S #{nickname}: #{message}", |
|
44 "mode": "%H:%M:%S :: #{nickname} set mode #{mode} to #{arg}", |
|
45 "notice": "%H:%M:%S [notice] (#{nickname}) #{message}", |
|
46 "part": "%H:%M:%S << #{nickname} left #{channel} [#{reason}]", |
|
47 "query": "%H:%M:%S #{nickname}: #{message}", |
|
48 "topic": "%H:%M:%S :: #{nickname} changed the topic of #{channel} to: #{topic}" |
|
49 }; |
|
50 |
|
51 /** |
|
52 * Load all formats. |
|
53 */ |
|
54 function loadFormats() |
|
55 { |
|
56 for (var key in formats) { |
|
57 var optname = "format-" + key; |
|
58 |
|
59 if (typeof (Plugin.config[optname]) !== "string") |
|
60 continue; |
|
61 |
|
62 if (Plugin.config[optname].length === 0) |
|
63 Logger.warning("skipping empty '" + optname + "' format"); |
|
64 else |
|
65 formats[key] = Plugin.config[optname]; |
|
66 } |
|
67 } |
|
68 |
|
69 function keywords(server, channel, origin, extra) |
|
70 { |
|
71 var kw = { |
|
72 "server": server.toString(), |
|
73 "channel": channel, |
|
74 "origin": origin, |
|
75 "nickname": Util.splituser(origin) |
|
76 }; |
|
77 |
|
78 for (var key in extra) |
|
79 kw[key] = extra[key]; |
|
80 |
|
81 return kw; |
|
82 } |
|
83 |
|
84 function write(fmt, args) |
|
85 { |
|
86 var path = Util.format(Plugin.config["path"], args); |
|
87 var directory = File.dirname(path); |
|
88 |
|
89 /* Try to create the directory */ |
|
90 if (!File.exists(directory)) { |
|
91 Logger.debug("creating directory: " + directory); |
|
92 Directory.mkdir(directory); |
|
93 } |
|
94 |
|
95 Logger.debug("opening: " + path); |
|
96 |
|
97 var str = Util.format(formats[fmt], args); |
|
98 var file = new File(path, "wa"); |
|
99 |
|
100 file.write(str + "\n"); |
|
101 } |
|
102 |
|
103 function onLoad() |
|
104 { |
|
105 if (Plugin.config["path"] === undefined) |
|
106 throw new Error("Missing 'path' option"); |
|
107 } |
|
108 |
|
109 function onChannelMode(server, origin, channel, mode, arg) |
|
110 { |
|
111 write("cmode", keywords(server, channel, origin, { |
|
112 "arg": arg, |
|
113 "mode": mode, |
|
114 "source": channel |
|
115 })); |
|
116 } |
|
117 |
|
118 function onChannelNotice(server, origin, channel, notice) |
|
119 { |
|
120 write("cnotice", keywords(server, channel, origin, { |
|
121 "message": notice, |
|
122 "source": channel |
|
123 })); |
|
124 } |
|
125 |
|
126 function onInvite(server, origin, channel) |
|
127 { |
|
128 write("invite", keywords(server, channel, origin, { |
|
129 "source": channel |
|
130 })); |
|
131 } |
|
132 |
|
133 function onJoin(server, origin, channel) |
|
134 { |
|
135 write("join", keywords(server, channel, origin, { |
|
136 "source": channel |
|
137 })); |
|
138 } |
|
139 |
|
140 function onKick(server, origin, channel, target, reason) |
|
141 { |
|
142 write("kick", keywords(server, channel, origin, { |
|
143 "target": target, |
|
144 "source": channel, |
|
145 "reason": reason |
|
146 })); |
|
147 } |
|
148 |
|
149 function onMe(server, origin, channel, message) |
|
150 { |
|
151 write("me", keywords(server, channel, origin, { |
|
152 "message": message, |
|
153 "source": channel |
|
154 })); |
|
155 } |
|
156 |
|
157 function onMessage(server, origin, channel, message) |
|
158 { |
|
159 write("message", keywords(server, channel, origin, { |
|
160 "message": message, |
|
161 "source": channel |
|
162 })); |
|
163 } |
|
164 |
|
165 function onMode(server, origin, mode) |
|
166 { |
|
167 write("mode", keywords(server, undefined, origin, { |
|
168 "mode": mode, |
|
169 "source": Util.splituser(origin) |
|
170 })); |
|
171 } |
|
172 |
|
173 function onNick(server, origin, nickname) |
|
174 { |
|
175 // TODO: write for all servers/channels a log entry |
|
176 } |
|
177 |
|
178 function onNotice(server, origin, notice) |
|
179 { |
|
180 write("notice", keywords(server, undefined, origin, { |
|
181 "message": notice, |
|
182 "source": Util.splituser(origin) |
|
183 })); |
|
184 } |
|
185 |
|
186 function onPart(server, origin, channel, reason) |
|
187 { |
|
188 write("part", keywords(server, channel, origin, { |
|
189 "reason": reason, |
|
190 "source": channel |
|
191 })); |
|
192 } |
|
193 |
|
194 function onQuery(server, origin, message) |
|
195 { |
|
196 write("query", keywords(server, undefined, origin, { |
|
197 "source": Util.splituser(origin), |
|
198 "message": message |
|
199 })); |
|
200 } |
|
201 |
|
202 function onTopic(server, origin, channel, topic) |
|
203 { |
|
204 write("topic", keywords(server, channel, origin, { |
|
205 "source": channel, |
|
206 "topic": topic |
|
207 })); |
|
208 } |