Run private server by default

Use `shout start --public` or edit your `config.json` to override.
This commit is contained in:
Mattias Erming 2014-08-14 09:35:37 -07:00
parent 43b6310481
commit eb7c40276e
5 changed files with 185 additions and 173 deletions

View file

@ -1,5 +1,5 @@
{ {
"port": 9000, "port": 9000,
"theme": "themes/example.css", "theme": "themes/example.css",
"public": true "public": false
} }

View file

@ -8,14 +8,14 @@ var program = require("commander");
var shout = require("./src/server.js"); var shout = require("./src/server.js");
program program
.option("-p, --port <port>"); .option("-p, --port <port>")
.option("-P, --public");
program program
.command("start") .command("start")
.description("Start the server") .description("Start the server")
.action(function() { .action(function() {
var port = program.port || config.port; shout(program.port, program.public);
shout(port);
}); });
program program

View file

@ -1,7 +1,7 @@
{ {
"name": "shout", "name": "shout",
"description": "A web IRC client", "description": "A web IRC client",
"version": "0.9.2", "version": "0.9.3",
"homepage": "http://github.com/erming/shout", "homepage": "http://github.com/erming/shout",
"author": "Mattias Erming", "author": "Mattias Erming",
"preferGlobal": true, "preferGlobal": true,

View file

@ -4,9 +4,19 @@ var Client = require("./client");
module.exports = ClientManager; module.exports = ClientManager;
function 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) { ClientManager.prototype.loadUsers = function(sockets) {
var users = this.getUsers(); var users = this.getUsers();
for (var i in users) { for (var i in users) {
@ -18,11 +28,11 @@ ClientManager.prototype.loadUsers = function(sockets) {
if (!json) { if (!json) {
continue; continue;
} }
if (!this.clients[name]) { if (!this.findClient(name)) {
this.clients[name] = new Client( this.clients.push(new Client(
sockets, sockets,
json json
); ));
} }
} }
}; };

View file

@ -1,160 +1,162 @@
var _ = require("lodash"); var _ = require("lodash");
var Client = require("./client"); var Client = require("./client");
var ClientManager = require("./clientManager"); var ClientManager = require("./clientManager");
var config = require("../config.json"); var config = require("../config.json");
var fs = require("fs"); var fs = require("fs");
var http = require("connect"); var http = require("connect");
var io = require("socket.io"); var io = require("socket.io");
var sockets = null; var sockets = null;
var manager = new ClientManager(); var manager = new ClientManager();
var inputs = [ var inputs = [
"action", "action",
"connect", "connect",
"invite", "invite",
"join", "join",
"kick", "kick",
"mode", "mode",
"msg", "msg",
"nick", "nick",
"notice", "notice",
"part", "part",
"quit", "quit",
"raw", "raw",
"topic", "topic",
"whois" "whois"
]; ];
module.exports = function(port) { module.exports = function(port, public) {
var port = port || config.port || 9000; config.port = port || config.port,
var app = http() config.public = public || config.public
.use(index)
.use(http.static("client")) var app = http()
.listen(port); .use(index)
.use(http.static("client"))
sockets = io(app); .listen(config.port);
sockets.on("connect", function(socket) {
if (config.public) { sockets = io(app);
auth.call(socket); sockets.on("connect", function(socket) {
} else { if (config.public) {
init(socket); 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("");
console.log(""); console.log("Shout is now running on port " + config.port);
console.log("Press ctrl-c to stop");
if (!config.public) { console.log("");
manager.loadUsers(sockets);
} 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) { function index(req, res, next) {
var data = _.merge( if (req.url != "/") return next();
require("../package.json"), return fs.readFile("client/index.html", "utf-8", function(err, file) {
config var data = _.merge(
); require("../package.json"),
res.end(_.template( config
file, );
data res.end(_.template(
)); file,
}); data
} ));
});
function init(socket, client) { }
if (!client) {
socket.emit("auth"); function init(socket, client) {
socket.on("auth", auth); if (!client) {
} else { socket.emit("auth");
socket.on( socket.on("auth", auth);
"input", } else {
function(data) { socket.on(
input(client, data); "input",
} function(data) {
); input(client, data);
socket.on( }
"showMore", );
function(data) { socket.on(
showMore(client, data); "showMore",
} function(data) {
); showMore(client, data);
socket.on( }
"conn", );
function(data) { socket.on(
client.connect(data); "conn",
} function(data) {
); client.connect(data);
socket.join(client.id); }
socket.emit("init", { );
networks: client.networks socket.join(client.id);
}); socket.emit("init", {
} networks: client.networks
} });
}
function auth(data) { }
var socket = this;
if (config.public) { function auth(data) {
var client = new Client(sockets); var socket = this;
clients.push(client); if (config.public) {
socket.on("disconnect", function() { var client = new Client(sockets);
clients = _.without(clients, client); manager.clients.push(client);
client.quit(); socket.on("disconnect", function() {
}); manager.clients = _.without(manager.clients, client);
init(socket, client); client.quit();
} else { });
var success = 0; init(socket, client);
_.each(manager.clients, function(client) { } else {
if (client.config.name == data.name && client.config.password == data.password) { var success = 0;
init(socket, client); _.each(manager.clients, function(client) {
success++; if (client.config.name == data.name && client.config.password == data.password) {
} init(socket, client);
}); success++;
if (!success) { }
socket.emit("auth"); });
} if (!success) {
} socket.emit("auth");
} }
}
function input(client, data) { }
var text = data.text;
var target = client.find(data.target); function input(client, data) {
if (text.charAt(0) !== "/") { var text = data.text;
text = "/say " + text; var target = client.find(data.target);
} if (text.charAt(0) !== "/") {
text = "/say " + text;
var args = text.split(" "); }
var cmd = args.shift().replace("/", "").toLowerCase();
var args = text.split(" ");
_.each(inputs, function(plugin) { var cmd = args.shift().replace("/", "").toLowerCase();
try {
var path = "./plugins/inputs/" + plugin; _.each(inputs, function(plugin) {
var fn = require(path); try {
fn.apply(client, [ var path = "./plugins/inputs/" + plugin;
target.network, var fn = require(path);
target.chan, fn.apply(client, [
cmd, target.network,
args target.chan,
]); cmd,
} catch (e) { args
console.log(path + ": " + e); ]);
} } catch (e) {
}); console.log(path + ": " + e);
} }
});
function showMore(client, data) { }
var target = client.find(data.target);
if (!target) { function showMore(client, data) {
return; var target = client.find(data.target);
} if (!target) {
var chan = target.chan; return;
var messages = chan.messages.slice(0, chan.messages.length - (data.count || 0)); }
client.emit("showMore", { var chan = target.chan;
chan: chan.id, var messages = chan.messages.slice(0, chan.messages.length - (data.count || 0));
messages: messages client.emit("showMore", {
}); chan: chan.id,
} messages: messages
});
}