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,70 +41,83 @@ 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) => {
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;
}
}
return data;
}
verifyColor(color) {
return color; //TODO make this
}
bindEventListeners() {
this.on("bye", participant => {
this.remove(participant);
})
} }
}
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);
}
}
})
}
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;
}
}
return data;
}
verifyColor(color) {
return color; //TODO make this
}
bindEventListeners() {
this.on("bye", participant => {
this.remove(participant);
})
}
} }
module.exports = Room; module.exports = Room;