remove stacking clients

This commit is contained in:
BopItFreak 2019-06-06 14:54:06 -04:00
parent 3d4c8430cf
commit 61e6625201
1 changed files with 71 additions and 53 deletions

View File

@ -3,7 +3,7 @@
//room deleter //room deleter
//databases in Map //databases in Map
class Room extends EventEmitter { //clean? class Room extends EventEmitter {
constructor(server, _id, settings) { constructor(server, _id, settings) {
super(); super();
EventEmitter.call(this); EventEmitter.call(this);
@ -18,14 +18,19 @@ class Room extends EventEmitter { //clean?
color2: this.verifyColor(settings.color) || this.defaultLobbyColor2 color2: this.verifyColor(settings.color) || this.defaultLobbyColor2
} }
this.ppl = new Map(); this.ppl = new Map();
this.connections = [];
this.bindEventListeners(); this.bindEventListeners();
this.server.rooms.set(_id, this); this.server.rooms.set(_id, this);
} }
join(cl) { join(cl) {
let otheruser = this.connections.find((a) => a.user._id == cl.user._id)// Array.from(this.ppl.values()).find((a) => a.user._id == cl.user._id);//
if (!otheruser) {
let participantId = createKeccakHash('keccak256').update((Math.random().toString() + cl.ip)).digest('hex').substr(0, 24); let participantId = createKeccakHash('keccak256').update((Math.random().toString() + cl.ip)).digest('hex').substr(0, 24);
cl.user.id = participantId; cl.user.id = participantId;
cl.participantId = participantId; cl.participantId = participantId;
this.ppl.set(participantId, cl); this.ppl.set(participantId, cl);
this.connections.push(cl);
this.sendArray([{ this.sendArray([{
color: this.ppl.get(cl.participantId).user.color, color: this.ppl.get(cl.participantId).user.color,
id: this.ppl.get(cl.participantId).participantId, id: this.ppl.get(cl.participantId).participantId,
@ -36,31 +41,44 @@ class Room extends EventEmitter { //clean?
_id: cl.user._id _id: cl.user._id
}], cl) }], cl)
this.updateCh(cl); this.updateCh(cl);
} else {
cl.user.id = otheruser.participantId;
cl.participantId = otheruser.participantId;
this.connections.push(cl);
this.updateCh(cl);
} }
remove(p) {
//this.participants.splice(this.participants.findIndex((cl) => cl.participantId == p.participantId), 1); }
remove(p) {
let otheruser = this.connections.filter((a) => a.user._id == p.user._id);//Array.from(this.ppl.values()).filter((a) => a.user._id == p._id);
if (!(otheruser.length > 1)) {
this.ppl.delete(p.participantId); this.ppl.delete(p.participantId);
this.connections.splice(this.connections.findIndex((a) => a.connectionid == p.connectionid), 1);
console.log(`Deleted client ${p.user.id}`);
this.sendArray([{ this.sendArray([{
m: "bye", m: "bye",
p: p.participantId p: p.participantId
}]); }]);
this.updateCh(); this.updateCh();
} else {
this.connections.splice(this.connections.findIndex((a) => a.connectionid == p.connectionid), 1);
} }
updateCh(cl) {
if (this.ppl.keys().next().value.length <= 0) this.destroy(); }
this.ppl.forEach((usr) => { updateCh(cl) {
if (Array.from(this.ppl.values()).length <= 0) this.destroy();
this.connections.forEach((usr) => {
this.server.connections.get(usr.connectionid).sendArray([this.fetchData(usr, cl)]) this.server.connections.get(usr.connectionid).sendArray([this.fetchData(usr, cl)])
}) })
} }
destroy() { destroy() {
this._id; this._id;
console.log(`Deleted room ${this._id}`); console.log(`Deleted room ${this._id}`);
this.settings = {}; this.settings = {};
this.ppl; this.ppl;
this.server.rooms.delete(_id); this.server.rooms.delete(_id);
} }
sendArray(arr, not) { sendArray(arr, not) {
this.ppl.forEach((usr) => { this.ppl.forEach((usr) => {
if (!not || usr.participantId != not.participantId) { if (!not || usr.participantId != not.participantId) {
try { try {
@ -70,8 +88,8 @@ class Room extends EventEmitter { //clean?
} }
} }
}) })
} }
fetchData(usr, cl) { fetchData(usr, cl) {
let chppl = []; let chppl = [];
[...this.ppl.values()].forEach((a) => { [...this.ppl.values()].forEach((a) => {
chppl.push(a.user); chppl.push(a.user);
@ -91,15 +109,15 @@ class Room extends EventEmitter { //clean?
} }
} }
return data; return data;
} }
verifyColor(color) { verifyColor(color) {
return color; //TODO make this return color; //TODO make this
} }
bindEventListeners() { bindEventListeners() {
this.on("bye", participant => { this.on("bye", participant => {
this.remove(participant); this.remove(participant);
}) })
} }
} }
module.exports = Room; module.exports = Room;