Mercurial > irccd
diff plugins/history/history.js @ 0:1158cffe5a5e
Initial import
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 08 Feb 2016 16:43:14 +0100 |
parents | |
children | 50b7b5d287e8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/history/history.js Mon Feb 08 16:43:14 2016 +0100 @@ -0,0 +1,215 @@ +/* + * history.js -- track nickname's history + * + * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* Modules */ +var Directory = Irccd.Directory; +var File = Irccd.File; +var Logger = Irccd.Logger; +var Plugin = Irccd.Plugin; +var Server = Irccd.Server; +var Util = Irccd.Util; + +/* Plugin information */ +info = { + author: "David Demelier <markand@malikania.fr>", + license: "ISC", + summary: "track nickname's history", + version: "@IRCCD_VERSION@" +}; + +var formats = { + "error": "#{nickname}, I'm sorry, something went wrong.", + "seen": "#{nickname}, I've seen #{target} for the last time the %d-%m-%Y %H:%M", + "said": "#{nickname}, #{target} said on %d-%m-%Y %H:%M: #{message}", + "unknown": "#{nickname}, I've never seen #{target}.", + "usage": "#{nickname}, usage: #{plugin} seen | said <target>." +}; + +function isSelf(server, origin) +{ + return server.info().nickname === Util.splituser(origin); +} + +function command(server) +{ + return server.info().commandChar + "history"; +} + +function path(server, channel) +{ + var p; + + if (Plugin.config["path"] !== undefined) { + p = Util.format(Plugin.config["path"], { + "server": server.toString(), + "channel": channel + }); + } else { + p = Plugin.cachePath + "db.json"; + } + + return p; +} + +function read(server, channel, nickname) +{ + var p = path(server, channel); + var db = {}; + + if (File.exists(p)) { + var file = new File(path(server, channel), "r"); + var str = file.read(); + + db = JSON.parse(str); + } + + /* Complete if needed */ + if (!db[server]) + db[server] = {}; + if (!db[server][channel]) + db[server][channel] = {}; + if (!db[server][channel][nickname]) + db[server][channel][nickname] = {}; + + return db; +} + +function write(server, channel, nickname, message) +{ + var db = read(server, channel, nickname); + var entry = db[server][channel][nickname]; + var p = path(server, channel); + + if (!File.exists(File.dirname(p))) { + Logger.debug("creating directory " + File.dirname(p)); + Directory.mkdir(File.dirname(p)); + } + + var file = new File(path(server, channel), "wt"); + + entry.timestamp = Date.now(); + entry.message = (message) ? message : entry.message; + + file.write(JSON.stringify(db)); +} + +function find(server, channel, target) +{ + var db = read(server, channel, target); + var it = db[server][channel][target]; + + if (it.timestamp) + return it; +} + +function loadFormats() +{ + for (var key in formats) { + var optname = "format-" + key; + + if (typeof (Plugin.config[optname]) !== "string") + continue; + + if (Plugin.config[optname].length === 0) + Logger.warning("skipping empty '" + optname + "' format"); + else + formats[key] = Plugin.config[optname]; + } +} + +function onCommand(server, origin, channel, message) +{ + var args = message.trim().split(" "); + var kw = { + "server": server.toString(), + "channel": channel, + "origin": origin, + "nickname": Util.splituser(origin), + "plugin": command(server), + }; + + if (args.length !== 2 || args[0].length === 0 || args[1].length === 0) { + server.message(channel, Util.format(formats.usage, kw)); + return; + } + + if (args[0] !== "seen" && args[0] !== "said") { + server.message(channel, Util.format(formats.usage, kw)); + return; + } + + if (isSelf(server, args[1])) + return; + + try { + var info = find(server, channel, args[1]); + + kw.target = args[1]; + + if (!info) { + server.message(channel, Util.format(formats.unknown, kw)); + return; + } + + kw.date = info.timestamp; + kw.message = info.message ? info.message : ""; + + server.message(channel, Util.format(formats[args[0] == "seen" ? "seen" : "said"], kw)); + } catch (e) { + server.message(channel, Util.format(kw)); + } +} + +function onJoin(server, origin, channel) +{ + write(server, channel, Util.splituser(origin)); +} + +function onMessage(server, origin, channel, message) +{ + write(server, channel, Util.splituser(origin), message); +} + +onMe = onMessage; + +function onTopic(server, origin, channel) +{ + write(server, channel, Util.splituser(origin)); +} + +function onLoad() +{ + var table = Server.list(); + + for (var k in table) + for (var c in table[k].info().channels) + table[k].names(c); + + loadFormats(); +} + +function onReload() +{ + loadFormats(); +} + +function onNames(server, channel, list) +{ + for (var i = 0; i < list.length; ++i) + write(server, channel, list[i]); +} \ No newline at end of file