Continue working on channel.js

This commit is contained in:
calzoneman 2013-12-31 15:12:47 -05:00
parent 01aab965ad
commit 1b3199a4ef
3 changed files with 282 additions and 4 deletions

View file

@ -1,5 +1,13 @@
var util = require("./utilities");
var db = require("./database");
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 = [
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 () {
var self = this;
@ -539,7 +547,7 @@ Channel.prototype.sendModMessage = function (msg, minrank) {
var notice = {
username: "[server]",
msg: msg
msg: msg,
meta: {
addClass: "server-whisper" ,
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
*/
@ -963,3 +1239,5 @@ Channel.prototype.readLog = function (filterIp, callback) {
});
});
};
module.exports = Channel;

View file

@ -40,7 +40,7 @@ var https = require("https");
var express = require("express");
var Config = require("./config");
var Logger = require("./logger");
var Channel = require("./channel");
var Channel = require("./channel-new");
var User = require("./user");
var $util = require("./utilities");
var ActionLog = require("./actionlog");

View file

@ -143,7 +143,7 @@ User.prototype.initCallbacks = function () {
self.rank = rank;
});
}
self.pendingChannel.userJoin(self);
self.pendingChannel.join(self);
});
self.socket.on("channelPassword", function (pw) {