diff --git a/client/index.html b/client/index.html index 218daa2a..1e2d5655 100644 --- a/client/index.html +++ b/client/index.html @@ -90,7 +90,7 @@
{{#each users}} - + {{mode}}{{name}} {{/each}} @@ -99,8 +99,8 @@ {{#each messages}}
{{time}} - {{mode}}{{user}} - {{type}} {{{link text}}} + {{mode}}{{user}} + {{type}} {{{link message}}}
{{/each}}
@@ -114,7 +114,7 @@ diff --git a/client/js/chat.js b/client/js/chat.js index a48313c9..cf036f94 100644 --- a/client/js/chat.js +++ b/client/js/chat.js @@ -1,6 +1,6 @@ $(function() { var socket = io.connect(""); - $.each(["networks", "channels", "messages", "users"], function(i, type) { + $.each(["network", "channel", "message", "user"], function(i, type) { socket.on(type, function(json) { event(type, json); }); @@ -16,9 +16,10 @@ $(function() { } function event(type, json) { + console.log(json); switch (type) { - case "networks": + case "network": var html = ""; json.forEach(function(network) { html += render("#window", network); @@ -37,7 +38,7 @@ $(function() { .bringToTop(); break; - case "channels": + case "channel": var target = json.target; if (json.action == "remove") { $("[data-id='" + json.data.id + "']").remove(); @@ -65,7 +66,7 @@ $(function() { .scrollGlue({animate: 400}); break; - case "users": + case "user": var target; if (typeof json.target !== "undefined") { target = chat.find(".window[data-id='" + json.target + "']"); @@ -75,7 +76,7 @@ $(function() { target.html(render("#user", {users: json.data})); break; - case "messages": + case "message": var target; if (typeof json.target !== "undefined") { target = chat.find(".window[data-id='" + json.target + "']"); diff --git a/lib/models.js b/lib/models.js index dfbdc057..5483c024 100644 --- a/lib/models.js +++ b/lib/models.js @@ -1,22 +1,20 @@ -var irc = require("irc"); var _ = require("lodash"); -var Backbone = require("backbone"); -var moment = require("moment"); +var backbone = require("backbone"); +var moment = require("moment"); +var id = 1; var models = module.exports = {}; -var id = 1; - -models.User = Backbone.Model.extend({ +models.User = backbone.Model.extend({ defaults: { mode: "", - name: "" + name: "", } }); -models.Users = Backbone.Collection.extend({ +models.Users = backbone.Collection.extend({ model: models.User, sort: function(options) { this.models = _.sortBy( @@ -39,23 +37,23 @@ models.Users = Backbone.Collection.extend({ } }); -models.Message = Backbone.Model.extend({ +models.Message = backbone.Model.extend({ defaults: { + type: "", time: "", - user: "", - text: "", - type: "" + from: "", + message: "", }, initialize: function() { this.set("time", moment().format("HH:mm")); } }); -models.Messages = Backbone.Collection.extend({ +models.Messages = backbone.Collection.extend({ model: models.Message }); -models.Channel = Backbone.Model.extend({ +models.Channel = backbone.Model.extend({ defaults: { type: "channel", name: "" @@ -67,7 +65,7 @@ models.Channel = Backbone.Model.extend({ this.set("messages", new models.Messages()); this.get("messages").on("all", function(action, data) { - this.trigger("MESSAGES", { + this.trigger("message", { target: this.get("id"), type: "message", data: data, @@ -77,7 +75,7 @@ models.Channel = Backbone.Model.extend({ this.set("users", new models.Users()); this.get("users").on("all", function(action) { - this.trigger("USERS", { + this.trigger("user", { target: this.get("id"), type: "user", data: this.get("users"), @@ -87,14 +85,13 @@ models.Channel = Backbone.Model.extend({ } }); -models.Channels = Backbone.Collection.extend({ +models.Channels = backbone.Collection.extend({ model: models.Channel }); -models.Network = Backbone.Model.extend({ +models.Network = backbone.Model.extend({ defaults: { - host: "", - nick: "nick" + host: "" }, initialize: function() { this.set({ @@ -103,10 +100,10 @@ models.Network = Backbone.Model.extend({ this.set("channels", new models.Channels()); this.get("channels").on("all", function(action, data) { - if (action == "USERS" || action == "MESSAGES") { + if (action == "user" || action == "message") { this.trigger(action, data); } else { - this.trigger("CHANNELS", { + this.trigger("channel", { target: this.get("id"), type: "channel", data: data, @@ -122,12 +119,11 @@ models.Network = Backbone.Model.extend({ } }); -models.Networks = Backbone.Collection.extend({ +models.Networks = backbone.Collection.extend({ model: models.Network, initialize: function() { this.add(new models.Network({ - host: "Lobby", - connect: false + host: "Status" })); }, find: function(id) { diff --git a/lib/server.js b/lib/server.js index e59fc5a4..90d394ff 100644 --- a/lib/server.js +++ b/lib/server.js @@ -1,31 +1,71 @@ -var connect = require("connect"); -var _ = require("lodash"); -var io = require("socket.io"); - -// Local library -var models = require("./models"); +var http = require("connect"); +var io = require("socket.io"); +var irc = require("slate-irc"); +var models = require(__dirname + "/models"); +var net = require("net"); +var _ = require("lodash"); var sockets; var networks = new models.Networks; -module.exports = function server(options) { - var app = connect().use(connect.static("client")).listen(9000); - sockets = io.listen(app, {log: 0}).sockets; - sockets.on("connection", function(s) { - init(s); +var events = [ + "away", + "join", + "kick", + "names", + "nick", + "notice", + "part", + "pong", + "privmsg", + "quit", + "topic", + "welcome", + "whois" +]; + +module.exports = function listen() { + var app = http() + .use(http.static("client")) + .listen(9000); + + sockets = io.listen(app, {log: 0}).sockets.on("connection", function(s) { + s.on("input", input); + sockets.emit("network", networks); }); - networks.on("all", function(e) { - sockets.emit("networks", networks); + networks.on("all", function() { + sockets.emit.apply(sockets, arguments); }); }; -function init(socket) { - socket.on("input", function(json) { clientInput(json); }); - sockets.emit("networks", networks); +function connect(host) { + var network = new models.Network({host: host}, {silent: true}); + networks.add(network); + networks.trigger("network", networks); + + var stream = net.connect({ + port: 6667, + host: host, + }); + + stream.on("error", function(e) { + console.log(e); + }); + + var client = irc(stream); + + client.nick("t_user"); + client.user("t_user", "temp user"); + + events.forEach(function(e) { + client.on(e, function(data) { + event.apply(network, [e, data]); + }); + }); } -function clientInput(json) { +function input(json) { var target = networks.find(json.id); if (!target) { return; @@ -48,18 +88,14 @@ function clientInput(json) { channel.get("name") ); case "msg": - var m = new models.Message({text: _.tail(args, 2)}); - channel.get("messages").add(m); + channel.get("messages").add(new models.Message({text: _.tail(args, 2)})); break; case "server": case "connect": - if (!args[1]) { - break; + if (args[1]) { + connect(args[1]); } - - var n = new models.Network({host: args[1]}); - networks.add(n); break; case "quit": @@ -68,4 +104,68 @@ function clientInput(json) { break; } +} + +function event(event, data) { + var network = this; + var channels = network.get("channels"); + + switch (event) { + + case "away": + console.log(event); + break; + + case "join": + console.log(event); + break; + + case "kick": + console.log(event); + break; + + case "names": + console.log(event); + break; + + case "nick": + console.log(event); + break; + + case "notice": + channels.first().get("messages").add(new models.Message(data)); + break; + + case "part": + console.log(event); + break; + + case "pong": + console.log(event); + break; + + case "privmsg": + console.log(event); + break; + + case "quit": + console.log(event); + break; + + case "topic": + console.log(event); + break; + + case "welcome": + console.log(event); + break; + + case "whois": + console.log(event); + break; + + } + + // Debug + console.log(data); } \ No newline at end of file diff --git a/package.json b/package.json index 2812bbb0..63842e83 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,12 @@ "email": "mattias@mattiaserming.com" }, "dependencies": { - "backbone": "1.1.2", - "connect": "2.13.0", - "irc": "0.3.6", - "lodash": "2.4.1", - "moment": "2.5.1", - "socket.io": "0.9.16", - "slate-irc": "~0.4.0" + "lodash": "~2.4.1", + "backbone": "~1.1.2", + "slate-irc": "~0.4.0", + "moment": "~2.5.1", + "connect": "~2.14.3", + "socket.io": "~0.9.16" }, "keywords": [ "chat",