fix bugs, add chset

This commit is contained in:
BopItFreak 2019-06-09 15:05:52 -04:00
parent 0bca3c6460
commit bce9e3d155
3 changed files with 230 additions and 184 deletions

View File

@ -11,7 +11,8 @@ class Client extends EventEmitter {
this.channel; this.channel;
this.ws = ws; this.ws = ws;
this.req = req; this.req = req;
this.ip = (req.connection.remoteAddress).replace("::ffff:",""); this.ip = (req.connection.remoteAddress).replace("::ffff:", "");
this.destroied = false;
this.bindEventListeners(); this.bindEventListeners();
require('./Message.js')(this); require('./Message.js')(this);
} }
@ -45,36 +46,39 @@ class Client extends EventEmitter {
} }
destroy() { destroy() {
this.ws.close(); this.ws.close();
if (this.channel) {
this.channel.emit("bye", this)
}
this.user; this.user;
this.participantId; this.participantId;
this.channel; this.channel;
this.connectionid; this.connectionid;
this.server.connections.delete(this.connectionid); this.server.connections.delete(this.connectionid);
if (this.channel) { this.destroied = true;
this.channel.emit("bye", this)
}
console.log(`Removed Connection ${this.connectionid}.`); console.log(`Removed Connection ${this.connectionid}.`);
} }
bindEventListeners() { bindEventListeners() {
this.ws.on("message", (evt) => { this.ws.on("message", (evt) => {
try { try {
var transmission = JSON.parse(evt); let transmission = JSON.parse(evt);
} catch (e) {
this.destroy();
} finally {
for (let msg of transmission) { for (let msg of transmission) {
if (!msg.hasOwnProperty("m")) return; if (!msg.hasOwnProperty("m")) return;
if (!this.server.legit_m.includes(msg.m)) return; if (!this.server.legit_m.includes(msg.m)) return;
this.emit(msg.m, msg); this.emit(msg.m, msg);
console.log(`RECIEVE: `, JSON.colorStringify(msg)); console.log(`RECIEVE: `, JSON.colorStringify(msg));
} }
} catch (e) {
console.log(e)
this.destroy();
} }
}); });
this.ws.on("close", () => { this.ws.on("close", () => {
if (!this.destroied)
this.destroy(); this.destroy();
}); });
this.ws.addEventListener("error", (err) => { this.ws.addEventListener("error", (err) => {
console.error(err); console.error(err);
if (!this.destroied)
this.destroy(); this.destroy();
}); });
} }

View File

