Work on unregistered channels; fixes

This commit is contained in:
calzoneman 2014-02-02 12:41:41 -06:00
parent 0603a02d2e
commit b214c07fe0
10 changed files with 284 additions and 60 deletions

View file

@ -9,6 +9,7 @@ var MakeEmitter = require("./emitter");
var InfoGetter = require("./get-info");
var ChatCommand = require("./chatcommand");
var XSS = require("./xss");
var Media = require("./media").Media;
var fs = require("fs");
var path = require("path");
@ -452,6 +453,9 @@ Channel.prototype.preJoin = function (user, password) {
if (err) {
user.rank = user.global_rank;
} else {
if (!self.registered && user.rank > 2 && rank <= 2) {
return;
}
user.rank = Math.max(rank, user.global_rank);
}
@ -515,6 +519,21 @@ Channel.prototype.join = function (user) {
}
}
if (!self.registered) {
var hasAdmin = false;
for (var i = 0; i < self.users.length; i++) {
if (self.users[i].rank > 2) {
hasAdmin = true;
break;
}
}
if (!hasAdmin) {
user.rank = 4;
user.socket.emit("rank", 4);
}
}
self.sendUserJoin(self.users, user);
self.sendUserlist([user]);
};
@ -524,11 +543,20 @@ Channel.prototype.join = function (user) {
user.socket.join(self.uniqueName);
user.channel = self;
if (!self.registered) {
user.socket.emit("channelNotRegistered");
}
self.users.push(user);
self.sendVoteskipUpdate(self.users);
self.sendUsercount(self.users);
user.whenLoggedIn(function () {
if (!self.registered) {
afterLogin();
return;
}
db.channels.isNameBanned(self.name, user.name, function (err, banned) {
if (!err && banned) {
user.kick("You're banned!");
@ -554,6 +582,11 @@ Channel.prototype.join = function (user) {
Logger.syslog.log(user.ip + " joined channel " + self.name);
};
if (!self.registered) {
afterIPBan();
return;
}
db.channels.isIPBanned(self.name, user.ip, function (err, banned) {
if (!err && banned) {
user.kick("You're banned!");
@ -595,6 +628,19 @@ Channel.prototype.part = function (user) {
self.users.splice(idx, 1);
}
if (!self.registered && user.rank === 4) {
if (self.users.length > 0) {
for (var i = 0; i < self.users.length; i++) {
self.users[i].rank = 4;
self.users[i].socket.emit("rank", 4);
self.sendAll("setUserRank", {
name: self.users[i].name,
rank: 4
});
}
}
}
// A change in usercount might cause a voteskip result to change
self.checkVoteskipPass();
self.sendUsercount(self.users);
@ -911,6 +957,10 @@ Channel.prototype.banIP = function (actor, ip, name, reason, range) {
Channel.prototype.sendBanlist = function (users) {
var self = this;
if (!self.registered) {
return;
}
var bans = [];
var unmaskedbans = [];
db.channels.listBans(self.name, function (err, banlist) {
@ -954,6 +1004,11 @@ Channel.prototype.sendBanlist = function (users) {
*/
Channel.prototype.sendChannelRanks = function (users) {
var self = this;
if (!self.registered) {
return;
}
db.channels.allRanks(self.name, function (err, ranks) {
if (err) {
return;

View file

@ -37,6 +37,10 @@ function User(socket) {
self.initChannelCallbacks();
});
self.socket.once("initUserPLCallbacks", function () {
self.initUserPLCallbacks();
});
self.socket.once("initACP", function () {
self.whenLoggedIn(function () {
if (self.global_rank >= 255) {
@ -274,10 +278,13 @@ User.prototype.initChannelCallbacks = function () {
});
wrapTypecheck("queue", function (data) {
console.log("queue", data);
self.channel.handleQueue(self, data);
});
wrapTypecheck("queuePlaylist", function (data) {
self.channel.handleQueuePlaylist(self, data);
});
wrapTypecheck("setTemp", function (data) {
self.channel.handleSetTemp(self, data);
});
@ -526,4 +533,8 @@ User.prototype.guestLogin = function (name) {
});
};
User.prototype.initUserPLCallbacks = function () {
require("./userplaylists").init(this);
};
module.exports = User;

77
lib/userplaylists.js Normal file
View file

@ -0,0 +1,77 @@
var db = require("./database");
function listPlaylists(user) {
db.listUserPlaylists(user.name, function (err, rows) {
if (err) {
user.socket.emit("errorMsg", {
msg: "Database error when attempting to fetch list of playlists"
});
return;
}
user.socket.emit("listPlaylists", rows);
});
}
function clonePlaylist(user, data) {
if (!user.inChannel()) {
user.socket.emit("errorMsg", {
msg: "You must be in a channel in order to clone its playlist"
});
return;
}
if (typeof data.name !== "string") {
return;
}
var pl = user.channel.playlist.items.toArray();
db.saveUserPlaylist(pl, user.name, data.name, function (err, res) {
if (err) {
user.socket.emit("errorMsg", {
msg: "Database error when saving playlist"
});
} else {
listPlaylists(user);
}
});
}
function deletePlaylist(user, data) {
if (typeof data.name !== "string") {
return;
}
db.deleteUserPlaylist(user.name, data.name, function (err) {
if (err) {
user.socket.emit("errorMsg", {
msg: err
});
return;
}
setImmediate(function () {
listPlaylists(user);
});
});
}
module.exports.init = function (user) {
console.log('Initializing playlists for ' + user.name);
var s = user.socket;
var wrap = function (cb) {
return function (data) {
if (!user.loggedIn || user.rank < 1) {
s.emit("errorMsg", {
msg: "You must be logged in to manage playlists"
});
return;
}
cb(user, data);
};
};
s.on("listPlaylists", wrap(listPlaylists));
s.on("clonePlaylist", wrap(clonePlaylist));
s.on("deletePlaylist", wrap(deletePlaylist));
};