123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- 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);
|