diff --git a/lib/Server/Channel.js b/lib/Server/Channel.js index 8dfe7e6..f4ace36 100644 --- a/lib/Server/Channel.js +++ b/lib/Server/Channel.js @@ -1,10 +1,12 @@ -define(["Chuck/ServerGame"], function(ServerGame) { +define(["Chuck/ServerGame", "Server/Factory"], function(ServerGame, Factory) { function Channel(name) { + this.factory = new Factory(); + this.name = name; this.users = {}; - this.serverGame = new ServerGame(this); - this.serverGame.loadLevel("default.json") + this.serverGame = this.factory.new(ServerGame, this); + this.serverGame.loadLevel("default.json"); } Channel.validateName = function(name){ diff --git a/lib/Server/NotificationCenter.js b/lib/Server/NotificationCenter.js index 26848fc..976c450 100644 --- a/lib/Server/NotificationCenter.js +++ b/lib/Server/NotificationCenter.js @@ -1,7 +1,53 @@ define(function() { function NotificationCenter() { + this.topics = {}; + this.subUid = -1; } + NotificationCenter.prototype.trigger = function(topic, args) { + if (!this.topics[topic]) { + throw "No such topic " + topic + ". Could not trigger."; + } + + var subscribers = this.topics[topic]; + var len = subscribers ? subscribers.length : 0; + + while (len--) { + subscribers[len].func(topic, args); + } + + return this; + } + + NotificationCenter.prototype.on = function(topic, func) { + if (!this.topics[topic]) { + this.topics[topic] = []; + } + + var token = ( ++this.subUid ).toString(); + this.topics[topic].push({ + token: token, + func: func + }); + + return token; + } + + NotificationCenter.prototype.off = function(token) { + + for(var m in this.topics) { + if (this.topics[m]) { + for(var i = 0, j = this.topics[m].length; i < j; i++) { + if (this.topics[m][i].token === token) { + this.topics[m].splice(i, 1); + return token; + } + } + } + } + return this; + } + return NotificationCenter; }); \ No newline at end of file