Mercurial > irccd-plugins
changeset 29:0facbbd7a807
quote: adapt to new style
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 04 Sep 2019 13:05:04 +0200 |
parents | 103a9f976cc8 |
children | d93c2790c3a4 |
files | quote/quote.js |
diffstat | 1 files changed, 98 insertions(+), 70 deletions(-) [+] |
line wrap: on
line diff
--- a/quote/quote.js Wed Sep 04 11:19:19 2019 +0200 +++ b/quote/quote.js Wed Sep 04 13:05:04 2019 +0200 @@ -16,125 +16,153 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -info = { - summary: "Save user quotes", - version: "0.1-dev", - license: "ISC", - author: "David Demelier <markand@malikania.fr>" -}; - var File = Irccd.File; var Plugin = Irccd.Plugin var Directory = Irccd.Directory; var Logger = Irccd.Logger; var Util = Irccd.Util; +info = { + name: "quote", + summary: "Save user quotes", + version: "0.1-dev", + license: "ISC", + author: "David Demelier <markand@malikania.fr>" +}; + +Plugin.templates = { + "empty": "#{nickname}, no quote saved for #{target}", + "invalid": "#{nickname}, you can't set your own quote", + "message": "#{target}: #{message}", + "silent": "#{nickname}, #{target} hasn't said anything yet", + "usage": "usage: #{command} get user | set user" +}; + // Save last messages that should be store. var last = {}; function path() { - if (Plugin.config["file"]) { - return Plugin.config["file"]; - } - - return Plugin.cachePath + "db.json"; + return Plugin.config.file + ? Plugin.config.file + : Plugin.paths.cache + "/db.json"; } function key(server, channel, nickname) { - return server.toString() + "~" + channel + "~" + nickname; + return server.toString() + "|" + channel + "|" + nickname; } 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); - } - - return db; + try { + return db = JSON.parse((new File(path(), "r")).read()); + } catch (e) { + return {}; + } } function write(server, channel, nickname) { - var db = read(server, channel, nickname); - var p = path(server, channel); + var p = path(); + + // TODO: race condition. + if (!File.exists(File.dirname(p))) + Directory.mkdir(File.dirname(p)); - if (!File.exists(File.dirname(p))) { - Logger.debug("creating directory " + File.dirname(p)); - Directory.mkdir(File.dirname(p)); - } + var db = read(server, channel, nickname); + var file = new File(p, "wt"); + var k = key(server, channel, nickname); - var file = new File(p, "wt"); - var k = key(server, channel, nickname); - - db[k] = last[k]; - - file.write(JSON.stringify(db)); + db[k] = last[k]; + file.write(JSON.stringify(db)); } function find(server, channel, target) { - var db = read(server, channel, target); - var it = db[server][channel][target]; + var db = read(server, channel, target); + var it = db[server][channel][target]; + + if (it.timestamp) + return it; +} - if (it.timestamp) { - return it; - } +function keywords(server, origin, channel, extra) +{ + var object = { + command: server.info().commandChar + info.name, + nickname: Util.splituser(origin), + origin: origin, + server: server.toString() + }; + + return Object.assign(object, extra); } function set(server, origin, channel, target) { - var k = key(server, channel, target); + var k = key(server, channel, target); + var kw = keywords(server, origin, channel, { + target: target + }); - if (!last[k]) { - server.message(channel, "target has not said anything"); - } else { - write(server, channel, target); - } + if (kw.nickname === target) { + server.message(channel, Util.format(Plugin.templates["invalid"], kw)); + return; + } + + if (!last[k]) + server.message(channel, Util.format(Plugin.templates["silent"], kw)); + else + write(server, channel, target); } function get(server, origin, channel, target) { - var db = read(server, channel, target); - var k = key(server, channel, target); + var db = read(server, channel, target); + var k = key(server, channel, target); - if (!db[k]) { - server.message(channel, "no quote saved for target"); - } else { - server.message(channel, db[k].message); - } + if (!db[k]) { + var fmt = Plugin.templates["empty"]; + var kw = keywords(server, origin, channel, { + target: target + }); + } else { + var fmt = Plugin.templates["message"]; + var kw = keywords(server, origin, channel, { + target: target, + message: db[k].message + }); + } + + server.message(channel, Util.format(fmt, kw)); } function onMessage(server, origin, channel, message) { - var origin = Util.splituser(origin); - var k = key(server, channel, origin); + var origin = Util.splituser(origin); + var k = key(server, channel, origin); - last[k] = { - timestamp: Date.now(), - message: message - }; + last[k] = { + timestamp: Date.now(), + message: message + }; } function onCommand(server, origin, channel, message) { - var args = message.trim().split(" "); + var args = message.trim().split(" "); - if (args.length !== 2 || args[0].length === 0 || args[1].length === 0) { - server.message(channel, "usage: !quote set user | !quote get user"); - return; - } + if (args.length !== 2 || args[0].length === 0 || args[1].length === 0) { + var fmt = Plugin.templates["usage"]; + var kw = keywords(server, origin, channel); - if (args[0] == "set") { - set(server, origin, channel, args[1]); - } else if (args[0] == "get") { - get(server, origin, channel, args[1]); - } + server.message(channel, Util.format(fmt, kw)); + return; + } + + if (args[0] == "set") + set(server, origin, channel, args[1]); + else if (args[0] == "get") + get(server, origin, channel, args[1]); }