From b57e771679cb1c3f278af9e4f52185dc926b5422 Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Thu, 27 Jan 2022 18:23:41 -0800 Subject: [PATCH] Send back to lobby if < 2 players Signed-off-by: James Ketrenos --- client/.env | 4 +- client/package.json | 2 +- client/src/Board.js | 27 ++++++++--- client/webpack.common.js | 33 -------------- client/webpack.dev.js | 41 ----------------- client/webpack.prod.js | 8 ---- server/routes/games.js | 98 ++++++++++++++++++++++++++-------------- 7 files changed, 87 insertions(+), 126 deletions(-) delete mode 100644 client/webpack.common.js delete mode 100755 client/webpack.dev.js delete mode 100644 client/webpack.prod.js diff --git a/client/.env b/client/.env index 8b13789..550b42b 100644 --- a/client/.env +++ b/client/.env @@ -1 +1,3 @@ - +PUBLIC_URL=/ketr.ketran +HOST=nuc.ketrenos.com +DANGEROUSLY_DISABLE_HOST_CHECK='true' diff --git a/client/package.json b/client/package.json index 71ec120..8e931a5 100644 --- a/client/package.json +++ b/client/package.json @@ -18,7 +18,7 @@ "web-vitals": "^2.1.2" }, "scripts": { - "start": "export $(cat ../.env | xargs) && react-scripts start", + "start": "react-scripts start", "build": "export $(cat ../.env | xargs) && react-scripts build", "test": "export $(cat ../.env | xargs) && react-scripts test", "eject": "export $(cat ../.env | xargs) && react-scripts eject" diff --git a/client/src/Board.js b/client/src/Board.js index 950a936..a5ea5f5 100755 --- a/client/src/Board.js +++ b/client/src/Board.js @@ -227,13 +227,12 @@ const Chat = ({ board, promoteGameState }) => { //const timeDelta = game.timestamp - Date.now(); const messages = board.game.chat.map((item, index) => { - //const timestamp = moment(item.date - timeDelta).fromNow(); return ( {item.from} - )} /> + )} /> ); }); @@ -344,6 +343,10 @@ const Players = ({ board, promoteGameState }) => { const players = []; for (let key in board.game.players) { const item = board.game.players[key]; + console.log(item); + if (board.game.state != "lobby" && item.status == 'Not active') { + continue; + } players.push(( @@ -492,10 +495,12 @@ class Board extends React.Component { } return res.json(); }).then((game) => { - console.log (`Dice rolled!`); - console.log(game.dice); + let message = game.status != "success" ? game.status : "Dice rolled!" + if (game.status != "success") { + game.dice = []; + } this.updateGame(game); - this.setState({ game: { ...this.state.game, dice: game.dice }, message: "Dice rolled!"} ); + this.setState({ game: { ...this.state.game, dice: game.dice }, message: message } ); }).catch((error) => { console.error(error); this.setState({message: error.message}); @@ -1140,6 +1145,10 @@ class Board extends React.Component { updateGame(game) { this.game = game; + + if (game.state === "invalid") { + return; + } this.pips = Pips(this); this.tiles = Tiles(this); @@ -1251,7 +1260,7 @@ class Board extends React.Component { return (
this.el = el}> this.canvas = el}> -
this.cards = el}> +
this.cards = el}> { game &&
@@ -1260,7 +1269,10 @@ class Board extends React.Component { { this.state.message != "" &&
{this.state.message}
}
} -
In hand
+ { + game && game.state == "active" && + <> +
In hand
@@ -1300,6 +1312,7 @@ class Board extends React.Component {
Settlements remaining: 5
+ }
); diff --git a/client/webpack.common.js b/client/webpack.common.js deleted file mode 100644 index 2f14635..0000000 --- a/client/webpack.common.js +++ /dev/null @@ -1,33 +0,0 @@ -const path = require("path"); -const webpack = require("webpack"); - -module.exports = { - entry: "./src/index.js", - module: { - rules: [ - { - test: /\.(js|jsx)$/, - exclude: /(node_modules|bower_components)/, - loader: "babel-loader", - options: { presets: ["@babel/env"] } - }, - { - test: /\.css$/, - use: ["style-loader", "css-loader"] - }, - { - test: /\.(png|svg|jpg|md)$/, - use: [ "file-loader" ] - } - ] - }, - resolve: { - extensions: ["*", ".js", ".jsx"] - }, - output: { - path: path.resolve(__dirname, "dist/"), - publicPath: "./dist/", - filename: "bundle.js" - } -}; - diff --git a/client/webpack.dev.js b/client/webpack.dev.js deleted file mode 100755 index 16b9a94..0000000 --- a/client/webpack.dev.js +++ /dev/null @@ -1,41 +0,0 @@ -const path = require("path"); -const merge = require('webpack-merge') -const common = require('./webpack.common.js'); -const webpack = require('webpack'); -const config = require("config"); -const base = config.get("basePath"); - -const proxy = { -} - -console.log(`Using base: ${base}`); - -proxy[`${base}/`] = { - target: "http://localhost:8930", - bypass: function(req, res, proxyOptions) { - if ((req.url.indexOf(`${base}/assets`) == 0) || - (req.url.indexOf(`${base}/dist`) == 0)) { - return req.url.replace(base, ""); - } - console.log(`Proxying to backend server: ${req.url}`); - return null; - } -}; - -/* https://webpack.js.org/configuration/dev-server/ */ - -module.exports = merge(common, { - mode: "development", - devServer: { - contentBase: path.join(__dirname, "/"), - port: 8930, - publicPath: `http://localhost:8930${base}/dist/`, - hotOnly: true, - disableHostCheck: true, - historyApiFallback: true, - proxy: proxy - }, - plugins: [new webpack.HotModuleReplacementPlugin()] -}); - - diff --git a/client/webpack.prod.js b/client/webpack.prod.js deleted file mode 100644 index 65c5e7f..0000000 --- a/client/webpack.prod.js +++ /dev/null @@ -1,8 +0,0 @@ -const merge = require('webpack-merge') -const common = require('./webpack.common.js'); - -module.exports = merge(common, { - mode: "production", - devtool: 'source-map' -}); - diff --git a/server/routes/games.js b/server/routes/games.js index b921ea3..5b3bd05 100755 --- a/server/routes/games.js +++ b/server/routes/games.js @@ -101,93 +101,109 @@ for (let i = 0; i < 5; i++) { const games = {}; const roll = (game, player) => { - if (player == 0) { - console.log("No player active; roll has no action"); - return; + let error; + if (!player) { + error = "No player active; roll has no action"; + console.log(error); + return error; } + const name = player.name; + switch (game.state) { case "lobby": - if (game.players[player].order) { - console.log(`Player ${player} already rolled for order.`); - return; + if (player.order) { + error = `Player ${name} already rolled for order.`; + console.log(error); + return error; } game.dice = [ Math.ceil(Math.random() * 6) ]; - game.players[player].order = game.dice[0]; - const message = `${player} rolled ${game.dice[0]} for play order.`; + player.order = game.dice[0]; + const message = `${name} rolled ${game.dice[0]} for play order.`; game.chat.push({ date: Date.now(), message: message }); console.log(message); return; } + + error = `Invalid game state (${game.state}) in roll.`; + return error; } router.put("/:id/:action/:value?", (req, res) => { console.log(`PUT games/${req.params.id}/${req.params.action}`); - if (!req.params.action in games) { + if (!(req.params.id in games)) { const error = `Game not found: ${req.params.id}`; return res.status(404).send(error); } const game = games[req.params.id]; - if (!req.session.activePlayer || !req.session.activePlayer in game.players) { - const error = `Invalid player: ${req.session.activePlayer}`; - return res.status(404).send(error); + let error; + + if (!req.session.activePlayer || !(req.session.activePlayer in game.players)) { + error = `Invalid player: ${req.session.activePlayer}`; + return sendGame(res, req, game, error); } - - const player = game.players[req.session.activePlayer].name; - + + const player = game.players[req.session.activePlayer], + name = player.name; + switch (req.params.action) { case "roll": - roll(game, player); + error = roll(game, player); break; case "shuffle": if (game.state === "lobby") { shuffleBoard(game); - const message = `${player} requested a new board.`; + const message = `${name} requested a new board.`; game.chat.push({ date: Date.now(), message: message }); console.log(message); - return sendGame(res, req, game); } else { - const error = `Game no longer in lobby (${game.state}). Can not shuffle board.`; - return res.status(400).send(error) + error = `Game no longer in lobby (${game.state}). Can not shuffle board.`; } case "state": const state = req.params.value ? req.params.value : "active"; if (state != game.state) { game.state = state; - const message = `${player} set game state to ${state}.`; + const message = `${name} set game state to ${state}.`; game.chat.push({ date: Date.now(), message: message }); } - return sendGame(res, req, game); } - return sendGame(res, req, game); + return sendGame(res, req, game, error); }) router.get("/:id", async (req, res/*, next*/) => { - console.log("GET games/" + req.params.id); - let error; - if (req.params.id in games) { - const game = games[req.params.id]; + const id = req.params.id; + console.log("GET games/" + id); + let error, game; + + if (id in games) { + game = games[id]; return sendGame(res, req, game) } - if (/^.|\//.exec(req.params.id)) { + if (/^\.|\//.exec(id)) { error = `Requested game ID is invalid`; + console.log(error, id); return res.status(400).send(error); } - const game = await readFile(`games/${req.params.id}`) + + game = await readFile(`games/${id}`) .catch(() => { - return null; + return; }); + if (!game) { - error = `Unable to load game: ${req.params.id}`; - res.status(404).send(error); + error = `Game ${id} not found -- returning invalid game state.`; + console.warn(error); + game = { id: id, state: 'invalid' }; } else { - games[req.params.id] = game; - return sendGame(game); + game = JSON.parse(game); } + + games[id] = game; + return sendGame(res, req, game, error); }); router.put("/:id", (req, res/*, next*/) => { @@ -237,7 +253,18 @@ router.put("/:id", (req, res/*, next*/) => { } }); -const sendGame = async (res, req, game) => { +const sendGame = async (res, req, game, error) => { + let active = 0; + for (let player in game.players) { + player = game.players[player]; + active += ((player.status && player.status != 'Not active') ? 1 : 0); + } + if (active < 2 && game.state != 'lobby' && game.state != 'invalid') { + let message = "Insufficient players in game. Setting back to lobby." + game.chat.push({ date: Date.now(), message: message }); + console.log(message); + game.state = 'lobby'; + } await writeFile(`games/${game.id}`, JSON.stringify(game, null, 2)) .catch((error) => { console.error(`Unable to write to games/${games.id}`); @@ -246,6 +273,7 @@ const sendGame = async (res, req, game) => { return res.status(200).send(Object.assign({}, game, { timestamp: Date.now(), + status: error ? error : "success", activePlayer: (req.session && req.session.activePlayer) ? req.session.activePlayer : null }));