302 lines
9.1 KiB
JavaScript
302 lines
9.1 KiB
JavaScript
|
function log(message) {
|
||
|
let time = new Date().toUTCString();
|
||
|
console.log(`[${time}]`, message);
|
||
|
}
|
||
|
|
||
|
const _port = process.env.PORT || 6942;
|
||
|
const ws = require('ws');
|
||
|
//const fs = require('fs');
|
||
|
const WSServer = ws.Server;
|
||
|
const http = require('http').createServer();
|
||
|
const server = new WSServer({ server: http });
|
||
|
const app = require('./app');
|
||
|
const crypto = require('crypto');
|
||
|
|
||
|
let clients = [];
|
||
|
let participants = {};
|
||
|
let rooms = {};
|
||
|
|
||
|
let index = 10;
|
||
|
let temp_user = `face${index}`;
|
||
|
|
||
|
let lobbyOwner = "abcdef0123456789abcdef01"
|
||
|
|
||
|
class Participant {
|
||
|
constructor(_id, name, c) {
|
||
|
this._id = _id;
|
||
|
this.name = name;
|
||
|
this.color = "#123456";
|
||
|
this.id = _id;
|
||
|
this.x = 60;
|
||
|
this.y = 50;
|
||
|
this.c = c;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Room {
|
||
|
constructor(name, settings) {
|
||
|
this.name = name;
|
||
|
this._id = this.name;
|
||
|
|
||
|
this.ppl = {};
|
||
|
this.banlist = {};
|
||
|
|
||
|
this.crown = {};
|
||
|
|
||
|
this.settings = settings;
|
||
|
|
||
|
this.isLobby = this.name.startsWith("lobby") || this.name.startsWith("test/");
|
||
|
}
|
||
|
|
||
|
add(participant) {
|
||
|
if (this.banlist[participant._id]) return participant.setChannel("test/ohnoguys");
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const broadcast = data => {
|
||
|
for (let i = 0; i < clients.length; i++) clients[i].send(data);
|
||
|
};
|
||
|
|
||
|
const broadcastExceptClient = (client, data) => {
|
||
|
for (let i = 0; i < clients.length; i++) if (clients[i] != client) clients[i].send(data);
|
||
|
};
|
||
|
|
||
|
const broadcastToRoom = (room, data) => {
|
||
|
for (let part of Object.entries(room.ppl)) if (part[1]._id !== lobbyOwner) part[1].c.send(data);
|
||
|
}
|
||
|
|
||
|
const broadcastToRoomExceptId = (room, pid, data) => {
|
||
|
for (let part of Object.entries(room.ppl)) if (part[1]._id !== lobbyOwner && part[1]._id !== pid) {
|
||
|
/*console.log(part[1]._id),*/ part[1].c.send(data);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
rooms["lobby"] = new Room("lobby");
|
||
|
rooms["realistic"] = new Room("realistic");
|
||
|
rooms["lobby"].ppl["face00"] = {
|
||
|
_id: lobbyOwner,
|
||
|
name: "Large Dummy",
|
||
|
color: "#654321",
|
||
|
id: lobbyOwner,
|
||
|
x: 60,
|
||
|
y: 50
|
||
|
}
|
||
|
|
||
|
server.on('connection', c => {
|
||
|
clients.push(c);
|
||
|
let myId;
|
||
|
let myName;
|
||
|
let myOldRoom;
|
||
|
let myRoom;
|
||
|
|
||
|
|
||
|
// todo: C message
|
||
|
|
||
|
// first connect B
|
||
|
c.send(JSON.stringify([{
|
||
|
m: "b",
|
||
|
code: "test-code-yes"
|
||
|
}]));
|
||
|
|
||
|
// now listen
|
||
|
|
||
|
c.on('message', msg => {
|
||
|
let data;
|
||
|
|
||
|
try {
|
||
|
data = JSON.parse(msg)[0];
|
||
|
} catch (e) {
|
||
|
log(e);
|
||
|
data = {m: "none"};
|
||
|
}
|
||
|
|
||
|
console.log(data.m);
|
||
|
|
||
|
if (data !== undefined && data !== null) switch (data.m) {
|
||
|
case "hi":
|
||
|
// server hi
|
||
|
|
||
|
index++;
|
||
|
temp_user = `face${index}`;
|
||
|
myName = `Dummy ${index}`;
|
||
|
|
||
|
//myId = temp_user;
|
||
|
console.log(c._socket.remoteAddress);
|
||
|
myId = crypto.createHmac("sha256", "23FireFoxId").update(temp_user).digest("hex").substring(0,24);
|
||
|
console.log(myId);
|
||
|
|
||
|
c.send(JSON.stringify([{
|
||
|
m: "hi",
|
||
|
t: Date.now(),
|
||
|
u: {
|
||
|
_id: myId,
|
||
|
name: myName,
|
||
|
color: "#ff8080",
|
||
|
|
||
|
},
|
||
|
token: `${myId}.test-token-yes`,
|
||
|
permissions: {}
|
||
|
}]));
|
||
|
|
||
|
participants[myId] = new Participant(myName, myId, c);
|
||
|
break;
|
||
|
|
||
|
case "ch":
|
||
|
let room_name = data._id.trim();
|
||
|
|
||
|
if (myRoom !== room_name && room_name && room_name !== "") {
|
||
|
myOldRoom = myRoom;
|
||
|
myRoom = room_name;
|
||
|
|
||
|
if (rooms[room_name] === undefined) rooms[room_name] = new Room(room_name);
|
||
|
|
||
|
// send myself to all users in the room
|
||
|
broadcastToRoom(rooms[room_name], JSON.stringify([{
|
||
|
m: 'p',
|
||
|
_id: myId,
|
||
|
name: myName,
|
||
|
color: "#123456",
|
||
|
id: myId,
|
||
|
x: 60,
|
||
|
y: 50
|
||
|
}]));
|
||
|
|
||
|
rooms[room_name].ppl[myId] = {
|
||
|
_id: myId,
|
||
|
name: myName,
|
||
|
color: "#123456",
|
||
|
id: myId,
|
||
|
x: 60,
|
||
|
y: 50,
|
||
|
c: c
|
||
|
};
|
||
|
|
||
|
let _ppl = [];
|
||
|
for (let part of Object.entries(rooms[room_name].ppl)) _ppl.push({
|
||
|
_id: part[1]._id,
|
||
|
name: part[1].name,
|
||
|
color: part[1].color,
|
||
|
id: part[1].id,
|
||
|
x: part[1].x,
|
||
|
y: part[1].y
|
||
|
});
|
||
|
|
||
|
console.log(_ppl);
|
||
|
|
||
|
c.send(JSON.stringify([{
|
||
|
m: "ch",
|
||
|
ch: {
|
||
|
settings: {
|
||
|
chat: true,
|
||
|
color: "#654321",
|
||
|
visible: true,
|
||
|
limit: 10,
|
||
|
crownsolo: false,
|
||
|
"no cussing": false,
|
||
|
minOnlineTime: 0,
|
||
|
color2: "#123456"
|
||
|
},
|
||
|
id: room_name,
|
||
|
_id: room_name,
|
||
|
count: Object.keys(rooms[room_name].ppl).length,
|
||
|
crown: {
|
||
|
endPos: {
|
||
|
x: 50,
|
||
|
y: 50
|
||
|
},
|
||
|
startPos: {
|
||
|
x: 50,
|
||
|
y: 25
|
||
|
},
|
||
|
userId: lobbyOwner,
|
||
|
time: Date.now(),
|
||
|
participantId: lobbyOwner
|
||
|
}
|
||
|
},
|
||
|
ppl: _ppl,
|
||
|
p: myId
|
||
|
}]));
|
||
|
|
||
|
|
||
|
|
||
|
// send all users in room to me
|
||
|
for (let part of _ppl) {
|
||
|
c.send(JSON.stringify([{
|
||
|
m: 'p',
|
||
|
_id: part._id,
|
||
|
name: part.name,
|
||
|
color: part.color,
|
||
|
id: part._id,
|
||
|
x: part.x,
|
||
|
y: part.y
|
||
|
}]));
|
||
|
}
|
||
|
|
||
|
if (myOldRoom) {
|
||
|
delete rooms[myOldRoom].ppl[myId];
|
||
|
broadcastToRoom(rooms[myOldRoom], JSON.stringify([{
|
||
|
m: 'bye',
|
||
|
p: myId
|
||
|
}]));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'a':
|
||
|
if (myRoom) {
|
||
|
let msg;
|
||
|
if (data.message && typeof data.message === "string")
|
||
|
msg = data.message.trim(); else break;
|
||
|
if (msg !== "") broadcastToRoom(rooms[myRoom], JSON.stringify([{
|
||
|
m: "a",
|
||
|
t: Date.now(),
|
||
|
a: msg,
|
||
|
p: {
|
||
|
_id: myId,
|
||
|
name: myName,
|
||
|
color: "#123456",
|
||
|
id: myId
|
||
|
}
|
||
|
}]));
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'm':
|
||
|
if (myRoom) {
|
||
|
let moveX = parseFloat(data.x);
|
||
|
let moveY = parseFloat(data.y);
|
||
|
console.log("what");
|
||
|
console.log(moveX, moveY);
|
||
|
if (typeof moveX === "number" && typeof moveY === "number"
|
||
|
&& !isNaN(moveX) && !isNaN(moveY)) {
|
||
|
console.log("Huh!");
|
||
|
broadcastToRoomExceptId(rooms[myRoom], myId, JSON.stringify([{
|
||
|
m: "m",
|
||
|
x: data.x,
|
||
|
y: data.y,
|
||
|
id: myId
|
||
|
}]));
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
});
|
||
|
|
||
|
c.on('close', () => {
|
||
|
delete rooms[myRoom].ppl[myId];
|
||
|
broadcastToRoom(rooms[myRoom], JSON.stringify([{
|
||
|
m: 'bye',
|
||
|
p: myId
|
||
|
}]));
|
||
|
});
|
||
|
});
|
||
|
|
||
|
http.on('request', app);
|
||
|
|
||
|
http.listen(_port, () => {
|
||
|
console.log("listening");
|
||
|
});
|