2013-03-24 02:28:20 +00:00
|
|
|
/*
|
|
|
|
The MIT License (MIT)
|
|
|
|
Copyright (c) 2013 Calvin Montgomery
|
2013-04-19 19:50:08 +00:00
|
|
|
|
2013-03-24 02:28:20 +00:00
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
2013-04-19 19:50:08 +00:00
|
|
|
|
2013-03-24 02:28:20 +00:00
|
|
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
2013-04-19 19:50:08 +00:00
|
|
|
|
2013-03-24 02:28:20 +00:00
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
2013-02-16 17:19:59 +00:00
|
|
|
|
2013-03-24 17:23:48 +00:00
|
|
|
var Channel = require("./channel.js").Channel;
|
2013-03-27 19:28:51 +00:00
|
|
|
var Logger = require("./logger.js");
|
2013-08-18 17:49:54 +00:00
|
|
|
var $util = require("./utilities");
|
2013-10-11 21:31:40 +00:00
|
|
|
var ActionLog = require("./actionlog");
|
|
|
|
var Server = require("./server");
|
|
|
|
var ACP = require("./acp");
|
|
|
|
var InfoGetter = require("./get-info");
|
2013-02-16 05:02:42 +00:00
|
|
|
|
|
|
|
// Represents a client connected via socket.io
|
2013-10-11 21:31:40 +00:00
|
|
|
var User = function (socket) {
|
2013-07-16 03:01:12 +00:00
|
|
|
this.ip = socket._ip;
|
2013-10-11 21:31:40 +00:00
|
|
|
this.server = Server.getServer();
|
2013-02-16 05:02:42 +00:00
|
|
|
this.socket = socket;
|
|
|
|
this.loggedIn = false;
|
2013-09-08 04:40:25 +00:00
|
|
|
this.loggingIn = false;
|
2013-08-30 23:42:00 +00:00
|
|
|
this.saverank = false;
|
2013-10-11 21:31:40 +00:00
|
|
|
this.rank = -1
|
|
|
|
this.global_rank = -1;
|
2013-02-16 05:02:42 +00:00
|
|
|
this.channel = null;
|
2013-11-25 22:20:15 +00:00
|
|
|
this.pendingChannel = null;
|
2013-02-16 05:02:42 +00:00
|
|
|
this.name = "";
|
2013-04-19 19:50:08 +00:00
|
|
|
this.meta = {
|
2013-06-25 14:18:33 +00:00
|
|
|
afk: false,
|
|
|
|
icon: false
|
2013-04-19 19:50:08 +00:00
|
|
|
};
|
2013-08-29 00:25:53 +00:00
|
|
|
this.queueLimiter = $util.newRateLimiter();
|
2013-11-19 21:14:40 +00:00
|
|
|
this.chatLimiter = $util.newRateLimiter();
|
2013-12-06 21:21:32 +00:00
|
|
|
this.rankListLimiter = $util.newRateLimiter();
|
2013-05-13 00:41:02 +00:00
|
|
|
this.profile = {
|
|
|
|
image: "",
|
|
|
|
text: ""
|
|
|
|
};
|
2013-07-28 21:58:22 +00:00
|
|
|
this.awaytimer = false;
|
|
|
|
this.autoAFK();
|
2013-02-16 05:02:42 +00:00
|
|
|
|
|
|
|
this.initCallbacks();
|
2013-10-11 21:31:40 +00:00
|
|
|
if (this.server.announcement !== null) {
|
|
|
|
this.socket.emit("announcement", this.server.announcement);
|
2013-03-20 18:35:06 +00:00
|
|
|
}
|
2013-02-16 05:02:42 +00:00
|
|
|
};
|
|
|
|
|
2013-09-18 23:27:42 +00:00
|
|
|
User.prototype.inChannel = function () {
|
|
|
|
return this.channel !== null && !this.channel.dead;
|
|
|
|
};
|
|
|
|
|
2013-11-25 22:20:15 +00:00
|
|
|
User.prototype.inPendingChannel = function () {
|
|
|
|
return this.pendingChannel != null && !this.pendingChannel.dead;
|
|
|
|
};
|
|
|
|
|
2013-07-28 21:58:22 +00:00
|
|
|
User.prototype.setAFK = function (afk) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (!this.inChannel())
|
2013-07-28 21:58:22 +00:00
|
|
|
return;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (this.meta.afk === afk)
|
2013-08-01 19:12:57 +00:00
|
|
|
return;
|
2013-07-28 21:58:22 +00:00
|
|
|
var chan = this.channel;
|
|
|
|
this.meta.afk = afk;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (afk) {
|
|
|
|
if (chan.voteskip)
|
2013-08-07 17:11:58 +00:00
|
|
|
chan.voteskip.unvote(this.ip);
|
2013-09-12 03:16:56 +00:00
|
|
|
} else {
|
2013-08-01 13:39:10 +00:00
|
|
|
this.autoAFK();
|
2013-07-28 21:58:22 +00:00
|
|
|
}
|
2013-08-01 13:39:10 +00:00
|
|
|
chan.checkVoteskipPass();
|
2013-08-01 19:12:57 +00:00
|
|
|
chan.sendAll("setAFK", {
|
|
|
|
name: this.name,
|
|
|
|
afk: afk
|
|
|
|
});
|
2013-09-26 18:29:36 +00:00
|
|
|
};
|
2013-07-28 21:58:22 +00:00
|
|
|
|
|
|
|
User.prototype.autoAFK = function () {
|
2013-09-26 18:29:36 +00:00
|
|
|
var self = this;
|
|
|
|
if (self.awaytimer)
|
|
|
|
clearTimeout(self.awaytimer);
|
2013-07-28 21:58:22 +00:00
|
|
|
|
2013-11-30 03:09:19 +00:00
|
|
|
if (!self.inChannel()) {
|
2013-07-28 21:58:22 +00:00
|
|
|
return;
|
2013-11-30 03:09:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
var timeout = parseFloat(self.channel.opts.afk_timeout);
|
|
|
|
if (isNaN(timeout)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (timeout <= 0) {
|
|
|
|
return;
|
|
|
|
}
|
2013-07-28 21:58:22 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.awaytimer = setTimeout(function () {
|
|
|
|
self.setAFK(true);
|
2013-11-30 03:09:19 +00:00
|
|
|
}, timeout * 1000);
|
2013-09-26 18:29:36 +00:00
|
|
|
};
|
2013-07-28 21:58:22 +00:00
|
|
|
|
2013-10-12 23:59:50 +00:00
|
|
|
User.prototype.kick = function (reason) {
|
|
|
|
this.socket.emit("kick", { reason: reason });
|
|
|
|
this.socket.disconnect(true);
|
|
|
|
};
|
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
User.prototype.initCallbacks = function () {
|
2013-08-18 17:21:34 +00:00
|
|
|
var self = this;
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("disconnect", function () {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.awaytimer && clearTimeout(self.awaytimer);
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel())
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.userLeave(self);
|
2013-12-11 20:30:53 +00:00
|
|
|
else if (self.inPendingChannel())
|
|
|
|
self.pendingChannel.userLeave(self);
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("joinChannel", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-11-30 16:50:02 +00:00
|
|
|
if (self.inChannel() || self.inPendingChannel()) {
|
2013-06-02 22:09:52 +00:00
|
|
|
return;
|
2013-11-30 16:50:02 +00:00
|
|
|
}
|
2013-10-12 23:59:50 +00:00
|
|
|
if (typeof data.name != "string") {
|
2013-03-28 23:51:08 +00:00
|
|
|
return;
|
2013-10-12 23:59:50 +00:00
|
|
|
}
|
2013-09-26 18:29:36 +00:00
|
|
|
if (!data.name.match(/^[\w-_]{1,30}$/)) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.socket.emit("errorMsg", {
|
2013-07-27 14:40:49 +00:00
|
|
|
msg: "Invalid channel name. Channel names may consist of"+
|
|
|
|
" 1-30 characters in the set a-z, A-Z, 0-9, -, and _"
|
|
|
|
});
|
2013-10-12 23:59:50 +00:00
|
|
|
self.kick("Invalid channel name");
|
2013-03-28 23:51:08 +00:00
|
|
|
return;
|
2013-07-27 14:40:49 +00:00
|
|
|
}
|
2013-04-05 19:03:35 +00:00
|
|
|
data.name = data.name.toLowerCase();
|
2013-11-25 22:20:15 +00:00
|
|
|
self.pendingChannel = self.server.getChannel(data.name);
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.loggedIn) {
|
2013-11-25 22:20:15 +00:00
|
|
|
// TODO fix
|
2013-11-30 16:50:02 +00:00
|
|
|
// I'm not sure what I meant by "fix", but I suppose I'll find out soon
|
2013-11-25 22:20:15 +00:00
|
|
|
self.pendingChannel.getRank(self.name, function (err, rank) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (!err && rank > self.rank)
|
2013-08-18 17:21:34 +00:00
|
|
|
self.rank = rank;
|
|
|
|
});
|
2013-05-17 15:02:45 +00:00
|
|
|
}
|
2013-11-25 22:20:15 +00:00
|
|
|
self.pendingChannel.userJoin(self);
|
|
|
|
});
|
|
|
|
|
|
|
|
self.socket.on("channelPassword", function (pw) {
|
|
|
|
if (!self.inChannel() && self.inPendingChannel()) {
|
|
|
|
self.pendingChannel.userJoin(self, pw);
|
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("login", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
|
|
|
var name = (typeof data.name === "string") ? data.name : "";
|
|
|
|
var pw = (typeof data.pw === "string") ? data.pw : "";
|
|
|
|
var session = (typeof data.session === "string") ? data.session : "";
|
2013-09-26 18:29:36 +00:00
|
|
|
if (pw.length > 100)
|
2013-04-26 03:50:12 +00:00
|
|
|
pw = pw.substring(0, 100);
|
2013-11-30 16:50:02 +00:00
|
|
|
if (session.length > 64)
|
|
|
|
session = session.substring(0, 64);
|
2013-09-08 04:40:25 +00:00
|
|
|
|
|
|
|
if (self.loggedIn)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (self.loggingIn) {
|
|
|
|
var j = 0;
|
|
|
|
// Wait until current login finishes
|
|
|
|
var i = setInterval(function () {
|
|
|
|
j++;
|
|
|
|
if (!self.loggingIn) {
|
|
|
|
clearInterval(i);
|
|
|
|
if (!self.loggedIn)
|
|
|
|
self.login(name, pw, session);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// Just in case to prevent the interval from going wild
|
|
|
|
if (j >= 4)
|
|
|
|
clearInterval(i);
|
|
|
|
}, 1000);
|
|
|
|
} else {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.login(name, pw, session);
|
2013-09-08 04:40:25 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("assignLeader", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryChangeLeader(self, data);
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("setChannelRank", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.trySetRank(self, data);
|
2013-06-05 15:40:59 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-05 15:40:59 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("unban", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryUnban(self, data);
|
2013-05-21 16:17:01 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-05-21 16:17:01 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("chatMsg", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-10-12 23:25:36 +00:00
|
|
|
if (typeof data.msg !== "string") {
|
|
|
|
return;
|
|
|
|
}
|
2013-09-26 18:29:36 +00:00
|
|
|
if (data.msg.indexOf("/afk") !== 0) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.setAFK(false);
|
|
|
|
self.autoAFK();
|
2013-07-30 00:06:01 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryChat(self, data);
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("newPoll", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryOpenPoll(self, data);
|
2013-04-18 16:42:07 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-18 16:42:07 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("playerReady", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.sendMediaUpdate(self);
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("requestPlaylist", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.sendPlaylist(self);
|
2013-04-17 19:05:45 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-17 19:05:45 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("queue", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryQueue(self, data);
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("setTemp", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.trySetTemp(self, data);
|
2013-05-04 22:54:28 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-05-04 22:54:28 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("delete", function (data) {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryDequeue(self, data);
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("uncache", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryUncache(self, data);
|
2013-04-27 16:48:36 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-27 16:48:36 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("moveMedia", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryMove(self, data);
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("jumpTo", function (data) {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryJumpTo(self, data);
|
2013-03-28 23:51:08 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-03-28 23:51:08 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("playNext", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryPlayNext(self);
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("clearPlaylist", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryClearqueue(self);
|
2013-04-22 20:37:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-22 20:37:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("shufflePlaylist", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryShufflequeue(self);
|
2013-04-22 20:37:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-22 20:37:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("togglePlaylistLock", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryToggleLock(self);
|
2013-03-16 20:39:58 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-03-16 20:39:58 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("mediaUpdate", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryUpdate(self, data);
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("searchMedia", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-10-12 23:59:50 +00:00
|
|
|
if (typeof data.query !== "string") {
|
|
|
|
return;
|
|
|
|
}
|
2013-11-30 16:50:02 +00:00
|
|
|
// Soft limit to prevent someone from making a massive query
|
|
|
|
if (data.query.length > 255) {
|
2013-12-01 23:10:37 +00:00
|
|
|
data.query = data.query.substring(0, 255);
|
2013-11-30 16:50:02 +00:00
|
|
|
}
|
2013-10-12 23:59:50 +00:00
|
|
|
if (data.source === "yt") {
|
2013-10-11 21:31:40 +00:00
|
|
|
var searchfn = InfoGetter.Getters.ytSearch;
|
2013-08-17 20:47:11 +00:00
|
|
|
searchfn(data.query.split(" "), function (e, vids) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (!e) {
|
2013-08-17 20:47:11 +00:00
|
|
|
self.socket.emit("searchResults", {
|
2013-09-23 21:25:45 +00:00
|
|
|
source: "yt",
|
2013-08-17 20:47:11 +00:00
|
|
|
results: vids
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
self.channel.search(data.query, function (vids) {
|
2013-11-11 04:26:30 +00:00
|
|
|
if (vids.length === 0) {
|
|
|
|
var searchfn = InfoGetter.Getters.ytSearch;
|
|
|
|
searchfn(data.query.split(" "), function (e, vids) {
|
|
|
|
if (!e) {
|
|
|
|
self.socket.emit("searchResults", {
|
|
|
|
source: "yt",
|
|
|
|
results: vids
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2013-08-17 20:47:11 +00:00
|
|
|
self.socket.emit("searchResults", {
|
2013-09-23 21:25:45 +00:00
|
|
|
source: "library",
|
2013-04-04 16:39:43 +00:00
|
|
|
results: vids
|
|
|
|
});
|
2013-08-17 23:51:10 +00:00
|
|
|
});
|
2013-04-04 16:39:43 +00:00
|
|
|
}
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("closePoll", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryClosePoll(self);
|
2013-03-16 21:49:58 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-03-16 21:49:58 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("vote", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryVote(self, data);
|
2013-03-16 21:49:58 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-03-16 21:49:58 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("registerChannel", function (data) {
|
|
|
|
if (!self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.socket.emit("channelRegistration", {
|
2013-03-17 17:14:34 +00:00
|
|
|
success: false,
|
|
|
|
error: "You're not in any channel!"
|
|
|
|
});
|
2013-09-26 18:29:36 +00:00
|
|
|
} else {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryRegister(self);
|
2013-03-17 17:14:34 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-03-17 17:14:34 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("unregisterChannel", function () {
|
|
|
|
if (!self.inChannel()) {
|
2013-05-13 19:41:29 +00:00
|
|
|
return;
|
|
|
|
}
|
2013-10-12 23:59:50 +00:00
|
|
|
if (self.rank < 10) {
|
|
|
|
self.kick("Attempted unregisterChannel with insufficient permission");
|
|
|
|
return;
|
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.unregister(self);
|
|
|
|
});
|
2013-05-13 19:41:29 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("setOptions", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryUpdateOptions(self, data);
|
2013-03-22 20:04:04 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-03-31 19:27:54 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("setPermissions", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryUpdatePermissions(self, data);
|
2013-05-22 19:38:16 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-05-22 19:38:16 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("setChannelCSS", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.trySetCSS(self, data);
|
2013-05-15 15:34:27 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-05-15 15:34:27 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("setChannelJS", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.trySetJS(self, data);
|
2013-05-15 15:34:27 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-05-15 15:34:27 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("updateFilter", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryUpdateFilter(self, data);
|
2013-06-18 15:51:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-18 15:51:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("removeFilter", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryRemoveFilter(self, data);
|
2013-06-18 15:51:42 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-18 15:51:42 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("moveFilter", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryMoveFilter(self, data);
|
2013-03-31 19:27:54 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-01 21:02:09 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("setMotd", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryUpdateMotd(self, data);
|
2013-03-31 19:27:54 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-19 19:50:08 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("requestLoginHistory", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.sendLoginHistory(self);
|
2013-06-18 03:57:29 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-18 03:57:29 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("requestBanlist", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.sendBanlist(self);
|
2013-06-18 04:26:44 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-18 04:26:44 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("requestChatFilters", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.sendChatFilters(self);
|
2013-04-23 18:47:09 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-23 18:47:09 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("requestChannelRanks", function () {
|
|
|
|
if (self.inChannel()) {
|
2013-12-06 21:21:32 +00:00
|
|
|
if (self.rankListLimiter.throttle({
|
|
|
|
burst: 0,
|
|
|
|
sustained: 0.1,
|
|
|
|
cooldown: 10
|
|
|
|
})) {
|
|
|
|
self.socket.emit("noflood", {
|
|
|
|
action: "channel ranks",
|
|
|
|
msg: "You may only refresh channel ranks once every 10 seconds"
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
self.channel.sendChannelRanks(self);
|
|
|
|
}
|
2013-04-29 23:59:51 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-04-29 23:59:51 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("voteskip", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryVoteskip(self);
|
2013-04-02 19:07:22 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-05-13 00:41:02 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("listPlaylists", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.name === "" || self.rank < 1) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.socket.emit("listPlaylists", {
|
2013-06-01 15:59:04 +00:00
|
|
|
pllist: [],
|
|
|
|
error: "You must be logged in to manage playlists"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-08-18 17:21:34 +00:00
|
|
|
self.server.db.listUserPlaylists(self.name, function (err, list) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (err)
|
2013-08-18 17:21:34 +00:00
|
|
|
list = [];
|
|
|
|
for(var i = 0; i < list.length; i++) {
|
2013-08-24 02:06:29 +00:00
|
|
|
list[i].time = $util.formatTime(list[i].time);
|
2013-08-18 17:21:34 +00:00
|
|
|
}
|
|
|
|
self.socket.emit("listPlaylists", {
|
2013-09-26 18:29:36 +00:00
|
|
|
pllist: list
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-01 15:59:04 +00:00
|
|
|
});
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-01 15:59:04 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("savePlaylist", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
|
|
|
if (typeof data.name !== "string") {
|
|
|
|
return;
|
|
|
|
}
|
2013-11-30 16:50:02 +00:00
|
|
|
// Soft limit to prevent someone from saving a list with a massive name
|
|
|
|
if (data.name.length > 200) {
|
|
|
|
data.name = data.name.substring(0, 200);
|
|
|
|
}
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.rank < 1) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.socket.emit("savePlaylist", {
|
2013-06-01 15:59:04 +00:00
|
|
|
success: false,
|
|
|
|
error: "You must be logged in to manage playlists"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
if (!self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.socket.emit("savePlaylist", {
|
2013-06-01 15:59:04 +00:00
|
|
|
success: false,
|
|
|
|
error: "Not in a channel"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
if (typeof data.name != "string") {
|
2013-06-01 15:59:04 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-08-18 17:21:34 +00:00
|
|
|
var pl = self.channel.playlist.items.toArray();
|
|
|
|
self.server.db.saveUserPlaylist(pl, self.name, data.name,
|
|
|
|
function (err, res) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (err) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.socket.emit("savePlaylist", {
|
|
|
|
success: false,
|
|
|
|
error: err
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
self.socket.emit("savePlaylist", {
|
|
|
|
success: true
|
|
|
|
});
|
|
|
|
|
|
|
|
self.server.db.listUserPlaylists(self.name,
|
|
|
|
function (err, list) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (err)
|
2013-08-18 17:21:34 +00:00
|
|
|
list = [];
|
|
|
|
for(var i = 0; i < list.length; i++) {
|
2013-08-24 02:06:29 +00:00
|
|
|
list[i].time = $util.formatTime(list[i].time);
|
2013-08-18 17:21:34 +00:00
|
|
|
}
|
|
|
|
self.socket.emit("listPlaylists", {
|
2013-09-26 18:29:36 +00:00
|
|
|
pllist: list
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
|
|
|
});
|
2013-06-01 20:56:23 +00:00
|
|
|
});
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-01 19:42:08 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("queuePlaylist", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryQueuePlaylist(self, data);
|
2013-06-01 19:42:08 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-01 20:56:23 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("deletePlaylist", function (data) {
|
2013-10-12 23:59:50 +00:00
|
|
|
data = (typeof data !== "object") ? {} : data;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (typeof data.name != "string") {
|
2013-06-01 20:56:23 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-08-18 17:21:34 +00:00
|
|
|
self.server.db.deleteUserPlaylist(self.name, data.name,
|
|
|
|
function () {
|
|
|
|
self.server.db.listUserPlaylists(self.name,
|
|
|
|
function (err, list) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (err)
|
2013-08-18 17:21:34 +00:00
|
|
|
list = [];
|
|
|
|
for(var i = 0; i < list.length; i++) {
|
2013-08-24 02:06:29 +00:00
|
|
|
list[i].time = $util.formatTime(list[i].time);
|
2013-08-18 17:21:34 +00:00
|
|
|
}
|
|
|
|
self.socket.emit("listPlaylists", {
|
2013-09-26 18:29:36 +00:00
|
|
|
pllist: list
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
|
|
|
});
|
2013-06-01 20:56:23 +00:00
|
|
|
});
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-20 23:45:21 +00:00
|
|
|
|
2013-08-18 17:21:34 +00:00
|
|
|
self.socket.on("readChanLog", function () {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.tryReadLog(self);
|
2013-08-06 18:20:47 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-08-06 18:20:47 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("acp-init", function () {
|
2013-10-11 21:31:40 +00:00
|
|
|
if (self.global_rank >= 255)
|
|
|
|
ACP.init(self);
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-06-23 14:25:49 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
self.socket.on("borrow-rank", function (rank) {
|
|
|
|
if (self.global_rank < 255)
|
2013-06-23 14:25:49 +00:00
|
|
|
return;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (rank > self.global_rank)
|
2013-06-23 14:25:49 +00:00
|
|
|
return;
|
|
|
|
|
2013-08-18 17:21:34 +00:00
|
|
|
self.rank = rank;
|
|
|
|
self.socket.emit("rank", rank);
|
2013-11-09 18:33:18 +00:00
|
|
|
if (self.inChannel()) {
|
|
|
|
self.channel.sendAll("setUserRank", {
|
|
|
|
name: self.name,
|
|
|
|
rank: rank
|
|
|
|
});
|
|
|
|
}
|
2013-06-23 14:25:49 +00:00
|
|
|
|
2013-08-18 17:21:34 +00:00
|
|
|
});
|
2013-09-26 18:29:36 +00:00
|
|
|
};
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-05-03 03:13:46 +00:00
|
|
|
var lastguestlogin = {};
|
2013-09-26 18:18:37 +00:00
|
|
|
User.prototype.guestLogin = function (name) {
|
2013-08-17 20:54:23 +00:00
|
|
|
var self = this;
|
2013-09-26 18:18:37 +00:00
|
|
|
|
|
|
|
if (self.ip in lastguestlogin) {
|
|
|
|
var diff = (Date.now() - lastguestlogin[self.ip])/1000;
|
|
|
|
if (diff < self.server.cfg["guest-login-delay"]) {
|
2013-08-17 20:54:23 +00:00
|
|
|
self.socket.emit("login", {
|
|
|
|
success: false,
|
2013-09-26 18:18:37 +00:00
|
|
|
error: "Guest logins are restricted to one per IP address "+
|
|
|
|
"per " + self.server.cfg["guest-login-delay"] +
|
2013-09-26 18:29:36 +00:00
|
|
|
" seconds."
|
2013-08-17 20:54:23 +00:00
|
|
|
});
|
2013-09-26 18:18:37 +00:00
|
|
|
return false;
|
2013-08-17 20:54:23 +00:00
|
|
|
}
|
2013-09-26 18:18:37 +00:00
|
|
|
}
|
2013-08-17 20:54:23 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
if (!$util.isValidUserName(name)) {
|
2013-09-26 18:18:37 +00:00
|
|
|
self.socket.emit("login", {
|
|
|
|
success: false,
|
|
|
|
error: "Invalid username. Usernames must be 1-20 characters "+
|
|
|
|
"long and consist only of characters a-z, A-Z, 0-9, -, "+
|
|
|
|
"and _"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2013-08-17 20:54:23 +00:00
|
|
|
|
2013-09-26 18:18:37 +00:00
|
|
|
// Set the loggingIn flag to avoid race conditions with the callback
|
|
|
|
self.loggingIn = true;
|
|
|
|
self.server.db.isUsernameTaken(name, function (err, taken) {
|
|
|
|
self.loggingIn = false;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (err) {
|
2013-09-26 18:18:37 +00:00
|
|
|
self.socket.emit("login", {
|
|
|
|
success: false,
|
|
|
|
error: "Internal error: " + err
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2013-08-17 20:54:23 +00:00
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
if (taken) {
|
2013-08-17 20:54:23 +00:00
|
|
|
self.socket.emit("login", {
|
2013-09-26 18:18:37 +00:00
|
|
|
success: false,
|
|
|
|
error: "That username is registered and protected."
|
2013-02-16 05:02:42 +00:00
|
|
|
});
|
2013-09-26 18:18:37 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-10-06 01:42:15 +00:00
|
|
|
var lname = name.toLowerCase();
|
2013-09-26 18:18:37 +00:00
|
|
|
for(var i = 0; i < self.channel.users.length; i++) {
|
2013-10-06 01:42:15 +00:00
|
|
|
if (self.channel.users[i].name.toLowerCase() === lname) {
|
2013-09-26 18:18:37 +00:00
|
|
|
self.socket.emit("login", {
|
|
|
|
success: false,
|
|
|
|
error: "That name is already in use on this channel"
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2013-06-19 21:54:27 +00:00
|
|
|
}
|
2013-09-26 18:18:37 +00:00
|
|
|
}
|
|
|
|
lastguestlogin[self.ip] = Date.now();
|
|
|
|
self.rank = 0;
|
|
|
|
Logger.syslog.log(self.ip + " signed in as " + name);
|
|
|
|
self.server.db.recordVisit(self.ip, name);
|
|
|
|
self.name = name;
|
|
|
|
self.loggedIn = false;
|
|
|
|
self.socket.emit("login", {
|
|
|
|
success: true,
|
|
|
|
name: name
|
2013-08-17 23:51:10 +00:00
|
|
|
});
|
2013-09-26 18:18:37 +00:00
|
|
|
self.socket.emit("rank", self.rank);
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-09-26 18:18:37 +00:00
|
|
|
self.channel.logger.log(self.ip + " signed in as " + name);
|
|
|
|
self.channel.broadcastNewUser(self);
|
|
|
|
}
|
|
|
|
});
|
2013-09-26 18:29:36 +00:00
|
|
|
};
|
|
|
|
|
2013-09-26 18:18:37 +00:00
|
|
|
// Attempt to login
|
2013-09-26 18:29:36 +00:00
|
|
|
User.prototype.login = function (name, pw, session) {
|
2013-09-26 18:18:37 +00:00
|
|
|
var self = this;
|
|
|
|
// No password => try guest login
|
2013-09-26 18:29:36 +00:00
|
|
|
if (pw === "" && session === "") {
|
2013-09-26 18:18:37 +00:00
|
|
|
this.guestLogin(name);
|
2013-08-17 20:54:23 +00:00
|
|
|
} else {
|
2013-09-08 04:40:25 +00:00
|
|
|
self.loggingIn = true;
|
2013-08-17 20:54:23 +00:00
|
|
|
self.server.db.userLogin(name, pw, session, function (err, row) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (err) {
|
2013-09-08 04:40:25 +00:00
|
|
|
self.loggingIn = false;
|
2013-10-11 21:31:40 +00:00
|
|
|
ActionLog.record(self.ip, name, "login-failure",
|
2013-09-26 18:18:37 +00:00
|
|
|
err);
|
2013-08-17 20:54:23 +00:00
|
|
|
self.socket.emit("login", {
|
2013-06-19 21:54:27 +00:00
|
|
|
success: false,
|
2013-08-17 20:54:23 +00:00
|
|
|
error: err
|
2013-06-19 21:54:27 +00:00
|
|
|
});
|
2013-08-17 20:54:23 +00:00
|
|
|
return;
|
2013-02-16 05:02:42 +00:00
|
|
|
}
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-09-26 18:18:37 +00:00
|
|
|
var n = name.toLowerCase();
|
2013-08-17 20:54:23 +00:00
|
|
|
for(var i = 0; i < self.channel.users.length; i++) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.channel.users[i].name.toLowerCase() === n) {
|
2013-09-26 18:18:37 +00:00
|
|
|
if (self.channel.users[i] === self) {
|
2013-09-08 04:40:25 +00:00
|
|
|
Logger.errlog.log("Wat: user.login() but user "+
|
2013-09-07 20:44:57 +00:00
|
|
|
"already logged in on channel");
|
|
|
|
break;
|
|
|
|
}
|
2013-09-26 18:18:37 +00:00
|
|
|
self.channel.kick(self.channel.users[i],
|
|
|
|
"Duplicate login");
|
2013-08-17 20:54:23 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-09-26 18:18:37 +00:00
|
|
|
// Record logins for administrator accounts
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.global_rank >= 255)
|
2013-10-11 21:31:40 +00:00
|
|
|
ActionLog.record(self.ip, name, "login-success");
|
2013-08-17 20:54:23 +00:00
|
|
|
self.loggedIn = true;
|
2013-09-08 04:40:25 +00:00
|
|
|
self.loggingIn = false;
|
2013-08-17 20:54:23 +00:00
|
|
|
self.socket.emit("login", {
|
|
|
|
success: true,
|
|
|
|
session: row.session_hash,
|
|
|
|
name: name
|
2013-02-16 05:02:42 +00:00
|
|
|
});
|
2013-08-17 20:54:23 +00:00
|
|
|
Logger.syslog.log(self.ip + " logged in as " + name);
|
|
|
|
self.server.db.recordVisit(self.ip, name);
|
|
|
|
self.profile = {
|
|
|
|
image: row.profile_image,
|
|
|
|
text: row.profile_text
|
|
|
|
};
|
|
|
|
self.global_rank = row.global_rank;
|
2013-08-18 17:21:34 +00:00
|
|
|
var afterRankLookup = function () {
|
|
|
|
self.socket.emit("rank", self.rank);
|
|
|
|
self.name = name;
|
2013-09-26 18:29:36 +00:00
|
|
|
if (self.inChannel()) {
|
2013-08-18 17:21:34 +00:00
|
|
|
self.channel.logger.log(self.ip + " logged in as " +
|
|
|
|
name);
|
|
|
|
self.channel.broadcastNewUser(self);
|
2013-11-25 22:20:15 +00:00
|
|
|
} else if (self.inPendingChannel()) {
|
|
|
|
self.pendingChannel.userJoin(self);
|
2013-08-18 17:21:34 +00:00
|
|
|
}
|
|
|
|
};
|
2013-11-25 22:20:15 +00:00
|
|
|
if (self.inChannel() || self.inPendingChannel()) {
|
|
|
|
var chan = self.channel != null ? self.channel : self.pendingChannel;
|
|
|
|
chan.getRank(name, function (err, rank) {
|
2013-09-26 18:29:36 +00:00
|
|
|
if (!err) {
|
2013-08-30 23:42:00 +00:00
|
|
|
self.saverank = true;
|
2013-08-18 17:21:34 +00:00
|
|
|
self.rank = rank;
|
2013-08-30 23:42:00 +00:00
|
|
|
} else {
|
2013-09-26 18:18:37 +00:00
|
|
|
// If there was an error in retrieving the rank,
|
|
|
|
// don't overwrite it with a bad value
|
2013-08-30 23:42:00 +00:00
|
|
|
self.saverank = false;
|
2013-08-18 19:21:42 +00:00
|
|
|
self.rank = self.global_rank;
|
2013-08-30 23:42:00 +00:00
|
|
|
}
|
2013-08-18 17:21:34 +00:00
|
|
|
afterRankLookup();
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
self.rank = self.global_rank;
|
|
|
|
afterRankLookup();
|
2013-08-17 20:54:23 +00:00
|
|
|
}
|
2013-02-16 05:02:42 +00:00
|
|
|
});
|
|
|
|
}
|
2013-09-26 18:29:36 +00:00
|
|
|
};
|
2013-02-16 05:02:42 +00:00
|
|
|
|
2013-07-16 03:01:12 +00:00
|
|
|
module.exports = User;
|