diff --git a/src/Client.js b/src/Client.js index d7af903..74a5844 100644 --- a/src/Client.js +++ b/src/Client.js @@ -11,7 +11,8 @@ class Client extends EventEmitter { this.channel; this.ws = ws; this.req = req; - this.ip = (req.connection.remoteAddress).replace("::ffff:",""); + this.ip = (req.connection.remoteAddress).replace("::ffff:", ""); + this.destroied = false; this.bindEventListeners(); require('./Message.js')(this); } @@ -45,36 +46,39 @@ class Client extends EventEmitter { } destroy() { this.ws.close(); + if (this.channel) { + this.channel.emit("bye", this) + } this.user; this.participantId; this.channel; this.connectionid; this.server.connections.delete(this.connectionid); - if (this.channel) { - this.channel.emit("bye", this) - } + this.destroied = true; console.log(`Removed Connection ${this.connectionid}.`); } bindEventListeners() { this.ws.on("message", (evt) => { try { - var transmission = JSON.parse(evt); - } catch (e) { - this.destroy(); - } finally { + let transmission = JSON.parse(evt); for (let msg of transmission) { if (!msg.hasOwnProperty("m")) return; if (!this.server.legit_m.includes(msg.m)) return; this.emit(msg.m, msg); console.log(`RECIEVE: `, JSON.colorStringify(msg)); } + } catch (e) { + console.log(e) + this.destroy(); } }); this.ws.on("close", () => { + if (!this.destroied) this.destroy(); }); this.ws.addEventListener("error", (err) => { console.error(err); + if (!this.destroied) this.destroy(); }); } diff --git a/src/Message.js b/src/Message.js index 076398f..764dc50 100644 --- a/src/Message.js +++ b/src/Message.js @@ -40,16 +40,31 @@ module.exports = (cl) => { }) cl.on("chown", msg => { if (!(cl.channel && cl.participantId)) return; - console.log((Date.now() - cl.channel.crown.time)) - console.log(!(cl.channel.crown.userId != cl.user._id), !((Date.now() - cl.channel.crown.time) > 15000)); + //console.log((Date.now() - cl.channel.crown.time)) + //console.log(!(cl.channel.crown.userId != cl.user._id), !((Date.now() - cl.channel.crown.time) > 15000)); if (!(cl.channel.crown.userId == cl.user._id) && !((Date.now() - cl.channel.crown.time) > 15000)) return; if (msg.hasOwnProperty("id")) { - console.log(cl.channel.crown) - if (cl.user._id == cl.channel.crown.userId || cl.channel.crown.dropped) - cl.channel.chown(msg.id); + // console.log(cl.channel.crown) + if (cl.user._id == cl.channel.crown.userId || cl.channel.crowndropped) + cl.channel.chown(msg.id); } else { - if (cl.user._id == cl.channel.crown.userId || cl.channel.crown.dropped) - cl.channel.chown(); + if (cl.user._id == cl.channel.crown.userId || cl.channel.crowndropped) + cl.channel.chown(); } }) + cl.on("chset", msg => { + if (!(cl.channel && cl.participantId)) return; + if (!(cl.user._id == cl.channel.crown.userId)) return; + if (!msg.hasOwnProperty("set") || !msg.set) msg.set = {}; + let settings = {}; + settings.lobby = cl.channel.isLobby(cl.channel._id); + settings.visible = !!msg.set.visible; + settings.crownsolo = !!msg.set.crownsolo; + settings.chat = !!msg.set.chat; + settings.color = cl.channel.verifyColor(msg.set.color) || cl.channel.settings.color; + settings.color2 = cl.channel.verifyColor(msg.set.color2) || cl.channel.settings.color2; + cl.channel.settings = settings; + console.log(settings) + cl.channel.updateCh(); + }) } \ No newline at end of file diff --git a/src/Room.js b/src/Room.js index 61cf49c..51d944e 100644 --- a/src/Room.js +++ b/src/Room.js @@ -10,6 +10,7 @@ class Room extends EventEmitter { this._id = _id; this.server = server; this.crown = null; + this.crowndropped = false; this.settings = { lobby: this.isLobby(_id), visible: settings.visible || true, @@ -24,197 +25,223 @@ class Room extends EventEmitter { this.server.rooms.set(_id, this); } join(cl) { //this stuff is complicated - let otheruser = this.connections.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; - if ((this.connections.length == 0 && Array.from(this.ppl.values()).length == 0) && !this.isLobby(this._id)) { //user that created the room, give them the crown. - this.crown = { - participantId: cl.participantId, - userId: cl.user._id, - time: Date.now(), - startPos: {x: 50, y: 50}, - endPos: {x: this.getCrownX(), y: this.getCrownY()}, - dropped: false + let otheruser = this.connections.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; + if ((this.connections.length == 0 && Array.from(this.ppl.values()).length == 0) && !this.isLobby(this._id) || (this.crown && this.crown.userId == cl.user._id)) { //user that created the room, give them the crown. + this.crown = { + participantId: cl.participantId, + userId: cl.user._id, + time: Date.now(), + startPos: { + x: 50, + y: 50 + }, + endPos: { + x: this.getCrownX(), + y: this.getCrownY() + } + } + this.crowndropped = false; } + 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, + m: "p", + name: this.ppl.get(cl.participantId).user.name, + x: this.ppl.get(cl.participantId).x || 200, + y: this.ppl.get(cl.participantId).y || 100, + _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); } - 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, - m: "p", - name: this.ppl.get(cl.participantId).user.name, - x: this.ppl.get(cl.participantId).x || 200, - y: this.ppl.get(cl.participantId).y || 100, - _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 is complicated too - let otheruser = this.connections.filter((a) => a.user._id == p.user._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 - }], p); - this.updateCh(); - } else { - this.connections.splice(this.connections.findIndex((a) => a.connectionid == p.connectionid), 1); - } - -} -updateCh(cl) { //update channel for all people in channel - 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() { //destroy room - this._id; - console.log(`Deleted room ${this._id}`); - this.settings = {}; - this.ppl; - this.connnections; - this.server.rooms.delete(this._id); -} -sendArray(arr, not) { - this.connections.forEach((usr) => { - if (!not || usr.participantId != not.participantId) { - try { - this.server.connections.get(usr.connectionid).sendArray(arr) - } catch (e) { - console.log(e); + remove(p) { //this is complicated too + let otheruser = this.connections.filter((a) => a.user._id == p.user._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 + }], p); + if (this.crown.userId == p.user._id && !this.crowndropped) { + this.chown(); } + this.updateCh(); + } else { + this.connections.splice(this.connections.findIndex((a) => a.connectionid == p.connectionid), 1); } - }) -} -fetchData(usr, cl) { - let chppl = []; - [...this.ppl.values()].forEach((a) => { - chppl.push(a.user); - }) - let crown = this.crown; - let data = { - m: "ch", - p: "ofo", - ch: { - count: chppl.length, - crown: crown, - settings: this.settings, - _id: this._id - }, - ppl: chppl + } - if (cl) { - if (usr.user.id == cl.user.id) { - data.p = cl.participantId; + updateCh(cl) { //update channel for all people in channel + 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() { //destroy room + this._id; + console.log(`Deleted room ${this._id}`); + this.settings = {}; + this.ppl; + this.connnections; + this.server.rooms.delete(this._id); + } + sendArray(arr, not) { + this.connections.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", + p: "ofo", + ch: { + count: chppl.length, + crown: this.crown, + settings: this.settings, + _id: this._id + }, + ppl: chppl + } + if (cl) { + if (usr.user.id == cl.user.id) { + data.p = cl.participantId; + } else { + delete data.p; + } } else { delete data.p; } - } else { - delete data.p; + if (data.ch.crown == null) { + delete data.ch.crown; + this.crown = crown; + } else { + + } + return data; } - if (data.ch.crown == null) { - delete data.ch.crown; - } else { - delete data.ch.crown.dropped; + verifyColor(color) { + return color; //TODO make this } - return data; -} -verifyColor(color) { - return color; //TODO make this -} -getColor(_id) { - if (this.isLobby(_id)) { - return this.server.defaultLobbyColor; - } else { - return this.server.defaultRoomColor; + getColor(_id) { + if (this.isLobby(_id)) { + return this.server.defaultLobbyColor; + } else { + return this.server.defaultRoomColor; + } } -} -getColor2(_id) { - if (this.isLobby(_id)) { - return this.server.defaultLobbyColor2; - } else { - return; - delete this.settings.color2; + getColor2(_id) { + if (this.isLobby(_id)) { + return this.server.defaultLobbyColor2; + } else { + return; + delete this.settings.color2; + } } -} -isLobby(_id) { - if (_id.startsWith("lobby")) { - if (_id == "lobby") { - return true; - } else if (parseFloat(_id.split("lobby")[1] % 1) === 0) { - return true; + isLobby(_id) { + if (_id.startsWith("lobby")) { + if (_id == "lobby") { + return true; + } else if (parseFloat(_id.split("lobby")[1] % 1) === 0) { + return true; + } else { + return false; + } + } else if (_id.startsWith("test/")) { + if (_id == "test/") { + return false; + } else { + return true; + } } else { return false; } - } else if (_id.startsWith("test/")) { - if (_id == "test/") { - return false; + + } + getCrownY() { + return 50 - 30; + } + getCrownX() { + return 50; + } + chown(id) { + let prsn = this.ppl.get(id); + if (prsn) { + this.crown = { + participantId: prsn.participantId, + userId: prsn.user._id, + time: Date.now(), + startPos: { + x: 50, + y: 50 + }, + endPos: { + x: this.getCrownX(), + y: this.getCrownY() + }, + } + this.crowndropped = false; } else { - return true; + this.crown = { + userId: this.crown.userId, + time: Date.now(), + startPos: { + x: 50, + y: 50 + }, + endPos: { + x: this.getCrownX(), + y: this.getCrownY() + } + } + this.crowndropped = true; } - } else { - return false; + this.updateCh(); } - -} -getCrownY() { - return 50 - 30; -} -getCrownX() { - return 50; -} -chown(id) { - let prsn = this.ppl.get(id); - if (prsn) { - this.crown = { - participantId: prsn.participantId, - userId: prsn.user._id, - time: Date.now(), - startPos: {x: 50, y: 50}, - endPos: {x: this.getCrownX(), y: this.getCrownY()}, - dropped: false - } - } else { - this.crown = { - userId: this.crown.userId, - time: Date.now(), - startPos: {x: 50, y: 50}, - endPos: {x: this.getCrownX(), y: this.getCrownY()}, - dropped: true - } + setCords(p, x, y) { + if (p.participantId) + x ? this.ppl.get(p.participantId).x = x : {}; + y ? this.ppl.get(p.participantId).y = y : {}; + this.sendArray([{ + m: "m", + id: p.participantId, + x: this.ppl.get(p.participantId).x, + y: this.ppl.get(p.participantId).y + }], p); } - this.updateCh(); -} -setCords(p, x, y) { - if (p.participantId) - x ? this.ppl.get(p.participantId).x = x : {}; - y ? this.ppl.get(p.participantId).y = y : {}; - this.sendArray([{m: "m", id: p.participantId, x: this.ppl.get(p.participantId).x, y: this.ppl.get(p.participantId).y}], p); -} -bindEventListeners() { - this.on("bye", participant => { - this.remove(participant); - }) + bindEventListeners() { + this.on("bye", participant => { + this.remove(participant); + }) - this.on("m", (participant, x, y) => { - this.setCords(participant, x, y); - }) -} + this.on("m", (participant, x, y) => { + this.setCords(participant, x, y); + }) + } } module.exports = Room; \ No newline at end of file