Merge pull request #232 from xeoncore/autoload

Refactored Autoload system
This commit is contained in:
Mattias Erming 2014-10-12 17:09:11 +02:00
commit 62b15ab193

View File

@ -8,7 +8,14 @@ var moment = require("moment");
module.exports = ClientManager; module.exports = ClientManager;
function ClientManager() { function ClientManager() {
var self = this;
this.clients = []; this.clients = [];
if(!/^win/.test(process.platform)) {
process.on('SIGHUP', function() {
console.log("Received 'SIGHUP'. Reloading Users.");
self.reloadUsers();
});
}
} }
ClientManager.prototype.findClient = function(name) { ClientManager.prototype.findClient = function(name) {
@ -48,9 +55,35 @@ ClientManager.prototype.loadUser = function(name) {
name, name,
json json
)); ));
console.log( console.log("User '%s' loaded.", name);
"User '" + name + "' loaded." }
};
ClientManager.prototype.reloadUsers = function() {
var users = this.getUsers();
for (var i in users) {
this.reloadUser(users[i]);
}
};
ClientManager.prototype.reloadUser = function(name) {
var client = this.findClient(name);
if (client) {
try {
var json = fs.readFileSync(
Helper.HOME + "/users/" + name + "/user.json",
"utf-8"
); );
json = JSON.parse(json);
} catch(e) {
console.log(e);
return;
}
if (!json) {
return;
}
client.config = json;
console.log("User '%s' reloaded.", name);
} }
}; };
@ -110,34 +143,66 @@ ClientManager.prototype.removeUser = function(name) {
return true; return true;
}; };
ClientManager.prototype.watchUser = function(name) {
var self = this;
var client = this.findClient(name);
if(!client || client.watcher) {
return;
}
var path = Helper.HOME + "/users/" + client.name + "/user.json";
var lastReload = Date.now();
client.watcher = fs.watch(path, {persistent: false}, function(event, filename) {
switch (event) {
case "change":
// user.json modified
if(Date.now() - lastReload > 50) {
self.reloadUser(client.name);
lastReload = Date.now();
}
break;
default:
break;
}
});
};
ClientManager.prototype.autoload = function(sockets) { ClientManager.prototype.autoload = function(sockets) {
var self = this; var self = this;
var loaded = ["erming"];
setInterval(function() {
var loaded = _.pluck(
self.clients,
"name"
);
var added = _.difference(self.getUsers(), loaded); // Listen to new users being added/removed
_.each(added, function(name) { fs.watch(Helper.HOME + "/users/", { persistent: false }, function(event, filename) {
self.loadUser(name); switch (event) {
}); case "rename":
if(filename === null) {
var removed = _.difference(loaded, self.getUsers()); // User removed.
var removed = _(self.clients)
.pluck('name')
.difference(self.getUsers())
.value();
_.each(removed, function(name) { _.each(removed, function(name) {
var client = _.find( var client = self.findClient(name);
self.clients, {
name: name
}
);
if (client) { if (client) {
client.quit(); client.quit();
if(client.watcher) {
client.watcher.close();
}
self.clients = _.without(self.clients, client); self.clients = _.without(self.clients, client);
console.log( console.log("User '%s' disconnected.", name);
"User '" + name + "' disconnected."
);
} }
}); });
}, 1000); } else {
// User created.
self.loadUser(filename);
self.watchUser(filename);
}
break;
default:
break;
}
});
// Listen to user modification
_.each(this.clients, function(client) {
self.watchUser(client.name);
});
}; };