diff --git a/config.json b/config.json index 8914005b..597f545d 100644 --- a/config.json +++ b/config.json @@ -1,5 +1,5 @@ -{ - "port": 9000, - "theme": "themes/example.css", - "public": true -} +{ + "port": 9000, + "theme": "themes/example.css", + "public": false +} diff --git a/index.js b/index.js index 7178a4d9..31b47f81 100755 --- a/index.js +++ b/index.js @@ -8,14 +8,14 @@ var program = require("commander"); var shout = require("./src/server.js"); program - .option("-p, --port "); + .option("-p, --port ") + .option("-P, --public"); program .command("start") .description("Start the server") .action(function() { - var port = program.port || config.port; - shout(port); + shout(program.port, program.public); }); program diff --git a/package.json b/package.json index 6a64c2cc..1e6a1d8d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "shout", "description": "A web IRC client", - "version": "0.9.2", + "version": "0.9.3", "homepage": "http://github.com/erming/shout", "author": "Mattias Erming", "preferGlobal": true, diff --git a/src/clientManager.js b/src/clientManager.js index 8aba1544..a168a7c0 100644 --- a/src/clientManager.js +++ b/src/clientManager.js @@ -4,9 +4,19 @@ var Client = require("./client"); module.exports = ClientManager; function ClientManager() { - this.clients = {}; + this.clients = []; } +ClientManager.prototype.findClient = function(name) { + for (var i in this.clients) { + var client = this.clients[i]; + if (client.name == name) { + return client; + } + } + return false; +}; + ClientManager.prototype.loadUsers = function(sockets) { var users = this.getUsers(); for (var i in users) { @@ -18,11 +28,11 @@ ClientManager.prototype.loadUsers = function(sockets) { if (!json) { continue; } - if (!this.clients[name]) { - this.clients[name] = new Client( + if (!this.findClient(name)) { + this.clients.push(new Client( sockets, json - ); + )); } } }; diff --git a/src/server.js b/src/server.js index c700ce0f..61a49b2b 100644 --- a/src/server.js +++ b/src/server.js @@ -1,160 +1,162 @@ -var _ = require("lodash"); -var Client = require("./client"); -var ClientManager = require("./clientManager"); -var config = require("../config.json"); -var fs = require("fs"); -var http = require("connect"); -var io = require("socket.io"); - -var sockets = null; -var manager = new ClientManager(); - -var inputs = [ - "action", - "connect", - "invite", - "join", - "kick", - "mode", - "msg", - "nick", - "notice", - "part", - "quit", - "raw", - "topic", - "whois" -]; - -module.exports = function(port) { - var port = port || config.port || 9000; - var app = http() - .use(index) - .use(http.static("client")) - .listen(port); - - sockets = io(app); - sockets.on("connect", function(socket) { - if (config.public) { - auth.call(socket); - } else { - init(socket); - } - }); - - console.log(""); - console.log("Shout is now running on port " + port); - console.log("Press ctrl-c to stop"); - console.log(""); - - if (!config.public) { - manager.loadUsers(sockets); - } -}; - -function index(req, res, next) { - if (req.url != "/") return next(); - return fs.readFile("client/index.html", "utf-8", function(err, file) { - var data = _.merge( - require("../package.json"), - config - ); - res.end(_.template( - file, - data - )); - }); -} - -function init(socket, client) { - if (!client) { - socket.emit("auth"); - socket.on("auth", auth); - } else { - socket.on( - "input", - function(data) { - input(client, data); - } - ); - socket.on( - "showMore", - function(data) { - showMore(client, data); - } - ); - socket.on( - "conn", - function(data) { - client.connect(data); - } - ); - socket.join(client.id); - socket.emit("init", { - networks: client.networks - }); - } -} - -function auth(data) { - var socket = this; - if (config.public) { - var client = new Client(sockets); - clients.push(client); - socket.on("disconnect", function() { - clients = _.without(clients, client); - client.quit(); - }); - init(socket, client); - } else { - var success = 0; - _.each(manager.clients, function(client) { - if (client.config.name == data.name && client.config.password == data.password) { - init(socket, client); - success++; - } - }); - if (!success) { - socket.emit("auth"); - } - } -} - -function input(client, data) { - var text = data.text; - var target = client.find(data.target); - if (text.charAt(0) !== "/") { - text = "/say " + text; - } - - var args = text.split(" "); - var cmd = args.shift().replace("/", "").toLowerCase(); - - _.each(inputs, function(plugin) { - try { - var path = "./plugins/inputs/" + plugin; - var fn = require(path); - fn.apply(client, [ - target.network, - target.chan, - cmd, - args - ]); - } catch (e) { - console.log(path + ": " + e); - } - }); -} - -function showMore(client, data) { - var target = client.find(data.target); - if (!target) { - return; - } - var chan = target.chan; - var messages = chan.messages.slice(0, chan.messages.length - (data.count || 0)); - client.emit("showMore", { - chan: chan.id, - messages: messages - }); -} +var _ = require("lodash"); +var Client = require("./client"); +var ClientManager = require("./clientManager"); +var config = require("../config.json"); +var fs = require("fs"); +var http = require("connect"); +var io = require("socket.io"); + +var sockets = null; +var manager = new ClientManager(); + +var inputs = [ + "action", + "connect", + "invite", + "join", + "kick", + "mode", + "msg", + "nick", + "notice", + "part", + "quit", + "raw", + "topic", + "whois" +]; + +module.exports = function(port, public) { + config.port = port || config.port, + config.public = public || config.public + + var app = http() + .use(index) + .use(http.static("client")) + .listen(config.port); + + sockets = io(app); + sockets.on("connect", function(socket) { + if (config.public) { + auth.call(socket); + } else { + init(socket); + } + }); + + console.log(""); + console.log("Shout is now running on port " + config.port); + console.log("Press ctrl-c to stop"); + console.log(""); + + if (!config.public) { + manager.loadUsers(sockets); + } +}; + +function index(req, res, next) { + if (req.url != "/") return next(); + return fs.readFile("client/index.html", "utf-8", function(err, file) { + var data = _.merge( + require("../package.json"), + config + ); + res.end(_.template( + file, + data + )); + }); +} + +function init(socket, client) { + if (!client) { + socket.emit("auth"); + socket.on("auth", auth); + } else { + socket.on( + "input", + function(data) { + input(client, data); + } + ); + socket.on( + "showMore", + function(data) { + showMore(client, data); + } + ); + socket.on( + "conn", + function(data) { + client.connect(data); + } + ); + socket.join(client.id); + socket.emit("init", { + networks: client.networks + }); + } +} + +function auth(data) { + var socket = this; + if (config.public) { + var client = new Client(sockets); + manager.clients.push(client); + socket.on("disconnect", function() { + manager.clients = _.without(manager.clients, client); + client.quit(); + }); + init(socket, client); + } else { + var success = 0; + _.each(manager.clients, function(client) { + if (client.config.name == data.name && client.config.password == data.password) { + init(socket, client); + success++; + } + }); + if (!success) { + socket.emit("auth"); + } + } +} + +function input(client, data) { + var text = data.text; + var target = client.find(data.target); + if (text.charAt(0) !== "/") { + text = "/say " + text; + } + + var args = text.split(" "); + var cmd = args.shift().replace("/", "").toLowerCase(); + + _.each(inputs, function(plugin) { + try { + var path = "./plugins/inputs/" + plugin; + var fn = require(path); + fn.apply(client, [ + target.network, + target.chan, + cmd, + args + ]); + } catch (e) { + console.log(path + ": " + e); + } + }); +} + +function showMore(client, data) { + var target = client.find(data.target); + if (!target) { + return; + } + var chan = target.chan; + var messages = chan.messages.slice(0, chan.messages.length - (data.count || 0)); + client.emit("showMore", { + chan: chan.id, + messages: messages + }); +}