diff --git a/API/src/database/database.sqlite b/API/src/database/database.sqlite index ed7be32ccd95fadcfdba4d8983a6d5731c58f8a2..3b0f607132d41b2d59a2ed5c6fefffe988f5b37b 100644 Binary files a/API/src/database/database.sqlite and b/API/src/database/database.sqlite differ diff --git a/API/src/express/Server.ts b/API/src/express/Server.ts index b9adf9bb34ea1835f2c64ea74d68a3dfedc1fbcc..e45eed10423f19a3a9bae45f10e3e3a2910dce6a 100644 --- a/API/src/express/Server.ts +++ b/API/src/express/Server.ts @@ -1,25 +1,35 @@ -import { Express } from 'express-serve-static-core'; -import cors from 'cors'; +import {Express} from 'express-serve-static-core'; +import cors from 'cors'; import morganMiddleware from '../logging/MorganMiddleware'; -import logger from '../logging/WinstonLogger'; -import { AddressInfo } from 'net'; -import http from 'http'; -import helmet from 'helmet'; -import express from 'express'; -import multer from 'multer'; -import Config from '../config/Config'; -import BaseRoutes from '../routes/BaseRoutes'; -import ServerIO from '../socket.io/ServerIO'; -import routerUser from "../routes/router-gamer"; +import logger from '../logging/WinstonLogger'; +import {AddressInfo} from 'net'; +import http from 'http'; +import helmet from 'helmet'; +import express from 'express'; +import multer from 'multer'; +import Config from '../config/Config'; +import BaseRoutes from '../routes/BaseRoutes'; +import ServerIO from '../socket.io/ServerIO'; import routerGamer from "../routes/router-gamer"; import routerGuest from "../routes/router-guest"; import routerAdmin from "../routes/router-admin"; +import jwt from 'jsonwebtoken'; +import * as IO from 'socket.io'; + + +export interface SocketIoInfo extends IO.Socket{ + user :any; +} + + class Server { private readonly backend: Express; private readonly server: http.Server; private readonly io: ServerIO; + public static invalidTokens: string[] = []; + constructor() { this.backend = express(); @@ -52,6 +62,16 @@ class Server { this.server = http.createServer(this.backend); this.io = new ServerIO(this.server); + this.io.use((socket: SocketIoInfo, next) => { + const token = socket.handshake.auth.token; + + try { + socket.user = jwt.verify(token, process.env.SECRET_KEY); + next(); + } catch (error) { + next(new Error('Invalid token')); + } + }); } run() { diff --git a/API/src/routes/middleware.ts b/API/src/routes/middleware.ts index 3c3164c36f0467489626ed1b46ebafd347b1f834..56be529b503cdc9b0cbb9487d42d431675610299 100644 --- a/API/src/routes/middleware.ts +++ b/API/src/routes/middleware.ts @@ -47,6 +47,8 @@ export interface TokenRequest extends express.Request { user?: any; } + + export async function verifyToken(req: TokenRequest, res: express.Response, next: express.NextFunction) { const authHeader = req.headers['authorization']; @@ -59,7 +61,7 @@ export async function verifyToken(req: TokenRequest, res: express.Response, next try { req.user = jwt.verify(token, secretKey); - if(req.user.username !== req.params.admin) + if(req.user.username !== req.params.admin && req.user.username !== req.params.username) return res.status(403).json({message: 'Invalid token user'}); //check if admin or user next(); diff --git a/API/src/routes/router-guest.ts b/API/src/routes/router-guest.ts index ad6875e571b780883d9b047a867bb5aeee6a89fb..32728878839f94492c75e6478f81560121cd08ce 100644 --- a/API/src/routes/router-guest.ts +++ b/API/src/routes/router-guest.ts @@ -29,7 +29,7 @@ router.post('/:username', checkExistingUser, async (req: express.Request, res: e let usertype=user.dataValues.type === "user"?"USER":"ADMIN" if (user.dataValues.password === data.password) { // Génération du token JWT - const userInfo={ type: userType, username: req.params.username, firstname: user.dataValues.firstname, lastname: user.dataValues.lastname } + const userInfo={ type: user.dataValues.type, username: req.params.username, firstname: user.dataValues.firstname, lastname: user.dataValues.lastname } const secretKey=process.env.SECRET_KEY; const token = jwt.sign(userInfo, secretKey); res.status(StatusCodes.OK).json({message: usertype+"_ALLOWED", token: token, firstname: user.dataValues.firstname, lastname: user.dataValues.lastname}); diff --git a/API/src/socket.io/ServerIO.ts b/API/src/socket.io/ServerIO.ts index 11e53d43f1eb05eefe03188960519b16ff155256..9ec2874d7485b1a4a2ce760a84eddefce2933d13 100644 --- a/API/src/socket.io/ServerIO.ts +++ b/API/src/socket.io/ServerIO.ts @@ -1,11 +1,16 @@ import * as IO from 'socket.io'; import logger from '../logging/WinstonLogger'; import http from 'http'; +import Server, {SocketIoInfo} from "../express/Server"; +import {UserInfo} from "./UserInfo" //TODO: In this file you can add/edit all things about socket.io + + class ServerIO extends IO.Server { + players: { [key: string]: UserInfo } = {}; constructor(server: http.Server) { super(server, { cors: { @@ -13,18 +18,67 @@ class ServerIO extends IO.Server { } }); - this.on('connection', (socket: IO.Socket) => { - logger.info(`Nouveau socket vers ${ socket.client.conn.remoteAddress }`); + + this.on('connection', (socket: SocketIoInfo) => { + logger.info(`Nouveau socket vers ${ socket.client.conn.remoteAddress }`) ; + console.log(`Socket info: ${ socket.user.username } // ${ socket.user.firstname } // ${socket.user.lastname}`); + const playerKey = socket.user.username; + // Vérifiez si le joueur existe déjà dans le dictionnaire + if (this.players[playerKey]) { + // Le joueur est déjà connecté, vous pouvez effectuer une action appropriée ici + console.log(`Player ${playerKey} is already connected.`); + } else { + // Le joueur n'est pas encore connecté, ajoutez-le au dictionnaire + this.players[playerKey] = new UserInfo( + socket.user.username, + socket.user.firstname, + socket.user.lastname + ); + console.log(`Player ${playerKey} is connected.`); + } + + this.testNumberofPlayer(); + this.registerEventsOnSocket(socket); }); + + } - private registerEventsOnSocket(socket: IO.Socket) { - socket.on('Hello World', _ => { - socket.emit('Bienvenue', socket.id); + private registerEventsOnSocket(socket: SocketIoInfo) { + + socket.on('disconnect', () => { + logger.info(`Deconnexion du socket ${ socket.client.conn.remoteAddress }`) ; + console.log(`Socket info: ${ socket.user.username } // ${ socket.user.firstname } // ${socket.user.lastname}`); + const playerKey = socket.user.username; + + + // Vérifiez si le joueur est dans le dictionnaire + if (this.players[playerKey]) { + // Le joueur est connecté, retirez-le du dictionnaire + delete this.players[playerKey]; + console.log(`Player ${playerKey} is disconnected.`); + } else { + // Le joueur n'est pas trouvé dans le dictionnaire, cela peut être un cas anormal + console.log(`Player ${playerKey} is not connected.`); + } + this.testNumberofPlayer(); + }); } + + private testNumberofPlayer(){ + if(Object.keys(this.players).length < 3){ + this.emit("players-left", 3 - Object.keys(this.players).length) + console.log(Object.keys(this.players).length) + } + + if (Object.keys(this.players).length === 3) { + // Démarre le jeu + this.emit('start-game'); + } + } } diff --git a/API/src/socket.io/UserInfo.ts b/API/src/socket.io/UserInfo.ts index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..079aa860b57f109ad5e09d5c13735075b1e624c2 100644 --- a/API/src/socket.io/UserInfo.ts +++ b/API/src/socket.io/UserInfo.ts @@ -0,0 +1,7 @@ +export class UserInfo { + constructor( + public username: string, + public firstname: string, + public lastname: string + ){} +} \ No newline at end of file