mirror of
https://github.com/thelounge/thelounge
synced 2024-11-23 12:33:07 +00:00
Refactored Autoload
Autoload now uses kernel events to watch files on disk. This greatly increases performance and reliability. Autoload will also watch user.json files for changes and reload the users data.
This commit is contained in:
parent
0ba67481fb
commit
8a61e4e969
1 changed files with 88 additions and 30 deletions
|
@ -13,7 +13,7 @@ function ClientManager() {
|
|||
if(!/^win/.test(process.platform)) {
|
||||
process.on('SIGHUP', function() {
|
||||
console.log("Received 'SIGHUP'. Reloading Users.");
|
||||
self.loadUsers();
|
||||
self.reloadUsers();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -55,9 +55,35 @@ ClientManager.prototype.loadUser = function(name) {
|
|||
name,
|
||||
json
|
||||
));
|
||||
console.log(
|
||||
"User '" + name + "' loaded."
|
||||
);
|
||||
console.log("User '%s' loaded.", name);
|
||||
}
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -117,34 +143,66 @@ ClientManager.prototype.removeUser = function(name) {
|
|||
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) {
|
||||
var self = this;
|
||||
var loaded = ["erming"];
|
||||
setInterval(function() {
|
||||
var loaded = _.pluck(
|
||||
self.clients,
|
||||
"name"
|
||||
);
|
||||
|
||||
var added = _.difference(self.getUsers(), loaded);
|
||||
_.each(added, function(name) {
|
||||
self.loadUser(name);
|
||||
});
|
||||
|
||||
var removed = _.difference(loaded, self.getUsers());
|
||||
_.each(removed, function(name) {
|
||||
var client = _.find(
|
||||
self.clients, {
|
||||
name: name
|
||||
}
|
||||
);
|
||||
if (client) {
|
||||
client.quit();
|
||||
self.clients = _.without(self.clients, client);
|
||||
console.log(
|
||||
"User '" + name + "' disconnected."
|
||||
);
|
||||
// Listen to new users being added/removed
|
||||
fs.watch(Helper.HOME + "/users/", { persistent: false }, function(event, filename) {
|
||||
switch (event) {
|
||||
case "rename":
|
||||
if(filename === null) {
|
||||
// User removed.
|
||||
var removed = _(self.clients)
|
||||
.pluck('name')
|
||||
.difference(self.getUsers())
|
||||
.value();
|
||||
_.each(removed, function(name) {
|
||||
var client = self.findClient(name);
|
||||
if (client) {
|
||||
client.quit();
|
||||
if(client.watcher) {
|
||||
client.watcher.close();
|
||||
}
|
||||
self.clients = _.without(self.clients, client);
|
||||
console.log("User '%s' disconnected.", name);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// User created.
|
||||
self.loadUser(filename);
|
||||
self.watchUser(filename);
|
||||
}
|
||||
});
|
||||
}, 1000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// Listen to user modification
|
||||
_.each(this.clients, function(client) {
|
||||
self.watchUser(client.name);
|
||||
});
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue