function Channel() {
EventEmitter.call(this);
this.callbacks = [];
this.messages = [];
this.channels = [];
this.listSs = [];
this.chCfg = require("./config").Config("CHANNEL");
var a = this;
setInterval(function () {
var b = new Date;
for(var c in a.callbacks) {
while(a.callbacks[c].length > 0 && b - a.callbacks[c][0].timestamp > a.chCfg.callback_timeout) a.callbacks[c].shift().callback([])
}
}, 5e3)
}
var util = require("util");
var EventEmitter = require("events").EventEmitter;
util.inherits(Channel, EventEmitter);
module.exports = Channel;
Channel.prototype.createChannel = function (a, b, c, d) {
var e = {};
switch(d) {
case "randomChat":
e = {
id: a,
chId: Math.floor(Math.random() * 99999999).toString(),
gender: b,
find: c,
available: true,
type: d
};
break;
case "groupChat":
e = {
mem: [a],
chId: Math.floor(Math.random() * 99999999).toString(),
type: d,
identify: 1
};
break;
default:
break
}
this.channels.push(e);
if(!this.messages[e.chId]) this.messages[e.chId] = [];
if(!this.callbacks[e.chId]) this.callbacks[e.chId] = [];
return e.chId
};
Channel.prototype.joinChannel = function (a, b, c, d) {
var e = "";
var f = "";
var g = {
wait: true,
chId: f
};
switch(d) {
case "randomChat":
e = this.joinRandomChannel(b, c);
break;
case "groupChat":
e = this.joinGroupChannel(a);
break;
default:
break
}
if(e !== -1) {
f = this.channels[e].chId;
var h = {};
if(d === "groupChat") {
if(this.channels[e].mem.length > 2) g.wait = false;
this.channels[e].identify++;
g.identify = this.channels[e].identify
} else if(d === "randomChat") {
h = {
id: a,
chId: f,
gender: b,
find: c,
available: false,
type: d
};
g.wait = false;
this.channels.push(h)
}
} else {
f = this.createChannel(a, b, c, d);
if(d == "groupChat") g.identify = 1
}
g.chId = f;
if(!this.listSs[f]) this.listSs[f] = [];
this.listSs[f].push({
id: a
});
return g
};
Channel.prototype.joinRandomChannel = function (a, b) {
var c = -1;
switch(b) {
case "all":
for(var d in this.channels) if(this.channels[d].type == "randomChat" && (this.channels[d].find == b && this.channels[d].available == true || this.channels[d].find == a && this.channels[d].available == true)) {
this.channels[d].available = false;
c = d;
break
}
break;
case "male":
case "female":
for(var d in this.channels) if(this.channels[d].type == "randomChat" && (this.channels[d].find == a && b == this.channels[d].gender && this.channels[d].available == true || this.channels[d].find == "all" && this.channels[d].available == true)) {
this.channels[d].available = false;
c = d;
break
}
break;
case "none":
for(var d in this.channels) if(this.channels[d].type == "randomChat" && this.channels[d].available == true) {
this.channels[d].available = false;
c = d;
break
}
break;
default:
break
}
return c
};
Channel.prototype.joinGroupChannel = function (a) {
var b = -1;
for(var c in this.channels) if(this.channels[c].type === "groupChat" && this.channels[c].mem.length < chCfg.group_chat_max_user) {
this.channels[c].mem.push(a);
b = c;
break
}
return b
};
Channel.prototype.countUserOnline = function () {
var a = 0;
for(var b in this.channels) {
if(this.channels[b].type == "randomChat") a++;
else if(this.channels[b].type == "groupChat") a += this.channels[b].mem.length
}
return a
};
Channel.prototype.leaveChannel = function (a, b, c) {
switch(c) {
case "randomChat":
this.leaveRandomChannel(a, b);
break;
case "groupChat":
this.leaveGroupChannel(a, b);
break;
default:
break
}
return
};
Channel.prototype.leaveRandomChannel = function (a, b) {
for(var c in this.channels) {
if(this.channels[c].id == a && this.channels[c].chId == b) {
this.channels.splice(c, 1);
break
}
}
for(var c in this.channels) {
if(this.channels[c].chId == b) {
this.channels[c].available = true;
break
}
}
};
Channel.prototype.leaveGroupChannel = function (a, b) {
for(var c in this.channels) if(this.channels[c].chId == b) {
for(var d in this.channels[c].mem) if(this.channels[c].mem[d] == a) {
this.channels[c].mem.splice(d, 1);
break
}
if(this.channels[c].mem.length == 0) this.channels.splice(c, 1);
break
}
};
Channel.prototype.countGroup = function (a) {
for(var b in this.channels) if(this.channels[b].chId == a) return this.channels[b].mem.length;
return 0
};
Channel.prototype.reconnect = function (a) {
for(var b in this.channels) {
if(this.channels[b].chId == a) {
this.channels[b].available = true;
break
}
}
return
};
Channel.prototype.deleteListMessageAndSession = function (a, b) {
for(var c in this.messages[a]) if(c == b) this.messages[a].splice(c, 1);
for(var c in this.listSs[a]) if(this.listSs[a][c].id == b) this.listSs[a].splice(c, 1)
};
Channel.prototype.appendMessage = function (a, b, c, d, e) {
var f = {
id: a,
chId: b,
timestamp: (new Date).getTime(),
type: c,
textchat: d
};
switch(c) {
case "join":
case "quit":
f.counter = this.countUserOnline();
break;
default:
break
}
if(e) f.identify = e;
if(this.listSs[b]) var g = this.listSs[b].slice(0);
else var g = [];
while(this.callbacks[b].length > 0) {
var h = this.callbacks[b].shift();
h.callback([f]);
for(var i in g) if(g[i].id == h.id) {
g.splice(i, 1);
break
}
}
if(g) while(g.length > 0) {
var a = g.shift().id;
if(!this.messages[b][a]) this.messages[b][a] = [];
this.messages[b][a].push(f)
}
};
Channel.prototype.query = function (a, b, c, d) {
var e = [];
if(this.messages[c] && this.messages[c][d]) while(this.messages[c][d].length > 0) {
var f = this.messages[c][d].shift();
e.push(f)
}
if(e.length != 0) b(e);
else this.callbacks[c].push({
id: d,
timestamp: new Date,
callback: b
})
}