thelounge/lib/server.js

187 lines
3.3 KiB
JavaScript
Raw Normal View History

2014-03-04 17:31:52 +01:00
var connect = require("connect");
2014-03-09 22:22:37 +01:00
var io = require("socket.io");
2014-03-06 16:11:25 +01:00
2014-03-07 22:24:02 +01:00
// Local library
2014-03-09 22:22:37 +01:00
var models = require("./models.js");
2014-03-06 16:11:25 +01:00
2014-03-07 22:24:02 +01:00
module.exports = Server;
2014-03-06 16:11:25 +01:00
2014-03-07 22:24:02 +01:00
function Server() {
this.sockets = false;
this.networks = new models.NetworkCollection;
}
2014-03-06 16:11:25 +01:00
2014-03-07 22:24:02 +01:00
Server.prototype.listen = function(port) {
var self = this;
2014-03-06 16:11:25 +01:00
var http = connect()
.use(connect.static("client"))
.listen(port);
2014-03-11 23:57:29 +01:00
this.networks.on(
"all",
2014-03-12 14:10:53 +01:00
function(type, data) {
if ([
"users",
"messages"
].indexOf(type) != -1) {
self.sockets.emit(type, data);
} else {
self.sockets.emit("networks", self.networks);
}
2014-03-11 23:57:29 +01:00
}
);
2014-03-12 16:09:37 +01:00
var options = {
log: false
};
this.sockets = io
.listen(http, options)
.sockets;
2014-03-07 22:24:02 +01:00
this.sockets.on("connection", function(socket) {
2014-03-09 22:22:37 +01:00
socket.emit(
2014-03-12 14:10:53 +01:00
"networks",
2014-03-09 22:22:37 +01:00
self.networks
);
2014-03-09 20:27:44 +01:00
socket.on(
"input",
function(input) {
2014-03-10 00:14:22 +01:00
handleInput.call(self, input);
2014-03-09 20:27:44 +01:00
}
);
2014-03-07 22:24:02 +01:00
});
2014-03-06 19:02:43 +01:00
2014-03-07 22:24:02 +01:00
return this;
};
2014-03-06 19:02:43 +01:00
2014-03-10 00:14:22 +01:00
function handleInput(input) {
2014-03-09 22:22:37 +01:00
var target = this.networks.find(input.id);
if (!target) {
return;
}
var argv = input.text.substr(1).split(" ");
var cmd = input.text.charAt(0) == "/" ? argv[0].toUpperCase()
: "";
switch (cmd) {
case "":
target.channel.get("messages").add(
2014-03-09 20:27:44 +01:00
new models.Message({user: "user", text: input.text})
);
2014-03-09 22:22:37 +01:00
break;
2014-03-12 14:10:53 +01:00
case "JOIN":
2014-03-12 16:09:37 +01:00
var irc = target.network.irc;
if (argv[1] && typeof irc !== "undefined") {
irc.join(argv[1]);
}
break;
case "PART":
var irc = target.network.irc;
if (argv[1] && typeof irc !== "undefined") {
irc.part(argv[1]);
2014-03-12 14:10:53 +01:00
}
break;
2014-03-12 16:09:37 +01:00
case "SERVER":
2014-03-09 22:22:37 +01:00
case "CONNECT":
2014-03-12 16:09:37 +01:00
if (argv[1]) {
var network = this.networks.add(
new models.Network({host: argv[1]})
);
network.irc.addListener(
"raw",
function() {
handleEvent.apply(network, arguments);
}
);
2014-03-10 00:14:22 +01:00
}
break;
2014-03-09 22:22:37 +01:00
2014-03-12 16:09:37 +01:00
case "QUIT":
2014-03-10 00:14:22 +01:00
case "DISCONNECT":
this.networks.remove(target.network);
2014-03-09 22:22:37 +01:00
break;
default:
target.channel.get("messages").add(
new models.Message({text: "Command `/" + cmd + "` does not exist."})
2014-03-09 20:27:44 +01:00
);
2014-03-09 22:22:37 +01:00
break;
2014-03-09 20:27:44 +01:00
}
2014-03-10 00:14:22 +01:00
}
2014-03-09 22:22:37 +01:00
2014-03-10 00:14:22 +01:00
function handleEvent(argv) {
2014-03-12 16:09:37 +01:00
var network = this;
var channels = network.get("channels");
// Temp
var network_lobby = channels.first().get("messages");
network_lobby.add(
2014-03-10 00:14:22 +01:00
new models.Message({
user: argv.args[0],
text: argv.args[1]
})
2014-03-09 22:22:37 +01:00
);
2014-03-11 23:57:29 +01:00
2014-03-12 16:09:37 +01:00
var event = argv.command;
switch (event) {
case "JOIN":
if (argv.nick == network.get("nick")) {
var channel = new models.Channel({
name: argv.args[0]
});
channel.get("users").add(
new models.User({
name: network.get("nick")
})
)
channels.add(
channel
);
} else {
var channel = channels.findWhere({name: argv.args[0]});
var users = channel.get("users");
users.add(
new models.User({
name: argv.nick
})
);
var messages = channel.get("messages");
messages.add(
new models.Message({
user: argv.nick,
text: "has joined the channel."
})
);
}
break;
case "PART":
var channel = channels.findWhere({name: argv.args[0]});
if (argv.nick == network.get("nick")) {
channels.remove(channel);
} else {
var users = channel.get("users");
users.remove(
users.findWhere({
name: argv.nick
})
);
var messages = channel.get("messages");
messages.add(
new models.Message({
user: argv.nick,
text: "has left the channel."
})
);
}
break;
}
2014-03-11 23:57:29 +01:00
// Debug
console.log(argv);
2014-03-09 20:27:44 +01:00
}