added fetching data with socketio
This commit is contained in:
parent
9686276ece
commit
159b96a678
@ -1,23 +1,23 @@
|
|||||||
const session = require("express-session");
|
const session = require('express-session');
|
||||||
const CONNECTION_URI = require("../credentials.js");
|
const CONNECTION_URI = require('../credentials.js');
|
||||||
const MongoDBStore = require("connect-mongodb-session")(session);
|
const MongoDBStore = require('connect-mongodb-session')(session);
|
||||||
const store = new MongoDBStore({
|
const store = new MongoDBStore({
|
||||||
uri: CONNECTION_URI,
|
uri: CONNECTION_URI,
|
||||||
collection: "sessions",
|
collection: 'sessions',
|
||||||
});
|
});
|
||||||
const sessionMiddleware = session({
|
const sessionMiddleware = session({
|
||||||
secret: "lalala",
|
|
||||||
resave: true,
|
|
||||||
saveUninitialized: false,
|
|
||||||
store: store,
|
store: store,
|
||||||
credentials: true,
|
credentials: true,
|
||||||
cookie: {
|
cookie: {
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
},
|
},
|
||||||
|
secret: 'secret',
|
||||||
|
saveUninitialized: true,
|
||||||
|
resave: true,
|
||||||
|
maxAge: 20000,
|
||||||
});
|
});
|
||||||
|
|
||||||
const wrap = (expressMiddleware) => (socket, next) =>
|
const wrap = expressMiddleware => (socket, next) => expressMiddleware(socket.request, {}, next);
|
||||||
expressMiddleware(socket.request, {}, next);
|
|
||||||
|
|
||||||
module.exports = { sessionMiddleware, wrap };
|
module.exports = { sessionMiddleware, wrap };
|
||||||
|
|||||||
@ -53,7 +53,7 @@ module.exports = (io, socket) => {
|
|||||||
ready: false,
|
ready: false,
|
||||||
color: colors[room.players.length],
|
color: colors[room.players.length],
|
||||||
});
|
});
|
||||||
const updatedRoom = { players: room.players };
|
let updatedRoom = { players: room.players };
|
||||||
// Checking if the room is full
|
// Checking if the room is full
|
||||||
if (room.players.length === 4) {
|
if (room.players.length === 4) {
|
||||||
// Changes the properties of the room to the state to start the game
|
// Changes the properties of the room to the state to start the game
|
||||||
|
|||||||
35
backend/handlers/roomHandler.js
Normal file
35
backend/handlers/roomHandler.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
const RoomModel = require('../schemas/room');
|
||||||
|
|
||||||
|
module.exports = (io, socket) => {
|
||||||
|
const req = socket.request;
|
||||||
|
const getData = () => {
|
||||||
|
RoomModel.findOne({ _id: req.session.roomId }, function (err, room) {
|
||||||
|
if (!room) return err;
|
||||||
|
if (room.nextMoveTime <= Date.now()) {
|
||||||
|
changeCurrentMovingPlayer();
|
||||||
|
} else {
|
||||||
|
io.to(req.session.roomId).emit('room:data', JSON.stringify(room));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.on('room:data', getData);
|
||||||
|
|
||||||
|
function changeCurrentMovingPlayer() {
|
||||||
|
RoomModel.findOne({ _id: req.session.roomId }, function (err, room) {
|
||||||
|
if (!room) return err;
|
||||||
|
const index = room.players.findIndex(player => player.nowMoving === true);
|
||||||
|
const roomSize = room.players.length;
|
||||||
|
room.players[index].nowMoving = false;
|
||||||
|
if (index + 1 === roomSize) {
|
||||||
|
room.players[0].nowMoving = true;
|
||||||
|
} else {
|
||||||
|
room.players[index + 1].nowMoving = true;
|
||||||
|
}
|
||||||
|
room.nextMoveTime = Date.now() + 15000;
|
||||||
|
RoomModel.findOneAndUpdate({ _id: req.session.roomId }, room, function (err, updatedRoom) {
|
||||||
|
io.to(req.session.roomId).emit('room:data', JSON.stringify(updatedRoom));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -1,47 +0,0 @@
|
|||||||
const express = require("express");
|
|
||||||
const router = express.Router();
|
|
||||||
const RoomModel = require("../schemas/room");
|
|
||||||
|
|
||||||
|
|
||||||
//get room values
|
|
||||||
router.get("/", function (req, res) {
|
|
||||||
RoomModel.findOne(
|
|
||||||
{ _id: req.session.roomId }, //find room by id
|
|
||||||
function (err, docs) {
|
|
||||||
if (err) {
|
|
||||||
console.log(err);
|
|
||||||
} else {
|
|
||||||
if (docs) {
|
|
||||||
if (docs.nextMoveTime <= Date.now()) {
|
|
||||||
RoomModel.findOne({ _id: req.session.roomId }, function (err, doc) {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send(err);
|
|
||||||
} else {
|
|
||||||
const index = doc.players.findIndex(player => player.nowMoving === true);
|
|
||||||
const roomSize = doc.players.length;
|
|
||||||
doc.players[index].nowMoving = false;
|
|
||||||
if (index + 1 === roomSize) {
|
|
||||||
doc.players[0].nowMoving = true;
|
|
||||||
} else {
|
|
||||||
doc.players[index + 1].nowMoving = true;
|
|
||||||
}
|
|
||||||
doc.nextMoveTime = Date.now() + 15000;
|
|
||||||
RoomModel.findOneAndUpdate({ _id: req.session.roomId }, doc, function (err, docs) {
|
|
||||||
if (err) {
|
|
||||||
res.status(500).send(err);
|
|
||||||
} else {
|
|
||||||
res.send(docs);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
res.send(docs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = router;
|
|
||||||
@ -3,6 +3,7 @@ const cors = require('cors');
|
|||||||
const cookieParser = require('cookie-parser');
|
const cookieParser = require('cookie-parser');
|
||||||
const { sessionMiddleware, wrap } = require('./controllers/serverController');
|
const { sessionMiddleware, wrap } = require('./controllers/serverController');
|
||||||
const registerPlayerHandlers = require('./handlers/playerHandler');
|
const registerPlayerHandlers = require('./handlers/playerHandler');
|
||||||
|
const registerRoomHandlers = require('./handlers/roomHandler');
|
||||||
const PORT = 8080;
|
const PORT = 8080;
|
||||||
const mongoose = require('mongoose');
|
const mongoose = require('mongoose');
|
||||||
const CONNECTION_URI = require('./credentials.js');
|
const CONNECTION_URI = require('./credentials.js');
|
||||||
@ -73,20 +74,19 @@ io.use(wrap(sessionMiddleware));
|
|||||||
|
|
||||||
io.on('connection', socket => {
|
io.on('connection', socket => {
|
||||||
registerPlayerHandlers(io, socket);
|
registerPlayerHandlers(io, socket);
|
||||||
|
registerRoomHandlers(io, socket);
|
||||||
if (socket.request.session.roomId) {
|
if (socket.request.session.roomId) {
|
||||||
socket.join(socket.request.session.roomId);
|
socket.join(socket.request.session.roomId);
|
||||||
socket.emit('player:data', JSON.stringify(session));
|
socket.emit('player:data', JSON.stringify(socket.request.session));
|
||||||
io.to(socket.request.session.roomId).emit('player joined');
|
io.to(socket.request.session.roomId).emit('player joined');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//ROUTES CONFIG
|
//ROUTES CONFIG
|
||||||
const roomRoutes = require('./routes/room');
|
|
||||||
const playerRoutes = require('./routes/player');
|
const playerRoutes = require('./routes/player');
|
||||||
const gameRoutes = require('./routes/game');
|
const gameRoutes = require('./routes/game');
|
||||||
|
|
||||||
app.use('/player', playerRoutes);
|
app.use('/player', playerRoutes);
|
||||||
app.use('/room', roomRoutes);
|
|
||||||
app.use('/game', gameRoutes);
|
app.use('/game', gameRoutes);
|
||||||
|
|
||||||
if (process.env.NODE_ENV === 'production') {
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
|||||||
@ -1,12 +1,13 @@
|
|||||||
import React, { useState, useEffect, useContext, useCallback } from 'react';
|
import React, { useState, useEffect, useContext, useCallback } from 'react';
|
||||||
import { PlayerDataContext } from '../App'
|
import { PlayerDataContext, SocketContext } from '../App';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import Map from './game-board-components/Map'
|
import Map from './game-board-components/Map';
|
||||||
import Dice from './game-board-components/Dice'
|
import Dice from './game-board-components/Dice';
|
||||||
import Navbar from './Navbar'
|
import Navbar from './Navbar';
|
||||||
|
|
||||||
const Gameboard = () => {
|
const Gameboard = () => {
|
||||||
// Context data
|
// Context data
|
||||||
|
const socket = useContext(SocketContext);
|
||||||
const context = useContext(PlayerDataContext);
|
const context = useContext(PlayerDataContext);
|
||||||
// Render data
|
// Render data
|
||||||
const [pawns, setPawns] = useState([]);
|
const [pawns, setPawns] = useState([]);
|
||||||
@ -20,26 +21,29 @@ const Gameboard = () => {
|
|||||||
const checkWin = useCallback(() => {
|
const checkWin = useCallback(() => {
|
||||||
// Player wins when all pawns with same color are inside end base
|
// Player wins when all pawns with same color are inside end base
|
||||||
if (pawns.filter(pawn => pawn.color === 'red' && pawn.position === 73).length === 4) {
|
if (pawns.filter(pawn => pawn.color === 'red' && pawn.position === 73).length === 4) {
|
||||||
alert("Red Won")
|
alert('Red Won');
|
||||||
} else if (pawns.filter(pawn => pawn.color === 'blue' && pawn.position === 79).length === 4) {
|
} else if (pawns.filter(pawn => pawn.color === 'blue' && pawn.position === 79).length === 4) {
|
||||||
alert("Blue Won")
|
alert('Blue Won');
|
||||||
} else if (pawns.filter(pawn => pawn.color === 'green' && pawn.position === 85).length === 4) {
|
} else if (pawns.filter(pawn => pawn.color === 'green' && pawn.position === 85).length === 4) {
|
||||||
alert("Green Won")
|
alert('Green Won');
|
||||||
} else if (pawns.filter(pawn => pawn.color === 'yellow' && pawn.position === 91).length === 4) {
|
} else if (pawns.filter(pawn => pawn.color === 'yellow' && pawn.position === 91).length === 4) {
|
||||||
alert("Yellow Won")
|
alert('Yellow Won');
|
||||||
}
|
}
|
||||||
}, [pawns]);
|
}, [pawns]);
|
||||||
// Fetching game data
|
// Fetching game data
|
||||||
const fetchData = useCallback(() => {
|
const fetchData = useCallback(() => {
|
||||||
axios.get('/room/',{
|
socket.emit('room:data');
|
||||||
withCredentials:true,
|
}, []);
|
||||||
}).then((response)=>{
|
|
||||||
|
useEffect(() => {
|
||||||
|
socket.on('room:data', data => {
|
||||||
|
data = JSON.parse(data);
|
||||||
// Filling navbar with empty player nick container
|
// Filling navbar with empty player nick container
|
||||||
while(response.data.players.length !== 4){
|
while (data.players.length !== 4) {
|
||||||
response.data.players.push({name: "...",});
|
data.players.push({ name: '...' });
|
||||||
};
|
}
|
||||||
// Checks if client is currently moving player by session ID
|
// Checks if client is currently moving player by session ID
|
||||||
const nowMovingPlayer = response.data.players.find(player => player.nowMoving === true);
|
const nowMovingPlayer = data.players.find(player => player.nowMoving === true);
|
||||||
if (nowMovingPlayer) {
|
if (nowMovingPlayer) {
|
||||||
if (nowMovingPlayer._id === context.playerId) {
|
if (nowMovingPlayer._id === context.playerId) {
|
||||||
setNowMoving(true);
|
setNowMoving(true);
|
||||||
@ -49,22 +53,19 @@ const Gameboard = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
checkWin();
|
checkWin();
|
||||||
setPlayers(response.data.players);
|
setPlayers(data.players);
|
||||||
setPawns(response.data.pawns);
|
setPawns(data.pawns);
|
||||||
setTime(response.data.nextMoveTime);
|
setTime(data.nextMoveTime);
|
||||||
setStarted(response.data.started);
|
setStarted(data.started);
|
||||||
})
|
});
|
||||||
},[checkWin, context.playerId]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
//sending ajax every 1 sec
|
//sending ajax every 1 sec
|
||||||
const interval = setInterval(fetchData, 1000);
|
const interval = setInterval(fetchData, 1000);
|
||||||
return () => clearInterval(interval);
|
return () => clearInterval(interval);
|
||||||
}, [fetchData]);
|
}, [fetchData]);
|
||||||
// Callback to handle dice rolling between dice and map component
|
// Callback to handle dice rolling between dice and map component
|
||||||
const rolledNumberCallback = (number) => {
|
const rolledNumberCallback = number => {
|
||||||
setRolledNumber(number);
|
setRolledNumber(number);
|
||||||
}
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -72,8 +73,7 @@ const Gameboard = () => {
|
|||||||
{nowMoving ? <Dice nowMoving={nowMoving} rolledNumberCallback={rolledNumberCallback} /> : null}
|
{nowMoving ? <Dice nowMoving={nowMoving} rolledNumberCallback={rolledNumberCallback} /> : null}
|
||||||
<Map pawns={pawns} nowMoving={nowMoving} rolledNumber={rolledNumber} />
|
<Map pawns={pawns} nowMoving={nowMoving} rolledNumber={rolledNumber} />
|
||||||
</>
|
</>
|
||||||
)
|
);
|
||||||
|
};
|
||||||
}
|
|
||||||
|
|
||||||
export default Gameboard;
|
export default Gameboard;
|
||||||
Loading…
Reference in New Issue
Block a user