@ -40,16 +40,31 @@ module.exports = (cl) => {
}) })
cl.on("chown", msg => { cl.on("chown", msg => {
if (!(cl.channel && cl.participantId)) return; if (!(cl.channel && cl.participantId)) return;
console.log((Date.now() - cl.channel.crown.time)) //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(!(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 (!(cl.channel.crown.userId == cl.user._id) && !((Date.now() - cl.channel.crown.time) > 15000)) return;
if (msg.hasOwnProperty("id")) { if (msg.hasOwnProperty("id")) {
console.log(cl.channel.crown) // console.log(cl.channel.crown)
if (cl.user._id == cl.channel.crown.userId || cl.channel.crown.dropped) if (cl.user._id == cl.channel.crown.userId || cl.channel.crowndropped)
cl.channel.chown(msg.id); cl.channel.chown(msg.id);
} else { } else {
if (cl.user._id == cl.channel.crown.userId || cl.channel.crown.dropped) if (cl.user._id == cl.channel.crown.userId || cl.channel.crowndropped)
cl.channel.chown(); 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();
})
} }

View File

@ -10,6 +10,7 @@ class Room extends EventEmitter {
this._id = _id; this._id = _id;
this.server = server; this.server = server;
this.crown = null; this.crown = null;
this.crowndropped = false;
this.settings = { this.settings = {
lobby: this.isLobby(_id), lobby: this.isLobby(_id),
visible: settings.visible || true, visible: settings.visible || true,
@ -24,197 +25,223 @@ class Room extends EventEmitter {
this.server.rooms.set(_id, this); this.server.rooms.set(_id, this);
} }
join(cl) { //this stuff is complicated join(cl) { //this stuff is complicated
let otheruser = this.connections.find((a) => a.user._id == cl.user._id) let otheruser = this.connections.find((a) => a.user._id == cl.user._id)
if (!otheruser) { 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;
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. 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 = { this.crown = {
participantId: cl.participantId, participantId: cl.participantId,
userId: cl.user._id, userId: cl.user._id,
time: Date.now(), time: Date.now(),
startPos: {x: 50, y: 50}, startPos: {
endPos: {x: this.getCrownX(), y: this.getCrownY()}, x: 50,
dropped: false 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);
remove(p) { //this is complicated too if (!(otheruser.length > 1)) {
let otheruser = this.connections.filter((a) => a.user._id == p.user._id); this.ppl.delete(p.participantId);
if (!(otheruser.length > 1)) { this.connections.splice(this.connections.findIndex((a) => a.connectionid == p.connectionid), 1);
this.ppl.delete(p.participantId); console.log(`Deleted client ${p.user.id}`);
this.connections.splice(this.connections.findIndex((a) => a.connectionid == p.connectionid), 1); this.sendArray([{
console.log(`Deleted client ${p.user.id}`); m: "bye",
this.sendArray([{ p: p.participantId
m: "bye", }], p);
p: p.participantId if (this.crown.userId == p.user._id && !this.crowndropped) {
}], p); this.chown();
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);
} }
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) { updateCh(cl) { //update channel for all people in channel
if (usr.user.id == cl.user.id) { if (Array.from(this.ppl.values()).length <= 0) this.destroy();
data.p = cl.participantId; 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 { } else {
delete data.p; delete data.p;
} }
} else { if (data.ch.crown == null) {
delete data.p; delete data.ch.crown;
this.crown = crown;
} else {
}
return data;
} }
if (data.ch.crown == null) { verifyColor(color) {
delete data.ch.crown; return color; //TODO make this
} else {
delete data.ch.crown.dropped;
} }
return data; getColor(_id) {
} if (this.isLobby(_id)) {
verifyColor(color) { return this.server.defaultLobbyColor;
return color; //TODO make this } else {
} return this.server.defaultRoomColor;
getColor(_id) { }
if (this.isLobby(_id)) {
return this.server.defaultLobbyColor;
} else {
return this.server.defaultRoomColor;
} }
} getColor2(_id) {
getColor2(_id) { if (this.isLobby(_id)) {
if (this.isLobby(_id)) { return this.server.defaultLobbyColor2;
return this.server.defaultLobbyColor2; } else {
} else { return;
return; delete this.settings.color2;
delete this.settings.color2; }
} }
} isLobby(_id) {
isLobby(_id) { if (_id.startsWith("lobby")) {
if (_id.startsWith("lobby")) { if (_id == "lobby") {
if (_id == "lobby") { return true;
return true; } else if (parseFloat(_id.split("lobby")[1] % 1) === 0) {
} else if (parseFloat(_id.split("lobby")[1] % 1) === 0) { return true;
return true; } else {
return false;
}
} else if (_id.startsWith("test/")) {
if (_id == "test/") {
return false;
} else {
return true;
}
} else { } else {
return false; 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 { } 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 { this.updateCh();
return false;
} }
setCords(p, x, y) {
} if (p.participantId)
getCrownY() { x ? this.ppl.get(p.participantId).x = x : {};
return 50 - 30; y ? this.ppl.get(p.participantId).y = y : {};
} this.sendArray([{
getCrownX() { m: "m",
return 50; id: p.participantId,
} x: this.ppl.get(p.participantId).x,
chown(id) { y: this.ppl.get(p.participantId).y
let prsn = this.ppl.get(id); }], p);
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
}
} }
this.updateCh(); bindEventListeners() {
} this.on("bye", participant => {
setCords(p, x, y) { this.remove(participant);
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);
})
this.on("m", (participant, x, y) => { this.on("m", (participant, x, y) => {
this.setCords(participant, x, y); this.setCords(participant, x, y);
}) })
} }
} }
module.exports = Room; module.exports = Room;