Continue working on channel.js
This commit is contained in:
parent
01aab965ad
commit
1b3199a4ef
|
@ -1,5 +1,13 @@
|
||||||
var util = require("./utilities");
|
var util = require("./utilities");
|
||||||
|
var db = require("./database");
|
||||||
var Playlist = require("./playlist");
|
var Playlist = require("./playlist");
|
||||||
|
var Filter = require("./filter").Filter;
|
||||||
|
var Logger = require("./logger");
|
||||||
|
var AsyncQueue = require("./asyncqueue");
|
||||||
|
|
||||||
|
var EventEmitter = require("events").EventEmitter;
|
||||||
|
var fs = require("fs");
|
||||||
|
var path = require("path");
|
||||||
|
|
||||||
var DEFAULT_FILTERS = [
|
var DEFAULT_FILTERS = [
|
||||||
new Filter("monospace", "`(.+?)`", "g", "<code>$1</code>"),
|
new Filter("monospace", "`(.+?)`", "g", "<code>$1</code>"),
|
||||||
|
@ -108,7 +116,7 @@ function Channel(name) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Channel.prototype = EventEmitter;
|
Channel.prototype = EventEmitter.prototype;
|
||||||
|
|
||||||
Channel.prototype.tryLoadState = function () {
|
Channel.prototype.tryLoadState = function () {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
@ -539,7 +547,7 @@ Channel.prototype.sendModMessage = function (msg, minrank) {
|
||||||
|
|
||||||
var notice = {
|
var notice = {
|
||||||
username: "[server]",
|
username: "[server]",
|
||||||
msg: msg
|
msg: msg,
|
||||||
meta: {
|
meta: {
|
||||||
addClass: "server-whisper" ,
|
addClass: "server-whisper" ,
|
||||||
addClassToNameAndTimestamp: true
|
addClassToNameAndTimestamp: true
|
||||||
|
@ -853,6 +861,274 @@ Channel.prototype.sendPlaylist = function (users) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the playlist count/time
|
||||||
|
*/
|
||||||
|
Channel.prototype.updatePlaylistMeta = function () {
|
||||||
|
var total = 0;
|
||||||
|
var iter = this.playlist.items.first;
|
||||||
|
while (iter !== null) {
|
||||||
|
if (iter.media !== null) {
|
||||||
|
total += iter.media.seconds;
|
||||||
|
}
|
||||||
|
iter = iter.next;
|
||||||
|
}
|
||||||
|
|
||||||
|
var timestr = util.formatTime(total);
|
||||||
|
this.plmeta = {
|
||||||
|
count: this.playlist.items.length,
|
||||||
|
time: timestr
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send the playlist count/time
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendPlaylistMeta = function (users) {
|
||||||
|
var self = this;
|
||||||
|
users.forEach(function (u) {
|
||||||
|
u.socket.emit("setPlaylistMeta", self.plmeta);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a changeMedia packet
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendMediaUpdate = function (users) {
|
||||||
|
var update = this.playlist.getFullUpdate();
|
||||||
|
if (update) {
|
||||||
|
users.forEach(function (u) {
|
||||||
|
u.socket.emit("changeMedia", update);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send the userlist
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendUserlist = function (toUsers) {
|
||||||
|
var users = [];
|
||||||
|
var detailedUsers = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < this.users.length; i++) {
|
||||||
|
var u = this.users[i];
|
||||||
|
if (u.name === "") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
users.push({
|
||||||
|
name: u.name,
|
||||||
|
rank: u.rank,
|
||||||
|
profile: u.profile
|
||||||
|
});
|
||||||
|
|
||||||
|
detailedUsers.push({
|
||||||
|
name: u.name,
|
||||||
|
rank: u.rank,
|
||||||
|
meta: u.meta,
|
||||||
|
profile: u.profile
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
toUsers.forEach(function (u) {
|
||||||
|
if (u.rank >= 2) {
|
||||||
|
u.socket.emit("userlist", detailedUsers);
|
||||||
|
} else {
|
||||||
|
u.socket.emit("userlist", users);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.leader !== null) {
|
||||||
|
u.socket.emit("setLeader", this.leader.name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send the user count
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendUsercount = function (users) {
|
||||||
|
var self = this;
|
||||||
|
users.forEach(function (u) {
|
||||||
|
u.socket.emit("usercount", self.users.length);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send the chat buffer
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendRecentChat = function (users) {
|
||||||
|
var self = this;
|
||||||
|
users.forEach(function (u) {
|
||||||
|
for (var i = 0; i < self.chatbuffer.length; i++) {
|
||||||
|
u.socket.emit("chatMsg", self.chatbuffer[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a user join notification
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendUserJoin = function (users, user) {
|
||||||
|
var self = this;
|
||||||
|
db.getAliases(user.ip, function (err, aliases) {
|
||||||
|
if (self.dead) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
aliases = [user.name];
|
||||||
|
}
|
||||||
|
|
||||||
|
user.meta.aliases = aliases;
|
||||||
|
|
||||||
|
if (user.name.toLowerCase() in self.namebans) {
|
||||||
|
user.kick("You're banned!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self.mutedUsers.contains("[shadow]"+user.name.toLowerCase())) {
|
||||||
|
user.meta.muted = true;
|
||||||
|
user.meta.shadowmuted = true;
|
||||||
|
user.meta.icon = "icon-volume-off";
|
||||||
|
} else if (self.mutedUsers.contains(user.name.toLowerCase())) {
|
||||||
|
user.meta.muted = true;
|
||||||
|
user.meta.shadowmuted = false;
|
||||||
|
user.meta.icon = "icon-volume-off";
|
||||||
|
}
|
||||||
|
|
||||||
|
var base = {
|
||||||
|
name: user.name,
|
||||||
|
rank: user.rank,
|
||||||
|
profile: user.profile,
|
||||||
|
meta: {
|
||||||
|
afk: user.meta.afk
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (user.meta.icon && !user.meta.shadowmuted) {
|
||||||
|
base.meta.icon = user.meta.icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
var mod = {
|
||||||
|
name: user.name,
|
||||||
|
rank: user.rank,
|
||||||
|
profile: user.profile,
|
||||||
|
meta: {
|
||||||
|
afk: user.meta.afk,
|
||||||
|
icon: user.meta.icon
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
users.forEach(function (u) {
|
||||||
|
if (u.rank >= 2) {
|
||||||
|
u.socket.emit("addUser", mod);
|
||||||
|
} else {
|
||||||
|
u.socket.emit("addUser", base);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
self.sendModMessage(user.name + " joined (aliases: " + aliases.join(",") + ")", 2);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a poll notification
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendPollUpdate = function (users) {
|
||||||
|
var self = this;
|
||||||
|
var unhidden = self.poll.packUpdate(true);
|
||||||
|
var hidden = self.poll.packUpdate(false);
|
||||||
|
|
||||||
|
users.forEach(function (u) {
|
||||||
|
if (self.hasPermission(u, "viewhiddenpoll")) {
|
||||||
|
u.socket.emit("newPoll", unhidden);
|
||||||
|
} else {
|
||||||
|
u.socket.emit("newPoll", hidden);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a "poll closed" notification
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendPollClose = function (users) {
|
||||||
|
users.forEach(function (u) {
|
||||||
|
u.socket.emit("closePoll");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Broadcasts the channel options
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendOpts = function (users) {
|
||||||
|
var self = this;
|
||||||
|
users.forEach(function (u) {
|
||||||
|
u.socket.emit("channelOpts", self.opts);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the number of eligible users to voteskip
|
||||||
|
*/
|
||||||
|
Channel.prototype.calcVoteskipMax = function () {
|
||||||
|
var self = this;
|
||||||
|
return this.users.map(function (u) {
|
||||||
|
if (!self.hasPermission(u, "voteskip")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.meta.afk ? 0 : 1;
|
||||||
|
}).reduce(function (a, b) {
|
||||||
|
return a + b;
|
||||||
|
}, 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a voteskip update packet
|
||||||
|
*/
|
||||||
|
Channel.prototype.getVoteskipPacket = function () {
|
||||||
|
var have = this.voteskip ? this.voteskip.counts[0] : 0;
|
||||||
|
var max = this.calcVoteskipMax();
|
||||||
|
var need = this.voteskip ? Math.ceil(max * this.opts.voteskip_ratio) : 0;
|
||||||
|
return {
|
||||||
|
count: have,
|
||||||
|
need: need
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a voteskip update packet
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendVoteskipUpdate = function (users) {
|
||||||
|
var self = this;
|
||||||
|
var update = self.getVoteskipPacket();
|
||||||
|
users.forEach(function (u) {
|
||||||
|
if (u.rank >= 1.5) {
|
||||||
|
u.socket.emit("voteskip", update);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends the MOTD
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendMotd = function (users) {
|
||||||
|
var self = this;
|
||||||
|
users.forEach(function (u) {
|
||||||
|
u.socket.emit("setMotd", self.motd);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends the drink count
|
||||||
|
*/
|
||||||
|
Channel.prototype.sendDrinks = function (users) {
|
||||||
|
var self = this;
|
||||||
|
users.forEach(function (u) {
|
||||||
|
u.socket.emit("drinkCount", self.drinks);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches channel library
|
* Searches channel library
|
||||||
*/
|
*/
|
||||||
|
@ -963,3 +1239,5 @@ Channel.prototype.readLog = function (filterIp, callback) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module.exports = Channel;
|
||||||
|
|
|
@ -40,7 +40,7 @@ var https = require("https");
|
||||||
var express = require("express");
|
var express = require("express");
|
||||||
var Config = require("./config");
|
var Config = require("./config");
|
||||||
var Logger = require("./logger");
|
var Logger = require("./logger");
|
||||||
var Channel = require("./channel");
|
var Channel = require("./channel-new");
|
||||||
var User = require("./user");
|
var User = require("./user");
|
||||||
var $util = require("./utilities");
|
var $util = require("./utilities");
|
||||||
var ActionLog = require("./actionlog");
|
var ActionLog = require("./actionlog");
|
||||||
|
|
|
@ -143,7 +143,7 @@ User.prototype.initCallbacks = function () {
|
||||||
self.rank = rank;
|
self.rank = rank;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
self.pendingChannel.userJoin(self);
|
self.pendingChannel.join(self);
|
||||||
});
|
});
|
||||||
|
|
||||||
self.socket.on("channelPassword", function (pw) {
|
self.socket.on("channelPassword", function (pw) {
|
||||||
|
|
Loading…
Reference in a new issue