From 17b2e2c31fe5640d713df65bbd181235253aa2a5 Mon Sep 17 00:00:00 2001 From: sorrelbri Date: Sun, 7 Jun 2020 13:47:09 -0700 Subject: [PATCH] connect FE submit resign to BE game service --- .../GameUI/PlayerArea/PlayerArea.js | 3 +- packages/play-node-go/src/io.js | 4 + packages/play-node-go/src/pages/Game/Game.js | 23 +++++ .../src/reducers/games/reducer.games.js | 85 +++++++++++-------- .../src/reducers/socket/reducer.socket.js | 11 ++- packages/server/services/gameServices.js | 4 + packages/server/socket.js | 17 +++- 7 files changed, 108 insertions(+), 39 deletions(-) diff --git a/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js b/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js index c8778f4..e0b9d75 100644 --- a/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js +++ b/packages/play-node-go/src/components/GameUI/PlayerArea/PlayerArea.js @@ -1,7 +1,7 @@ import React from "react"; import "./PlayerArea.scss"; -const PlayerArea = ({ playerMeta, turn }) => { +const PlayerArea = ({ handleResignClick, playerMeta, turn }) => { const { stones, player, rank, captures } = playerMeta; const isTurn = (stones === "black" && turn === 1) || (stones === "white" && turn === -1); @@ -28,6 +28,7 @@ const PlayerArea = ({ playerMeta, turn }) => { >

handleResignClick(stones) } : null)} > Resign?

