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]);
 }