diff --git a/README.md b/README.md index 36627c30..e2712fd8 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,14 @@ Pretty simple, huh? If you want to edit users manually, see `users/example/user.json`. +## Custom paths + +You can define Shout's file storage path via the following options: + +- Add an entry called `home` to the `config.json` file. +- Set the environment variable `SHOUT_HOME` before calling the shout executable. +- Use the default of `$HOME/.shout`. + ## Commands These are the commands currently implemented: diff --git a/src/clientManager.js b/src/clientManager.js index abf410d7..f863ad06 100644 --- a/src/clientManager.js +++ b/src/clientManager.js @@ -2,8 +2,7 @@ var _ = require("lodash"); var fs = require("fs"); var Client = require("./client"); var mkdirp = require("mkdirp"); - -const HOME = process.env.HOME + "/.shout"; +var Helper = require("./helper"); module.exports = ClientManager; @@ -41,7 +40,7 @@ ClientManager.prototype.loadUsers = function(sockets) { ClientManager.prototype.loadUser = function(name) { try { var json = fs.readFileSync( - HOME + "/users/" + name + "/user.json", + Helper.resolveHomePath("users", name, "user.json"), "utf-8" ); json = JSON.parse(json); @@ -54,8 +53,10 @@ ClientManager.prototype.loadUser = function(name) { ClientManager.prototype.getUsers = function() { var users = []; - var path = HOME + "/users/"; + var path = Helper.resolveHomePath("users"); + mkdirp.sync(path); + try { users = fs.readdirSync(path); } catch(e) { @@ -75,7 +76,7 @@ ClientManager.prototype.addUser = function(name, password) { return false; } try { - var path = HOME + "/users/" + name; + var path = Helper.resolveHomePath("users", name); var user = { user: name, password: password || "", @@ -99,7 +100,7 @@ ClientManager.prototype.removeUser = function(name) { return false; } try { - var path = HOME + "/users/" + name; + var path = Helper.resolveHomePath("users", name); fs.unlinkSync(path + "/user.json"); fs.rmdirSync(path); } catch(e) { diff --git a/src/command-line/add.js b/src/command-line/add.js index bb3093e5..6c399ddd 100644 --- a/src/command-line/add.js +++ b/src/command-line/add.js @@ -3,15 +3,14 @@ var bcrypt = require("bcrypt"); var fs = require("fs"); var program = require("commander"); var mkdirp = require("mkdirp"); - -const HOME = process.env.HOME + "/.shout"; +var Helper = require("../helper"); program .command("add ") .description("Add a new user") .action(function(name) { try { - var path = HOME + "/users"; + var path = Helper.resolveHomePath("users"); mkdirp.sync(path); } catch (e) { console.log(""); @@ -21,7 +20,7 @@ program return; } try { - var path = HOME + "/users"; + var path = Helper.resolveHomePath("users"); var test = path + "/.test"; fs.mkdirSync(test); fs.rmdirSync(test); diff --git a/src/command-line/edit.js b/src/command-line/edit.js index d353b5a2..1d2c5829 100644 --- a/src/command-line/edit.js +++ b/src/command-line/edit.js @@ -1,12 +1,11 @@ var ClientManager = new require("../clientManager"); var program = require("commander"); var child = require("child_process"); - -const HOME = process.env.HOME + "/.shout"; +var Helper = require("../helper"); program .command("edit ") - .description("Edit user: '" + HOME + "/users//user.json'") + .description("Edit user: '" + Helper.resolveHomePath("users", "", "user.json") + "'") .action(function(name) { var users = new ClientManager().getUsers(); if (users.indexOf(name) === -1) { @@ -15,10 +14,9 @@ program console.log(""); return; } - var path = HOME + "/users/"; child.spawn( "vi", - [path + name + "/user.json"], + [Helper.resolveHomePath("users", name, "user.json")], {stdio: "inherit"} ); }); diff --git a/src/command-line/remove.js b/src/command-line/remove.js index f9d0b739..61001179 100644 --- a/src/command-line/remove.js +++ b/src/command-line/remove.js @@ -1,15 +1,14 @@ var ClientManager = new require("../clientManager"); var fs = require("fs"); var program = require("commander"); - -const HOME = process.env.HOME + "/.shout"; +var Helper = require("../helper"); program .command("remove ") .description("Remove an existing user") .action(function(name) { try { - var path = HOME + "/users"; + var path = Helper.resolveHomePath("users"); var test = path + "/.test"; fs.mkdirSync(test); fs.rmdirSync(test); diff --git a/src/command-line/reset.js b/src/command-line/reset.js index 2e1cdf10..466535f2 100644 --- a/src/command-line/reset.js +++ b/src/command-line/reset.js @@ -2,8 +2,7 @@ var bcrypt = require("bcrypt"); var ClientManager = new require("../clientManager"); var fs = require("fs"); var program = require("commander"); - -const HOME = process.env.HOME + "/.shout"; +var Helper = require("../helper"); program .command("reset ") @@ -16,7 +15,7 @@ program console.log(""); return; } - var path = HOME + "/users/"; + var path = Helper.resolveHomePath("users"); var file = path + name + "/user.json"; var user = require(file); require("read")({ diff --git a/src/helper.js b/src/helper.js new file mode 100644 index 00000000..093c78b8 --- /dev/null +++ b/src/helper.js @@ -0,0 +1,22 @@ +var path = require("path"); + +var Helper = module.exports = { + getConfig: function () { + return require(path.resolve(__dirname, "..", "config.json")); + }, + + getHomeDirectory: function () { + return ( + this.getConfig().home || + process.env.SHOUT_HOME || + path.resolve(process.env.HOME, ".shout") + ); + }, + + resolveHomePath: function () { + var fragments = [ Helper.HOME ].concat([].slice.apply(arguments)); + return path.resolve.apply(path, fragments); + } +}; + +Helper.HOME = Helper.getHomeDirectory() diff --git a/src/plugins/irc-events/image.js b/src/plugins/irc-events/image.js index 83e0392a..c57d7cb7 100644 --- a/src/plugins/irc-events/image.js +++ b/src/plugins/irc-events/image.js @@ -4,6 +4,7 @@ var config = require("../../../config.json"); var fs = require("fs"); var mkdirp = require("mkdirp"); var request = require("superagent"); +var Helper = require("../../helper"); module.exports = function(irc, network) { var client = this; @@ -40,7 +41,7 @@ module.exports = function(irc, network) { }; function fetchImage(url, callback) { - var path = process.env.HOME + "/.shout/cache/thumbs"; + var path = Helper.resolveHomePath("cache", "thumbs"); var name = new Date().getTime().toString(); mkdirp(path, function(e) { if (e) { @@ -58,9 +59,9 @@ function fetchImage(url, callback) { }); req.on("end", function() { if (this.req.res.statusCode == 200) { - callback(name); + callback(name); } }); - + }); } diff --git a/src/server.js b/src/server.js index 3005072c..6efccf30 100644 --- a/src/server.js +++ b/src/server.js @@ -6,6 +6,7 @@ var config = require("../config.json"); var fs = require("fs"); var http = require("connect"); var io = require("socket.io"); +var Helper = require("./helper"); var sockets = null; var manager = new ClientManager(); @@ -18,7 +19,7 @@ module.exports = function(port, host, isPublic) { var app = http() .use(index) .use(http.static("client")) - .use(http.static(process.env.HOME + "/.shout/cache")) + .use(http.static(Helper.resolveHomePath("cache"))) .listen(config.port, config.host); sockets = io(app);