From 61e662520198db86f12e6a8dea8678f125af7b86 Mon Sep 17 00:00:00 2001 From: BopItFreak Date: Thu, 6 Jun 2019 14:54:06 -0400 Subject: [PATCH] remove stacking clients --- src/Room.js | 124 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 53 deletions(-) diff --git a/src/Room.js b/src/Room.js index aabb832..2c73c1b 100644 --- a/src/Room.js +++ b/src/Room.js @@ -3,7 +3,7 @@ //room deleter //databases in Map -class Room extends EventEmitter { //clean? +class Room extends EventEmitter { constructor(server, _id, settings) { super(); EventEmitter.call(this); @@ -18,14 +18,19 @@ class Room extends EventEmitter { //clean? color2: this.verifyColor(settings.color) || this.defaultLobbyColor2 } this.ppl = new Map(); + this.connections = []; this.bindEventListeners(); this.server.rooms.set(_id, this); } 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); cl.user.id = participantId; cl.participantId = participantId; this.ppl.set(participantId, cl); + this.connections.push(cl); + this.sendArray([{ color: this.ppl.get(cl.participantId).user.color, id: this.ppl.get(cl.participantId).participantId, @@ -36,70 +41,83 @@ class Room extends EventEmitter { //clean? _id: cl.user._id }], 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.connections.splice(this.connections.findIndex((a) => a.connectionid == p.connectionid), 1); + console.log(`Deleted client ${p.user.id}`); this.sendArray([{ m: "bye", p: p.participantId }]); 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) => { - this.server.connections.get(usr.connectionid).sendArray([this.fetchData(usr, cl)]) - }) - } - destroy() { - this._id; - console.log(`Deleted room ${this._id}`); - this.settings = {}; - this.ppl; - this.server.rooms.delete(_id); - } - sendArray(arr, not) { - this.ppl.forEach((usr) => { - if (!not || usr.participantId != not.participantId) { - try { - this.server.connections.get(usr.connectionid).sendArray(arr) - } catch (e) { - console.log(e); - } - } - }) - } - fetchData(usr, cl) { - let chppl = []; - [...this.ppl.values()].forEach((a) => { - chppl.push(a.user); - }) - let data = { - m: "ch", - ch: { - count: chppl.length, - settings: this.settings, - _id: this._id - }, - ppl: chppl - } - if (cl) { - if (usr.user.id == cl.user.id) { - data.p = cl.participantId; +} +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)]) + }) +} +destroy() { + this._id; + console.log(`Deleted room ${this._id}`); + this.settings = {}; + this.ppl; + this.server.rooms.delete(_id); +} +sendArray(arr, not) { + this.ppl.forEach((usr) => { + if (!not || usr.participantId != not.participantId) { + try { + this.server.connections.get(usr.connectionid).sendArray(arr) + } catch (e) { + console.log(e); } } - return data; + }) +} +fetchData(usr, cl) { + let chppl = []; + [...this.ppl.values()].forEach((a) => { + chppl.push(a.user); + }) + let data = { + m: "ch", + ch: { + count: chppl.length, + settings: this.settings, + _id: this._id + }, + ppl: chppl } - verifyColor(color) { - return color; //TODO make this - } - bindEventListeners() { - this.on("bye", participant => { - this.remove(participant); - }) + if (cl) { + if (usr.user.id == cl.user.id) { + data.p = cl.participantId; + } } + return data; +} +verifyColor(color) { + return color; //TODO make this +} +bindEventListeners() { + this.on("bye", participant => { + this.remove(participant); + }) +} } module.exports = Room; \ No newline at end of file