diff --git a/packages/play-node-go/src/io.js b/packages/play-node-go/src/io.js index 0e4b9a7..460c2dc 100644 --- a/packages/play-node-go/src/io.js +++ b/packages/play-node-go/src/io.js @@ -42,6 +42,10 @@ const launch = (nsp, dispatch) => { dispatch({ type: "GAMES", message: "UPDATE_BOARD", body: data }); }); + socket.on("game_resign", (data) => { + dispatch({ type: "GAMES", message: "GAME_RESIGN", body: data }); + }); + return socket; }; diff --git a/packages/play-node-go/src/pages/Game/Game.js b/packages/play-node-go/src/pages/Game/Game.js index e366152..cb34e49 100644 --- a/packages/play-node-go/src/pages/Game/Game.js +++ b/packages/play-node-go/src/pages/Game/Game.js @@ -61,17 +61,39 @@ const Game = (props) => { }); }, [playerState, game]); + const handleResignClick = (player) => { + const action = { + type: "SOCKET", + message: "RESIGN", + body: { game, player }, + }; + dispatch(action); + }; + return (
{state.socket ? "✓" : " ⃠"} + {state?.meta?.winner ? ( +

+ {`winner: ${ + state.meta.winner === 1 + ? playerBlackMeta?.player + : playerWhiteMeta?.player + } + `} +

+ ) : ( + <> + )}

Timer

? Game Tree

{ board={state.board} /> { - switch(action.message) { + switch (action.message) { + case "SET_GAMES": { + const games = formatGames(action); + return { ...state, games }; + } - case 'SET_GAMES': - const games = formatGames(action);; - return {...state, games}; - - case 'JOIN_REQUEST': + case "JOIN_REQUEST": { if (!Object.entries(state.user).length) { const errAction = { - type: 'ERR', - message: 'JOIN_GAME_ERROR', - body: {joinGameError: 'user not logged in'} - } - return stateReducer(state, errAction) + type: "ERR", + message: "JOIN_GAME_ERROR", + body: { joinGameError: "user not logged in" }, + }; + return stateReducer(state, errAction); } const id = action.body; - return {...state, joinGame: id}; + return { ...state, joinGame: id }; + } - case 'UPDATE_BOARD': + case "UPDATE_BOARD": { const { gameRecord, pass, turn, winner, playerState } = action.body.meta; - return {...state, board: action.body.board, meta: {gameRecord, pass, turn, winner, playerState } }; + return { + ...state, + board: action.body.board, + meta: { gameRecord, pass, turn, winner, playerState }, + }; + } - case 'SET_ACTIVE': - return {...state, active: action.body}; - - default: + case "GAME_RESIGN": { + const { gameRecord, pass, turn, winner, playerState } = action.body.meta; + return { + ...state, + meta: { gameRecord, pass, turn, winner, playerState }, + }; + } + + case "SET_ACTIVE": { + return { ...state, active: action.body }; + } + + default: { return state; + } } -} +}; function parseRank(rank) { - switch(rank[0]) { - case 'D': - return `${rank.slice(1)}${rank[0].toLowerCase()}` - case 'K': - return `${rank.slice(1)}${rank[0].toLowerCase()}` - case 'U': - return '?' - default: - return '?' + switch (rank[0]) { + case "D": + return `${rank.slice(1)}${rank[0].toLowerCase()}`; + case "K": + return `${rank.slice(1)}${rank[0].toLowerCase()}`; + case "U": + return "?"; + default: + return "?"; } } function formatGames(action) { - const games = [...action.body].map(game => { - + const games = [...action.body].map((game) => { if (game.playerBlackRank) { - game.playerBlackRank = parseRank(game.playerBlackRank) + game.playerBlackRank = parseRank(game.playerBlackRank); } if (game.playerWhiteRank) { - game.playerWhiteRank = parseRank(game.playerWhiteRank) + game.playerWhiteRank = parseRank(game.playerWhiteRank); } return game; - }) + }); return games; -} \ No newline at end of file +} diff --git a/packages/play-node-go/src/reducers/socket/reducer.socket.js b/packages/play-node-go/src/reducers/socket/reducer.socket.js index 832abad..882da99 100644 --- a/packages/play-node-go/src/reducers/socket/reducer.socket.js +++ b/packages/play-node-go/src/reducers/socket/reducer.socket.js @@ -34,6 +34,10 @@ export const socketReducer = (state, action) => { return makeMove(state, action); } + case "RESIGN": { + return resign(state, action); + } + default: return state; } @@ -58,8 +62,13 @@ function connectGame(state, action) { } function makeMove(state, action) { - // const { user, game, room, board, move } = action.body; const socket = state.socket; socket.emit("make_move", { ...action.body }); return state; } + +function resign(state, action) { + const socket = state.socket; + socket.emit("resign", { ...action.body }); + return state; +} diff --git a/packages/server/services/gameServices.js b/packages/server/services/gameServices.js index f1df37b..22028e0 100644 --- a/packages/server/services/gameServices.js +++ b/packages/server/services/gameServices.js @@ -70,6 +70,10 @@ const GameService = (moveQueries) => { getAllGames: () => { return gamesInProgress; }, + + resign: ({ id, player }) => { + return gamesInProgress[id].submitResign(player).getMeta(); + }, }; }; diff --git a/packages/server/socket.js b/packages/server/socket.js index 14bad8d..03aa3d2 100644 --- a/packages/server/socket.js +++ b/packages/server/socket.js @@ -21,8 +21,6 @@ io.on("connection", async (socket) => { const game = `game-${data.game.id}`; socket.join(game, async () => { const gameRecord = await moveQueries.findGameRecord(data.game.id); - console.log("gameRecord from db"); - console.log(gameRecord); await gameServices.initGame({ id: data.game.id, gameRecord }); const { board, ...meta } = await gameServices.getDataForUI( data.game.id @@ -52,6 +50,21 @@ io.on("connection", async (socket) => { }); } }); + socket.on("resign", async ({ game, player }) => { + const { id, room } = game; + const gameNsp = `game-${id}`; + try { + const meta = await gameServices.resign({ + id, + player, + }); + socket.join(gameNsp, () => { + io.of(room).to(gameNsp).emit("game_resign", meta); + }); + } catch (e) { + console.log(e); + } + }); }); }); });