diff --git a/derplib/ch_room.js b/derplib/ch_room.js
index f29c91b..b99ca4a 100644
--- a/derplib/ch_room.js
+++ b/derplib/ch_room.js
@@ -290,22 +290,19 @@ Room.prototype._onAuth = function(){
});
this.on('frame_participant', function(_frame) {
- if(_frame.mode == 'leave'){
- if(_.has(self.users, _frame.user.sess))
- delete self.users[_frame.user.sess];
- }
- else if(_frame.mode == 'join'){
- if(!_.has(self.users, _frame.user.sess))
- self.users[_frame.user.sess] = _frame.user;
- }
- else if(_frame.mode == 'change'){
- //log in or out
- self.users[_frame.user.sess] = _frame.user;
- if(undefined === _frame.user.name){
- eventModule.emit('event', 'userLogout', _frame.user);
- }else{
- eventModule.emit('event', 'userLogin', _frame.user);
+ if(_frame.mode){
+ if(['leave-anon', 'leave-temp', 'leave-user'].indexOf(_frame.mode) !== -1){
+ if(_.has(self.users, _frame.user.sess))
+ delete self.users[_frame.user.sess];
+ }
+ else if(['join-anon', 'join-temp', 'join-user'].indexOf(_frame.mode) !== -1){
+ if(!_.has(self.users, _frame.user.sess))
+ self.users[_frame.user.sess] = _frame.user;
+ }
+ else if(['logout', 'temp', 'login'].indexOf(_frame.mode) !== -1){
+ self.users[_frame.user.sess] = _frame.user;
}
+ eventModule.emit('participant', self, _frame);
}
});
@@ -373,8 +370,8 @@ Room.prototype._onAuth = function(){
this.on('frame_mods', function(_frame) {
self.mods = _frame.mods;
- var added = _.find(self.mods, function(x){ return self.mods.indexOf(x) > -1; });
- var removed = _.find(self.mods, function(x){ return self.mods.indexOf(x) < 0; });
+ var added = _.find(Object.keys(self.mods), function(x){ return Object.keys(self.mods).indexOf(x) > -1; });
+ var removed = _.find(Object.keys(self.mods), function(x){ return Object.keys(self.mods).indexOf(x) < 0; });
if(added){
self.emit('mod_added', added);
@@ -454,8 +451,7 @@ function stringConvertEnteties(string, all){
},'');
}
-Room.prototype.message = function(body) {
-
+Room.prototype.message = function(body, channel) {
if(this._writeLock || !body) return;
var self = this;
@@ -468,13 +464,13 @@ Room.prototype.message = function(body) {
output = output.replace(/(\n\r|\r\n|\n|\r|\0)/g, '
');
_.each(output.match(/.{1,2950}/gm), function(msg){
- self.write('bmsg', 'l33t', ''+msg);
+ self.write('bm', 'l33t', utils.choose_channel(utils.find_channel(channel)[0]), ''+'
'+msg);
});
}
else{
body = String(body).replace(/(\n\r|\r\n|\n|\r|\0)/g, '
');
_.each(body.match(/.{1,2950}/gm), function(msg){
- self.write('bmsg', 'l33t', '' + self.font() + msg + self.fontEnd());
+ self.write('bm', 'l33t', utils.choose_channel(utils.find_channel(channel)[0]), '' + self.font() + msg + self.fontEnd());
});
}
};
@@ -519,7 +515,7 @@ Room.prototype.logout = function(){
Room.prototype.checkModStatus = function(){
this._isAdmin = (this.admin == this._accountLC);
- this._isModerator = (this.mods.indexOf(this._accountLC) != -1 || this._isAdmin);
+ this._isModerator = (Object.keys(this.mods).indexOf(this._accountLC) != -1 || this._isAdmin);
}
Room.prototype.addMod = function(name) {
@@ -600,10 +596,13 @@ Room.prototype.delLastUser = function(name, amount) {
}
Room.prototype.clearUser = function(name) {
+
+
if(this._isModerator && name){
_.each(this.users, function(user){
- if(user.name == name.toLowerCase() && user.key)
- this.write(['delallmsg', user.key]);
+ if(user.name == name.toLowerCase() && user.key && user.ip)
+ this.write(['delallmsg', user.key, user.ip, ['#', '_'].indexOf(user.name.charAt(0)) !== -1 ? '' : user.name]);
+
}.bind(this));
}
}
@@ -612,7 +611,7 @@ Room.prototype.modClearAll = function() {
if(this._isModerator){
var self = this;
_.each(this.users, function(user){
- if(user.key) self.write(['delallmsg', user.key]);
+ if(user.key && user.ip) self.write(['delallmsg', user.key, user.ip, ['#', '_'].indexOf(user.name.charAt(0)) !== -1 ? '' : user.name]);
});
}
}
diff --git a/derplib/frame.js b/derplib/frame.js
index a8febf3..347e51f 100644
--- a/derplib/frame.js
+++ b/derplib/frame.js
@@ -42,7 +42,7 @@ var frameTypesRoom = {
myname: myname,
jointime: jointime,
myip: myip,
- mods: mods.split(";")};
+ mods: _.reduce(mods.split(";"), function(mods, args){args = args.split(',');mods[args[0]] = args[1];return mods;},{})};
},
inited: function() {
@@ -101,27 +101,27 @@ var frameTypesRoom = {
},
mods: function(mods) {
- return {type: "mods", mods: _.toArray(arguments)};
+ return {type: "mods", mods: _.reduce(_.toArray(arguments), function(mods, args){args = args.split(',');mods[args[0]] = args[1];return mods;},{})};
},
- i: function(time, name, alias, user_id, user_key, msgid, ip, prem, _noidea) {
+ i: function(time, name, alias, user_id, user_key, msgid, ip, channel, _noidea) {
return {
time: parseFloat(time),
type: "i",
user: makeUser(name, alias, user_id, user_key, ip),
id: msgid,
- premium: makePremium(parseInt(prem, 10)),
+ channel: parseInt(channel, 10),
body: _.toArray(arguments).slice(9).join(":")};
},
- b: function(time, name, alias, user_id, user_key, number, ip, prem) {
+ b: function(time, name, alias, user_id, user_key, number, ip, channel) {
return {
time: parseFloat(time),
type: "b",
user: makeUser(name, alias, user_id, user_key, ip),
number: number,
id: false,
- premium: makePremium(parseInt(prem, 10)),
+ channel: parseInt(channel, 10),
body: _.toArray(arguments).slice(9).join(":")};
},
@@ -231,7 +231,7 @@ var frameTypesRoom = {
if(user.alias) user.alias = '#'+user.alias;
return {
type: "participant",
- mode: ( mode == "0" ? "leave" : mode == "1" ? "join" : mode == "2" ? "change" : undefined ),
+ mode: ( mode == "0" && !name && !alias ? "leave-anon" : mode == "0" && !name && alias ? "leave-temp" : mode == "0" && name && !alias ? "leave-user" : mode == "1" && !name && !alias ? "join-anon" : mode == "1" && !name && alias ? "join-temp" : mode == "1" && name && !alias ? "join-user" : mode == "2" && !name && !alias ? "logout" : mode == "2" && !name && alias ? "temp" : mode == "2" && name && !alias ? "login" : undefined ),
user: user};
},
diff --git a/derplib/request.js b/derplib/request.js
index bca494d..4088829 100644
--- a/derplib/request.js
+++ b/derplib/request.js
@@ -29,12 +29,12 @@ Request.prototype.parseMessage = function(frame) {
user_id: frame.user.id,
user_key: frame.user.key, //mod only
user_ip: frame.user.ip, //mod only
+ channel: frame.channel,
time: (+new Date),
deleted: false,
};
// Set name to lowercase
if(frame.user.name) frame.user.name = frame.user.name.toLowerCase();
-
// Parse message data
message.text = utils.html_decode(utils.html_remove(message.body));
message.nameColor = //gi.exec(message.body);
@@ -48,7 +48,7 @@ Request.prototype.parseMessage = function(frame) {
// Set user details
if(frame.user.name && frame.user.alias === undefined) {
frame.user.type = 'user';
- if(this.room.mods.indexOf(frame.user.name) != -1) {
+ if(Object.keys(this.room.mods).indexOf(frame.user.name) != -1) {
frame.user.level = 3;
} else if(this.room.admin == frame.user.name) {
frame.user.level = 4;
@@ -64,7 +64,6 @@ Request.prototype.parseMessage = function(frame) {
frame.user.level = 0;
frame.user.name = '_anon' + utils.getAnonId(message.nameColor, message.user_id);
}
-
//Extra
var self = this;
message.links = [];
@@ -97,10 +96,10 @@ Request.prototype.parseMessage = function(frame) {
Request.prototype.parsePMMessage = function(frame) {
var message = {
- //room: this.room.name,
+ room: this.room.name,
stime: frame.time, // Server time
- //name: frame.user.name.toLowerCase(),
- //alias: frame.user.alias,
+ name: frame.user.name.toLowerCase(),
+ alias: frame.user.alias,
number: undefined,
premium: frame.premium,
body: frame.body,
@@ -109,20 +108,60 @@ Request.prototype.parsePMMessage = function(frame) {
time: +new Date,
deleted: false,
};
+ // Set name to lowercase
+ if(frame.user.name) frame.user.name = frame.user.name.toLowerCase();
+ // What kind of user is it
+ if(frame.user.name && frame.user.alias) frame.user.type = 'user';
- //message.type = 'user'; // parse this properly
-
+ //CONTINUE
message.text = utils.html_decode(utils.html_remove(message.body));
+ message.nameColor = //gi.exec(message.body);
+ message.nameColor = message.nameColor ? message.nameColor[1] : false;
+ var fontMatches = //gi.exec(message.body);
+ if(fontMatches){
+ message.fontSize = fontMatches[1];
+ message.fontColor = fontMatches[2];
+ message.fontFace = fontMatches[3];
+ }
+
+ //Extra
+ var self = this;
+ message.links = [];
+ var links = message.text.match(/(\b(http:\/\/|www.)[^\s]*)/gi);
+ _.each(links, function(link){
+ link = url.parse(link);
+ if(!link.host) return;
+ link.isImage = /(.gif|.jpeg|.jpg|.png)$/i.test(link.pathname);
+ link.isYoutube = (link.host.indexOf('youtube.com') != -1 && link.search);
+ if(link.isYoutube){
+ var youtubeId = link.search.split('v=')[1];
+ if(youtubeId){
+ var ampersandPosition = youtubeId.indexOf('&');
+ if(ampersandPosition != -1){
+ link.youtubeId = youtubeId.substring(0, ampersandPosition);
+ }else{
+ link.youtubeId = youtubeId;
+ }
+ }else{
+ link.isYoutube = false;
+ }
+ }
+ message.links.push(link);
+ });
+
+ message.name = frame.user.name.toLowerCase;
+ //message.type = 'user'; // parse this properly
this.message = message;
this.user = frame.user;
}
-Request.prototype.write = function(body){
+
+Request.prototype.write = function(body, channel){
if(this.room.ispm)
this.room.message(this.user.name, body);
else
- this.room.message(body);
+ this.room.message(body, !channel ? this.message.channel : channel);
}
// Database format
diff --git a/derplib/utils.js b/derplib/utils.js
index 28f55ce..00c2f42 100644
--- a/derplib/utils.js
+++ b/derplib/utils.js
@@ -426,3 +426,25 @@ exports.getAnonName = function(num, ts) {
*/
+exports.choose_channel = function(channel) {
+ return Math.floor(65536*Math.floor(Math.random()))+Math.floor(exports.number_random(0,255)+Math.floor(256*(channel !== 0 ? Math.pow(2,channel)/2 : 0)));
+}
+
+exports.find_channel = function(channel) {
+ var channels = {
+ 0: {name: 'no color', numbers: [0,255]},
+ 1: {name: 'Vivid red', numbers: [256,511]},
+ 2: {name: 'Vivid orange', numbers: [512,767]},
+ 3: {name: 'Moderate lime green', numbers: [1024,1279]},
+ 4: {name: 'Bright blue', numbers: [2048,2303]},
+ 5: {name: 'Strong blue', numbers: [4096,4351]},
+ 6: {name: 'Dark moderate violet', numbers: [8192,8447]},
+ 7: {name: 'Vivid pink', numbers: [16384,16639]},
+ 8: {name: 'mods only', numbers: [32768,33023]}
+ }
+ for(var i = 0; i < Object.keys(channels).length; i++){
+ if(channels[i].numbers[0] <= channel && channels[i].numbers[1] >= channel || channels[i].name == channel){
+ return [i, channels[i].name];
+ }
+ }
+}