Newer
Older
BlackoutServerNode / index.js
const WebSocket = require('ws');
const Player = require('./player');
const Room = require('./room');
const EventEmitter = require("events");

let lobby = null;
function createNewLobby()
{
	if (lobby)
	{
		console.log("Removing lobby");
		lobby.remove();
		lobby = null;
	}
	console.log("Creating lobby");
	lobby = new Room("Lobby");
	lobby.on('lost_last_player', createNewLobby);
}

let playersBySocket = new Map();

createNewLobby();


const ws = new WebSocket.Server({port: 9997});

ws.on('listening', function() {
	console.log('Listening!');
});

const interval = setInterval(() =>
	{
		ws.clients.forEach(i =>
			{
				if (i.failedPong > 8)
				{
					i.terminate();
				}
				else
				{
					if (i.failedPong > 0)
					{
						console.log("Client failed pong " + i.failedPong + "  " + (playersBySocket.has(i) ? playersBySocket.get(i).id : "noplayer"));
					}
					i.failedPong++;
					i.ping();
				}
			}
		);
	}, 15000
);

ws.on('connection', function(conn)
	{
		console.log('Connection!');

		conn.failedPong = 0;
		conn.on('pong', () => { conn.failedPong = 0; });

		
		conn.on('message', function(message)
			{
				if (playersBySocket.has(conn))
				{
					const p = playersBySocket.get(conn);
					if (p.room != null)
					{
						p.room.playerMessage(p, message);
					}
				}
				//console.log('Message: ' + message);
			}
		);
		conn.on('close', function(code, reason)
			{
				console.log('Socket closed: ' + reason);
				if (playersBySocket.has(conn))
				{
					const p = playersBySocket.get(conn);
					console.log("Deleting player " + p.id);
					playersBySocket.delete(conn);

					p.room.removePlayer(p);

					p.remove();
				}
			}
		);

		const p = new Player(conn);
		playersBySocket.set(conn, p);

		p.sendMessage("connected", {player_id:p.id});

		console.log("New player (size " + playersBySocket.size + ")");

		lobby.addPlayer(p);
	}
);

ws.on('error', function(err)
	{
		console.log('Error: ' + err);
	}
);