121 lines
3.3 KiB
JavaScript
121 lines
3.3 KiB
JavaScript
var WebSocketServer = require('ws').Server;
|
|
var Board = require('./BoardServer');
|
|
var Player = require('./Player');
|
|
|
|
var PORT = 2667;
|
|
var wss = new WebSocketServer({port: PORT});
|
|
var board = new Board();
|
|
|
|
var events = {
|
|
incoming: {
|
|
JOIN_GAME: 'csJoinGame',
|
|
MARK: 'csMark',
|
|
QUIT: 'csQuit'
|
|
},
|
|
outgoing: {
|
|
JOIN_GAME: 'scJoinGame',
|
|
MARK: 'scMark',
|
|
SET_TURN: 'scSetTurn',
|
|
OPPONENT_READY: 'scOpponentReady',
|
|
GAME_OVER: 'scGameOver',
|
|
ERROR: 'scError',
|
|
QUIT: 'scQuit'
|
|
}
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param action
|
|
* @param data
|
|
* @returns {*}
|
|
*/
|
|
function makeMessage(action, data) {
|
|
var resp = {
|
|
action: action,
|
|
data: data
|
|
};
|
|
|
|
return JSON.stringify(resp);
|
|
}
|
|
|
|
wss.on('connection', function connection(ws) {
|
|
board.on(Board.events.PLAYER_CONNECTED, function(player) {
|
|
wss.clients.forEach(function(client) {
|
|
board.players.forEach(function(player) {
|
|
client.send(makeMessage(events.outgoing.JOIN_GAME, player));
|
|
});
|
|
});
|
|
});
|
|
|
|
board.on(Board.events.GAME_READY, function(player) {
|
|
wss.clients.forEach(function(client) {
|
|
client.send(makeMessage(events.outgoing.SET_TURN, player));
|
|
});
|
|
});
|
|
|
|
board.on(Board.events.CELL_MARKED, function(event) {
|
|
wss.clients.forEach(function(client) {
|
|
client.send(makeMessage(events.outgoing.MARK, event));
|
|
});
|
|
});
|
|
|
|
board.on(Board.events.CHANGE_TURN, function(player) {
|
|
wss.clients.forEach(function(client) {
|
|
client.send(makeMessage(events.outgoing.SET_TURN, player));
|
|
});
|
|
});
|
|
|
|
board.on(Board.events.WINNER, function(event) {
|
|
wss.clients.forEach(function(client) {
|
|
client.send(makeMessage(events.outgoing.GAME_OVER, event));
|
|
});
|
|
});
|
|
|
|
board.on(Board.events.DRAW, function(event) {
|
|
wss.clients.forEach(function(client) {
|
|
client.send(makeMessage(events.outgoing.GAME_OVER, event));
|
|
});
|
|
});
|
|
|
|
ws.on('message', function incoming(msg) {
|
|
try {
|
|
var msg = JSON.parse(msg);
|
|
} catch (error) {
|
|
ws.send(makeMessage(events.outgoing.ERROR, 'Invalid action'));
|
|
return;
|
|
}
|
|
|
|
try {
|
|
switch (msg.action) {
|
|
case events.incoming.JOIN_GAME:
|
|
var player = new Player(board.players.length + 1, board.players.length === 0 ? 'X' : 'O', msg.data);
|
|
board.addPlayer(player);
|
|
|
|
break;
|
|
case events.incoming.MARK:
|
|
if (board.checkTurn(msg.data.playerId)) {
|
|
var player = board.players.filter(function(player){
|
|
return player.id == msg.data.playerId;
|
|
}).pop();
|
|
|
|
board.mark(msg.data.cellId);
|
|
}
|
|
|
|
break;
|
|
|
|
case events.incoming.QUIT:
|
|
board = new Board();
|
|
wss.clients.forEach(function(client){
|
|
client.send(makeMessage(events.outgoing.QUIT, {}));
|
|
});
|
|
|
|
break;
|
|
}
|
|
} catch (error) {
|
|
ws.send(makeMessage(events.outgoing.ERROR, error.message));
|
|
}
|
|
});
|
|
});
|
|
|
|
console.log('Listening on port %d', PORT);
|