From 948214b50a479d2dae2575bd7cf7cf444d264a4b Mon Sep 17 00:00:00 2001 From: batche Date: Mon, 21 Nov 2022 17:29:23 +0100 Subject: [PATCH 01/45] suppression fichier inutile --- srcs/requirements/nestjs/FICHIER INUTILE.INUTILE | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 srcs/requirements/nestjs/FICHIER INUTILE.INUTILE diff --git a/srcs/requirements/nestjs/FICHIER INUTILE.INUTILE b/srcs/requirements/nestjs/FICHIER INUTILE.INUTILE deleted file mode 100644 index e69de29b..00000000 From b04cd0aa48762444df0f38c4cf36379fe7a8ab8c Mon Sep 17 00:00:00 2001 From: batche Date: Mon, 12 Dec 2022 12:37:47 +0100 Subject: [PATCH 02/45] =?UTF-8?q?Impl=C3=A9mentation=20du=20jeu=20dans=20s?= =?UTF-8?q?velte=20HOPE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JEU2/jsconfig.json | 13 - JEU2/make.sh | 18 -- JEU2/memo.txt | 45 ---- JEU2/package-lock.json | 121 --------- JEU2/package.json | 13 - JEU2/src/server/class/Client.ts | 36 --- JEU2/src/server/class/GameComponents.ts | 65 ----- JEU2/src/server/class/GameComponentsServer.ts | 15 -- JEU2/src/server/class/GameSession.ts | 188 -------------- JEU2/src/server/class/interface.ts | 21 -- JEU2/src/server/enums.ts | 47 ---- JEU2/src/server/server.ts | 41 --- JEU2/src/server/utils.ts | 33 --- JEU2/src/server/wallsMovement.ts | 20 -- JEU2/src/server/wsServer.ts | 238 ------------------ JEU2/tsconfig.json | 107 -------- .../api_front/public/game/class/Event.ts | 107 -------- .../api_front/public/game/class/Rectangle.ts | 144 ----------- .../api_front/public/game/class/Vector.ts | 49 ---- .../api_front/public/game/constants copy.ts | 26 -- .../svelte/api_front/public/game/gameLoop.ts | 49 ---- .../svelte/api_front/public/game/global.ts | 3 - .../svelte/api_front/public/index.html | 2 +- .../public/{sound => sounds}/pong/0.ogg | Bin .../public/{sound => sounds}/pong/1.ogg | Bin .../public/{sound => sounds}/pong/10.ogg | Bin .../public/{sound => sounds}/pong/11.ogg | Bin .../public/{sound => sounds}/pong/12.ogg | Bin .../public/{sound => sounds}/pong/13.ogg | Bin .../public/{sound => sounds}/pong/14.ogg | Bin .../public/{sound => sounds}/pong/15.ogg | Bin .../public/{sound => sounds}/pong/16.ogg | Bin .../public/{sound => sounds}/pong/17.ogg | Bin .../public/{sound => sounds}/pong/18.ogg | Bin .../public/{sound => sounds}/pong/19.ogg | Bin .../public/{sound => sounds}/pong/2.ogg | Bin .../public/{sound => sounds}/pong/20.ogg | Bin .../public/{sound => sounds}/pong/21.ogg | Bin .../public/{sound => sounds}/pong/22.ogg | Bin .../public/{sound => sounds}/pong/23.ogg | Bin .../public/{sound => sounds}/pong/24.ogg | Bin .../public/{sound => sounds}/pong/25.ogg | Bin .../public/{sound => sounds}/pong/26.ogg | Bin .../public/{sound => sounds}/pong/27.ogg | Bin .../public/{sound => sounds}/pong/28.ogg | Bin .../public/{sound => sounds}/pong/29.ogg | Bin .../public/{sound => sounds}/pong/3.ogg | Bin .../public/{sound => sounds}/pong/30.ogg | Bin .../public/{sound => sounds}/pong/31.ogg | Bin .../public/{sound => sounds}/pong/32.ogg | Bin .../public/{sound => sounds}/pong/4.ogg | Bin .../public/{sound => sounds}/pong/5.ogg | Bin .../public/{sound => sounds}/pong/6.ogg | Bin .../public/{sound => sounds}/pong/7.ogg | Bin .../public/{sound => sounds}/pong/8.ogg | Bin .../public/{sound => sounds}/pong/9.ogg | Bin .../public/{sound => sounds}/roblox-oof.ogg | Bin .../api_front/public/sounds/sound/pong/0.ogg | Bin 4228 -> 0 bytes .../api_front/public/sounds/sound/pong/1.ogg | Bin 4298 -> 0 bytes .../api_front/public/sounds/sound/pong/10.ogg | Bin 4226 -> 0 bytes .../api_front/public/sounds/sound/pong/11.ogg | Bin 4306 -> 0 bytes .../api_front/public/sounds/sound/pong/12.ogg | Bin 4398 -> 0 bytes .../api_front/public/sounds/sound/pong/13.ogg | Bin 4322 -> 0 bytes .../api_front/public/sounds/sound/pong/14.ogg | Bin 4439 -> 0 bytes .../api_front/public/sounds/sound/pong/15.ogg | Bin 4199 -> 0 bytes .../api_front/public/sounds/sound/pong/16.ogg | Bin 4428 -> 0 bytes .../api_front/public/sounds/sound/pong/17.ogg | Bin 4427 -> 0 bytes .../api_front/public/sounds/sound/pong/18.ogg | Bin 4324 -> 0 bytes .../api_front/public/sounds/sound/pong/19.ogg | Bin 4358 -> 0 bytes .../api_front/public/sounds/sound/pong/2.ogg | Bin 4378 -> 0 bytes .../api_front/public/sounds/sound/pong/20.ogg | Bin 4238 -> 0 bytes .../api_front/public/sounds/sound/pong/21.ogg | Bin 4320 -> 0 bytes .../api_front/public/sounds/sound/pong/22.ogg | Bin 4343 -> 0 bytes .../api_front/public/sounds/sound/pong/23.ogg | Bin 4240 -> 0 bytes .../api_front/public/sounds/sound/pong/24.ogg | Bin 4241 -> 0 bytes .../api_front/public/sounds/sound/pong/25.ogg | Bin 4348 -> 0 bytes .../api_front/public/sounds/sound/pong/26.ogg | Bin 4399 -> 0 bytes .../api_front/public/sounds/sound/pong/27.ogg | Bin 4227 -> 0 bytes .../api_front/public/sounds/sound/pong/28.ogg | Bin 4160 -> 0 bytes .../api_front/public/sounds/sound/pong/29.ogg | Bin 4205 -> 0 bytes .../api_front/public/sounds/sound/pong/3.ogg | Bin 4292 -> 0 bytes .../api_front/public/sounds/sound/pong/30.ogg | Bin 4305 -> 0 bytes .../api_front/public/sounds/sound/pong/31.ogg | Bin 4319 -> 0 bytes .../api_front/public/sounds/sound/pong/32.ogg | Bin 4397 -> 0 bytes .../api_front/public/sounds/sound/pong/4.ogg | Bin 4464 -> 0 bytes .../api_front/public/sounds/sound/pong/5.ogg | Bin 4220 -> 0 bytes .../api_front/public/sounds/sound/pong/6.ogg | Bin 4197 -> 0 bytes .../api_front/public/sounds/sound/pong/7.ogg | Bin 4442 -> 0 bytes .../api_front/public/sounds/sound/pong/8.ogg | Bin 4351 -> 0 bytes .../api_front/public/sounds/sound/pong/9.ogg | Bin 4291 -> 0 bytes .../public/sounds/sound/roblox-oof.ogg | Bin 6383 -> 0 bytes .../requirements/svelte/api_front/src/main.js | 9 + .../svelte/api_front/src/main.js.map | 1 + .../api_front/src/pages/game/Game.svelte | 117 ++++++--- .../game => src/pages/game/client}/audio.ts | 4 +- .../pages/game/client}/class/GameArea.ts | 4 +- .../client}/class/GameComponentsClient.ts | 9 +- .../pages/game/client}/class/InputHistory.ts | 4 +- .../game/client}/class/RectangleClient.ts | 34 +-- .../pages/game/client}/class/Text.ts | 6 +- .../pages/game/client}/constants.ts | 0 .../game => src/pages/game/client}/draw.ts | 8 +- .../src/pages/game/client/gameLoop.ts | 71 ++++++ .../api_front/src/pages/game/client/global.ts | 29 +++ .../pages/game/client}/handleInput.ts | 6 +- .../src/pages/game/client/message.ts | 80 ++++++ .../game => src/pages/game/client}/pong.ts | 49 ++-- .../src/pages/game/client/pongSpectator.ts | 46 ++++ .../game => src/pages/game/client}/utils.ts | 4 +- .../game => src/pages/game/client}/ws.ts | 150 +++++++++-- .../src/pages/game/shared_js}/class/Event.ts | 48 ++-- .../game/shared_js}/class/GameComponents.ts | 4 +- .../pages/game/shared_js}/class/Rectangle.ts | 28 +-- .../src/pages/game/shared_js}/class/Vector.ts | 8 +- .../pages/game/shared_js}/class/interface.ts | 8 +- .../src/pages/game/shared_js}/constants.ts | 13 +- .../pages/game/shared_js}/enums.ts | 13 +- .../pages/game/shared_js/utils.ts} | 10 +- .../pages/game/shared_js}/wallsMovement.ts | 4 +- .../api_front/src/routes/primaryRoutes.js | 193 +------------- .../svelte/api_front/tsconfig.json | 2 +- 121 files changed, 570 insertions(+), 1793 deletions(-) delete mode 100644 JEU2/jsconfig.json delete mode 100644 JEU2/make.sh delete mode 100644 JEU2/memo.txt delete mode 100644 JEU2/package-lock.json delete mode 100644 JEU2/package.json delete mode 100644 JEU2/src/server/class/Client.ts delete mode 100644 JEU2/src/server/class/GameComponents.ts delete mode 100644 JEU2/src/server/class/GameComponentsServer.ts delete mode 100644 JEU2/src/server/class/GameSession.ts delete mode 100644 JEU2/src/server/class/interface.ts delete mode 100644 JEU2/src/server/enums.ts delete mode 100644 JEU2/src/server/server.ts delete mode 100644 JEU2/src/server/utils.ts delete mode 100644 JEU2/src/server/wallsMovement.ts delete mode 100644 JEU2/src/server/wsServer.ts delete mode 100644 JEU2/tsconfig.json delete mode 100644 srcs/requirements/svelte/api_front/public/game/class/Event.ts delete mode 100644 srcs/requirements/svelte/api_front/public/game/class/Rectangle.ts delete mode 100644 srcs/requirements/svelte/api_front/public/game/class/Vector.ts delete mode 100644 srcs/requirements/svelte/api_front/public/game/constants copy.ts delete mode 100644 srcs/requirements/svelte/api_front/public/game/gameLoop.ts delete mode 100644 srcs/requirements/svelte/api_front/public/game/global.ts rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/0.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/1.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/10.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/11.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/12.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/13.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/14.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/15.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/16.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/17.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/18.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/19.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/2.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/20.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/21.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/22.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/23.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/24.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/25.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/26.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/27.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/28.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/29.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/3.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/30.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/31.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/32.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/4.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/5.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/6.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/7.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/8.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/pong/9.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sound => sounds}/roblox-oof.ogg (100%) delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/0.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/1.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/10.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/11.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/12.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/13.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/14.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/15.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/16.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/17.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/18.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/19.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/2.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/20.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/21.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/22.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/23.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/24.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/25.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/26.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/27.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/28.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/29.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/3.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/30.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/31.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/32.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/4.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/5.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/6.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/7.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/8.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/pong/9.ogg delete mode 100644 srcs/requirements/svelte/api_front/public/sounds/sound/roblox-oof.ogg create mode 100644 srcs/requirements/svelte/api_front/src/main.js create mode 100644 srcs/requirements/svelte/api_front/src/main.js.map rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/audio.ts (66%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/class/GameArea.ts (96%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/class/GameComponentsClient.ts (93%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/class/InputHistory.ts (87%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/class/RectangleClient.ts (79%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/class/Text.ts (93%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/constants.ts (100%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/draw.ts (84%) create mode 100644 srcs/requirements/svelte/api_front/src/pages/game/client/gameLoop.ts create mode 100644 srcs/requirements/svelte/api_front/src/pages/game/client/global.ts rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/handleInput.ts (96%) create mode 100644 srcs/requirements/svelte/api_front/src/pages/game/client/message.ts rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/pong.ts (71%) create mode 100644 srcs/requirements/svelte/api_front/src/pages/game/client/pongSpectator.ts rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/utils.ts (68%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/client}/ws.ts (57%) rename {JEU2/src/server => srcs/requirements/svelte/api_front/src/pages/game/shared_js}/class/Event.ts (62%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/shared_js}/class/GameComponents.ts (97%) rename {JEU2/src/server => srcs/requirements/svelte/api_front/src/pages/game/shared_js}/class/Rectangle.ts (94%) rename {JEU2/src/server => srcs/requirements/svelte/api_front/src/pages/game/shared_js}/class/Vector.ts (88%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/shared_js}/class/interface.ts (66%) rename {JEU2/src/server => srcs/requirements/svelte/api_front/src/pages/game/shared_js}/constants.ts (77%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/shared_js}/enums.ts (74%) rename srcs/requirements/svelte/api_front/{public/game/utils copy.ts => src/pages/game/shared_js/utils.ts} (55%) rename srcs/requirements/svelte/api_front/{public/game => src/pages/game/shared_js}/wallsMovement.ts (87%) diff --git a/JEU2/jsconfig.json b/JEU2/jsconfig.json deleted file mode 100644 index 347bf03f..00000000 --- a/JEU2/jsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "module": "ESNext", - "moduleResolution": "Node", - "target": "ES2020", - "strictNullChecks": true, - "strictFunctionTypes": true - }, - "exclude": [ - "node_modules", - "**/node_modules/*" - ] -} \ No newline at end of file diff --git a/JEU2/make.sh b/JEU2/make.sh deleted file mode 100644 index ebce024a..00000000 --- a/JEU2/make.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -npx tsc - -mkdir -p www -cp ./src/client/*.html ./www/ -cp ./src/client/*.css ./www/ - -mkdir -p www/js -cp ./src/client/*.js ./www/js/ - -mkdir -p www/js/class -cp ./src/client/class/*.js ./www/js/class/ - -mkdir -p www/shared_js/ -cp ./src/shared_js/*.js ./www/shared_js/ - -mkdir -p www/shared_js/class -cp ./src/shared_js/class/*.js ./www/shared_js/class/ diff --git a/JEU2/memo.txt b/JEU2/memo.txt deleted file mode 100644 index 20d493f3..00000000 --- a/JEU2/memo.txt +++ /dev/null @@ -1,45 +0,0 @@ -Done: - - Connexion client/serveur via un Websocket - - implémentation basique (authoritative server) - - Matchmaking - - client prediction - - server reconciliation (buffer des inputs côté client + id sur les inputs) - - amélioration collision avec Hugo - - du son (rebonds de la balle, "Oof" de Roblox sur un point) - - init de GameComponents partagé entre serveur et client. - - draw on the canvas "WIN", "LOSE", "MATCHMAKING COMPLETE", ... - - interpolation (mis à jour progressif des mouvements de l'adversaire) - - traitement groupé des inputs clients toutes les x millisecondes - (BUG désynchronisation: revenu à un traitement immédiat en attendant) - - Détruire les GameSession une fois finies. - - mode multi-balles - - mode murs mouvant (la zone de jeu rétréci / agrandi en continu) - - Selection des modes de jeu via HTML - - Selection audio on/off via HTML - -TODO: -- Match Abort si tout les joueurs ne sont pas pret assez vite (~15 secondes) -- mode spectateur -- certaines utilisations de Math.floor() superflu ? Vérifier les appels. - (éventuellement Math.round() ?) -- un autre mode de jeu alternatif ? -- changer les "localhost:8080" dans le code. -- sélection couleur des raquettes (your color/opponent color) dans le profil utilisateur. - Enregistrement dans la DB. - init des couleurs dans GameComponentsClient() basé sur les variables de l'utilsateur connecté. ------------ -idées modes de jeu : - - mode 2 raquettes (un joueur haut/gauche et bas/droite) - - skin patate ??? -- (prediction de l'avancement de la balle basé sur la latence serveur ?) -- d'autres sons (foule qui applaudi/musique de victoire) ------------ -- BUG: Si la balle va très vite, elle peut ignorer la collision avec une raquette ou mur. -la collision est testée seulement après le mouvement. -Pour éviter ce bug il faudrait diviser le mouvement pour faire plusieurs tests de collision successifs. -- BUG mineur: sur un changement de fenêtre, les touches restent enfoncées et il faut les "décoincer" -en réappuyant. Ce n'est pas grave mais peut-on faire mieux ? ----------- -OSEF, rebuts: -- reconnection -- amélioration du protocole, remplacement du JSON (compression. moins de bande passante). diff --git a/JEU2/package-lock.json b/JEU2/package-lock.json deleted file mode 100644 index 807c07eb..00000000 --- a/JEU2/package-lock.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "name": "ft_transcendence", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "dependencies": { - "uuid": "^9.0.0", - "ws": "^8.10.0" - }, - "devDependencies": { - "@types/node": "^18.11.5", - "@types/uuid": "^8.3.4", - "@types/ws": "^8.5.3", - "typescript": "^4.8.4" - } - }, - "node_modules/@types/node": { - "version": "18.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", - "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==", - "dev": true - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/ws": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", - "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - }, - "dependencies": { - "@types/node": { - "version": "18.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", - "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==", - "dev": true - }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "ws": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", - "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", - "requires": {} - } - } -} diff --git a/JEU2/package.json b/JEU2/package.json deleted file mode 100644 index f8f23534..00000000 --- a/JEU2/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "module", - "devDependencies": { - "@types/node": "^18.11.5", - "@types/uuid": "^8.3.4", - "@types/ws": "^8.5.3", - "typescript": "^4.8.4" - }, - "dependencies": { - "uuid": "^9.0.0", - "ws": "^8.10.0" - } -} diff --git a/JEU2/src/server/class/Client.ts b/JEU2/src/server/class/Client.ts deleted file mode 100644 index dead987b..00000000 --- a/JEU2/src/server/class/Client.ts +++ /dev/null @@ -1,36 +0,0 @@ - -import { WebSocket } from "../wsServer.js"; -import { Racket } from "../../shared_js/class/Rectangle.js"; -import { GameSession } from "./GameSession.js"; -import * as ev from "./Event.js" -import * as en from "../enums.js" - -class Client { - socket: WebSocket; - id: string; // Pas indispensable si "socket" a une copie de "id" - isAlive: boolean = true; - gameSession: GameSession = null; - matchOptions: en.MatchOptions = 0; - constructor(socket: WebSocket, id: string) { - this.socket = socket; - this.id = id; - } -} - -class ClientPlayer extends Client { - inputBuffer: ev.EventInput = new ev.EventInput(); - lastInputId: number = 0; - racket: Racket; - constructor(socket: WebSocket, id: string, racket: Racket) { - super(socket, id); - this.racket = racket; - } -} - -class ClientSpectator extends Client { // Wip, unused - constructor(socket: WebSocket, id: string) { - super(socket, id); - } -} - -export {Client, ClientPlayer, ClientSpectator} diff --git a/JEU2/src/server/class/GameComponents.ts b/JEU2/src/server/class/GameComponents.ts deleted file mode 100644 index 5bbcd511..00000000 --- a/JEU2/src/server/class/GameComponents.ts +++ /dev/null @@ -1,65 +0,0 @@ - -import * as c from "../constants.js" -import * as en from "../enums.js" -import { VectorInteger } from "./Vector.js"; -import { Rectangle, MovingRectangle, Racket, Ball } from "./Rectangle.js"; -import { random } from "../utils.js"; - -class GameComponents { - wallTop: Rectangle | MovingRectangle; - wallBottom: Rectangle | MovingRectangle; - playerLeft: Racket; - playerRight: Racket; - ballsArr: Ball[] = []; - constructor(options: en.MatchOptions) - { - const pos = new VectorInteger; - - // Rackets - pos.assign(0+c.pw, c.h_mid-c.ph/2); - this.playerLeft = new Racket(pos, c.pw, c.ph, c.racketSpeed); - pos.assign(c.w-c.pw-c.pw, c.h_mid-c.ph/2); - this.playerRight = new Racket(pos, c.pw, c.ph, c.racketSpeed); - - // Balls - let ballsCount = 1; - if (options & en.MatchOptions.multiBalls) { - ballsCount = c.multiBallsCount; - } - pos.assign(-c.ballSize, -c.ballSize); // ball out =) - while (this.ballsArr.length < ballsCount) { - this.ballsArr.push(new Ball(pos, c.ballSize, c.ballSpeed, c.ballSpeedIncrease)) - } - this.ballsArr.forEach((ball) => { - ball.dir.x = 1; - if (random() > 0.5) { - ball.dir.x *= -1; - } - - ball.dir.y = random(0, 0.2); - if (random() > 0.5) { - ball.dir.y *= -1; - } - - ball.dir = ball.dir.normalized(); - }); - - // Walls - if (options & en.MatchOptions.movingWalls) { - pos.assign(0, 0); - this.wallTop = new MovingRectangle(pos, c.w, c.wallSize, c.movingWallSpeed); - (this.wallTop).dir.y = -1; - pos.assign(0, c.h-c.wallSize); - this.wallBottom = new MovingRectangle(pos, c.w, c.wallSize, c.movingWallSpeed); - (this.wallBottom).dir.y = 1; - } - else { - pos.assign(0, 0); - this.wallTop = new Rectangle(pos, c.w, c.wallSize); - pos.assign(0, c.h-c.wallSize); - this.wallBottom = new Rectangle(pos, c.w, c.wallSize); - } - } -} - -export {GameComponents} diff --git a/JEU2/src/server/class/GameComponentsServer.ts b/JEU2/src/server/class/GameComponentsServer.ts deleted file mode 100644 index d05858e7..00000000 --- a/JEU2/src/server/class/GameComponentsServer.ts +++ /dev/null @@ -1,15 +0,0 @@ - -import * as c from "../constants.js" -import * as en from "../enums.js" -import { GameComponents } from "../../shared_js/class/GameComponents.js"; - -class GameComponentsServer extends GameComponents { - scoreLeft: number = 0; - scoreRight: number = 0; - constructor(options: en.MatchOptions) - { - super(options); - } -} - -export {GameComponentsServer} diff --git a/JEU2/src/server/class/GameSession.ts b/JEU2/src/server/class/GameSession.ts deleted file mode 100644 index f10dccdf..00000000 --- a/JEU2/src/server/class/GameSession.ts +++ /dev/null @@ -1,188 +0,0 @@ - -import * as en from "../enums.js" -import * as ev from "./Event.js" -import * as c from "../constants.js" -import { ClientPlayer } from "./Client"; -import { GameComponentsServer } from "./GameComponentsServer.js"; -import { clientInputListener } from "../wsServer.js"; -import { random } from "../utils.js"; -import { Ball } from "../../shared_js/class/Rectangle.js"; -import { wallsMovements } from "../../shared_js/wallsMovement.js"; - -/* - Arg "s: GameSession" replace "this: GameSession" for use with setTimeout(), - because "this" is equal to "this: Timeout" -*/ -class GameSession { - id: string; // url ? - playersMap: Map = new Map(); - unreadyPlayersMap: Map = new Map(); - gameLoopInterval: NodeJS.Timer | number = 0; - clientsUpdateInterval: NodeJS.Timer | number = 0; - components: GameComponentsServer; - matchOptions: en.MatchOptions; - matchEnded: boolean = false; - - actual_time: number; - last_time: number; - delta_time: number; - - constructor(id: string, matchOptions: en.MatchOptions) { - this.id = id; - this.matchOptions = matchOptions; - this.components = new GameComponentsServer(this.matchOptions); - } - start() { - const gc = this.components; - setTimeout(this.resume, c.matchStartDelay, this); - - let timeout = c.matchStartDelay + c.newRoundDelay; - gc.ballsArr.forEach((ball) => { - setTimeout(this._newRound, timeout, this, ball); - timeout += c.newRoundDelay*0.5; - }); - } - resume(s: GameSession) { - s.playersMap.forEach( (client) => { - client.socket.on("message", clientInputListener); - }); - - s.actual_time = Date.now(); - s.gameLoopInterval = setInterval(s._gameLoop, c.serverGameLoopIntervalMS, s); - s.clientsUpdateInterval = setInterval(s._clientsUpdate, c.clientsUpdateIntervalMS, s); - } - pause(s: GameSession) { - s.playersMap.forEach( (client) => { - client.socket.off("message", clientInputListener); - }); - - clearInterval(s.gameLoopInterval); - clearInterval(s.clientsUpdateInterval); - } - instantInputDebug(client: ClientPlayer) { - this._handleInput(c.fixedDeltaTime, client); - } - private _handleInput(delta: number, client: ClientPlayer) { - // if (client.inputBuffer === null) {return;} - const gc = this.components; - const input = client.inputBuffer.input; - - if (input === en.InputEnum.up) { - client.racket.dir.y = -1; - } - else if (input === en.InputEnum.down) { - client.racket.dir.y = 1; - } - - if (input !== en.InputEnum.noInput) { - client.racket.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); - } - - client.lastInputId = client.inputBuffer.id; - // client.inputBuffer = null; - } - private _gameLoop(s: GameSession) { - /* s.last_time = s.actual_time; - s.actual_time = Date.now(); - s.delta_time = (s.actual_time - s.last_time) / 1000; */ - s.delta_time = c.fixedDeltaTime; - - // WIP, replaced by instantInputDebug() to prevent desynchro - /* s.playersMap.forEach( (client) => { - s._handleInput(s.delta_time, client); - }); */ - - const gc = s.components; - gc.ballsArr.forEach((ball) => { - s._ballMovement(s.delta_time, ball); - }); - - if (s.matchOptions & en.MatchOptions.movingWalls) { - wallsMovements(s.delta_time, gc); - } - } - private _ballMovement(delta: number, ball: Ball) { - const gc = this.components; - if (ball.ballInPlay) - { - ball.moveAndBounce(delta, [gc.wallTop, gc.wallBottom, gc.playerLeft, gc.playerRight]); - if (ball.pos.x > c.w - || ball.pos.x < 0 - ball.width) - { - ball.ballInPlay = false; - if (this.matchEnded) { - return; - } - - if (ball.pos.x > c.w) { ++gc.scoreLeft; } - else if (ball.pos.x < 0 - ball.width) { ++gc.scoreRight; } - - this.playersMap.forEach( (client) => { - client.socket.send(JSON.stringify(new ev.EventScoreUpdate(gc.scoreLeft, gc.scoreRight))); - }); - setTimeout(this._newRound, c.newRoundDelay, this, ball); - } - } - } - private _clientsUpdate(s: GameSession) { - const gc = s.components; - const update = new ev.EventGameUpdate(); - update.playerLeft.y = gc.playerLeft.pos.y; - update.playerRight.y = gc.playerRight.pos.y; - gc.ballsArr.forEach((ball) => { - update.ballsArr.push({ - x: ball.pos.x, - y: ball.pos.y, - dirX: ball.dir.x, - dirY: ball.dir.y, - speed: ball.speed - }); - }); - if (s.matchOptions & en.MatchOptions.movingWalls) { - update.wallTop.y = gc.wallTop.pos.y; - update.wallBottom.y = gc.wallBottom.pos.y; - } - - s.playersMap.forEach( (client) => { - update.lastInputId = client.lastInputId; - client.socket.send(JSON.stringify(update)); - }); - } - private _newRound(s: GameSession, ball: Ball) { - const gc = s.components; - // https://fr.wikipedia.org/wiki/Tennis_de_table#Nombre_de_manches - if (gc.scoreLeft >= 11 || gc.scoreRight >= 11) - // if (gc.scoreLeft >= 2 || gc.scoreRight >= 2) // WIP: for testing - { - if (Math.abs(gc.scoreLeft - gc.scoreRight) >= 2) - { - s._matchEnd(s); - return; - } - } - ball.pos.x = c.w_mid; - ball.pos.y = random(c.h*0.3, c.h*0.7); - ball.speed = ball.baseSpeed; - ball.ballInPlay = true; - } - private _matchEnd(s: GameSession) { - s.matchEnded = true; - const gc = s.components; - - let eventEnd: ev.EventMatchEnd; - if (gc.scoreLeft > gc.scoreRight) { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.left); - console.log("Player Left WIN"); - } - else { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.right); - console.log("Player Right WIN"); - } - - s.playersMap.forEach( (client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); - } -} - -export {GameSession} diff --git a/JEU2/src/server/class/interface.ts b/JEU2/src/server/class/interface.ts deleted file mode 100644 index 39753de1..00000000 --- a/JEU2/src/server/class/interface.ts +++ /dev/null @@ -1,21 +0,0 @@ - -import { Vector, VectorInteger } from "./Vector.js"; - -interface Component { - pos: VectorInteger; -} - -interface GraphicComponent extends Component { - ctx: CanvasRenderingContext2D; - color: string; - update: () => void; - clear: (pos?: VectorInteger) => void; -} - -interface Moving { - dir: Vector; - speed: number; // pixel per second - move(delta: number): void; -} - -export {Component, GraphicComponent, Moving} diff --git a/JEU2/src/server/enums.ts b/JEU2/src/server/enums.ts deleted file mode 100644 index dfba2aa3..00000000 --- a/JEU2/src/server/enums.ts +++ /dev/null @@ -1,47 +0,0 @@ - -enum EventTypes { - // Class Implemented - gameUpdate = 1, - scoreUpdate, - matchEnd, - assignId, - matchmakingComplete, - - // Generic - matchmakingInProgress, - matchStart, - matchNewRound, // unused - matchPause, // unused - matchResume, // unused - - // Client - clientAnnounce, - clientPlayerReady, - clientInput, - -} - -enum InputEnum { - noInput = 0, - up = 1, - down, -} - -enum PlayerSide { - left = 1, - right -} - -enum ClientRole { - player = 1, - spectator -} - -enum MatchOptions { - // binary flags, can be mixed - noOption = 0b0, - multiBalls = 1 << 0, - movingWalls = 1 << 1 -} - -export {EventTypes, InputEnum, PlayerSide, ClientRole, MatchOptions} diff --git a/JEU2/src/server/server.ts b/JEU2/src/server/server.ts deleted file mode 100644 index 20801d7f..00000000 --- a/JEU2/src/server/server.ts +++ /dev/null @@ -1,41 +0,0 @@ - -import http from "http"; -import url from "url"; -import fs from "fs"; -import path from "path"; - -import {wsServer} from "./wsServer.js"; wsServer; // no-op, just for loading - -const hostname = "localhost"; -const port = 8080; -const root = "../../www/"; - -const server = http.createServer((req, res) => { - // let q = new URL(req.url, `http://${req.getHeaders().host}`) - let q = url.parse(req.url, true); - let filename = root + q.pathname; - fs.readFile(filename, (err, data) => { - if (err) { - res.writeHead(404, {"Content-Type": "text/html"}); - return res.end("404 Not Found"); - } - if (path.extname(filename) === ".html") { - res.writeHead(200, {"Content-Type": "text/html"}); - } - else if (path.extname(filename) === ".js") { - res.writeHead(200, {"Content-Type": "application/javascript"}); - } - else if (path.extname(filename) === ".mp3") { - res.writeHead(200, {"Content-Type": "audio/mpeg"}); - } - else if (path.extname(filename) === ".ogg") { - res.writeHead(200, {"Content-Type": "audio/ogg"}); - } - res.write(data); - return res.end(); - }); -}); - -server.listen(port, hostname, () => { - console.log(`Pong running at http://${hostname}:${port}/pong.html`); -}); diff --git a/JEU2/src/server/utils.ts b/JEU2/src/server/utils.ts deleted file mode 100644 index 39929054..00000000 --- a/JEU2/src/server/utils.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MovingRectangle } from "./class/Rectangle.js"; -export * from "../shared_js/utils.js" - -function shortId(id: string): string { - return id.substring(0, id.indexOf("-")); -} - -export {shortId} - -function random(min: number = 0, max: number = 1) { - return Math.random() * (max - min) + min; -} - -function sleep (ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -function clamp(n: number, min: number, max: number) : number -{ - if (n < min) - n = min; - else if (n > max) - n = max; - return (n); -} - -// Typescript hack, unused -function assertMovingRectangle(value: unknown): asserts value is MovingRectangle { - // if (value !== MovingRectangle) throw new Error("Not a MovingRectangle"); - return; -} - -export {random, sleep, clamp, assertMovingRectangle} diff --git a/JEU2/src/server/wallsMovement.ts b/JEU2/src/server/wallsMovement.ts deleted file mode 100644 index dbf3f558..00000000 --- a/JEU2/src/server/wallsMovement.ts +++ /dev/null @@ -1,20 +0,0 @@ - -import * as c from "./constants.js"; -import { MovingRectangle } from "../shared_js/class/Rectangle.js"; -import { GameComponents } from "./class/GameComponents.js"; - -function wallsMovements(delta: number, gc: GameComponents) -{ - const wallTop = gc.wallTop; - const wallBottom = gc.wallBottom; - if (wallTop.pos.y <= 0 || wallTop.pos.y >= c.movingWallPosMax) { - wallTop.dir.y *= -1; - } - if (wallBottom.pos.y >= c.h-c.wallSize || wallBottom.pos.y <= c.h-c.movingWallPosMax) { - wallBottom.dir.y *= -1; - } - wallTop.moveAndCollide(delta, [gc.playerLeft, gc.playerRight]); - wallBottom.moveAndCollide(delta, [gc.playerLeft, gc.playerRight]); -} - -export {wallsMovements} diff --git a/JEU2/src/server/wsServer.ts b/JEU2/src/server/wsServer.ts deleted file mode 100644 index bc3901bc..00000000 --- a/JEU2/src/server/wsServer.ts +++ /dev/null @@ -1,238 +0,0 @@ - -import { WebSocketServer, WebSocket as BaseLibWebSocket } from "ws"; - -export class WebSocket extends BaseLibWebSocket { - id?: string; -} - -import { IncomingMessage } from "http"; -import { v4 as uuidv4 } from 'uuid'; - -import * as en from "./enums.js" -import * as ev from "./class/Event.js" -import { Client, ClientPlayer } from "./class/Client.js" -import { GameSession } from "./class/GameSession.js" -import { shortId } from "./utils.js"; - -// pas indispensable d'avoir un autre port si le WebSocket est relié à un serveur http préexistant ? -const wsPort = 8042; -export const wsServer = new WebSocketServer({port: wsPort, path: "/pong"}); - -const clientsMap: Map = new Map; // socket.id/Client -const matchmakingPlayersMap: Map = new Map; // socket.id/ClientPlayer (duplicates with clientsMap) -const gameSessionsMap: Map = new Map; // GameSession.id(url)/GameSession - -wsServer.on("connection", connectionListener); -wsServer.on("error", errorListener); -wsServer.on("close", closeListener); - - -function connectionListener(socket: WebSocket, request: IncomingMessage) -{ - const id = uuidv4(); - const client = new Client(socket, id); - clientsMap.set(id, client); - socket.id = id; - - socket.on("pong", function heartbeat() { - client.isAlive = true; - // console.log(`client ${shortId(client.id)} is alive`); - }); - - socket.on("message", function log(data: string) { - try { - const event: ev.ClientEvent = JSON.parse(data); - if (event.type === en.EventTypes.clientInput) { - return; - } - } - catch (e) {} - console.log("data: " + data); - }); - - socket.once("message", clientAnnounceListener); -} - - -function clientAnnounceListener(this: WebSocket, data: string) -{ - try { - const msg : ev.ClientAnnounce = JSON.parse(data); - if (msg.type === en.EventTypes.clientAnnounce) - { - // TODO: reconnection with msg.clientId ? - // TODO: spectator/player distinction with msg.role ? - // msg.role is probably not a good idea. - // something like a different route could be better - // "/pong" to play, "/ID_OF_A_GAMESESSION" to spectate - - const player = clientsMap.get(this.id) as ClientPlayer; - player.matchOptions = msg.matchOptions; - this.send(JSON.stringify( new ev.EventAssignId(this.id) )); - this.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchmakingInProgress) )); - matchmaking(player); - } - else { - console.log("Invalid ClientAnnounce"); - } - return; - } - catch (e) { - console.log("Invalid JSON (clientAnnounceListener)"); - } - this.once("message", clientAnnounceListener); -} - - -function matchmaking(player: ClientPlayer) -{ - const minPlayersNumber = 2; - const maxPlayersNumber = 2; - const matchOptions = player.matchOptions; - matchmakingPlayersMap.set(player.id, player); - - const compatiblePlayers: ClientPlayer[] = []; - for (const [id, client] of matchmakingPlayersMap) - { - if (client.matchOptions === matchOptions) - { - compatiblePlayers.push(client); - if (compatiblePlayers.length === maxPlayersNumber) { - break; - } - } - } - - if (compatiblePlayers.length < minPlayersNumber) { - return; - } - - const id = uuidv4(); - const gameSession = new GameSession(id, matchOptions); - gameSessionsMap.set(id, gameSession); - - compatiblePlayers.forEach((client) => { - matchmakingPlayersMap.delete(client.id); - client.gameSession = gameSession; - gameSession.playersMap.set(client.id, client); - gameSession.unreadyPlayersMap.set(client.id, client); - }); - - // WIP: Not pretty, hardcoded two players. - // Could be done in gameSession maybe ? - compatiblePlayers[0].racket = gameSession.components.playerRight; - compatiblePlayers[1].racket = gameSession.components.playerLeft; - - compatiblePlayers.forEach((client) => { - client.socket.once("message", playerReadyConfirmationListener); - }); - - compatiblePlayers[0].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.right) )); - compatiblePlayers[1].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.left) )); -} - - -function playerReadyConfirmationListener(this: WebSocket, data: string) -{ - try { - const msg : ev.ClientEvent = JSON.parse(data); - if (msg.type === en.EventTypes.clientPlayerReady) - { - const client = clientsMap.get(this.id); - const gameSession = client.gameSession; - gameSession.unreadyPlayersMap.delete(this.id); - if (gameSession.unreadyPlayersMap.size === 0) { - gameSession.playersMap.forEach( (client) => { - client.socket.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchStart) )); - }); - gameSession.start(); - } - } - else { - console.log("Invalid playerReadyConfirmation"); - } - return; - } - catch (e) { - console.log("Invalid JSON (playerReadyConfirmationListener)"); - } - this.once("message", playerReadyConfirmationListener); -} - - -export function clientInputListener(this: WebSocket, data: string) -{ - try { - // const input: ev.ClientEvent = JSON.parse(data); - const input: ev.EventInput = JSON.parse(data); - if (input.type === en.EventTypes.clientInput) - { - const client = clientsMap.get(this.id) as ClientPlayer; - client.inputBuffer = input; - client.gameSession.instantInputDebug(client); // wip - } - else { - console.log("Invalid clientInput"); - } - } - catch (e) { - console.log("Invalid JSON (clientInputListener)"); - } -} - -//////////// -//////////// - -const pingInterval = setInterval( () => { - let deleteLog = ""; - clientsMap.forEach( (client, key, map) => { - if (!client.isAlive) { - clientTerminate(client, key, map); - deleteLog += ` ${shortId(key)} |`; - } - else { - client.isAlive = false; - client.socket.ping(); - } - }); - - if (deleteLog) { - console.log(`Disconnected:${deleteLog}`); - } - console.log("gameSessionMap size: " + gameSessionsMap.size); - console.log("clientsMap size: " + clientsMap.size); - console.log("matchmakingPlayersMap size: " + matchmakingPlayersMap.size); - console.log(""); -}, 4200); - - -function clientTerminate(client: Client, key: string, map: Map) -{ - client.socket.terminate(); - if (client.gameSession) - { - client.gameSession.playersMap.delete(key); - if (client.gameSession.playersMap.size === 0) - { - clearInterval(client.gameSession.clientsUpdateInterval); - clearInterval(client.gameSession.gameLoopInterval); - gameSessionsMap.delete(client.gameSession.id); - } - } - map.delete(key); - if (matchmakingPlayersMap.has(key)) { - matchmakingPlayersMap.delete(key); - } -} - - -function closeListener() -{ - clearInterval(pingInterval); -} - - -function errorListener(error: Error) -{ - console.log("Error: " + JSON.stringify(error)); -} diff --git a/JEU2/tsconfig.json b/JEU2/tsconfig.json deleted file mode 100644 index 988126ba..00000000 --- a/JEU2/tsconfig.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "include": ["src"], -// "exclude": ["node_modules"], - "compilerOptions": { - // "outDir": "./build", - // "types": ["node"], /* Specify type package names to be included without being referenced in a source file. */ - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.gc. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.gc. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - // "module": "commonjs", /* Specify what module code is generated. */ - "module": "ES6", /* Specify what module code is generated. */ - // "rootDir": "./", /* Specify the root folder within your source files. */ - "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - "strictNullChecks": false, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -} diff --git a/srcs/requirements/svelte/api_front/public/game/class/Event.ts b/srcs/requirements/svelte/api_front/public/game/class/Event.ts deleted file mode 100644 index 3f0d440a..00000000 --- a/srcs/requirements/svelte/api_front/public/game/class/Event.ts +++ /dev/null @@ -1,107 +0,0 @@ - -import * as en from "../enums.js" - -/* From Server */ -class ServerEvent { - type: en.EventTypes; - constructor(type: en.EventTypes = 0) { - this.type = type; - } -} - -class EventAssignId extends ServerEvent { - id: string; - constructor(id: string) { - super(en.EventTypes.assignId); - this.id = id; - } -} - -class EventMatchmakingComplete extends ServerEvent { - side: en.PlayerSide; - constructor(side: en.PlayerSide) { - super(en.EventTypes.matchmakingComplete); - this.side = side; - } -} - -class EventGameUpdate extends ServerEvent { - playerLeft = { - y: 0 - }; - playerRight = { - y: 0 - }; - ballsArr: { - x: number, - y: number, - dirX: number, - dirY: number, - speed: number - }[] = []; - wallTop? = { - y: 0 - }; - wallBottom? = { - y: 0 - }; - lastInputId = 0; - constructor() { // TODO: constructor that take GameComponentsServer maybe ? - super(en.EventTypes.gameUpdate); - } -} - -class EventScoreUpdate extends ServerEvent { - scoreLeft: number; - scoreRight: number; - constructor(scoreLeft: number, scoreRight: number) { - super(en.EventTypes.scoreUpdate); - this.scoreLeft = scoreLeft; - this.scoreRight = scoreRight; - } -} - -class EventMatchEnd extends ServerEvent { - winner: en.PlayerSide; - constructor(winner: en.PlayerSide) { - super(en.EventTypes.matchEnd); - this.winner = winner; - } -} - - -/* From Client */ -class ClientEvent { - type: en.EventTypes; // readonly ? - constructor(type: en.EventTypes = 0) { - this.type = type; - } -} - -class ClientAnnounce extends ClientEvent { - role: en.ClientRole; - clientId: string; - matchOptions: en.MatchOptions; - constructor(role: en.ClientRole, matchOptions: en.MatchOptions, clientId: string = "") { - super(en.EventTypes.clientAnnounce); - this.role = role; - this.clientId = clientId; - this.matchOptions = matchOptions; - } -} - -class EventInput extends ClientEvent { - input: en.InputEnum; - id: number; - constructor(input: en.InputEnum = en.InputEnum.noInput, id: number = 0) { - super(en.EventTypes.clientInput); - this.input = input; - this.id = id; - } -} - -export { - ServerEvent, EventAssignId, EventMatchmakingComplete, - EventGameUpdate, EventScoreUpdate, EventMatchEnd, - ClientEvent, ClientAnnounce, EventInput -} diff --git a/srcs/requirements/svelte/api_front/public/game/class/Rectangle.ts b/srcs/requirements/svelte/api_front/public/game/class/Rectangle.ts deleted file mode 100644 index fff71dc9..00000000 --- a/srcs/requirements/svelte/api_front/public/game/class/Rectangle.ts +++ /dev/null @@ -1,144 +0,0 @@ - -import { Vector, VectorInteger } from "./Vector.js"; -import { Component, Moving } from "./interface.js"; -import * as c from "../constants.js" - -class Rectangle implements Component { - pos: VectorInteger; - width: number; - height: number; - constructor(pos: VectorInteger, width: number, height: number) { - this.pos = new VectorInteger(pos.x, pos.y); - this.width = width; - this.height = height; - } - collision(collider: Rectangle): boolean { - const thisLeft = this.pos.x; - const thisRight = this.pos.x + this.width; - const thisTop = this.pos.y; - const thisBottom = this.pos.y + this.height; - const colliderLeft = collider.pos.x; - const colliderRight = collider.pos.x + collider.width; - const colliderTop = collider.pos.y; - const colliderBottom = collider.pos.y + collider.height; - if ((thisBottom < colliderTop) - || (thisTop > colliderBottom) - || (thisRight < colliderLeft) - || (thisLeft > colliderRight)) { - return false; - } - else { - return true; - } - } -} - -class MovingRectangle extends Rectangle implements Moving { - dir: Vector = new Vector(0,0); - speed: number; - readonly baseSpeed: number; - constructor(pos: VectorInteger, width: number, height: number, baseSpeed: number) { - super(pos, width, height); - this.baseSpeed = baseSpeed; - this.speed = baseSpeed; - } - move(delta: number) { // Math.floor WIP until VectorInteger debug - // console.log(`delta: ${delta}, speed: ${this.speed}, speed*delta: ${this.speed * delta}`); - // this.pos.x += Math.floor(this.dir.x * this.speed * delta); - // this.pos.y += Math.floor(this.dir.y * this.speed * delta); - this.pos.x += this.dir.x * this.speed * delta; - this.pos.y += this.dir.y * this.speed * delta; - } - moveAndCollide(delta: number, colliderArr: Rectangle[]) { - this._moveAndCollideAlgo(delta, colliderArr); - } - protected _moveAndCollideAlgo(delta: number, colliderArr: Rectangle[]) { - let oldPos = new VectorInteger(this.pos.x, this.pos.y); - this.move(delta); - if (colliderArr.some(this.collision, this)) { - this.pos = oldPos; - } - } -} - -class Racket extends MovingRectangle { - constructor(pos: VectorInteger, width: number, height: number, baseSpeed: number) { - super(pos, width, height, baseSpeed); - } - moveAndCollide(delta: number, colliderArr: Rectangle[]) { - // let oldPos = new VectorInteger(this.pos.x, this.pos.y); // debug - this._moveAndCollideAlgo(delta, colliderArr); - // console.log(`y change: ${this.pos.y - oldPos.y}`); - } -} - -class Ball extends MovingRectangle { - readonly speedIncrease: number; - ballInPlay: boolean = false; - constructor(pos: VectorInteger, size: number, baseSpeed: number, speedIncrease: number) { - super(pos, size, size, baseSpeed); - this.speedIncrease = speedIncrease; - } - bounce(collider?: Rectangle) { - this._bounceAlgo(collider); - } - protected _bounceAlgo(collider?: Rectangle) { - /* Could be more generic, but testing only Racket is enough, - because in Pong collider can only be Racket or Wall. */ - if (collider instanceof Racket) { - this._bounceRacket(collider); - } - else { - this._bounceWall(); - } - } - moveAndBounce(delta: number, colliderArr: Rectangle[]) { - this.move(delta); - let i = colliderArr.findIndex(this.collision, this); - if (i != -1) - { - this.bounce(colliderArr[i]); - this.move(delta); - } - } - protected _bounceWall() { // Should be enough for Wall - this.dir.y = this.dir.y * -1; - } - protected _bounceRacket(racket: Racket) { - this._bounceRacketAlgo(racket); - } - protected _bounceRacketAlgo(racket: Racket) { - this.speed += this.speedIncrease; - - let x = this.dir.x * -1; - - const angleFactorDegree = 60; - const angleFactor = angleFactorDegree / 90; - const racketHalf = racket.height/2; - const ballMid = this.pos.y + this.height/2; - const racketMid = racket.pos.y + racketHalf; - - let impact = ballMid - racketMid; - const horizontalMargin = racketHalf * 0.15; - if (impact < horizontalMargin && impact > -horizontalMargin) { - impact = 0; - } - else if (impact > 0) { - impact = impact - horizontalMargin; - } - else if (impact < 0) { - impact = impact + horizontalMargin; - } - - let y = impact / (racketHalf - horizontalMargin) * angleFactor; - - this.dir.assign(x, y); - // Normalize Vector (for consistency in speed independent of direction) - if (c.normalizedSpeed) { - this.dir = this.dir.normalized(); - } - // console.log(`x: ${this.dir.x}, y: ${this.dir.y}`); - } -} - -export {Rectangle, MovingRectangle, Racket, Ball} diff --git a/srcs/requirements/svelte/api_front/public/game/class/Vector.ts b/srcs/requirements/svelte/api_front/public/game/class/Vector.ts deleted file mode 100644 index 025bca36..00000000 --- a/srcs/requirements/svelte/api_front/public/game/class/Vector.ts +++ /dev/null @@ -1,49 +0,0 @@ - -class Vector { - x: number; - y: number; - constructor(x: number = 0, y: number = 0) { - this.x = x; - this.y = y; - } - assign(x: number, y: number) { - this.x = x; - this.y = y; - } - normalized() : Vector { - const normalizationFactor = Math.abs(this.x) + Math.abs(this.y); - return new Vector(this.x/normalizationFactor, this.y/normalizationFactor); - } -} - -class VectorInteger extends Vector { - // PLACEHOLDER - // VectorInteger with set/get dont work (No draw on the screen). Why ? -} - -/* -class VectorInteger { - // private _x: number = 0; - // private _y: number = 0; - // constructor(x: number = 0, y: number = 0) { - // this._x = x; - // this._y = y; - // } - // get x(): number { - // return this._x; - // } - // set x(v: number) { - // // this._x = Math.floor(v); - // this._x = v; - // } - // get y(): number { - // return this._y; - // } - // set y(v: number) { - // // this._y = Math.floor(v); - // this._y = v; - // } -} -*/ - -export {Vector, VectorInteger} diff --git a/srcs/requirements/svelte/api_front/public/game/constants copy.ts b/srcs/requirements/svelte/api_front/public/game/constants copy.ts deleted file mode 100644 index ae3320e5..00000000 --- a/srcs/requirements/svelte/api_front/public/game/constants copy.ts +++ /dev/null @@ -1,26 +0,0 @@ - -export const CanvasWidth = 1500; -export const CanvasRatio = 1.66666; -/* ratio 5/3 (1.66) */ - -export const w = CanvasWidth; -export const h = CanvasWidth / CanvasRatio; -export const w_mid = Math.floor(w/2); -export const h_mid = Math.floor(h/2); -export const pw = Math.floor(w*0.017); -export const ph = pw*6; -export const ballSize = pw; -export const wallSize = Math.floor(w*0.01); -export const racketSpeed = Math.floor(w*0.66); // pixel per second -export const ballSpeed = Math.floor(w*0.66); // pixel per second -export const ballSpeedIncrease = Math.floor(ballSpeed*0.05); // pixel per second - -export const normalizedSpeed = false; // for consistency in speed independent of direction - -export const matchStartDelay = 3000; // millisecond -export const newRoundDelay = 1500; // millisecond - -// Game Variantes -export const multiBallsCount = 3; -export const movingWallPosMax = Math.floor(w*0.12); -export const movingWallSpeed = Math.floor(w*0.08); diff --git a/srcs/requirements/svelte/api_front/public/game/gameLoop.ts b/srcs/requirements/svelte/api_front/public/game/gameLoop.ts deleted file mode 100644 index 593d1eaa..00000000 --- a/srcs/requirements/svelte/api_front/public/game/gameLoop.ts +++ /dev/null @@ -1,49 +0,0 @@ - -import * as c from "./constants.js"; -import * as en from "../shared_js/enums.js" -import { gc, matchOptions, clientInfo } from "./global.js"; -import { wallsMovements } from "../shared_js/wallsMovement.js"; - -let actual_time: number = Date.now(); -let last_time: number; -let delta_time: number; - -function gameLoop() -{ - /* last_time = actual_time; - actual_time = Date.now(); - delta_time = (actual_time - last_time) / 1000; */ - - delta_time = c.fixedDeltaTime; - // console.log(`delta_gameLoop: ${delta_time}`); - - // interpolation - // console.log(`dir.y: ${clientInfo.opponent.dir.y}, pos.y: ${clientInfo.opponent.pos.y}, opponentNextPos.y: ${clientInfo.opponentNextPos.y}`); - if (clientInfo.opponent.dir.y != 0 ) { - opponentInterpolation(delta_time); - } - - // client prediction - gc.ballsArr.forEach((ball) => { - ball.moveAndBounce(delta_time, [gc.wallTop, gc.wallBottom, gc.playerLeft, gc.playerRight]); - }); - - if (matchOptions & en.MatchOptions.movingWalls) { - wallsMovements(delta_time, gc); - } -} - -function opponentInterpolation(delta: number) -{ - // interpolation - clientInfo.opponent.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); - - if ((clientInfo.opponent.dir.y > 0 && clientInfo.opponent.pos.y > clientInfo.opponentNextPos.y) - || (clientInfo.opponent.dir.y < 0 && clientInfo.opponent.pos.y < clientInfo.opponentNextPos.y)) - { - clientInfo.opponent.dir.y = 0; - clientInfo.opponent.pos.y = clientInfo.opponentNextPos.y; - } -} - -export {gameLoop} diff --git a/srcs/requirements/svelte/api_front/public/game/global.ts b/srcs/requirements/svelte/api_front/public/game/global.ts deleted file mode 100644 index 7d0a7126..00000000 --- a/srcs/requirements/svelte/api_front/public/game/global.ts +++ /dev/null @@ -1,3 +0,0 @@ - -export {pong, gc, matchOptions} from "./pong.js" -export {socket, clientInfo} from "./ws.js" diff --git a/srcs/requirements/svelte/api_front/public/index.html b/srcs/requirements/svelte/api_front/public/index.html index 5da7ed3e..2e6a0f20 100644 --- a/srcs/requirements/svelte/api_front/public/index.html +++ b/srcs/requirements/svelte/api_front/public/index.html @@ -4,7 +4,7 @@ - Svelte app + Potato Pong diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/0.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/0.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/0.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/0.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/1.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/1.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/1.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/1.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/10.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/10.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/10.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/10.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/11.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/11.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/11.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/11.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/12.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/12.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/12.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/12.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/13.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/13.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/13.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/13.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/14.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/14.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/14.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/14.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/15.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/15.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/15.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/15.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/16.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/16.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/16.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/16.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/17.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/17.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/17.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/17.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/18.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/18.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/18.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/18.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/19.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/19.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/19.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/19.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/2.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/2.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/2.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/2.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/20.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/20.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/20.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/20.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/21.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/21.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/21.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/21.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/22.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/22.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/22.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/22.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/23.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/23.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/23.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/23.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/24.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/24.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/24.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/24.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/25.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/25.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/25.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/25.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/26.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/26.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/26.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/26.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/27.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/27.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/27.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/27.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/28.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/28.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/28.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/28.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/29.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/29.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/29.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/29.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/3.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/3.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/3.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/3.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/30.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/30.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/30.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/30.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/31.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/31.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/31.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/31.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/32.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/32.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/32.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/32.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/4.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/4.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/4.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/4.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/5.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/5.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/5.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/5.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/6.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/6.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/6.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/6.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/7.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/7.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/7.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/7.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/8.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/8.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/8.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/8.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/pong/9.ogg b/srcs/requirements/svelte/api_front/public/sounds/pong/9.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/pong/9.ogg rename to srcs/requirements/svelte/api_front/public/sounds/pong/9.ogg diff --git a/srcs/requirements/svelte/api_front/public/sound/roblox-oof.ogg b/srcs/requirements/svelte/api_front/public/sounds/roblox-oof.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sound/roblox-oof.ogg rename to srcs/requirements/svelte/api_front/public/sounds/roblox-oof.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/0.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/0.ogg deleted file mode 100644 index 93d054091a3fd97fb2cb0a5870b7e2dafff60fa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4228 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

oatvYAs+uRxKfjwm6x z<0&Q5C)brB5c$cGiWDQV;46f$K#{kcQabdjg!7&HK6M&`q(Wpps$^<^=WHMH%xIud z4fU2$^=!YoY2Iicss`fJuNJO5mpZRWR=m;5VN|_kUIVq7?NjY;M4I&I^w}#_x?bb_ zr8;#UX?msEJgV8PcO5lk`N0qjcNdPrJb@u-;6c`1ijc!%aXdnX+IcVp;guRo2^oP| zG#oP2DrC!rvF*GGD14sBF-Wwfk{E5)q?R`}rBOfaS2xcijj!6D&3C8kRnM0LfKLa& z%()6{u~uyk^5Csd5L@74c8qz8y0j{+kE$ai-10RemJU$Oh_VvMlgV6l1X&5w3{uf6 zh%y;7WibF2p77p!P)R=PiAD=1I|6{5$tdX0YQb0PczOl&Y6H^#G)S&HQq6}a#ep1U z1ESLF6$>2w6X+i!N2764R5u`qUZYmQLqSxVJJd6JNFe$?mE(LjqET&zF4cFp!0qq| zM%#CP4R80(+4=6`X1&Jg=WZ8lAO?&tTLpX;do&fMGbvV4$=4ZxU<$IGmk@Jsv?WAo z5tBizlbOTodK|u1Kc-oeC<*=mXAd2+om`8)bB!A}a2**xXv+ zJMt&j74Y^Z07BOy9G*aWNi)lHfkkZI0B%_>tEH^#esGD}y>NWILID zbmtm(Db0+AI}~N(gIVV3IdRzj;dAM_^2+dtCj_*z0$4B()2b5K+A11bE_7YL^I&}X zIV=%jvjQ&x@O(czFK^1h(aG7B;^FD#{kN~V?Cfl#ln)%UvyI9aEG;b8+u5ccms$YO`k-%u1HjLxZ4zrgIJ2nr!6$D0ps4rKi(;8_IQ~Rs z>w|SUq9q{mCrYQFsv>vKcOR?)O%DQl{7k#l+s^N6Q_OD4ecdzpIUFmA?DB zB<4QD>6b6gIDv#mo7aW@61&x0_M(2b;UU@KnD?3R_47ZXUzwLAyLZ*t+G7g73y+y3 zzBB!q3-Dxs``Xu+4E_0C(dV4qx0al=ZMre%Y)Nti>o{#U!c<BT$Q$W||NA!0UlmOT|>ok8%nRNY^_ zxAgP`l}H`V?>*4(L7jb+qyJ%#YVS{!Pv=~YpB6@p-T%Ztek-@>!hg6~&0JfbB0kRv zSaUHmNid^c6MXY8$=@FI7BjJPi>w;H}*?r3QkaMK(#83@=DxX#f1Srun2?CGt2)yPLtmZaYOHT(BA gb?}<-wngr1LuWz7^n#n)<6{@ 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 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/13.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/13.ogg deleted file mode 100644 index 71cfead6f5639d86ca130a6528258fa4fd514dcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4322 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 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/15.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/15.ogg deleted file mode 100644 index 011f139c110360529716d44a8b602630913b6182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4199 zcmd5nN3lW4w5D5ebG^IQu1PCHYP&%bUH6Sl3 zV#tyZ8RQY<10qJi8ahZ(5kakp5NHMvsfpL%V|;*1>Uhr=>`d>v(>v>~`_Db=!ZH@9tWBs_u6P8K9_ zGE?w@nK_*71DRZQCZC8t1BL$WX1M%-^^{#vP!I!fNs+|e)%3fxVjG^weRp+YC9Swg zXiW(|&9jVXA*-b6ZI`<6Lac4XKB8eYy`0XmNvc38>>lbyzJ-s|=_G6%_51Nt>81YN zcEU9hdI<5Vh+aZ5wuvYsUK7!26r+uNb03XeL^+M%|E-kQ+9ehzmA3FJX?t0n6YY6)dYbQkNNsqip>kcvAa$DzMf3ymaWgM#FN$2hpoz_-d z6sqEfPVyPdE*7(!J2}pc7jtJ8^M2I@_IeY80eBQ#-WXic7+gN*UFnE9*e|6pU-E9g+xh~cjf001|~ zD|DA29*HW7+|v~q+7-FSiV?>6SIskYloSdbyAfs`=u15Q{X@LN#*GiBvHjSSweFi7 zx;}GQd7^UKeU;VGT910O>}kpz_UJn3wBLaMX!!vCI+iy`4r)1RLDrt-i)^)aP380y z;EODaiM) z^bLDK3Kx;WECVC>tZ))b^}=`TRY(M5$4De2g2A1PWH80PKah5eMlyaNF~;B&-W}pV z#u#^0AW-ueQ(~@qkrij16VBjHMY7b}7^(%<!y6Y}O(6w{s=omMtI&X@(KmJhpEY9ch^SKt}T#bCQS+mRP%TIIz7nXVzWpdpT0;kUE z{`0!tmp}J*xHQba?N1x-@A$FX{V%sBV~Q6Qr^gswQy=Vv62*t zjDskM61fXU!ilZjFOf7?%Tgusbcw93L`EEzr41=K62-hy!R?V}sOvfUX@*4R(xYfq z%jX{}8=10}+*(drErikw%Ug46)4r%pMQRBMl7=Ad2;ve4S0#^HWKJcJBWsr+&cia~ zM+FDz&Oi`u4>JE&!PP0DCR{|er3Ohukrgg#<-b9#P-Ka=S_aj~kRY4mYMUh}vZh!D z!Ch)($dFiDjX>nb#kJ{r#&0R`wJOM%2de*t(?`0ElWzM)w3b_fmWnVhfbfqm1pUc zZr>>~mXNl$%FSx!0iB0>Auj-iV1y@E4f6zs-~t=6Mo8Q^1|!ZZbgY{VLl9o638c_T zm__5EW1U>4n48eeo`u2}*>MX3Rh1xKl{cqiPid5jC&P;NC8YIj_tT~RES>zhDFC=E z0F2$vm|5B?EI<*w70MFI+>MXZZ%jbVG8NrG7*y-wa)<>+gWu z;Ss325Bvq*?!C{J`cJg$l&(MbyPE}JzQ;AiO7R-Q#CS;wRf(g1!1$ah=ia1={f z5l&u z{Qm>ts^50i|HVF2P*IWvD!%w7GJ|1|m4(xY1Ja{dcMUG-4wXPmyh$FggQ57)PKc#* zwp<*7G1_>K&aLLrV@sjXR&8UWW!x?DF*?2Uyhf7#w6QZPUGAxkjcxT*NqM&}by}y( zVHM6Bc83G3`*0tMKSOYzN4`k;fJLI*lcKQ%cc+6Tbr zU#|du`DEkP;sg*xaZq^ z*A<`MxyCZ07*nuEV(k1dCf?q&g-+AYg};~9MMOTvqm>mf1NUKC)qxEgB&{9a_6^>d zxc}%mED>R|25$iH-kD!iq;Ym}b@L#3dHeYO{cA2iKVL892gm$;{rB2R0PR5=`n`q< zZuq)=+ea9Tx#e1`kFD(S_9+#`u&n8vDEav~0Dm*e#zj6i=^UTQ^tSDpfX zzo84{paBg&>PU0VLiYCKH}ACF``ZhxSt)t@ga>)dssHT#yH+n&wcX{JJ-W22ay;a# zBwCZp%*()WVByPfiZt@ty8Eq~Kl?|`A9wqT zUh?{y-@P`ZWi3oi?E5TtCP+Korv1~*M_Wm*xysF2ztuj*L*}0jTyJ^T#51VXwGD;{ z{p^=g8rt5y?{(k1<5&W&FyZj)0|^FeYwV60xvjr*=(IY#Ew@j)<~u@GRMt8QVb#Jq z>869F>jT5)(&KQnF9Ei0B)nF3+O>{m-@78j80>7>(i^lP1n7)%eZrD5e!>73YQM?$ zr{e75_@(NR2bmYYWM59YTz_9OyO^9hcH_~B>}aKZ!_=e6bKX~8Ml=leti2fb*ZY|l zR}R!09-=jqua3X5I?ld0=wAFjH|(9J;X=>W*9CuFUp8fe1f^+DxvTc!@`dvuc_tL^ za{2ZrUega&@58FY6Ix+_yC(fI^^G(f6!F=a=wa Mj)rs}y6tQJpSTMp82|tP diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/16.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/16.ogg deleted file mode 100644 index 7e852275d2a5b5c7f409ebb1d65bafc8b5475e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4428 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 YWxk`;2jKX3tpO1Oz5u(x^SQ;~Z`7QX`~Uy| diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/18.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/18.ogg deleted file mode 100644 index 6ad253919ee38994ff8c7ea0f36f64d7cbf94700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4324 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 ZRGn)*LUvvBCI{1C{vGHOE(A+3{{v%VWTXH9 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/19.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/19.ogg deleted file mode 100644 index f6fc42d64d57c8f3653f02da71c51e2acef2472b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4358 zcmd5<<6F5ASh4E{hUlE?4|38ZfL!bO>L!ZRJ z*=5rCkA9c%m)|yb<9Qr1T#n&nrnrRdPR6Bk5~2*~I2z8~)!o%~ohunfptF+%iJXjN zoPS0ZXZOwwE<1xyME5|U|3x#M-{C{*#waL>0k(;e#7!0S+d=tuJh9uRiiEPD{6>)t zHSj3UI-;4Pu1ae?cN!CRMBXU>$Xg?HDAOu1vu!rO@wZ&@vrUy2?R>sNA21#c*O^IP*R+FwEWB!gIZdK zlU7^ByFqcRHt-rV`#d7z8=79S8Qu-5|II@>UJUVZ=IRJQ(H9ZiY z^KQt)=h`M*AvRSVSm4y$P*>pIM>=)Qy&oO)Cr;h)nsmK{-Dug?ZnZh&^k7V4+c{lT z+Tz=>oVL?LLBvLQ%0z?zgz$LG?UG7-H=)RRcv;o%KH~8jBZE8PBAPzlS9yK`{J-_f zJnsOp9}V{Q;Ql+oVM`c;<*c|N_UJS>ereX|jNtx^U|gLO&y=wLPoFm(S|Y?!&F2ki zv`xI`rmOjS3-wnsad5+~aEG2`n}eNEnc%KN&?JLHvLxOIps(m$H-Kicj; zA`VgWLq_-v=4lqQgF7CakwL@<6+s(8`j9AlNUVEEsaqLT$BwO&rOFAF z3cXVP@4Aa2z)JwQS?X}L)By%K4H6iGcVR9VflSNGB{1k=#J{sK>=kq<>z3(n4*&qy zRTt@`03Mkpj@*1YGURmR<|T|U#=mPGAu4hRbnI%Fb)YMu=uZp!$FT>OL#MqD{GjE%xXW1H6-q$!*H#qWalY7I=g?S8 zPbT(!lW?6-K1^>d;uX^a+Ums#q%~P$dQo#Pj20sY_#=s+`X(S80FhfDvB5f_kkVAO zv5=_yhL`K6b>J0KbTxdsldg&%8g$7PPMfNDbT7wpUTBbGEsPIf27e1{Z+kCLe%AKm4K@$XS06K9+~k_@mVScdxXy#$zn&JVKJw(Rf3%RE6Gkw_LZ3nH_khXey; z6j`&D6)i!Lqa}h-J``p%-!P)51x$7M*bsMY9ZNmKU{2@2RTTN0fMvUZ@j5#qD`$+) zzOT-?&&*(XN^S|VEH~%dr^A=u9~qLd9@LY@?Vqx!c|xotVxZ-y>kzWsK^s zDW6$he%3J8ryArYR%DMdcWnE8@tCdGh3DhV$hVbpXUiti!V6FJy{G0n6@_yB90I3K zn(mYO&X+%To*>mv&UUBvcb~Z1;r2sk2I)ekLw}mS&rRPM-XZv6+nxm%U-AX4y*pT! zrv?1+0M9S`;L&2xqy3*gpIW@Lk(2$G5*Z3se&gR9cV%`(RV$dR>45vP6` za#z7YI?@q@dmfpbRdDr6s0kO5t*Jy(QDg;4qx=|Zg(6FJ6*8zsx)gDat8S8_$l81v z1SeI>kUoj70)fa+@~hJf$f)mmviSj^?iyA1WAX;dQ{2u{?2E8$dtiA zgBpr88pX4IMeCfwKvWIHrC-7Q;8gmYGDZ4MD<_R&&72Zy^{h|6vju6@qtmHbd8S_J z`kf+u4r!fLI%||W_3oPKY(E%+5guF(%o7-b(`?APMdrpa7;$Su20Pd=1mTq$PYxM@ zSu_+f*v@52xbYqAF(`b79XBmdmkYM3v&Yr!QLR$(v|rIShqTOgOwDy?>gCTD0AQO5 zfVpd}rM11n3gp3Cp)kJC&Af-Va6AV3vo7_nB9T@Nz1oa)JPnlS^6NP8q~ah) z){MyYdg(kz{{;HSz)>n)q;<^*qE{;9@K6xB^LfRj9ukPYPfnWaMwD`A=u&<63HUfX z0!_!xAK>lY`E0Jcv`w#c`MKN8G5`Y}SS$uUrfXY^GwEcTn3O9)0A~z@uJ7RwVyW-p zMJ4nge52S3Ue^!cYjr!-jzCWG2Uthwkd4F!^qp&X@&5e~_|F#p;S{|dz3Nk^-zF#9V5C&Occo4C->LAulYnynJMj$3!qx3q!P@HfOVd1?xBl~ZShc7@vfh1w@H)3 zDxBBv1_xO8*}g0OOu+-PClD?lKH=3(yA`wj*N`@{YeYpJW9fwy9o%$94mvf*N1{_c zmU`Tlhvtc>#IOnrC*EQ&L$PhP3|8DQW6)F*VS@;8fU6>`7djXybf5WnE-ygC-{|L4*#H8u|^9Z?W%@MZSIEpDdyVQ*Koxgrb?-(-Z+5kGQry72ydw7d2XgaL711Pbt1XAx|7#>dU^l#b51A}8l-&SC=?n#*h~Pl2W{vF8!A|I ztdnSs!B|-@v9`8ZhR5OX%W*hdk!T|Tt-}lU!SdwD!uIkD8$Q>6FotO#URO~+=K83! z;zG`k1(z&e{K&Cty>p0k)Hr_q&gIpjo*QpTy*;8vbqhS<&Lw+p{lr%eprU_I|RqXjkcXJ4>BI_29c3&Jn}> z_qvi!4cz>Gs$TW7P`m%Dy)HQ`B7W)pN%WLQo~|`H1Fko{&bD!y+WOtFnwNCt{_KE? zyFNfUh~dB7f5H2a@t<8SgenV9%rQ{Z>d}$%M=NrR z#$w-G-x*z+)Of%+UB^57?3d*}?^nOl;8^3xIHDguC;#Ew4J&^lI6m6GEOK1+Wb(4! zWH0}R$cJ~MrlPXk9)-SrF}RU;QC~=N0!pV}_6?aISS0*x{+sENox&^)GwDIY3icGb z9XQ{)-zxs+l_zpIKgS>5=b99t+w^HqC`*qGnb}c5zy3$r0p7<2j*XU*+4sjSsZ*S` ziu@mGnI`$nHltUmMO-Uft(`^m!MsDIjtv;s9w z`DOoO)zjLZHJ!%QSF^vrn<&lAVXWS8=n2DO47kfkgY@I!YUCmfp?CnS@xSdO`5r8kRyqzKJ3<73C zKU$=zaO7}A!8SGU*1Qf4>~aoe?q>mwbLiFN$?mxQ4+M+SXYaUpgF9UZwt)>`Aqajh I1oq&60qYcbo&W#< diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/2.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/2.ogg deleted file mode 100644 index 0f09bb3057cf801d9b9dd7c4c6f7feb4092f51a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4378 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 I0B1J)AM6m6LjV8( diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/20.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/20.ogg deleted file mode 100644 index 11ac780e985c9e1410d152434c8d0392751684d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4238 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 Xe6?FHo3(r+AdOF8TE{WQBBQ?m2bNen diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/22.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/22.ogg deleted file mode 100644 index b2ca975852361bc914636fdd03ace40c491f719d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4343 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 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/24.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/24.ogg deleted file mode 100644 index 90093efc7e6aa6f17613621bd0b952f890a4eaf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4241 zcmd5j0t0WThS}^diM!-ruVz^`0h9V%>H(E)?Rz< z-&t$zwf0#jDlIJrn1FXpMOz^Ho;0OlR%7yZ<|cD^C<_zRwy+}XS@=JTi9&b&rJ*}9 zaCU*z^XUi4Z-3i7O&4&;a5&Vq@X&J`3H?~pU)=+e36zpgJ9S_3$_sW-(p}E$_&ICFb+l|3 zoleRdp*SDq4fyD#ywcnq9_dg{%CjoiL0q8fe$oYGA}DWw(p<1>BM!<*I&}dV-fGCR z>6BA4+|EO4%{?8B>oyLl5egJB4#ISvIFj$fmA<)CSw;-}9&_@2_$T?t%6O z;Jk}>HRD5%9sdd!T*A57xOnpTkB;dUxl3C@jvue2-^Yt$2WZ6F1XE3{1%x><4n!8QRz5O!(H(jvGXksV;v!UgUp{0$XE57&8o>d>{- zVNqq(l*fC^3+g;&7P(W@8EnC7=(G<(5VU*%e*w$8NC{~$Z;EU|^_D$vVG~)Rq z$(IS$H|TALc;)nv_T!>tl53ubeyC*tMvI9({E-Tw`inp`0EHf*#767nGD@>Fu#Bib z!YlUB+4IUN`g%UyMK9%V3i}BMr_E9x-PgIAw<*lI0mcVd41e!8j8-hi_)CE>pvo`m z897=+jHoB4_nHz#0fs;AZ5>2)m4O9peU2(F^Y=L9U=2F8p0n7pECKKr(& z=r%K(O83;>nlQYzP(4oxp8j+7xelReNtPe`b$>Wt%;zzodF> zap7^}{Lt7qH>DBY;N$-FE&@ga%zE@eMFw7%x>Z0vG zW$1nWOK%71_=DH|8N>Y@H@iJ<^=6a4&#@oQGz@tddZW7qUvAs8^vCCX0c-CL)`d9% zeuV5*eE&dQrV%;gCc=@R$gW4_F2f4$e6L|hnT;S>5ZQn#nKj(|cnEo9G|;Gq z(p9T`JgjV+HyVhlfw&DTxhqd+&8yNS@3eB!DqZJQP^-s7ik+=Un*p6ZdacMYsNDak z%$i5qUaQt>RXYuy+PVB77=kfgTrJEK7=m+b$hu1ACNda_-jU7;H^-WROVrRh(1DD+z>rP(c@D`0?Zw%FHy`LL{*R{5_#(JqAI#Mq!QkD z5Q*rSW&l|Gz#u+sbq3WSjW(i(vq73WV2?>Q7! z(8C;>L{{*+z5`#Y+o`q$a%wQZIzxv95*yKXuJOhDe}~Y&x9~T2wEQEezq#Z81^;g# zT>bZ5^{?2s6jYSvfQo&;MrJ4sva;wf;()XO>!HJ?jM50iD(F~J>eh}`dr`GXq|YO@(rDS@RUxH`KYmTOQyn0pODb%rIGS3pX;>ARKO~n zH|zliSoh)H6@O;n4%r6?SKsLH?WbLh-~MYzo7gs?BC}X}8AT5tx~2%7nmfdzQ$Ch@ z0>?x1q_D!c3JWLRGGAk{y?7O@xM9YisZ@v!BftT!7GizT!APM4J=(jeLl!1k|9 zfxpnQ^%JS}Au}5^IbjJRv=`UYM+yVV1HQEk7>fSfk{Us|T9dpf(HnPW zpTH6kHXHB?0G|!Qk`kQ@$<5u9?Cs<0_m|H(p-^a)@`s~PX#8MXB(yZL0Q$j(3R2I5 zmCG*s6Cw+S)oG3*(gs*#>9VR$jxj zjqXvKsn2ZE>z>xeO+5;{s~d^4j@UZ&hxL!XSXB6DUT5CN-4+!e{7G;Ltk<;>CYuUw zKb3bLU47@xe$}(=bm>zbkmtw9{SVBBle(j9)4q{5zut9b-;pJ^u(mhXI;XBL`uO7) z8M{_H{deF4iz{`{FCTY)fm`pH^t(}D?*zQBCD{eCwTDxCw6Blp-`2&)wwBE+A}iv+NE0VY0%!XYQ-d&X{f5x&0$D zurm3mxY7-Lv)MM+|M&HMCQ~OOTb#b@FIh@I^7z!VpZ(r+RK{<#S}D+UHQkJIwQL#M zx&PL=$Ln^xT-o_2e~W#`nx&?(?6U;Z`RY?W(^I!z4DM~|xjVY@nd1xAxx2y>|5-&S zJm|D*{nFikP8|%tVY|J;{xrMCb9Y?wCGEA%z60iOW)JPYvG>2`&R+kq!|wS5Wx)q& z!Oc6ao@C6P+~xWlTV}cS;v1jlFK~FwH%>IG>#G$fSB$vnE`N7QuZfNP?laBFEf4RV z+OVzbJLfdU+sz{+5FhuYxTmaEnMYSwrA?PjM76(a_>3+-DC(|_`(@)GGjB=;h{JB| yhYGpWW4`k4887@|;k^&@ZI;aiJ~c?ROZH@*%mm=f;=CcNc#zJ(`N9|4?Ee7t1S;(S diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/25.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/25.ogg deleted file mode 100644 index 27dfe8eb65134e787b8b1a3893765dad077884a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4348 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 A%K!iX diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/26.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/26.ogg deleted file mode 100644 index 80cb60faaf2968a2b91934455797ca0ed2b6f1a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4399 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 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/27.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/27.ogg deleted file mode 100644 index 13332de644c46885bb092b2b671e1a26b5bcb14d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4227 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 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/28.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/28.ogg deleted file mode 100644 index 29615795329d22b87942cafaeb723234c0f6b02c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4160 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 PmeuZCcTAVmE?WK<#WD_& diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/29.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/29.ogg deleted file mode 100644 index 41f953432ca83a51dcd32e5fcb76f3fdde187a74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4205 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 K<#RQd)&B!XG)(^h diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/31.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/31.ogg deleted file mode 100644 index 4447b52aba0950509d1897bd1e580dbf21d0038a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4319 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 bgD*ug-Cjo8|C+K4e0m2+=a4^mgsJ~;6*glX diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/32.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/32.ogg deleted file mode 100644 index a58240a199bc12a8f2344f098a2a90198327ce87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4397 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 Bi248k diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/4.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/4.ogg deleted file mode 100644 index 688b1f81469413df22373bdb217f2aefe960b3e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4464 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 T&bE+U1#C;)g^QWI4TgUMw~Vm9 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/5.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/5.ogg deleted file mode 100644 index d2163268bfeef79ceb362fd2dc3f7bdd13f1f3d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4220 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 I`Q4(w0+*p2tN;K2 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/7.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/7.ogg deleted file mode 100644 index 9c9c994f7d387f7166b403194366e816c4baf583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4442 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 O<6q*+E4H|UN&f&x8>s>S diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/8.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/8.ogg deleted file mode 100644 index 0f9acf9968e994117ed9136747447e7989a19bab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4351 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 Gi2ECRx@F@4 diff --git a/srcs/requirements/svelte/api_front/public/sounds/sound/pong/9.ogg b/srcs/requirements/svelte/api_front/public/sounds/sound/pong/9.ogg deleted file mode 100644 index 15d82091bd70e6e6b7594b8358af7db583c28f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4291 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�zdXr7cPdag)Z~el?Z)?@X z$<*y}KXHP90zJ-g5u$Ph47IDL2g5xPMUXXt35%(uU9n;={>7Lk z;Qlt9`SYPZTR)!O+f8~wwY?uS4(zS`srx+nZ*^v-WW&HB{z`R~Ms#PJ8VD@}|_ zq#tMYoEhDADYI6XCZEYStv+Tz@=OwIawYD^FG@!?M@Z849sj~LxzDN~?Ci*a{&5S- zzLtwaOU|LZVp;MSJia|j6WxI9JM?b7YybvjnXab>@1EDhq3n+fjBJy{XxvTCfiCHg zIM}?TvTV>J6jh^O7G!&7->gQ{h{A==x9_G5{apF@@pVpLZ*IMO?keg_IE78HB7kMv77+YRYsTglS6OBFRmpt5KY4ymI=WT)qv1;5*hSU8J;#6hE_KeW^%m|o zC$SGH)VQ9qY<}@nrV)K=@U#=LN$!_x#bLknu^mS@>%C2mseEf9vz=Yy5!%>^z z+SXskCkTP*AHxQ@i)vB@5qi6O8;cf|yA6&GtD$0TyC-dfldq4N+FqMg2a?p3HZ$rM9=H0p<#Jg|-oBf^XYx}cj%%+b9-n>UQLS3}HwpVa> zO-pPD(fO(S_{Sz@Z$nzzm{e7^`$h>CME^X%MFhF z&!!lS29-=f_%$TghH>hLMZxatUG4Nu+WXI0r-+G$9d#G&T=zP-P@J3U#@^qZQKy|x z=#yDT*G@fu^>PXRry(_qnEU>9g1xu;PtKgaKRJotaNEKs$Y%fD-R9RYdD5B6ujoo& zO+Ednv5P+$@IGnEe79SSs5wY3h2=4@)~q;A@+6+k^w}QM=E3)KulKL-dA$soiF)>7 zIbFwZjk7L?iuRW752YP@oV%CooJXA?tkH6~-BFw7@zT{OyVZ8z%CzOhrp=!`mi*?z zB+~eAc}tcK*fQyH;Lb?2HB3;#uVdY z+so2kS5LpOt9}&O^J*q$g5mtaar&1HKgI-dGwQlr1i5f<~ug!~;9E7}_sD(#DopL!xIE>2XU4xN)L z8k%aEDx!MTasv0LP0saJ*I+h9Z&I4|U#mYlEHYK!zJ&6HR94u3;Kt)uv9*GGRYs$O@(J#NPc_RuOLmARWM?|!HHHYSQ!7BUbZI^?lfLe@`hHBNmq_addi z#WeDz{}tSU^P~B8GjrR2x@A;oxua%BrhHb^Gi->q*&!hU1n~YDlwgXMs*;!m-^%Ee|H9>-TGX>WXz_`{~cN4p^J2-*9rVOI+?9Sm-hrPtD;wCJ!v# zv}G_?sqmU7GJ!U48fcFqRyca#OpS~zEUPopse|PBR{EKVfdKZ5=ZZ1G&aqu#?&c)W$Ckcn!pjJpJXESmnum-xJPa$@kap^)8nK z7rNHE$2Qcg{lwofcXqL4S6Rvw&| zghzUEF(}{|;bFua?EbjAq3C_V$GnJ4ftbiNz9l$MG%AcT>gp)hr5|{DQnLDJi|zS{ z2SJLlKI%=cd)|Ge8vUWbJal=Nas-S1MS%l$9cP3%bsc)FVl|Gn7uGOYFJzF>)t z>eXS&`NXdqzdp32NzCe;B*Vq*>yn>a$=htYrwNvON<%Ju-C-}gR9q`s UUsjEEkpJHXAU^UBQk$p013HTK@&Et; diff --git a/srcs/requirements/svelte/api_front/src/main.js b/srcs/requirements/svelte/api_front/src/main.js new file mode 100644 index 00000000..34f779eb --- /dev/null +++ b/srcs/requirements/svelte/api_front/src/main.js @@ -0,0 +1,9 @@ +import App from './App.svelte'; +const app = new App({ + target: document.body, + props: { + // name: 'world' + } +}); +export default app; +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/srcs/requirements/svelte/api_front/src/main.js.map b/srcs/requirements/svelte/api_front/src/main.js.map new file mode 100644 index 00000000..3bd45e8b --- /dev/null +++ b/srcs/requirements/svelte/api_front/src/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["main.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAE/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IACnB,MAAM,EAAE,QAAQ,CAAC,IAAI;IACrB,KAAK,EAAE;IACN,gBAAgB;KAChB;CACD,CAAC,CAAC;AAEH,eAAe,GAAG,CAAC"} \ No newline at end of file diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index 4a4741b1..e3cb88a4 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -1,45 +1,104 @@ - -

.
- -
-
- game options -
- - -
-
- - -
-
- - - - - -
-
- -
-
+{#if optionsAreNotSet} +
+
+
+ game options +
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+

--- keys ---

+

move up: 'w' or 'up arrow'

+

move down: 's' OR 'down arrow'

+

grid on/off: 'g'

- +{/if}
- - \ No newline at end of file + From 67f7d0e8ec3cba8d7c5effa8cb01c57eec6debe0 Mon Sep 17 00:00:00 2001 From: batche Date: Fri, 16 Dec 2022 10:51:40 +0100 Subject: [PATCH 09/45] =?UTF-8?q?Suite=20de=20l'int=C3=A9gratyion=20du=20j?= =?UTF-8?q?eu.=20De=20nombreux=20paquets=20sont=20indisponibles.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api_back/src/game/dto/create-party.dto.ts | 16 ----------- .../api_back/src/game/entity/game.entity.ts | 26 +++++++++++++++++ .../api_back/src/game/entity/user.entity.ts | 22 --------------- .../nestjs/api_back/src/game/game.module.ts | 16 +++++------ .../api_back/src/game/game.service.spec.ts | 28 +++++++++---------- .../nestjs/api_back/src/game/game.service.ts | 7 +++-- .../api_back/src/redis/redis.service.ts | 1 + 7 files changed, 53 insertions(+), 63 deletions(-) delete mode 100644 srcs/requirements/nestjs/api_back/src/game/dto/create-party.dto.ts create mode 100644 srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts delete mode 100644 srcs/requirements/nestjs/api_back/src/game/entity/user.entity.ts create mode 100644 srcs/requirements/nestjs/api_back/src/redis/redis.service.ts diff --git a/srcs/requirements/nestjs/api_back/src/game/dto/create-party.dto.ts b/srcs/requirements/nestjs/api_back/src/game/dto/create-party.dto.ts deleted file mode 100644 index 14d2e14c..00000000 --- a/srcs/requirements/nestjs/api_back/src/game/dto/create-party.dto.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IsBoolean, IsEmail, IsNotEmpty, IsString } from 'class-validator'; - -export class CreateUsersDto { - @IsString() - @IsNotEmpty() - readonly username: string; - readonly fortyTwoId: string; - @IsEmail() - readonly email: string; - @IsString() - readonly image_url: string; - @IsString() - readonly status: string; - @IsBoolean() - readonly isEnabledTwoFactorAuth: boolean; -} diff --git a/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts b/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts new file mode 100644 index 00000000..b93d2088 --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts @@ -0,0 +1,26 @@ +import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; + +@Entity('game') +export class game { + + @PrimaryGeneratedColumn() + id: number; + + @Column() + playerOneUsername: string + + @Column() + playerTwoUsername: string + + @Column() + playerOneUsernameResult : number + + @Column() + playerTwoUsernameResult : number + + @Column() + gameServerIdOfTheMatch: string + + @Column({default: false}) //éric pourra trouver un meilleur mot : ongoing ? + isMatchIsFinished: boolean +} diff --git a/srcs/requirements/nestjs/api_back/src/game/entity/user.entity.ts b/srcs/requirements/nestjs/api_back/src/game/entity/user.entity.ts deleted file mode 100644 index 6c45d3a5..00000000 --- a/srcs/requirements/nestjs/api_back/src/game/entity/user.entity.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; - - - -@Entity('gameParty') -export class gameParty { - - @PrimaryGeneratedColumn() - id: number; - - @Column() - playerOne: string - - @Column() - playerTwo: string - - @Column() - resultOfTheMatch: string - - @Column() - gameServerIdOfTheMatch: string -} diff --git a/srcs/requirements/nestjs/api_back/src/game/game.module.ts b/srcs/requirements/nestjs/api_back/src/game/game.module.ts index 17a50c06..b9909dd5 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.module.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.module.ts @@ -1,9 +1,9 @@ -import { Module } from '@nestjs/common'; -import { GameController } from './game.controller'; -import { GameService } from './game.service'; +// import { Module } from '@nestjs/common'; +// import { GameController } from './game.controller'; +// import { GameService } from './game.service'; -@Module({ - controllers: [GameController], - providers: [GameService] -}) -export class GameModule {} +// @Module({ +// controllers: [GameController], +// providers: [GameService] +// }) +// export class GameModule {} diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.spec.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.spec.ts index f4a1db7e..d91fa17d 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.spec.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.spec.ts @@ -1,18 +1,18 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { GameService } from './game.service'; +// import { Test, TestingModule } from '@nestjs/testing'; +// // import { GameService } from './game.service'; -describe('GameService', () => { - let service: GameService; +// describe('GameService', () => { +// let service: GameService; - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [GameService], - }).compile(); +// beforeEach(async () => { +// const module: TestingModule = await Test.createTestingModule({ +// providers: [GameService], +// }).compile(); - service = module.get(GameService); - }); +// service = module.get(GameService); +// }); - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); +// it('should be defined', () => { +// expect(service).toBeDefined(); +// }); +// }); diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index 18ca270d..554d73dd 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -1,4 +1,5 @@ -import { Injectable } from '@nestjs/common'; +// import { Injectable } from '@nestjs/common'; + +// @Injectable('game') +// export class GameService {} -@Injectable() -export class GameService {} diff --git a/srcs/requirements/nestjs/api_back/src/redis/redis.service.ts b/srcs/requirements/nestjs/api_back/src/redis/redis.service.ts new file mode 100644 index 00000000..1bf70bcf --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/redis/redis.service.ts @@ -0,0 +1 @@ +import {RedisService} from "@nestjs/redis" From 42f2d76f30630e088d0d8bd83b83a016e6e78f62 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sat, 17 Dec 2022 17:22:42 +0100 Subject: [PATCH 10/45] Wip fetch() from gameServer to nestServer + miscs (html, css, svelte warning, ...) --- .../game_back/src/server/class/Client.ts | 2 + .../game_back/src/server/class/GameSession.ts | 78 +++++++----- .../game_back/src/server/constants.ts | 2 + .../game_back/src/server/wsServer.ts | 115 +++++++++++++++--- .../game_back/src/shared_js/class/Event.ts | 11 +- .../src/shared_js/class/Rectangle.ts | 2 +- .../src/shared_js/class/interface.ts | 2 +- .../game_back/src/shared_js/utils.ts | 2 +- .../game_back/src/shared_js/wallsMovement.ts | 4 +- srcs/requirements/nestjs/api_back/.env | 2 +- .../api_front/src/pages/game/Game.svelte | 92 ++++++++------ .../game/client/class/GameComponentsClient.ts | 2 +- .../pages/game/client/class/InputHistory.ts | 4 +- .../game/client/class/RectangleClient.ts | 2 +- .../src/pages/game/client/class/Text.ts | 2 +- .../src/pages/game/client/gameLoop.ts | 4 +- .../api_front/src/pages/game/client/ws.ts | 6 +- .../src/pages/game/shared_js/class/Event.ts | 11 +- .../pages/game/shared_js/class/Rectangle.ts | 2 +- .../pages/game/shared_js/class/interface.ts | 2 +- .../src/pages/game/shared_js/utils.ts | 2 +- .../src/pages/game/shared_js/wallsMovement.ts | 4 +- 22 files changed, 243 insertions(+), 110 deletions(-) diff --git a/srcs/requirements/game_server/game_back/src/server/class/Client.ts b/srcs/requirements/game_server/game_back/src/server/class/Client.ts index c6e4defa..864472ec 100644 --- a/srcs/requirements/game_server/game_back/src/server/class/Client.ts +++ b/srcs/requirements/game_server/game_back/src/server/class/Client.ts @@ -17,6 +17,8 @@ export class Client { } export class ClientPlayer extends Client { + token: string; + username: string; matchOptions: en.MatchOptions = 0; inputBuffer: ev.EventInput = new ev.EventInput(); lastInputId: number = 0; diff --git a/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts b/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts index 55879135..b6878dc1 100644 --- a/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts +++ b/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts @@ -24,15 +24,18 @@ export class GameSession { spectatorsUpdateInterval: NodeJS.Timer | number = 0; components: GameComponentsServer; matchOptions: en.MatchOptions; + isPrivateMatch: boolean; // WIP: could be used to separate leaderboards for example. matchEnded: boolean = false; + lastStateSnapshot: ev.EventGameUpdate; actual_time: number; last_time: number; delta_time: number; - constructor(id: string, matchOptions: en.MatchOptions) { + constructor(id: string, matchOptions: en.MatchOptions, isPrivateMatch: boolean = false) { this.id = id; this.matchOptions = matchOptions; + this.isPrivateMatch = isPrivateMatch; this.components = new GameComponentsServer(this.matchOptions); } start() { @@ -51,6 +54,7 @@ export class GameSession { }); s.actual_time = Date.now(); + s.lastStateSnapshot = s._gameStateSnapshot(); s.gameLoopInterval = setInterval(s._gameLoop, c.serverGameLoopIntervalMS, s); s.playersUpdateInterval = setInterval(s._playersUpdate, c.playersUpdateIntervalMS, s); s.spectatorsUpdateInterval = setInterval(s._spectatorsUpdate, c.spectatorsUpdateIntervalMS, s); @@ -139,16 +143,16 @@ export class GameSession { }); } private _playersUpdate(s: GameSession) { - const gameState: ev.EventGameUpdate = s._gameStateSnapshot(); + s.lastStateSnapshot = s._gameStateSnapshot(); s.playersMap.forEach( (client) => { - gameState.lastInputId = client.lastInputId; - client.socket.send(JSON.stringify(gameState)); + s.lastStateSnapshot.lastInputId = client.lastInputId; + client.socket.send(JSON.stringify(s.lastStateSnapshot)); }); } private _spectatorsUpdate(s: GameSession) { - const gameState = s._gameStateSnapshot(); + s.lastStateSnapshot.lastInputId = 0; s.spectatorsMap.forEach( (client) => { - client.socket.send(JSON.stringify(gameState)); + client.socket.send(JSON.stringify(s.lastStateSnapshot)); }); } private _gameStateSnapshot() : ev.EventGameUpdate { @@ -182,7 +186,12 @@ export class GameSession { { if (Math.abs(gc.scoreLeft - gc.scoreRight) >= 2) { - s._matchEnd(s); + if (gc.scoreLeft > gc.scoreRight) { + s._matchEnd(en.PlayerSide.left); + } + else { + s._matchEnd(en.PlayerSide.right); + } return; } } @@ -197,45 +206,54 @@ export class GameSession { this.matchEnded = true; if (this.playersMap.size != 0) { + console.log("Forfeit Ending"); const gc = this.components; const luckyWinner: ClientPlayer = this.playersMap.values().next().value; - let eventEnd: ev.EventMatchEnd; if (luckyWinner.racket === gc.playerLeft) { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.left, true); - console.log("Player Left WIN (by forfeit)"); + this._matchEnd(en.PlayerSide.left, true); } else { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.right, true); - console.log("Player Right WIN (by forfeit)"); + this._matchEnd(en.PlayerSide.right, true); } - luckyWinner.socket.send(JSON.stringify(eventEnd)); - this.spectatorsMap.forEach( (client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); } return true; } return false; } - private _matchEnd(s: GameSession) { - s.matchEnded = true; - const gc = s.components; - + private async _matchEnd(winner: en.PlayerSide, forfeit_flag: boolean = false) + { + this.matchEnded = true; let eventEnd: ev.EventMatchEnd; - if (gc.scoreLeft > gc.scoreRight) { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.left); + eventEnd = new ev.EventMatchEnd(winner, forfeit_flag); + this.playersMap.forEach( (client) => { + client.socket.send(JSON.stringify(eventEnd)); + }); + this.spectatorsMap.forEach( (client) => { + client.socket.send(JSON.stringify(eventEnd)); + }); + + /* // WIP nest , send match result + const gc = this.components; + await fetch(c.addressBackEnd + "/game/matchEnd", + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + id: this.id, + scoreLeft: gc.scoreLeft, + scoreRight: gc.scoreRight, + isPrivateMatch: this.isPrivateMatch, + }) + }); */ + + // logs + if (winner === en.PlayerSide.left) { console.log("Player Left WIN"); } else { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.right); console.log("Player Right WIN"); } - - s.playersMap.forEach( (client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); - s.spectatorsMap.forEach( (client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); } } diff --git a/srcs/requirements/game_server/game_back/src/server/constants.ts b/srcs/requirements/game_server/game_back/src/server/constants.ts index b7efffd3..3ab0ce0b 100644 --- a/srcs/requirements/game_server/game_back/src/server/constants.ts +++ b/srcs/requirements/game_server/game_back/src/server/constants.ts @@ -8,3 +8,5 @@ export const fixedDeltaTime = serverGameLoopIntervalMS/1000; // second // 33.333ms == 1000/30 export const playersUpdateIntervalMS = 1000/30; // millisecond export const spectatorsUpdateIntervalMS = 1000/30; // millisecond + +export const addressBackEnd = "http://backend_dev:3000"; diff --git a/srcs/requirements/game_server/game_back/src/server/wsServer.ts b/srcs/requirements/game_server/game_back/src/server/wsServer.ts index c11015f2..3f20fd4d 100644 --- a/srcs/requirements/game_server/game_back/src/server/wsServer.ts +++ b/srcs/requirements/game_server/game_back/src/server/wsServer.ts @@ -10,16 +10,17 @@ import { v4 as uuidv4 } from 'uuid'; import * as en from "../shared_js/enums.js" import * as ev from "../shared_js/class/Event.js" +import * as c from "./constants.js" import { Client, ClientPlayer, ClientSpectator } from "./class/Client.js" import { GameSession } from "./class/GameSession.js" import { shortId } from "./utils.js"; import { gameSessionIdPLACEHOLDER } from "./constants.js"; -// pas indispensable d'avoir un autre port si le WebSocket est relié à un serveur http préexistant ? const wsPort = 8042; export const wsServer = new WebSocketServer({host: "0.0.0.0", port: wsPort, path: "/pong"}); const clientsMap: Map = new Map; // socket.id/Client -const matchmakingPlayersMap: Map = new Map; // socket.id/ClientPlayer (duplicates with clientsMap) +const matchmakingPlayersMap: Map = new Map; // socket.id/ClientPlayer (duplicates with clientsMap) // TODO: rename in matchmakingMap +const privateMatchmakingMap: Map = new Map; // socket.id/ClientPlayer (duplicates with clientsMap) const gameSessionsMap: Map = new Map; // GameSession.id(url)/GameSession wsServer.on("connection", connectionListener); @@ -54,7 +55,7 @@ function connectionListener(socket: WebSocket, request: IncomingMessage) } -function clientAnnounceListener(this: WebSocket, data: string) +async function clientAnnounceListener(this: WebSocket, data: string) { try { const msg : ev.ClientAnnounce = JSON.parse(data); @@ -65,11 +66,44 @@ function clientAnnounceListener(this: WebSocket, data: string) if (msg.role === en.ClientRole.player) { const announce: ev.ClientAnnouncePlayer = msg; + + /* // WIP nest, fetch token validation + const response = await fetch(c.addressBackEnd + "/game/validateToken", + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + token: announce.token, + username: announce.username, + }) + }); + switch (response.status) + { + case 200: + case 204: + break; + case 403: + default: + // send message to client ? or just gtfo ? + clientTerminate(clientsMap.get(this.id)); + return; + } */ + const player = clientsMap.get(this.id) as ClientPlayer; player.matchOptions = announce.matchOptions; + player.token = announce.token; + player.username = announce.username; + this.send(JSON.stringify( new ev.EventAssignId(this.id) )); this.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchmakingInProgress) )); - matchmaking(player); + if (announce.privateMatch) { + privateMatchmaking(player); + } + else { + publicMatchmaking(player); + } } else if (msg.role === en.ClientRole.spectator) { @@ -77,6 +111,7 @@ function clientAnnounceListener(this: WebSocket, data: string) const gameSession = gameSessionsMap.get(announce.gameSessionId); if (!gameSession) { // WIP: send "invalid game session" + clientTerminate(clientsMap.get(this.id)); return; } const spectator = clientsMap.get(this.id) as ClientSpectator; @@ -97,12 +132,12 @@ function clientAnnounceListener(this: WebSocket, data: string) } -function matchmaking(player: ClientPlayer) +function publicMatchmaking(player: ClientPlayer) { const minPlayersNumber = 2; const maxPlayersNumber = 2; - const matchOptions = player.matchOptions; matchmakingPlayersMap.set(player.id, player); + const matchOptions = player.matchOptions; const compatiblePlayers: ClientPlayer[] = []; for (const [id, client] of matchmakingPlayersMap) @@ -116,17 +151,52 @@ function matchmaking(player: ClientPlayer) } } - if (compatiblePlayers.length < minPlayersNumber) { - return; + if (compatiblePlayers.length >= minPlayersNumber) { + compatiblePlayers.forEach((client) => { + matchmakingPlayersMap.delete(client.id); + }); + createGameSession(compatiblePlayers, matchOptions); + } +} + + +function privateMatchmaking(player: ClientPlayer) +{ + const minPlayersNumber = 2; + const maxPlayersNumber = 2; + privateMatchmakingMap.set(player.id, player); + const matchOptions = player.matchOptions; + + const token = player.token; + const compatiblePlayers: ClientPlayer[] = []; + for (const [id, client] of privateMatchmakingMap) + { + if (client.token === token) + { + compatiblePlayers.push(client); + if (compatiblePlayers.length === maxPlayersNumber) { + break; + } + } } + if (compatiblePlayers.length >= minPlayersNumber) { + compatiblePlayers.forEach((client) => { + privateMatchmakingMap.delete(client.id); + }); + createGameSession(compatiblePlayers, matchOptions); + } +} + + +async function createGameSession(playersArr: ClientPlayer[], matchOptions: en.MatchOptions) +{ // const id = gameSessionIdPLACEHOLDER; // Force ID, TESTING SPECTATOR const id = uuidv4(); const gameSession = new GameSession(id, matchOptions); gameSessionsMap.set(id, gameSession); - compatiblePlayers.forEach((client) => { - matchmakingPlayersMap.delete(client.id); + playersArr.forEach((client) => { client.gameSession = gameSession; gameSession.playersMap.set(client.id, client); gameSession.unreadyPlayersMap.set(client.id, client); @@ -134,15 +204,15 @@ function matchmaking(player: ClientPlayer) // WIP: Not pretty, hardcoded two players. // Could be done in gameSession maybe ? - compatiblePlayers[0].racket = gameSession.components.playerRight; - compatiblePlayers[1].racket = gameSession.components.playerLeft; + playersArr[0].racket = gameSession.components.playerRight; + playersArr[1].racket = gameSession.components.playerLeft; - compatiblePlayers.forEach((client) => { + playersArr.forEach((client) => { client.socket.once("message", playerReadyConfirmationListener); }); - compatiblePlayers[0].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.right) )); - compatiblePlayers[1].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.left) )); + playersArr[0].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.right) )); + playersArr[1].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.left) )); setTimeout(function abortMatch() { if (gameSession.unreadyPlayersMap.size !== 0) @@ -155,6 +225,18 @@ function matchmaking(player: ClientPlayer) }); } }, 5000); + + /* // WIP nest , send gameSession.id + await fetch(c.addressBackEnd + "/game/newGameSession", + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + id: id, + }) + }); */ } @@ -250,6 +332,9 @@ function clientTerminate(client: Client) if (matchmakingPlayersMap.has(client.id)) { matchmakingPlayersMap.delete(client.id); } + else if (privateMatchmakingMap.has(client.id)) { + privateMatchmakingMap.delete(client.id); + } } diff --git a/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts b/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts index 992827e4..10e9d580 100644 --- a/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts +++ b/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts @@ -89,12 +89,17 @@ export class ClientAnnounce extends ClientEvent { } export class ClientAnnouncePlayer extends ClientAnnounce { - clientId: string; + clientId: string; // unused matchOptions: en.MatchOptions; - constructor(matchOptions: en.MatchOptions, clientId: string = "") { + token: string; + username: string; + privateMatch: boolean; + constructor(matchOptions: en.MatchOptions, token: string, username: string, privateMatch: boolean = false) { super(en.ClientRole.player); - this.clientId = clientId; this.matchOptions = matchOptions; + this.token = token; + this.username = username; + this.privateMatch = privateMatch; } } diff --git a/srcs/requirements/game_server/game_back/src/shared_js/class/Rectangle.ts b/srcs/requirements/game_server/game_back/src/shared_js/class/Rectangle.ts index bbbb30e5..d258c553 100644 --- a/srcs/requirements/game_server/game_back/src/shared_js/class/Rectangle.ts +++ b/srcs/requirements/game_server/game_back/src/shared_js/class/Rectangle.ts @@ -1,6 +1,6 @@ import { Vector, VectorInteger } from "./Vector.js"; -import { Component, Moving } from "./interface.js"; +import type { Component, Moving } from "./interface.js"; import * as c from "../constants.js" export class Rectangle implements Component { diff --git a/srcs/requirements/game_server/game_back/src/shared_js/class/interface.ts b/srcs/requirements/game_server/game_back/src/shared_js/class/interface.ts index 544d54a8..0f484da3 100644 --- a/srcs/requirements/game_server/game_back/src/shared_js/class/interface.ts +++ b/srcs/requirements/game_server/game_back/src/shared_js/class/interface.ts @@ -1,5 +1,5 @@ -import { Vector, VectorInteger } from "./Vector.js"; +import type { Vector, VectorInteger } from "./Vector.js"; export interface Component { pos: VectorInteger; diff --git a/srcs/requirements/game_server/game_back/src/shared_js/utils.ts b/srcs/requirements/game_server/game_back/src/shared_js/utils.ts index 6cba06d2..dd3d40d0 100644 --- a/srcs/requirements/game_server/game_back/src/shared_js/utils.ts +++ b/srcs/requirements/game_server/game_back/src/shared_js/utils.ts @@ -1,5 +1,5 @@ -import { MovingRectangle } from "./class/Rectangle.js"; +import type { MovingRectangle } from "./class/Rectangle.js"; export function random(min: number = 0, max: number = 1) { return Math.random() * (max - min) + min; diff --git a/srcs/requirements/game_server/game_back/src/shared_js/wallsMovement.ts b/srcs/requirements/game_server/game_back/src/shared_js/wallsMovement.ts index 0f6dbe58..b2c2b581 100644 --- a/srcs/requirements/game_server/game_back/src/shared_js/wallsMovement.ts +++ b/srcs/requirements/game_server/game_back/src/shared_js/wallsMovement.ts @@ -1,7 +1,7 @@ import * as c from "./constants.js"; -import { MovingRectangle } from "../shared_js/class/Rectangle.js"; -import { GameComponents } from "./class/GameComponents.js"; +import type { MovingRectangle } from "../shared_js/class/Rectangle.js"; +import type { GameComponents } from "./class/GameComponents.js"; export function wallsMovements(delta: number, gc: GameComponents) { diff --git a/srcs/requirements/nestjs/api_back/.env b/srcs/requirements/nestjs/api_back/.env index 7799ac26..ed44998b 100644 --- a/srcs/requirements/nestjs/api_back/.env +++ b/srcs/requirements/nestjs/api_back/.env @@ -7,7 +7,7 @@ POSTGRES_DATABASE=transcendance_db # OAUTH2 42 API FORTYTWO_CLIENT_ID=u-s4t2ud-49dc7b539bcfe1acb48b928b2b281671c99fc5bfab1faca57a536ab7e0075500 -FORTYTWO_CLIENT_SECRET=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 +FORTYTWO_CLIENT_SECRET=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 FORTYTWO_CALLBACK_URL=http://transcendance:8080/api/v2/auth/redirect COOKIE_SECRET=248cdc831110eec8796d7c1edbf79835 # JWT diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index 754776ea..da29126f 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -15,25 +15,30 @@ let optionsAreNotSet = true - let sound = false; + let soundMutedFlag = false; let multi_balls = false; let moving_walls = false; - let matchOption : enumeration.MatchOptions = enumeration.MatchOptions.noOption; + let matchOptions : enumeration.MatchOptions = enumeration.MatchOptions.noOption; // En async au cas où pour la suite mais apriori inutile, les check se feront sûrement au onMount const init = async() => { - if (multi_balls === true) - matchOption |= enumeration.MatchOptions.multiBalls - if (moving_walls === true ) - matchOption |= enumeration.MatchOptions.movingWalls - initAudio(sound) - initMatchOptions(matchOption) - optionsAreNotSet = false - initPong(new GameArea()) - initGc(new GameComponentsClient(matchOption, pong.ctx)) - initStartFunction(start) - initWebSocket(matchOption) + console.log(soundMutedFlag); + + initAudio(soundMutedFlag); + if (multi_balls === true) { + matchOptions |= enumeration.MatchOptions.multiBalls; + } + if (moving_walls === true) { + matchOptions |= enumeration.MatchOptions.movingWalls; + } + initMatchOptions(matchOptions); + optionsAreNotSet = false; + + initPong(new GameArea()); + initGc(new GameComponentsClient(matchOptions, pong.ctx)); + initStartFunction(start); + initWebSocket(matchOptions); } function start() : void { @@ -65,28 +70,31 @@ -
.
{#if optionsAreNotSet}
-
- game options -
- - -
-
- - -
-
- - -
-
- -
-
+
+ game options +
+ + +
+
+ + +
+
+ + + + + + +
+
+ +
+
@@ -106,29 +114,33 @@ @font-face { font-family: "Bit5x3"; - src: url("/fonts/Bit5x3.woff2") format("woff2"),local("Bit5x3"), url("/fonts/Bit5x3.woff") format("woff"); + src: + url("/fonts/Bit5x3.woff2") format("woff2"), + local("Bit5x3"), + url("/fonts/Bit5x3.woff") format("woff"); font-weight: normal; font-style: normal; font-display: swap; } -#preload_font { - font-family: "Bit5x3"; - opacity:0; - height:0; - width:0; - display:inline-block; -} body { margin: 0; background-color: #222425; } #canvas_container { + margin-top: 20px; text-align: center; /* border: dashed rgb(245, 245, 245) 5px; */ /* max-height: 80vh; */ /* overflow: hidden; */ } +#div_game_instructions { + text-align: center; + font-family: "Bit5x3"; + color: rgb(245, 245, 245); + font-size: large; +} #div_game_options { + margin-top: 20px; text-align: center; font-family: "Bit5x3"; color: rgb(245, 245, 245); diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/class/GameComponentsClient.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/class/GameComponentsClient.ts index 9fa0a2a3..63797971 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/class/GameComponentsClient.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/class/GameComponentsClient.ts @@ -5,7 +5,7 @@ import { Vector, VectorInteger } from "../../shared_js/class/Vector.js"; import { TextElem, TextNumericValue } from "./Text.js"; import { RectangleClient, MovingRectangleClient, RacketClient, BallClient, Line } from "./RectangleClient.js"; import { GameComponents } from "../../shared_js/class/GameComponents.js"; -import { MovingRectangle } from "../../shared_js/class/Rectangle.js"; +import type { MovingRectangle } from "../../shared_js/class/Rectangle.js"; class GameComponentsExtensionForClient extends GameComponents { wallTop: RectangleClient | MovingRectangleClient; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/class/InputHistory.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/class/InputHistory.ts index 952693af..f8a7fe4f 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/class/InputHistory.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/class/InputHistory.ts @@ -1,6 +1,6 @@ -import * as en from "../../shared_js/enums.js" -import * as ev from "../../shared_js/class/Event.js" +import type * as en from "../../shared_js/enums.js" +import type * as ev from "../../shared_js/class/Event.js" export class InputHistory { input: en.InputEnum; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/class/RectangleClient.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/class/RectangleClient.ts index 1cc1c4f5..a1d3a1e4 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/class/RectangleClient.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/class/RectangleClient.ts @@ -1,6 +1,6 @@ import { Vector, VectorInteger } from "../../shared_js/class/Vector.js"; -import { Component, GraphicComponent, Moving } from "../../shared_js/class/interface.js"; +import type { GraphicComponent } from "../../shared_js/class/interface.js"; import { Rectangle, MovingRectangle, Racket, Ball } from "../../shared_js/class/Rectangle.js"; import { soundPongArr } from "../audio.js" import { random } from "../utils.js"; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/class/Text.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/class/Text.ts index 11f00ab9..ccdfdc0c 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/class/Text.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/class/Text.ts @@ -1,6 +1,6 @@ import { Vector, VectorInteger } from "../../shared_js/class/Vector.js"; -import { Component } from "../../shared_js/class/interface.js"; +import type { Component } from "../../shared_js/class/interface.js"; // conflict with Text export class TextElem implements Component { diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/gameLoop.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/gameLoop.ts index 784841c3..2ba91739 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/gameLoop.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/gameLoop.ts @@ -3,8 +3,8 @@ import * as c from "./constants.js"; import * as en from "../shared_js/enums.js" import { gc, matchOptions, clientInfo, clientInfoSpectator} from "./global.js"; import { wallsMovements } from "../shared_js/wallsMovement.js"; -import { RacketClient } from "./class/RectangleClient.js"; -import { VectorInteger } from "../shared_js/class/Vector.js"; +import type { RacketClient } from "./class/RectangleClient.js"; +import type { VectorInteger } from "../shared_js/class/Vector.js"; let actual_time: number = Date.now(); let last_time: number; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts index b02ebaec..f080b61d 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts @@ -30,11 +30,15 @@ export let socket: WebSocket; /* TODO: A way to still use "const" not "let" ? */ export const clientInfo = new ClientInfo(); export const clientInfoSpectator = new ClientInfoSpectator(); // WIP, could refactor this + +const tokenPLACEHOLDER = ""; +const usernamePLACEHOLDER = ""; +const privateMatchPLACEHOLDER = false; export function initWebSocket(options: en.MatchOptions) { socket = new WebSocket(wsUrl, "json"); socket.addEventListener("open", (event) => { - socket.send(JSON.stringify( new ev.ClientAnnouncePlayer(options, clientInfo.id) )); + socket.send(JSON.stringify( new ev.ClientAnnouncePlayer(options, tokenPLACEHOLDER, usernamePLACEHOLDER, privateMatchPLACEHOLDER) )); }); // socket.addEventListener("message", logListener); // for testing purpose socket.addEventListener("message", preMatchListener); diff --git a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts index 992827e4..10e9d580 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts @@ -89,12 +89,17 @@ export class ClientAnnounce extends ClientEvent { } export class ClientAnnouncePlayer extends ClientAnnounce { - clientId: string; + clientId: string; // unused matchOptions: en.MatchOptions; - constructor(matchOptions: en.MatchOptions, clientId: string = "") { + token: string; + username: string; + privateMatch: boolean; + constructor(matchOptions: en.MatchOptions, token: string, username: string, privateMatch: boolean = false) { super(en.ClientRole.player); - this.clientId = clientId; this.matchOptions = matchOptions; + this.token = token; + this.username = username; + this.privateMatch = privateMatch; } } diff --git a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Rectangle.ts b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Rectangle.ts index bbbb30e5..d258c553 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Rectangle.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Rectangle.ts @@ -1,6 +1,6 @@ import { Vector, VectorInteger } from "./Vector.js"; -import { Component, Moving } from "./interface.js"; +import type { Component, Moving } from "./interface.js"; import * as c from "../constants.js" export class Rectangle implements Component { diff --git a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/interface.ts b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/interface.ts index 544d54a8..0f484da3 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/interface.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/interface.ts @@ -1,5 +1,5 @@ -import { Vector, VectorInteger } from "./Vector.js"; +import type { Vector, VectorInteger } from "./Vector.js"; export interface Component { pos: VectorInteger; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/utils.ts b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/utils.ts index 6cba06d2..dd3d40d0 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/utils.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/utils.ts @@ -1,5 +1,5 @@ -import { MovingRectangle } from "./class/Rectangle.js"; +import type { MovingRectangle } from "./class/Rectangle.js"; export function random(min: number = 0, max: number = 1) { return Math.random() * (max - min) + min; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/wallsMovement.ts b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/wallsMovement.ts index 0f6dbe58..b2c2b581 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/wallsMovement.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/wallsMovement.ts @@ -1,7 +1,7 @@ import * as c from "./constants.js"; -import { MovingRectangle } from "../shared_js/class/Rectangle.js"; -import { GameComponents } from "./class/GameComponents.js"; +import type { MovingRectangle } from "../shared_js/class/Rectangle.js"; +import type { GameComponents } from "./class/GameComponents.js"; export function wallsMovements(delta: number, gc: GameComponents) { From 04029c998873ebb8e0a810a016db6373a466dde0 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sat, 17 Dec 2022 20:33:58 +0100 Subject: [PATCH 11/45] fix sound selector + favicon + temporary debug log for sound in RectangleClient --- .../svelte/api_front/public}/favicon.ico | Bin .../svelte/api_front/public/favicon.png | Bin 3127 -> 0 bytes .../svelte/api_front/public/index.html | 2 +- .../public/{sounds => sound}/pong/0.ogg | Bin .../public/{sounds => sound}/pong/1.ogg | Bin .../public/{sounds => sound}/pong/10.ogg | Bin .../public/{sounds => sound}/pong/11.ogg | Bin .../public/{sounds => sound}/pong/12.ogg | Bin .../public/{sounds => sound}/pong/13.ogg | Bin .../public/{sounds => sound}/pong/14.ogg | Bin .../public/{sounds => sound}/pong/15.ogg | Bin .../public/{sounds => sound}/pong/16.ogg | Bin .../public/{sounds => sound}/pong/17.ogg | Bin .../public/{sounds => sound}/pong/18.ogg | Bin .../public/{sounds => sound}/pong/19.ogg | Bin .../public/{sounds => sound}/pong/2.ogg | Bin .../public/{sounds => sound}/pong/20.ogg | Bin .../public/{sounds => sound}/pong/21.ogg | Bin .../public/{sounds => sound}/pong/22.ogg | Bin .../public/{sounds => sound}/pong/23.ogg | Bin .../public/{sounds => sound}/pong/24.ogg | Bin .../public/{sounds => sound}/pong/25.ogg | Bin .../public/{sounds => sound}/pong/26.ogg | Bin .../public/{sounds => sound}/pong/27.ogg | Bin .../public/{sounds => sound}/pong/28.ogg | Bin .../public/{sounds => sound}/pong/29.ogg | Bin .../public/{sounds => sound}/pong/3.ogg | Bin .../public/{sounds => sound}/pong/30.ogg | Bin .../public/{sounds => sound}/pong/31.ogg | Bin .../public/{sounds => sound}/pong/32.ogg | Bin .../public/{sounds => sound}/pong/4.ogg | Bin .../public/{sounds => sound}/pong/5.ogg | Bin .../public/{sounds => sound}/pong/6.ogg | Bin .../public/{sounds => sound}/pong/7.ogg | Bin .../public/{sounds => sound}/pong/8.ogg | Bin .../public/{sounds => sound}/pong/9.ogg | Bin .../public/{sounds => sound}/roblox-oof.ogg | Bin .../svelte/api_front/src/pages/game/Game.svelte | 15 ++++++++++----- .../pages/game/client/class/RectangleClient.ts | 4 +++- 39 files changed, 14 insertions(+), 7 deletions(-) rename {jeu/www => srcs/requirements/svelte/api_front/public}/favicon.ico (100%) delete mode 100644 srcs/requirements/svelte/api_front/public/favicon.png rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/0.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/1.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/10.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/11.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/12.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/13.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/14.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/15.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/16.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/17.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/18.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/19.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/2.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/20.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/21.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/22.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/23.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/24.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/25.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/26.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/27.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/28.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/29.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/3.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/30.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/31.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/32.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/4.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/5.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/6.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/7.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/8.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/pong/9.ogg (100%) rename srcs/requirements/svelte/api_front/public/{sounds => sound}/roblox-oof.ogg (100%) diff --git a/jeu/www/favicon.ico b/srcs/requirements/svelte/api_front/public/favicon.ico similarity index 100% rename from jeu/www/favicon.ico rename to srcs/requirements/svelte/api_front/public/favicon.ico diff --git a/srcs/requirements/svelte/api_front/public/favicon.png b/srcs/requirements/svelte/api_front/public/favicon.png deleted file mode 100644 index 7e6f5eb5a2f1f1c882d265cf479de25caa925645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3127 zcmV-749N3|P)i z7)}s4L53SJCkR}iVi00SFk;`MXX*#X*kkwKs@nFGS}c;=?XFjU|G$3t^5sjIVS2G+ zw)WGF83CpoGXhLGW(1gW%uV|X7>1P6VhCX=Ux)Lb!*DZ%@I3!{Gsf7d?gtIQ%nQiK z3%(LUSkBji;C5Rfgd6$VsF@H`Pk@xtY6t<>FNR-pD}=C~$?)9pdm3XZ36N5PNWYjb z$xd$yNQR9N!dfj-Vd@BwQo^FIIWPPmT&sZyQ$v81(sCBV=PGy{0wltEjB%~h157*t zvbe_!{=I_783x!0t1-r#-d{Y?ae$Q4N_Nd^Ui^@y(%)Gjou6y<3^XJdu{rmUf-Me?)zZ>9OR&6U5H*cK; z$gUlB{g0O4gN0sLSO|Of?hU(l?;h(jA3uH!Z{EBKuV23ouU@^Y6#%v+QG;>e*E}%?wlu-NT4DG zs)z)7WbLr)vGAu(ohrKc^em@OpO&f~6_>E61n_e0_V3@{U3^O;j{`^mNCJUj_>;7v zsMs6Hu3g7+@v+lSo;=yTYFqq}jZmQ-BK8K{C4kqi_i*jBaQE(Au0607V-zKeT;EPg zX(`vrn=L+e74+-Tqeok@_`tDa$G9I|$nTU5H*2V8@y()n*zqM?J1G!-1aX;CfDC9B zTnJ#j_%*n8Qb1)re*Bno7g0RG{Eb;IK14irJYJp$5Z6ac9~b_P?+5t~95~SRG$g?1 znFJ7p$xV&GZ18m~79TGRdfsc-BcX$9yXTR*n)mPD@1~O(_?cT$ZvFPucRmGlq&se0 zKrcUf^k}4hM*biEJOWKzz!qQe;CB_ZtSOO9Owg#lZAc=s65^rb{fZe(TYu_rk!wKkEf}RIt=#Om( zR8mN`DM<^xj~59euMMspBolVN zAPTr8sSDI104orIAdmL$uOXn*6hga1G+0WD0E?UtabxC#VC~vf3|10|phW;yQ3CY8 z2CM=)ErF;xq-YJ5G|um}>*1#E+O_Mu|Nr#qQ&G1P-NMq@f?@*XUcSbV?tX=)ilM-Q zBZP|!Bpv0V;#ojKcpc7$=eqO;#Uy~#?^kNI{vSZfLx&DEt~LTmaKWXcx=joubklI<*Aw z>LtMaQ7DR<1I2LkWvwyu#Rwn~;ezT}_g(@5l3h?W%-a86Y-t#O1PubP+z<%?V5D(U zy57A6{h+{?kOZp7&WKZR+=sznMJ}+Dnpo=C_0%R_x_t~J5T?E_{+))l5v1%52>)d-`iiZyx|5!%M2Fb2dU zW3~MwwpEH9Rhue+k$UIOoo($Ds!NbOyMR36fRHu;*15(YcA7siIZk#%JWz>P!qX1?IUojG&nKR>^gArBt2 zit(ETyZ=@V&7mv_Fi4bABcnwP+jzQuHcfU&BrAV91u-rFvEi7y-KnWsvHH=d2 zgAk(GKm_S8RcTJ>2N3~&Hbwp{Z3NF_Xeh}g4Eke)V&dY{W(3&b1j9t4yK_aYJisZZ{1rcU5- z;eD>K;ndPq&B-8yA_S0F!4ThA&{1{x)H<#?k9a#6Pc6L?V^s0``ynL&D;p(!Nmx`Y zFkHex{4p!Ggm^@DlehW}iHHVi}~u=$&N? z(NEBLQ#UxxAkdW>X9LnqUr#t4Lu0=9L8&o>JsqTtT5|%gb3QA~hr0pED71+iFFr)dZ=Q=E6ng{NE{Z~0)C?deO#?Aj zSDQ$z#TeC2T^|=}6GBo-&$;E{HL3!q3Z-szuf)O=G#zDjin4SSP%o%6+2IT#sLjQa ziyxFFz~LMjWY+_a5H!U6%a<=b7QVP^ z*90a62;bVq{?@)P6^DWd^Yilq4|YTV2Nw!Yu;a1lPI-sxR)rf@Fe5DhDP7FH zZZ%4S*1C30P;|O+jB!1;m|rXT90Sm5*RBbQN`PKu+hDD*S^yE(CdtSfg=z>u$cIj> zPotato Pong - + diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/0.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/0.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/0.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/0.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/1.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/1.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/1.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/1.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/10.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/10.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/10.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/10.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/11.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/11.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/11.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/11.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/12.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/12.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/12.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/12.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/13.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/13.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/13.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/13.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/14.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/14.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/14.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/14.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/15.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/15.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/15.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/15.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/16.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/16.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/16.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/16.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/17.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/17.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/17.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/17.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/18.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/18.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/18.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/18.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/19.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/19.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/19.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/19.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/2.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/2.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/2.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/2.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/20.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/20.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/20.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/20.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/21.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/21.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/21.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/21.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/22.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/22.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/22.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/22.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/23.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/23.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/23.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/23.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/24.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/24.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/24.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/24.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/25.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/25.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/25.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/25.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/26.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/26.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/26.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/26.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/27.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/27.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/27.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/27.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/28.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/28.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/28.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/28.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/29.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/29.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/29.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/29.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/3.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/3.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/3.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/3.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/30.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/30.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/30.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/30.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/31.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/31.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/31.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/31.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/32.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/32.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/32.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/32.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/4.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/4.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/4.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/4.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/5.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/5.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/5.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/5.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/6.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/6.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/6.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/6.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/7.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/7.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/7.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/7.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/8.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/8.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/8.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/8.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/pong/9.ogg b/srcs/requirements/svelte/api_front/public/sound/pong/9.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/pong/9.ogg rename to srcs/requirements/svelte/api_front/public/sound/pong/9.ogg diff --git a/srcs/requirements/svelte/api_front/public/sounds/roblox-oof.ogg b/srcs/requirements/svelte/api_front/public/sound/roblox-oof.ogg similarity index 100% rename from srcs/requirements/svelte/api_front/public/sounds/roblox-oof.ogg rename to srcs/requirements/svelte/api_front/public/sound/roblox-oof.ogg diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index da29126f..d537a794 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -15,7 +15,7 @@ let optionsAreNotSet = true - let soundMutedFlag = false; + let sound = "on"; // possible de faire un boolean avec svelte et radio buttons ? let multi_balls = false; let moving_walls = false; let matchOptions : enumeration.MatchOptions = enumeration.MatchOptions.noOption; @@ -23,9 +23,14 @@ // En async au cas où pour la suite mais apriori inutile, les check se feront sûrement au onMount const init = async() => { - console.log(soundMutedFlag); + if (sound === "off") { + initAudio(true); + } + else if (sound === "on") { + initAudio(false); + } + console.log(sound); - initAudio(soundMutedFlag); if (multi_balls === true) { matchOptions |= enumeration.MatchOptions.multiBalls; } @@ -86,9 +91,9 @@
- + - +
diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/class/RectangleClient.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/class/RectangleClient.ts index a1d3a1e4..e671fb3f 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/class/RectangleClient.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/class/RectangleClient.ts @@ -81,7 +81,9 @@ export class BallClient extends Ball implements GraphicComponent { } bounce(collider?: Rectangle) { this._bounceAlgo(collider); - soundPongArr[ Math.floor(random(0, soundPongArr.length)) ].play(); + let i = Math.floor(random(0, soundPongArr.length)); + soundPongArr[ i ].play(); + console.log(`sound_i=${i}`); // debug log } } From 674eff0d6d86644cc329bb1762a8d93334134ce0 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sat, 17 Dec 2022 20:34:48 +0100 Subject: [PATCH 12/45] deleted useless duplicates files --- jeu/jsconfig.json | 13 - jeu/make.sh | 18 -- jeu/package-lock.json | 121 -------- jeu/package.json | 12 - jeu/src/client/audio.js | 12 - jeu/src/client/audio.ts | 16 - jeu/src/client/class/GameArea.js | 32 -- jeu/src/client/class/GameArea.ts | 36 --- jeu/src/client/class/GameComponentsClient.js | 71 ----- jeu/src/client/class/GameComponentsClient.ts | 115 ------- jeu/src/client/class/InputHistory.js | 7 - jeu/src/client/class/InputHistory.ts | 14 - jeu/src/client/class/RectangleClient.js | 85 ------ jeu/src/client/class/RectangleClient.ts | 129 -------- jeu/src/client/class/Text.js | 43 --- jeu/src/client/class/Text.ts | 56 ---- jeu/src/client/constants.js | 13 - jeu/src/client/constants.ts | 18 -- jeu/src/client/draw.js | 35 --- jeu/src/client/draw.ts | 49 --- jeu/src/client/gameLoop.js | 52 ---- jeu/src/client/gameLoop.ts | 71 ----- jeu/src/client/global.js | 19 -- jeu/src/client/global.ts | 29 -- jeu/src/client/handleInput.js | 83 ----- jeu/src/client/handleInput.ts | 108 ------- jeu/src/client/message.js | 65 ---- jeu/src/client/message.ts | 80 ----- jeu/src/client/pong.css | 54 ---- jeu/src/client/pong.html | 47 --- jeu/src/client/pong.js | 63 ---- jeu/src/client/pong.ts | 78 ----- jeu/src/client/pongSpectator.html | 19 -- jeu/src/client/pongSpectator.js | 33 -- jeu/src/client/pongSpectator.ts | 46 --- jeu/src/client/utils.js | 13 - jeu/src/client/utils.ts | 16 - jeu/src/client/ws.js | 230 -------------- jeu/src/client/ws.ts | 302 ------------------- jeu/src/server/class/Client.js | 23 -- jeu/src/server/class/Client.ts | 34 --- jeu/src/server/class/GameComponentsServer.js | 8 - jeu/src/server/class/GameComponentsServer.ts | 12 - jeu/src/server/class/GameSession.js | 212 ------------- jeu/src/server/class/GameSession.ts | 241 --------------- jeu/src/server/constants.js | 7 - jeu/src/server/constants.ts | 10 - jeu/src/server/server.js | 37 --- jeu/src/server/server.ts | 41 --- jeu/src/server/utils.js | 4 - jeu/src/server/utils.ts | 6 - jeu/src/server/wsServer.js | 208 ------------- jeu/src/server/wsServer.ts | 266 ---------------- jeu/src/shared_js/class/Event.js | 84 ------ jeu/src/shared_js/class/Event.ts | 117 ------- jeu/src/shared_js/class/GameComponents.js | 51 ---- jeu/src/shared_js/class/GameComponents.ts | 63 ---- jeu/src/shared_js/class/Rectangle.js | 124 -------- jeu/src/shared_js/class/Rectangle.ts | 142 --------- jeu/src/shared_js/class/Vector.js | 40 --- jeu/src/shared_js/class/Vector.ts | 47 --- jeu/src/shared_js/class/interface.js | 1 - jeu/src/shared_js/class/interface.ts | 19 -- jeu/src/shared_js/constants.js | 23 -- jeu/src/shared_js/constants.ts | 30 -- jeu/src/shared_js/enums.js | 43 --- jeu/src/shared_js/enums.ts | 46 --- jeu/src/shared_js/utils.js | 18 -- jeu/src/shared_js/utils.ts | 25 -- jeu/src/shared_js/wallsMovement.js | 13 - jeu/src/shared_js/wallsMovement.ts | 18 -- jeu/tsconfig.json | 103 ------- jeu/www/Bit5x3.woff | Bin 3124 -> 0 bytes jeu/www/Bit5x3.woff2 | Bin 2012 -> 0 bytes jeu/www/sound/pong/0.ogg | Bin 4228 -> 0 bytes jeu/www/sound/pong/1.ogg | Bin 4298 -> 0 bytes jeu/www/sound/pong/10.ogg | Bin 4226 -> 0 bytes jeu/www/sound/pong/11.ogg | Bin 4306 -> 0 bytes jeu/www/sound/pong/12.ogg | Bin 4398 -> 0 bytes jeu/www/sound/pong/13.ogg | Bin 4322 -> 0 bytes jeu/www/sound/pong/14.ogg | Bin 4439 -> 0 bytes jeu/www/sound/pong/15.ogg | Bin 4199 -> 0 bytes jeu/www/sound/pong/16.ogg | Bin 4428 -> 0 bytes jeu/www/sound/pong/17.ogg | Bin 4427 -> 0 bytes jeu/www/sound/pong/18.ogg | Bin 4324 -> 0 bytes jeu/www/sound/pong/19.ogg | Bin 4358 -> 0 bytes jeu/www/sound/pong/2.ogg | Bin 4378 -> 0 bytes jeu/www/sound/pong/20.ogg | Bin 4238 -> 0 bytes jeu/www/sound/pong/21.ogg | Bin 4320 -> 0 bytes jeu/www/sound/pong/22.ogg | Bin 4343 -> 0 bytes jeu/www/sound/pong/23.ogg | Bin 4240 -> 0 bytes jeu/www/sound/pong/24.ogg | Bin 4241 -> 0 bytes jeu/www/sound/pong/25.ogg | Bin 4348 -> 0 bytes jeu/www/sound/pong/26.ogg | Bin 4399 -> 0 bytes jeu/www/sound/pong/27.ogg | Bin 4227 -> 0 bytes jeu/www/sound/pong/28.ogg | Bin 4160 -> 0 bytes jeu/www/sound/pong/29.ogg | Bin 4205 -> 0 bytes jeu/www/sound/pong/3.ogg | Bin 4292 -> 0 bytes jeu/www/sound/pong/30.ogg | Bin 4305 -> 0 bytes jeu/www/sound/pong/31.ogg | Bin 4319 -> 0 bytes jeu/www/sound/pong/32.ogg | Bin 4397 -> 0 bytes jeu/www/sound/pong/4.ogg | Bin 4464 -> 0 bytes jeu/www/sound/pong/5.ogg | Bin 4220 -> 0 bytes jeu/www/sound/pong/6.ogg | Bin 4197 -> 0 bytes jeu/www/sound/pong/7.ogg | Bin 4442 -> 0 bytes jeu/www/sound/pong/8.ogg | Bin 4351 -> 0 bytes jeu/www/sound/pong/9.ogg | Bin 4291 -> 0 bytes jeu/www/sound/roblox-oof.ogg | Bin 6383 -> 0 bytes 108 files changed, 4419 deletions(-) delete mode 100644 jeu/jsconfig.json delete mode 100644 jeu/make.sh delete mode 100644 jeu/package-lock.json delete mode 100644 jeu/package.json delete mode 100644 jeu/src/client/audio.js delete mode 100644 jeu/src/client/audio.ts delete mode 100644 jeu/src/client/class/GameArea.js delete mode 100644 jeu/src/client/class/GameArea.ts delete mode 100644 jeu/src/client/class/GameComponentsClient.js delete mode 100644 jeu/src/client/class/GameComponentsClient.ts delete mode 100644 jeu/src/client/class/InputHistory.js delete mode 100644 jeu/src/client/class/InputHistory.ts delete mode 100644 jeu/src/client/class/RectangleClient.js delete mode 100644 jeu/src/client/class/RectangleClient.ts delete mode 100644 jeu/src/client/class/Text.js delete mode 100644 jeu/src/client/class/Text.ts delete mode 100644 jeu/src/client/constants.js delete mode 100644 jeu/src/client/constants.ts delete mode 100644 jeu/src/client/draw.js delete mode 100644 jeu/src/client/draw.ts delete mode 100644 jeu/src/client/gameLoop.js delete mode 100644 jeu/src/client/gameLoop.ts delete mode 100644 jeu/src/client/global.js delete mode 100644 jeu/src/client/global.ts delete mode 100644 jeu/src/client/handleInput.js delete mode 100644 jeu/src/client/handleInput.ts delete mode 100644 jeu/src/client/message.js delete mode 100644 jeu/src/client/message.ts delete mode 100644 jeu/src/client/pong.css delete mode 100644 jeu/src/client/pong.html delete mode 100644 jeu/src/client/pong.js delete mode 100644 jeu/src/client/pong.ts delete mode 100644 jeu/src/client/pongSpectator.html delete mode 100644 jeu/src/client/pongSpectator.js delete mode 100644 jeu/src/client/pongSpectator.ts delete mode 100644 jeu/src/client/utils.js delete mode 100644 jeu/src/client/utils.ts delete mode 100644 jeu/src/client/ws.js delete mode 100644 jeu/src/client/ws.ts delete mode 100644 jeu/src/server/class/Client.js delete mode 100644 jeu/src/server/class/Client.ts delete mode 100644 jeu/src/server/class/GameComponentsServer.js delete mode 100644 jeu/src/server/class/GameComponentsServer.ts delete mode 100644 jeu/src/server/class/GameSession.js delete mode 100644 jeu/src/server/class/GameSession.ts delete mode 100644 jeu/src/server/constants.js delete mode 100644 jeu/src/server/constants.ts delete mode 100644 jeu/src/server/server.js delete mode 100644 jeu/src/server/server.ts delete mode 100644 jeu/src/server/utils.js delete mode 100644 jeu/src/server/utils.ts delete mode 100644 jeu/src/server/wsServer.js delete mode 100644 jeu/src/server/wsServer.ts delete mode 100644 jeu/src/shared_js/class/Event.js delete mode 100644 jeu/src/shared_js/class/Event.ts delete mode 100644 jeu/src/shared_js/class/GameComponents.js delete mode 100644 jeu/src/shared_js/class/GameComponents.ts delete mode 100644 jeu/src/shared_js/class/Rectangle.js delete mode 100644 jeu/src/shared_js/class/Rectangle.ts delete mode 100644 jeu/src/shared_js/class/Vector.js delete mode 100644 jeu/src/shared_js/class/Vector.ts delete mode 100644 jeu/src/shared_js/class/interface.js delete mode 100644 jeu/src/shared_js/class/interface.ts delete mode 100644 jeu/src/shared_js/constants.js delete mode 100644 jeu/src/shared_js/constants.ts delete mode 100644 jeu/src/shared_js/enums.js delete mode 100644 jeu/src/shared_js/enums.ts delete mode 100644 jeu/src/shared_js/utils.js delete mode 100644 jeu/src/shared_js/utils.ts delete mode 100644 jeu/src/shared_js/wallsMovement.js delete mode 100644 jeu/src/shared_js/wallsMovement.ts delete mode 100644 jeu/tsconfig.json delete mode 100644 jeu/www/Bit5x3.woff delete mode 100644 jeu/www/Bit5x3.woff2 delete mode 100644 jeu/www/sound/pong/0.ogg delete mode 100644 jeu/www/sound/pong/1.ogg delete mode 100644 jeu/www/sound/pong/10.ogg delete mode 100644 jeu/www/sound/pong/11.ogg delete mode 100644 jeu/www/sound/pong/12.ogg delete mode 100644 jeu/www/sound/pong/13.ogg delete mode 100644 jeu/www/sound/pong/14.ogg delete mode 100644 jeu/www/sound/pong/15.ogg delete mode 100644 jeu/www/sound/pong/16.ogg delete mode 100644 jeu/www/sound/pong/17.ogg delete mode 100644 jeu/www/sound/pong/18.ogg delete mode 100644 jeu/www/sound/pong/19.ogg delete mode 100644 jeu/www/sound/pong/2.ogg delete mode 100644 jeu/www/sound/pong/20.ogg delete mode 100644 jeu/www/sound/pong/21.ogg delete mode 100644 jeu/www/sound/pong/22.ogg delete mode 100644 jeu/www/sound/pong/23.ogg delete mode 100644 jeu/www/sound/pong/24.ogg delete mode 100644 jeu/www/sound/pong/25.ogg delete mode 100644 jeu/www/sound/pong/26.ogg delete mode 100644 jeu/www/sound/pong/27.ogg delete mode 100644 jeu/www/sound/pong/28.ogg delete mode 100644 jeu/www/sound/pong/29.ogg delete mode 100644 jeu/www/sound/pong/3.ogg delete mode 100644 jeu/www/sound/pong/30.ogg delete mode 100644 jeu/www/sound/pong/31.ogg delete mode 100644 jeu/www/sound/pong/32.ogg delete mode 100644 jeu/www/sound/pong/4.ogg delete mode 100644 jeu/www/sound/pong/5.ogg delete mode 100644 jeu/www/sound/pong/6.ogg delete mode 100644 jeu/www/sound/pong/7.ogg delete mode 100644 jeu/www/sound/pong/8.ogg delete mode 100644 jeu/www/sound/pong/9.ogg delete mode 100644 jeu/www/sound/roblox-oof.ogg diff --git a/jeu/jsconfig.json b/jeu/jsconfig.json deleted file mode 100644 index 347bf03f..00000000 --- a/jeu/jsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "module": "ESNext", - "moduleResolution": "Node", - "target": "ES2020", - "strictNullChecks": true, - "strictFunctionTypes": true - }, - "exclude": [ - "node_modules", - "**/node_modules/*" - ] -} \ No newline at end of file diff --git a/jeu/make.sh b/jeu/make.sh deleted file mode 100644 index ebce024a..00000000 --- a/jeu/make.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -npx tsc - -mkdir -p www -cp ./src/client/*.html ./www/ -cp ./src/client/*.css ./www/ - -mkdir -p www/js -cp ./src/client/*.js ./www/js/ - -mkdir -p www/js/class -cp ./src/client/class/*.js ./www/js/class/ - -mkdir -p www/shared_js/ -cp ./src/shared_js/*.js ./www/shared_js/ - -mkdir -p www/shared_js/class -cp ./src/shared_js/class/*.js ./www/shared_js/class/ diff --git a/jeu/package-lock.json b/jeu/package-lock.json deleted file mode 100644 index 03e6f035..00000000 --- a/jeu/package-lock.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "name": "jeu", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "dependencies": { - "uuid": "^9.0.0", - "ws": "^8.10.0" - }, - "devDependencies": { - "@types/node": "^18.11.5", - "@types/uuid": "^8.3.4", - "@types/ws": "^8.5.3", - "typescript": "^4.9.4" - } - }, - "node_modules/@types/node": { - "version": "18.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", - "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==", - "dev": true - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/ws": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", - "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - }, - "dependencies": { - "@types/node": { - "version": "18.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", - "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==", - "dev": true - }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "ws": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", - "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", - "requires": {} - } - } -} diff --git a/jeu/package.json b/jeu/package.json deleted file mode 100644 index 7fdb209b..00000000 --- a/jeu/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "devDependencies": { - "@types/node": "^18.11.5", - "@types/uuid": "^8.3.4", - "@types/ws": "^8.5.3", - "typescript": "^4.9.4" - }, - "dependencies": { - "uuid": "^9.0.0", - "ws": "^8.10.0" - } -} diff --git a/jeu/src/client/audio.js b/jeu/src/client/audio.js deleted file mode 100644 index df9ec3e0..00000000 --- a/jeu/src/client/audio.js +++ /dev/null @@ -1,12 +0,0 @@ -import * as c from "./constants.js"; -export const soundPongArr = []; -export const soundRoblox = new Audio("http://localhost:8080/sound/roblox-oof.ogg"); -export function initAudio(muteFlag) { - for (let i = 0; i <= 32; i++) { - soundPongArr.push(new Audio("http://localhost:8080/sound/pong/" + i + ".ogg")); - soundPongArr[i].volume = c.soundPongVolume; - soundPongArr[i].muted = muteFlag; - } - soundRoblox.volume = c.soundRobloxVolume; - soundRoblox.muted = muteFlag; -} diff --git a/jeu/src/client/audio.ts b/jeu/src/client/audio.ts deleted file mode 100644 index 74c73336..00000000 --- a/jeu/src/client/audio.ts +++ /dev/null @@ -1,16 +0,0 @@ - -import * as c from "./constants.js" - -export const soundPongArr: HTMLAudioElement[] = []; -export const soundRoblox = new Audio("http://localhost:8080/sound/roblox-oof.ogg"); - -export function initAudio(muteFlag: boolean) -{ - for (let i = 0; i <= 32; i++) { - soundPongArr.push(new Audio("http://localhost:8080/sound/pong/"+i+".ogg")); - soundPongArr[i].volume = c.soundPongVolume; - soundPongArr[i].muted = muteFlag; - } - soundRoblox.volume = c.soundRobloxVolume; - soundRoblox.muted = muteFlag; -} diff --git a/jeu/src/client/class/GameArea.js b/jeu/src/client/class/GameArea.js deleted file mode 100644 index 5748c9e7..00000000 --- a/jeu/src/client/class/GameArea.js +++ /dev/null @@ -1,32 +0,0 @@ -import * as c from ".././constants.js"; -export class GameArea { - constructor() { - this.keys = []; - this.handleInputInterval = 0; - this.gameLoopInterval = 0; - this.drawLoopInterval = 0; - this.canvas = document.createElement("canvas"); - this.ctx = this.canvas.getContext("2d"); - this.canvas.width = c.CanvasWidth; - this.canvas.height = c.CanvasWidth / c.CanvasRatio; - let container = document.getElementById("canvas_container"); - if (container) - container.insertBefore(this.canvas, container.childNodes[0]); - } - addKey(key) { - key = key.toLowerCase(); - var i = this.keys.indexOf(key); - if (i == -1) - this.keys.push(key); - } - deleteKey(key) { - key = key.toLowerCase(); - var i = this.keys.indexOf(key); - if (i != -1) { - this.keys.splice(i, 1); - } - } - clear() { - this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); - } -} diff --git a/jeu/src/client/class/GameArea.ts b/jeu/src/client/class/GameArea.ts deleted file mode 100644 index 5483baa4..00000000 --- a/jeu/src/client/class/GameArea.ts +++ /dev/null @@ -1,36 +0,0 @@ - -import * as c from ".././constants.js" - -export class GameArea { - keys: string[] = []; - handleInputInterval: number = 0; - gameLoopInterval: number = 0; - drawLoopInterval: number = 0; - canvas: HTMLCanvasElement; - ctx: CanvasRenderingContext2D; - constructor() { - this.canvas = document.createElement("canvas"); - this.ctx = this.canvas.getContext("2d") as CanvasRenderingContext2D; - this.canvas.width = c.CanvasWidth; - this.canvas.height = c.CanvasWidth / c.CanvasRatio; - let container = document.getElementById("canvas_container"); - if (container) - container.insertBefore(this.canvas, container.childNodes[0]); - } - addKey(key: string) { - key = key.toLowerCase(); - var i = this.keys.indexOf(key); - if (i == -1) - this.keys.push(key); - } - deleteKey(key: string) { - key = key.toLowerCase(); - var i = this.keys.indexOf(key); - if (i != -1) { - this.keys.splice(i, 1); - } - } - clear() { - this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); - } -} diff --git a/jeu/src/client/class/GameComponentsClient.js b/jeu/src/client/class/GameComponentsClient.js deleted file mode 100644 index 7207d1e0..00000000 --- a/jeu/src/client/class/GameComponentsClient.js +++ /dev/null @@ -1,71 +0,0 @@ -import * as c from "../constants.js"; -import * as en from "../../shared_js/enums.js"; -import { VectorInteger } from "../../shared_js/class/Vector.js"; -import { TextElem, TextNumericValue } from "./Text.js"; -import { RectangleClient, MovingRectangleClient, RacketClient, BallClient, Line } from "./RectangleClient.js"; -import { GameComponents } from "../../shared_js/class/GameComponents.js"; -class GameComponentsExtensionForClient extends GameComponents { - constructor(options, ctx) { - super(options); - // Rackets - const basePL = this.playerLeft; - const basePR = this.playerRight; - this.playerLeft = new RacketClient(basePL.pos, basePL.width, basePL.height, basePL.baseSpeed, ctx, "white"); - this.playerRight = new RacketClient(basePR.pos, basePR.width, basePR.height, basePR.baseSpeed, ctx, "white"); - // Balls - const newBallsArr = []; - this.ballsArr.forEach((ball) => { - newBallsArr.push(new BallClient(ball.pos, ball.width, ball.baseSpeed, ball.speedIncrease, ctx, "white")); - }); - this.ballsArr = newBallsArr; - // Walls - if (options & en.MatchOptions.movingWalls) { - const baseWT = this.wallTop; - const baseWB = this.wallBottom; - this.wallTop = new MovingRectangleClient(baseWT.pos, baseWT.width, baseWT.height, baseWT.baseSpeed, ctx, "grey"); - this.wallTop.dir.assign(baseWT.dir.x, baseWT.dir.y); - this.wallBottom = new MovingRectangleClient(baseWB.pos, baseWB.width, baseWB.height, baseWB.baseSpeed, ctx, "grey"); - this.wallBottom.dir.assign(baseWB.dir.x, baseWB.dir.y); - } - else { - const baseWT = this.wallTop; - const baseWB = this.wallBottom; - this.wallTop = new RectangleClient(baseWT.pos, baseWT.width, baseWT.height, ctx, "grey"); - this.wallBottom = new RectangleClient(baseWB.pos, baseWB.width, baseWB.height, ctx, "grey"); - } - } -} -export class GameComponentsClient extends GameComponentsExtensionForClient { - constructor(options, ctx) { - super(options, ctx); - let pos = new VectorInteger; - // Scores - pos.assign(c.w_mid - c.scoreSize * 1.6, c.scoreSize * 1.5); - this.scoreLeft = new TextNumericValue(pos, c.scoreSize, ctx, "white"); - pos.assign(c.w_mid + c.scoreSize * 1.1, c.scoreSize * 1.5); - this.scoreRight = new TextNumericValue(pos, c.scoreSize, ctx, "white"); - this.scoreLeft.value = 0; - this.scoreRight.value = 0; - // Text - pos.assign(0, c.h_mid); - this.text1 = new TextElem(pos, Math.floor(c.w / 8), ctx, "white"); - this.text2 = new TextElem(pos, Math.floor(c.w / 24), ctx, "white"); - this.text3 = new TextElem(pos, Math.floor(c.w / 24), ctx, "white"); - // Dotted Midline - pos.assign(c.w_mid - c.midLineSize / 2, 0 + c.wallSize); - this.midLine = new Line(pos, c.midLineSize, c.h - c.wallSize * 2, ctx, "white", 15); - // Grid - pos.assign(0, c.h_mid); - this.w_grid_mid = new RectangleClient(pos, c.w, c.gridSize, ctx, "darkgreen"); - pos.assign(0, c.h / 4); - this.w_grid_u1 = new RectangleClient(pos, c.w, c.gridSize, ctx, "darkgreen"); - pos.assign(0, c.h - c.h / 4); - this.w_grid_d1 = new RectangleClient(pos, c.w, c.gridSize, ctx, "darkgreen"); - pos.assign(c.w_mid, 0); - this.h_grid_mid = new RectangleClient(pos, c.gridSize, c.h, ctx, "darkgreen"); - pos.assign(c.w / 4, 0); - this.h_grid_u1 = new RectangleClient(pos, c.gridSize, c.h, ctx, "darkgreen"); - pos.assign(c.w - c.w / 4, 0); - this.h_grid_d1 = new RectangleClient(pos, c.gridSize, c.h, ctx, "darkgreen"); - } -} diff --git a/jeu/src/client/class/GameComponentsClient.ts b/jeu/src/client/class/GameComponentsClient.ts deleted file mode 100644 index 9fa0a2a3..00000000 --- a/jeu/src/client/class/GameComponentsClient.ts +++ /dev/null @@ -1,115 +0,0 @@ - -import * as c from "../constants.js" -import * as en from "../../shared_js/enums.js" -import { Vector, VectorInteger } from "../../shared_js/class/Vector.js"; -import { TextElem, TextNumericValue } from "./Text.js"; -import { RectangleClient, MovingRectangleClient, RacketClient, BallClient, Line } from "./RectangleClient.js"; -import { GameComponents } from "../../shared_js/class/GameComponents.js"; -import { MovingRectangle } from "../../shared_js/class/Rectangle.js"; - -class GameComponentsExtensionForClient extends GameComponents { - wallTop: RectangleClient | MovingRectangleClient; - wallBottom: RectangleClient | MovingRectangleClient; - playerLeft: RacketClient; - playerRight: RacketClient; - ballsArr: BallClient[]; - constructor(options: en.MatchOptions, ctx: CanvasRenderingContext2D) - { - super(options); - - // Rackets - const basePL = this.playerLeft; - const basePR = this.playerRight; - this.playerLeft = new RacketClient( - basePL.pos, basePL.width, basePL.height, basePL.baseSpeed, - ctx, "white"); - this.playerRight = new RacketClient( - basePR.pos, basePR.width, basePR.height, basePR.baseSpeed, - ctx, "white"); - - // Balls - const newBallsArr: BallClient[] = []; - this.ballsArr.forEach((ball) => { - newBallsArr.push(new BallClient(ball.pos, ball.width, ball.baseSpeed, ball.speedIncrease, - ctx, "white") - ); - }); - this.ballsArr = newBallsArr; - - // Walls - if (options & en.MatchOptions.movingWalls) - { - const baseWT = this.wallTop; - const baseWB = this.wallBottom; - - this.wallTop = new MovingRectangleClient(baseWT.pos, baseWT.width, baseWT.height, baseWT.baseSpeed, - ctx, "grey"); - (this.wallTop).dir.assign(baseWT.dir.x, baseWT.dir.y); - - this.wallBottom = new MovingRectangleClient(baseWB.pos, baseWB.width, baseWB.height, baseWB.baseSpeed, - ctx, "grey"); - (this.wallBottom).dir.assign(baseWB.dir.x, baseWB.dir.y); - } - else - { - const baseWT = this.wallTop; - const baseWB = this.wallBottom; - this.wallTop = new RectangleClient(baseWT.pos, baseWT.width, baseWT.height, - ctx, "grey"); - this.wallBottom = new RectangleClient(baseWB.pos, baseWB.width, baseWB.height, - ctx, "grey"); - } - } -} - -export class GameComponentsClient extends GameComponentsExtensionForClient { - midLine: Line; - scoreLeft: TextNumericValue; - scoreRight: TextNumericValue; - text1: TextElem; - text2: TextElem; - text3: TextElem; - - w_grid_mid: RectangleClient; - w_grid_u1: RectangleClient; - w_grid_d1: RectangleClient; - h_grid_mid: RectangleClient; - h_grid_u1: RectangleClient; - h_grid_d1: RectangleClient; - constructor(options: en.MatchOptions, ctx: CanvasRenderingContext2D) - { - super(options, ctx); - let pos = new VectorInteger; - // Scores - pos.assign(c.w_mid-c.scoreSize*1.6, c.scoreSize*1.5); - this.scoreLeft = new TextNumericValue(pos, c.scoreSize, ctx, "white"); - pos.assign(c.w_mid+c.scoreSize*1.1, c.scoreSize*1.5); - this.scoreRight = new TextNumericValue(pos, c.scoreSize, ctx, "white"); - this.scoreLeft.value = 0; - this.scoreRight.value = 0; - - // Text - pos.assign(0, c.h_mid); - this.text1 = new TextElem(pos, Math.floor(c.w/8), ctx, "white"); - this.text2 = new TextElem(pos, Math.floor(c.w/24), ctx, "white"); - this.text3 = new TextElem(pos, Math.floor(c.w/24), ctx, "white"); - - // Dotted Midline - pos.assign(c.w_mid-c.midLineSize/2, 0+c.wallSize); - this.midLine = new Line(pos, c.midLineSize, c.h-c.wallSize*2, ctx, "white", 15); - - // Grid - pos.assign(0, c.h_mid); - this.w_grid_mid = new RectangleClient(pos, c.w, c.gridSize, ctx, "darkgreen"); - pos.assign(0, c.h/4); - this.w_grid_u1 = new RectangleClient(pos, c.w, c.gridSize, ctx, "darkgreen"); - pos.assign(0, c.h-c.h/4); - this.w_grid_d1 = new RectangleClient(pos, c.w, c.gridSize, ctx, "darkgreen"); - pos.assign(c.w_mid, 0); - this.h_grid_mid = new RectangleClient(pos, c.gridSize, c.h, ctx, "darkgreen"); - pos.assign(c.w/4, 0); - this.h_grid_u1 = new RectangleClient(pos, c.gridSize, c.h, ctx, "darkgreen"); - pos.assign(c.w-c.w/4, 0); - this.h_grid_d1 = new RectangleClient(pos, c.gridSize, c.h, ctx, "darkgreen"); - } -} diff --git a/jeu/src/client/class/InputHistory.js b/jeu/src/client/class/InputHistory.js deleted file mode 100644 index d7c31ed3..00000000 --- a/jeu/src/client/class/InputHistory.js +++ /dev/null @@ -1,7 +0,0 @@ -export class InputHistory { - constructor(inputState, deltaTime) { - this.input = inputState.input; - this.id = inputState.id; - this.deltaTime = deltaTime; - } -} diff --git a/jeu/src/client/class/InputHistory.ts b/jeu/src/client/class/InputHistory.ts deleted file mode 100644 index 952693af..00000000 --- a/jeu/src/client/class/InputHistory.ts +++ /dev/null @@ -1,14 +0,0 @@ - -import * as en from "../../shared_js/enums.js" -import * as ev from "../../shared_js/class/Event.js" - -export class InputHistory { - input: en.InputEnum; - id: number; - deltaTime: number; - constructor(inputState: ev.EventInput, deltaTime: number) { - this.input = inputState.input; - this.id = inputState.id; - this.deltaTime = deltaTime; - } -} diff --git a/jeu/src/client/class/RectangleClient.js b/jeu/src/client/class/RectangleClient.js deleted file mode 100644 index 1fe3a10b..00000000 --- a/jeu/src/client/class/RectangleClient.js +++ /dev/null @@ -1,85 +0,0 @@ -import { VectorInteger } from "../../shared_js/class/Vector.js"; -import { Rectangle, MovingRectangle, Racket, Ball } from "../../shared_js/class/Rectangle.js"; -import { soundPongArr } from "../audio.js"; -import { random } from "../utils.js"; -function updateRectangle() { - this.ctx.fillStyle = this.color; - this.ctx.fillRect(this.pos.x, this.pos.y, this.width, this.height); -} -function clearRectangle(pos) { - if (pos) - this.ctx.clearRect(pos.x, pos.y, this.width, this.height); - else - this.ctx.clearRect(this.pos.x, this.pos.y, this.width, this.height); -} -export class RectangleClient extends Rectangle { - constructor(pos, width, height, ctx, color) { - super(pos, width, height); - this.ctx = ctx; - this.color = color; - this.update = updateRectangle; - this.clear = clearRectangle; - } -} -export class MovingRectangleClient extends MovingRectangle { - constructor(pos, width, height, baseSpeed, ctx, color) { - super(pos, width, height, baseSpeed); - this.ctx = ctx; - this.color = color; - this.update = updateRectangle; - this.clear = clearRectangle; - } -} -export class RacketClient extends Racket { - constructor(pos, width, height, baseSpeed, ctx, color) { - super(pos, width, height, baseSpeed); - this.ctx = ctx; - this.color = color; - this.update = updateRectangle; - this.clear = clearRectangle; - } -} -export class BallClient extends Ball { - constructor(pos, size, baseSpeed, speedIncrease, ctx, color) { - super(pos, size, baseSpeed, speedIncrease); - this.ctx = ctx; - this.color = color; - this.update = updateRectangle; - this.clear = clearRectangle; - } - bounce(collider) { - this._bounceAlgo(collider); - soundPongArr[Math.floor(random(0, soundPongArr.length))].play(); - } -} -function updateLine() { - this.ctx.fillStyle = this.color; - let pos = new VectorInteger; - let i = 0; - while (i < this.segmentCount) { - /* Horizontal Line */ - // pos.y = this.pos.y; - // pos.x = this.pos.x + this.segmentWidth * i; - /* Vertical Line */ - pos.x = this.pos.x; - pos.y = this.pos.y + this.segmentHeight * i; - this.ctx.fillRect(pos.x, pos.y, this.segmentWidth, this.segmentHeight); - i += 2; - } -} -export class Line extends RectangleClient { - constructor(pos, width, height, ctx, color, gapeCount) { - super(pos, width, height, ctx, color); - this.gapeCount = 0; - this.update = updateLine; - if (gapeCount) - this.gapeCount = gapeCount; - this.segmentCount = this.gapeCount * 2 + 1; - /* Vertical Line */ - this.segmentWidth = this.width; - this.segmentHeight = this.height / this.segmentCount; - /* Horizontal Line */ - // this.segmentWidth = this.width / this.segmentCount; - // this.segmentHeight = this.height; - } -} diff --git a/jeu/src/client/class/RectangleClient.ts b/jeu/src/client/class/RectangleClient.ts deleted file mode 100644 index 1cc1c4f5..00000000 --- a/jeu/src/client/class/RectangleClient.ts +++ /dev/null @@ -1,129 +0,0 @@ - -import { Vector, VectorInteger } from "../../shared_js/class/Vector.js"; -import { Component, GraphicComponent, Moving } from "../../shared_js/class/interface.js"; -import { Rectangle, MovingRectangle, Racket, Ball } from "../../shared_js/class/Rectangle.js"; -import { soundPongArr } from "../audio.js" -import { random } from "../utils.js"; - -function updateRectangle(this: RectangleClient) { - this.ctx.fillStyle = this.color; - this.ctx.fillRect(this.pos.x, this.pos.y, this.width, this.height); -} - -function clearRectangle(this: RectangleClient, pos?: VectorInteger) { - if (pos) - this.ctx.clearRect(pos.x, pos.y, this.width, this.height); - else - this.ctx.clearRect(this.pos.x, this.pos.y, this.width, this.height); -} - -export class RectangleClient extends Rectangle implements GraphicComponent { - ctx: CanvasRenderingContext2D; - color: string; - update: () => void; - clear: (pos?: VectorInteger) => void; - constructor(pos: VectorInteger, width: number, height: number, - ctx: CanvasRenderingContext2D, color: string) - { - super(pos, width, height); - this.ctx = ctx; - this.color = color; - this.update = updateRectangle; - this.clear = clearRectangle; - } -} - -export class MovingRectangleClient extends MovingRectangle implements GraphicComponent { - ctx: CanvasRenderingContext2D; - color: string; - update: () => void; - clear: (pos?: VectorInteger) => void; - constructor(pos: VectorInteger, width: number, height: number, baseSpeed: number, - ctx: CanvasRenderingContext2D, color: string) - { - super(pos, width, height, baseSpeed); - this.ctx = ctx; - this.color = color; - this.update = updateRectangle; - this.clear = clearRectangle; - } -} - -export class RacketClient extends Racket implements GraphicComponent { - ctx: CanvasRenderingContext2D; - color: string; - update: () => void; - clear: (pos?: VectorInteger) => void; - constructor(pos: VectorInteger, width: number, height: number, baseSpeed: number, - ctx: CanvasRenderingContext2D, color: string) - { - super(pos, width, height, baseSpeed); - this.ctx = ctx; - this.color = color; - this.update = updateRectangle; - this.clear = clearRectangle; - } -} - -export class BallClient extends Ball implements GraphicComponent { - ctx: CanvasRenderingContext2D; - color: string; - update: () => void; - clear: (pos?: VectorInteger) => void; - constructor(pos: VectorInteger, size: number, baseSpeed: number, speedIncrease: number, - ctx: CanvasRenderingContext2D, color: string) - { - super(pos, size, baseSpeed, speedIncrease); - this.ctx = ctx; - this.color = color; - this.update = updateRectangle; - this.clear = clearRectangle; - } - bounce(collider?: Rectangle) { - this._bounceAlgo(collider); - soundPongArr[ Math.floor(random(0, soundPongArr.length)) ].play(); - } -} - -function updateLine(this: Line) { - this.ctx.fillStyle = this.color; - let pos: VectorInteger = new VectorInteger; - let i = 0; - while (i < this.segmentCount) - { - /* Horizontal Line */ - // pos.y = this.pos.y; - // pos.x = this.pos.x + this.segmentWidth * i; - - /* Vertical Line */ - pos.x = this.pos.x; - pos.y = this.pos.y + this.segmentHeight * i; - - this.ctx.fillRect(pos.x, pos.y, this.segmentWidth, this.segmentHeight); - i += 2; - } -} - -export class Line extends RectangleClient { - gapeCount: number = 0; - segmentCount: number; - segmentWidth: number; - segmentHeight: number; - constructor(pos: VectorInteger, width: number, height: number, - ctx: CanvasRenderingContext2D, color: string, gapeCount?: number) - { - super(pos, width, height, ctx, color); - this.update = updateLine; - if (gapeCount) - this.gapeCount = gapeCount; - this.segmentCount = this.gapeCount * 2 + 1; - - /* Vertical Line */ - this.segmentWidth = this.width; - this.segmentHeight = this.height / this.segmentCount; - - /* Horizontal Line */ - // this.segmentWidth = this.width / this.segmentCount; - // this.segmentHeight = this.height; - } -} diff --git a/jeu/src/client/class/Text.js b/jeu/src/client/class/Text.js deleted file mode 100644 index 94370c93..00000000 --- a/jeu/src/client/class/Text.js +++ /dev/null @@ -1,43 +0,0 @@ -import { VectorInteger } from "../../shared_js/class/Vector.js"; -// conflict with Text -export class TextElem { - constructor(pos, size, ctx, color, font = "Bit5x3") { - this.text = ""; - // this.pos = Object.assign({}, pos); // create bug, Uncaught TypeError: X is not a function - this.pos = new VectorInteger(pos.x, pos.y); - this.size = size; - this.ctx = ctx; - this.color = color; - this.font = font; - } - update() { - this.ctx.font = this.size + "px" + " " + this.font; - this.ctx.fillStyle = this.color; - this.ctx.fillText(this.text, this.pos.x, this.pos.y); - } - clear() { - // clear no very accurate for Text - // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics - let textMetric = this.ctx.measureText(this.text); - // console.log("textMetric.width = "+textMetric.width); - // console.log("size = "+this.size); - // console.log("x = "+this.pos.x); - // console.log("y = "+this.pos.y); - this.ctx.clearRect(this.pos.x - 1, this.pos.y - this.size + 1, textMetric.width, this.size); - // +1 and -1 because float imprecision (and Math.floor() with VectorInteger dont work for the moment) - // (or maybe its textMetric imprecision ?) - } -} -export class TextNumericValue extends TextElem { - constructor(pos, size, ctx, color, font) { - super(pos, size, ctx, color, font); - this._value = 0; - } - get value() { - return this._value; - } - set value(v) { - this._value = v; - this.text = v.toString(); - } -} diff --git a/jeu/src/client/class/Text.ts b/jeu/src/client/class/Text.ts deleted file mode 100644 index 11f00ab9..00000000 --- a/jeu/src/client/class/Text.ts +++ /dev/null @@ -1,56 +0,0 @@ - -import { Vector, VectorInteger } from "../../shared_js/class/Vector.js"; -import { Component } from "../../shared_js/class/interface.js"; - -// conflict with Text -export class TextElem implements Component { - ctx: CanvasRenderingContext2D; - pos: VectorInteger; - color: string; - size: number; - font: string; - text: string = ""; - constructor(pos: VectorInteger, size: number, - ctx: CanvasRenderingContext2D, color: string, font: string = "Bit5x3") - { - // this.pos = Object.assign({}, pos); // create bug, Uncaught TypeError: X is not a function - this.pos = new VectorInteger(pos.x, pos.y); - this.size = size; - this.ctx = ctx; - this.color = color; - this.font = font; - } - update() { - this.ctx.font = this.size + "px" + " " + this.font; - this.ctx.fillStyle = this.color; - this.ctx.fillText(this.text, this.pos.x, this.pos.y); - } - clear() { - // clear no very accurate for Text - // https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics - let textMetric = this.ctx.measureText(this.text); - // console.log("textMetric.width = "+textMetric.width); - // console.log("size = "+this.size); - // console.log("x = "+this.pos.x); - // console.log("y = "+this.pos.y); - this.ctx.clearRect(this.pos.x - 1, this.pos.y-this.size + 1, textMetric.width, this.size); - // +1 and -1 because float imprecision (and Math.floor() with VectorInteger dont work for the moment) - // (or maybe its textMetric imprecision ?) - } -} - -export class TextNumericValue extends TextElem { - private _value: number = 0; - constructor(pos: VectorInteger, size: number, - ctx: CanvasRenderingContext2D, color: string, font?: string) - { - super(pos, size, ctx, color, font); - } - get value() { - return this._value; - } - set value(v: number) { - this._value = v; - this.text = v.toString(); - } -} diff --git a/jeu/src/client/constants.js b/jeu/src/client/constants.js deleted file mode 100644 index 33aecc6e..00000000 --- a/jeu/src/client/constants.js +++ /dev/null @@ -1,13 +0,0 @@ -import { w } from "../shared_js/constants.js"; -export * from "../shared_js/constants.js"; -export const midLineSize = Math.floor(w / 150); -export const scoreSize = Math.floor(w / 16); -export const gridSize = Math.floor(w / 500); -// min interval on Firefox seems to be 15. Chrome can go lower. -export const handleInputIntervalMS = 15; // millisecond -export const sendLoopIntervalMS = 15; // millisecond // unused -export const gameLoopIntervalMS = 15; // millisecond -export const drawLoopIntervalMS = 15; // millisecond -export const fixedDeltaTime = gameLoopIntervalMS / 1000; // second -export const soundRobloxVolume = 0.3; // between 0 and 1 -export const soundPongVolume = 0.3; // between 0 and 1 diff --git a/jeu/src/client/constants.ts b/jeu/src/client/constants.ts deleted file mode 100644 index 97bae265..00000000 --- a/jeu/src/client/constants.ts +++ /dev/null @@ -1,18 +0,0 @@ - -import { w } from "../shared_js/constants.js" -export * from "../shared_js/constants.js" - -export const midLineSize = Math.floor(w/150); -export const scoreSize = Math.floor(w/16); -export const gridSize = Math.floor(w/500); - -// min interval on Firefox seems to be 15. Chrome can go lower. -export const handleInputIntervalMS = 15; // millisecond -export const sendLoopIntervalMS = 15; // millisecond // unused -export const gameLoopIntervalMS = 15; // millisecond -export const drawLoopIntervalMS = 15; // millisecond - -export const fixedDeltaTime = gameLoopIntervalMS/1000; // second - -export const soundRobloxVolume = 0.3; // between 0 and 1 -export const soundPongVolume = 0.3; // between 0 and 1 diff --git a/jeu/src/client/draw.js b/jeu/src/client/draw.js deleted file mode 100644 index 93270c04..00000000 --- a/jeu/src/client/draw.js +++ /dev/null @@ -1,35 +0,0 @@ -import { pong, gc } from "./global.js"; -import { gridDisplay } from "./handleInput.js"; -export function drawLoop() { - pong.clear(); - if (gridDisplay) { - drawGrid(); - } - drawStatic(); - gc.text1.update(); - gc.text2.update(); - gc.text3.update(); - drawDynamic(); -} -function drawDynamic() { - gc.scoreLeft.update(); - gc.scoreRight.update(); - gc.playerLeft.update(); - gc.playerRight.update(); - gc.ballsArr.forEach((ball) => { - ball.update(); - }); -} -function drawStatic() { - gc.midLine.update(); - gc.wallTop.update(); - gc.wallBottom.update(); -} -function drawGrid() { - gc.w_grid_mid.update(); - gc.w_grid_u1.update(); - gc.w_grid_d1.update(); - gc.h_grid_mid.update(); - gc.h_grid_u1.update(); - gc.h_grid_d1.update(); -} diff --git a/jeu/src/client/draw.ts b/jeu/src/client/draw.ts deleted file mode 100644 index 204c55f5..00000000 --- a/jeu/src/client/draw.ts +++ /dev/null @@ -1,49 +0,0 @@ - -import { pong, gc } from "./global.js" -import { gridDisplay } from "./handleInput.js"; - -export function drawLoop() -{ - pong.clear(); - - if (gridDisplay) { - drawGrid(); - } - - drawStatic(); - - gc.text1.update(); - gc.text2.update(); - gc.text3.update(); - - drawDynamic(); -} - -function drawDynamic() -{ - gc.scoreLeft.update(); - gc.scoreRight.update(); - gc.playerLeft.update(); - gc.playerRight.update(); - gc.ballsArr.forEach((ball) => { - ball.update(); - }); -} - -function drawStatic() -{ - gc.midLine.update(); - gc.wallTop.update(); - gc.wallBottom.update(); -} - -function drawGrid() -{ - gc.w_grid_mid.update(); - gc.w_grid_u1.update(); - gc.w_grid_d1.update(); - - gc.h_grid_mid.update(); - gc.h_grid_u1.update(); - gc.h_grid_d1.update(); -} diff --git a/jeu/src/client/gameLoop.js b/jeu/src/client/gameLoop.js deleted file mode 100644 index 3a3197fa..00000000 --- a/jeu/src/client/gameLoop.js +++ /dev/null @@ -1,52 +0,0 @@ -import * as c from "./constants.js"; -import * as en from "../shared_js/enums.js"; -import { gc, matchOptions, clientInfo, clientInfoSpectator } from "./global.js"; -import { wallsMovements } from "../shared_js/wallsMovement.js"; -let actual_time = Date.now(); -let last_time; -let delta_time; -export function gameLoop() { - /* last_time = actual_time; - actual_time = Date.now(); - delta_time = (actual_time - last_time) / 1000; */ - delta_time = c.fixedDeltaTime; - // console.log(`delta_gameLoop: ${delta_time}`); - // interpolation - // console.log(`dir.y: ${clientInfo.opponent.dir.y}, pos.y: ${clientInfo.opponent.pos.y}, opponentNextPos.y: ${clientInfo.opponentNextPos.y}`); - if (clientInfo.opponent.dir.y != 0) { - racketInterpolation(delta_time, clientInfo.opponent, clientInfo.opponentNextPos); - } - // client prediction - gc.ballsArr.forEach((ball) => { - ball.moveAndBounce(delta_time, [gc.wallTop, gc.wallBottom, gc.playerLeft, gc.playerRight]); - }); - if (matchOptions & en.MatchOptions.movingWalls) { - wallsMovements(delta_time, gc); - } -} -export function gameLoopSpectator() { - delta_time = c.fixedDeltaTime; - // interpolation - if (gc.playerLeft.dir.y != 0) { - racketInterpolation(delta_time, gc.playerLeft, clientInfoSpectator.playerLeftNextPos); - } - if (gc.playerRight.dir.y != 0) { - racketInterpolation(delta_time, gc.playerRight, clientInfoSpectator.playerRightNextPos); - } - // client prediction - gc.ballsArr.forEach((ball) => { - ball.moveAndBounce(delta_time, [gc.wallTop, gc.wallBottom, gc.playerLeft, gc.playerRight]); - }); - if (matchOptions & en.MatchOptions.movingWalls) { - wallsMovements(delta_time, gc); - } -} -function racketInterpolation(delta, racket, nextPos) { - // interpolation - racket.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); - if ((racket.dir.y > 0 && racket.pos.y > nextPos.y) - || (racket.dir.y < 0 && racket.pos.y < nextPos.y)) { - racket.dir.y = 0; - racket.pos.y = nextPos.y; - } -} diff --git a/jeu/src/client/gameLoop.ts b/jeu/src/client/gameLoop.ts deleted file mode 100644 index 784841c3..00000000 --- a/jeu/src/client/gameLoop.ts +++ /dev/null @@ -1,71 +0,0 @@ - -import * as c from "./constants.js"; -import * as en from "../shared_js/enums.js" -import { gc, matchOptions, clientInfo, clientInfoSpectator} from "./global.js"; -import { wallsMovements } from "../shared_js/wallsMovement.js"; -import { RacketClient } from "./class/RectangleClient.js"; -import { VectorInteger } from "../shared_js/class/Vector.js"; - -let actual_time: number = Date.now(); -let last_time: number; -let delta_time: number; - -export function gameLoop() -{ - /* last_time = actual_time; - actual_time = Date.now(); - delta_time = (actual_time - last_time) / 1000; */ - - delta_time = c.fixedDeltaTime; - // console.log(`delta_gameLoop: ${delta_time}`); - - // interpolation - // console.log(`dir.y: ${clientInfo.opponent.dir.y}, pos.y: ${clientInfo.opponent.pos.y}, opponentNextPos.y: ${clientInfo.opponentNextPos.y}`); - if (clientInfo.opponent.dir.y != 0 ) { - racketInterpolation(delta_time, clientInfo.opponent, clientInfo.opponentNextPos); - } - - // client prediction - gc.ballsArr.forEach((ball) => { - ball.moveAndBounce(delta_time, [gc.wallTop, gc.wallBottom, gc.playerLeft, gc.playerRight]); - }); - - if (matchOptions & en.MatchOptions.movingWalls) { - wallsMovements(delta_time, gc); - } -} - -export function gameLoopSpectator() -{ - delta_time = c.fixedDeltaTime; - - // interpolation - if (gc.playerLeft.dir.y != 0 ) { - racketInterpolation(delta_time, gc.playerLeft, clientInfoSpectator.playerLeftNextPos); - } - if (gc.playerRight.dir.y != 0 ) { - racketInterpolation(delta_time, gc.playerRight, clientInfoSpectator.playerRightNextPos); - } - - // client prediction - gc.ballsArr.forEach((ball) => { - ball.moveAndBounce(delta_time, [gc.wallTop, gc.wallBottom, gc.playerLeft, gc.playerRight]); - }); - - if (matchOptions & en.MatchOptions.movingWalls) { - wallsMovements(delta_time, gc); - } -} - -function racketInterpolation(delta: number, racket: RacketClient, nextPos: VectorInteger) -{ - // interpolation - racket.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); - - if ((racket.dir.y > 0 && racket.pos.y > nextPos.y) - || (racket.dir.y < 0 && racket.pos.y < nextPos.y)) - { - racket.dir.y = 0; - racket.pos.y = nextPos.y; - } -} diff --git a/jeu/src/client/global.js b/jeu/src/client/global.js deleted file mode 100644 index e752c4f5..00000000 --- a/jeu/src/client/global.js +++ /dev/null @@ -1,19 +0,0 @@ -import * as en from "../shared_js/enums.js"; -// export {pong, gc, matchOptions} from "./pong.js" -export { socket, clientInfo, clientInfoSpectator } from "./ws.js"; -export let pong; -export let gc; -export let matchOptions = en.MatchOptions.noOption; -export function initPong(value) { - pong = value; -} -export function initGc(value) { - gc = value; -} -export function initMatchOptions(value) { - matchOptions = value; -} -export let startFunction; -export function initStartFunction(value) { - startFunction = value; -} diff --git a/jeu/src/client/global.ts b/jeu/src/client/global.ts deleted file mode 100644 index c789fca6..00000000 --- a/jeu/src/client/global.ts +++ /dev/null @@ -1,29 +0,0 @@ - -import * as en from "../shared_js/enums.js"; -import { GameArea } from "./class/GameArea.js"; -import { GameComponentsClient } from "./class/GameComponentsClient.js"; - -// export {pong, gc, matchOptions} from "./pong.js" -export {socket, clientInfo, clientInfoSpectator} from "./ws.js" - -export let pong: GameArea; -export let gc: GameComponentsClient; -export let matchOptions: en.MatchOptions = en.MatchOptions.noOption; - -export function initPong(value: GameArea) { - pong = value; -} - -export function initGc(value: GameComponentsClient) { - gc = value; -} - -export function initMatchOptions(value: en.MatchOptions) { - matchOptions = value; -} - -export let startFunction: () => void; - -export function initStartFunction(value: () => void) { - startFunction = value; -} diff --git a/jeu/src/client/handleInput.js b/jeu/src/client/handleInput.js deleted file mode 100644 index 36014674..00000000 --- a/jeu/src/client/handleInput.js +++ /dev/null @@ -1,83 +0,0 @@ -import { pong, gc, socket, clientInfo } from "./global.js"; -import * as ev from "../shared_js/class/Event.js"; -import * as en from "../shared_js/enums.js"; -import { InputHistory } from "./class/InputHistory.js"; -import * as c from "./constants.js"; -export let gridDisplay = false; -let actual_time = Date.now(); -let last_time; -let delta_time; -const inputState = new ev.EventInput(); -const inputHistoryArr = []; -// test -/* export function sendLoop() -{ - socket.send(JSON.stringify(inputState)); -} */ -export function handleInput() { - /* last_time = actual_time; - actual_time = Date.now(); - delta_time = (actual_time - last_time) / 1000; */ - delta_time = c.fixedDeltaTime; - // console.log(`delta_time: ${delta_time}`); - inputState.id = Date.now(); - inputState.input = en.InputEnum.noInput; - const keys = pong.keys; - if (keys.length !== 0) { - if (keys.indexOf("g") != -1) { - gridDisplay = !gridDisplay; - pong.deleteKey("g"); - } - playerMovements(delta_time, keys); - } - socket.send(JSON.stringify(inputState)); - // setTimeout(testInputDelay, 100); - inputHistoryArr.push(new InputHistory(inputState, delta_time)); - // client prediction - if (inputState.input !== en.InputEnum.noInput) { - // TODO: peut-etre le mettre dans game loop ? - // Attention au delta time dans ce cas ! - playerMovePrediction(delta_time, inputState.input); - } -} -function playerMovements(delta, keys) { - if (keys.indexOf("w") !== -1 || keys.indexOf("ArrowUp".toLowerCase()) !== -1) { - if (keys.indexOf("s") === -1 && keys.indexOf("ArrowDown".toLowerCase()) === -1) { - inputState.input = en.InputEnum.up; - } - } - else if (keys.indexOf("s") !== -1 || keys.indexOf("ArrowDown".toLowerCase()) !== -1) { - inputState.input = en.InputEnum.down; - } -} -function testInputDelay() { - socket.send(JSON.stringify(inputState)); -} -function playerMovePrediction(delta, input) { - // client prediction - const racket = clientInfo.racket; - if (input === en.InputEnum.up) { - racket.dir.y = -1; - } - else if (input === en.InputEnum.down) { - racket.dir.y = 1; - } - racket.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); -} -export function repeatInput(lastInputId) { - // server reconciliation - let i = inputHistoryArr.findIndex((value) => { - if (value.id === lastInputId) { - return true; - } - return false; - }); - // console.log(`inputHistory total: ${inputHistoryArr.length}` ); - inputHistoryArr.splice(0, i + 1); - // console.log(`inputHistory left: ${inputHistoryArr.length}` ); - inputHistoryArr.forEach((value) => { - if (value.input !== en.InputEnum.noInput) { - playerMovePrediction(value.deltaTime, value.input); - } - }); -} diff --git a/jeu/src/client/handleInput.ts b/jeu/src/client/handleInput.ts deleted file mode 100644 index 33b956f4..00000000 --- a/jeu/src/client/handleInput.ts +++ /dev/null @@ -1,108 +0,0 @@ - -import { pong, gc, socket, clientInfo } from "./global.js" -import * as ev from "../shared_js/class/Event.js" -import * as en from "../shared_js/enums.js" -import { InputHistory } from "./class/InputHistory.js" -import * as c from "./constants.js"; - -export let gridDisplay = false; - -let actual_time: number = Date.now(); -let last_time: number; -let delta_time: number; - -const inputState: ev.EventInput = new ev.EventInput(); -const inputHistoryArr: InputHistory[] = []; - -// test -/* export function sendLoop() -{ - socket.send(JSON.stringify(inputState)); -} */ - -export function handleInput() -{ - /* last_time = actual_time; - actual_time = Date.now(); - delta_time = (actual_time - last_time) / 1000; */ - - delta_time = c.fixedDeltaTime; - // console.log(`delta_time: ${delta_time}`); - - inputState.id = Date.now(); - inputState.input = en.InputEnum.noInput; - - const keys = pong.keys; - if (keys.length !== 0) - { - if (keys.indexOf("g") != -1) - { - gridDisplay = !gridDisplay; - pong.deleteKey("g"); - } - playerMovements(delta_time, keys); - } - - socket.send(JSON.stringify(inputState)); - // setTimeout(testInputDelay, 100); - inputHistoryArr.push(new InputHistory(inputState, delta_time)); - - // client prediction - if (inputState.input !== en.InputEnum.noInput) { - // TODO: peut-etre le mettre dans game loop ? - // Attention au delta time dans ce cas ! - playerMovePrediction(delta_time, inputState.input); - } -} - -function playerMovements(delta: number, keys: string[]) -{ - if (keys.indexOf("w") !== -1 || keys.indexOf("ArrowUp".toLowerCase()) !== -1) - { - if (keys.indexOf("s") === -1 && keys.indexOf("ArrowDown".toLowerCase()) === -1) { - inputState.input = en.InputEnum.up; - } - } - else if (keys.indexOf("s") !== -1 || keys.indexOf("ArrowDown".toLowerCase()) !== -1) { - inputState.input = en.InputEnum.down; - } -} - -function testInputDelay() { - socket.send(JSON.stringify(inputState)); -} - - -function playerMovePrediction(delta: number, input: en.InputEnum) -{ - // client prediction - const racket = clientInfo.racket; - if (input === en.InputEnum.up) { - racket.dir.y = -1; - } - else if (input === en.InputEnum.down) { - racket.dir.y = 1; - } - racket.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); -} - -export function repeatInput(lastInputId: number) -{ - // server reconciliation - let i = inputHistoryArr.findIndex((value: InputHistory) => { - if (value.id === lastInputId) { - return true; - } - return false; - }); - - // console.log(`inputHistory total: ${inputHistoryArr.length}` ); - inputHistoryArr.splice(0, i+1); - // console.log(`inputHistory left: ${inputHistoryArr.length}` ); - - inputHistoryArr.forEach((value: InputHistory) => { - if (value.input !== en.InputEnum.noInput) { - playerMovePrediction(value.deltaTime, value.input); - } - }); -} diff --git a/jeu/src/client/message.js b/jeu/src/client/message.js deleted file mode 100644 index 2a73b9ee..00000000 --- a/jeu/src/client/message.js +++ /dev/null @@ -1,65 +0,0 @@ -import * as c from "./constants.js"; -import { gc } from "./global.js"; -import * as en from "../shared_js/enums.js"; -/* - before game -*/ -export function matchmaking() { - const text = "searching..."; - console.log(text); - gc.text1.clear(); - gc.text1.pos.assign(c.w * 0.2, c.h * 0.5); - gc.text1.text = text; - gc.text1.update(); -} -export function matchmakingComplete() { - const text = "match found !"; - console.log(text); - gc.text1.clear(); - gc.text1.pos.assign(c.w * 0.15, c.h * 0.5); - gc.text1.text = text; - gc.text1.update(); -} -export function matchAbort() { - const text = "match abort"; - console.log(text); - gc.text1.clear(); - gc.text1.pos.assign(c.w * 0.15, c.h * 0.5); - gc.text1.text = text; - gc.text1.update(); - setTimeout(() => { - gc.text2.pos.assign(c.w * 0.44, c.h * 0.6); - gc.text2.text = "pardon =("; - const oriSize = gc.text2.size; - gc.text2.size = c.w * 0.025; - gc.text2.update(); - gc.text2.size = oriSize; - }, 2500); -} -/* - in game -*/ -export function win() { - gc.text1.pos.assign(c.w * 0.415, c.h * 0.5); - gc.text1.text = "WIN"; -} -export function lose() { - gc.text1.pos.assign(c.w * 0.383, c.h * 0.5); - gc.text1.text = "LOSE"; -} -export function forfeit(playerSide) { - if (playerSide === en.PlayerSide.left) { - gc.text2.pos.assign(c.w * 0.65, c.h * 0.42); - gc.text3.pos.assign(c.w * 0.65, c.h * 0.52); - } - else { - gc.text2.pos.assign(c.w * 0.09, c.h * 0.42); - gc.text3.pos.assign(c.w * 0.09, c.h * 0.52); - } - setTimeout(() => { - gc.text2.text = "par forfait"; - }, 1500); - setTimeout(() => { - gc.text3.text = "calme ta joie"; - }, 3500); -} diff --git a/jeu/src/client/message.ts b/jeu/src/client/message.ts deleted file mode 100644 index 5c1cdc15..00000000 --- a/jeu/src/client/message.ts +++ /dev/null @@ -1,80 +0,0 @@ - -import * as c from "./constants.js" -import { gc } from "./global.js" -import * as en from "../shared_js/enums.js" - -/* - before game -*/ -export function matchmaking() -{ - const text = "searching..."; - console.log(text); - gc.text1.clear(); - gc.text1.pos.assign(c.w*0.2, c.h*0.5); - gc.text1.text = text; - gc.text1.update(); -} - -export function matchmakingComplete() -{ - const text = "match found !"; - console.log(text); - gc.text1.clear(); - gc.text1.pos.assign(c.w*0.15, c.h*0.5); - gc.text1.text = text; - gc.text1.update(); -} - -export function matchAbort() -{ - const text = "match abort"; - console.log(text); - gc.text1.clear(); - gc.text1.pos.assign(c.w*0.15, c.h*0.5); - gc.text1.text = text; - gc.text1.update(); - - setTimeout(() => { - gc.text2.pos.assign(c.w*0.44, c.h*0.6); - gc.text2.text = "pardon =("; - const oriSize = gc.text2.size; - gc.text2.size = c.w*0.025; - gc.text2.update(); - gc.text2.size = oriSize; - }, 2500); -} - - -/* - in game -*/ -export function win() -{ - gc.text1.pos.assign(c.w*0.415, c.h*0.5); - gc.text1.text = "WIN"; -} - -export function lose() -{ - gc.text1.pos.assign(c.w*0.383, c.h*0.5); - gc.text1.text = "LOSE"; -} - -export function forfeit(playerSide: en.PlayerSide) -{ - if (playerSide === en.PlayerSide.left) { - gc.text2.pos.assign(c.w*0.65, c.h*0.42); - gc.text3.pos.assign(c.w*0.65, c.h*0.52); - } - else { - gc.text2.pos.assign(c.w*0.09, c.h*0.42); - gc.text3.pos.assign(c.w*0.09, c.h*0.52); - } - setTimeout(() => { - gc.text2.text = "par forfait"; - }, 1500); - setTimeout(() => { - gc.text3.text = "calme ta joie"; - }, 3500); -} diff --git a/jeu/src/client/pong.css b/jeu/src/client/pong.css deleted file mode 100644 index 39368218..00000000 --- a/jeu/src/client/pong.css +++ /dev/null @@ -1,54 +0,0 @@ - -@font-face { - font-family: "Bit5x3"; - src: url("http://localhost:8080/Bit5x3.woff2") format("woff2"), - url("http://localhost:8080/Bit5x3.woff") format("woff"); - font-weight: normal; - font-style: normal; - font-display: swap; -} -body { - margin: 0; - background-color: #222425; -} -#canvas_container { - margin-top: 20px; - text-align: center; - /* border: dashed rgb(245, 245, 245) 5px; */ - /* max-height: 80vh; */ - /* overflow: hidden; */ -} -#div_game_instructions { - text-align: center; - font-family: "Bit5x3"; - color: rgb(245, 245, 245); - font-size: large; -} -#div_game_options { - margin-top: 20px; - text-align: center; - font-family: "Bit5x3"; - color: rgb(245, 245, 245); - font-size: x-large; -} -#div_game_options fieldset { - max-width: 50vw; - width: auto; - margin: 0 auto; -} -#div_game_options fieldset div { - padding: 10px; -} -#play_pong_button { - font-family: "Bit5x3"; - color: rgb(245, 245, 245); - background-color: #333333; - font-size: x-large; - padding: 10px; -} -canvas { - background-color: #333333; - max-width: 75vw; - /* max-height: 100vh; */ - width: 80%; -} diff --git a/jeu/src/client/pong.html b/jeu/src/client/pong.html deleted file mode 100644 index 30f2e781..00000000 --- a/jeu/src/client/pong.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - -
-
- game options -
- - -
-
- - -
-
- - - - - -
-
- -
-
-
- -
-

--- keys ---

-

move up: 'w' or 'up arrow'

-

move down: 's' OR 'down arrow'

-

grid on/off: 'g'

-
- -
- -
- - - - - diff --git a/jeu/src/client/pong.js b/jeu/src/client/pong.js deleted file mode 100644 index b9754ddd..00000000 --- a/jeu/src/client/pong.js +++ /dev/null @@ -1,63 +0,0 @@ -initDom(); -function initDom() { - document.getElementById("play_pong_button").addEventListener("click", init); -} -import * as c from "./constants.js"; -import * as en from "../shared_js/enums.js"; -import { GameArea } from "./class/GameArea.js"; -import { GameComponentsClient } from "./class/GameComponentsClient.js"; -import { handleInput } from "./handleInput.js"; -// import { sendLoop } from "./handleInput.js"; -import { gameLoop } from "./gameLoop.js"; -import { drawLoop } from "./draw.js"; -import { countdown } from "./utils.js"; -import { initWebSocket } from "./ws.js"; -import { initAudio } from "./audio.js"; -/* TODO: A way to delay the init of variables, but still use "const" not "let" ? */ -import { pong, gc } from "./global.js"; -import { initPong, initGc, initMatchOptions, initStartFunction } from "./global.js"; -function init() { - console.log("multi_balls:" + document.getElementById("multi_balls").checked); - console.log("moving_walls:" + document.getElementById("moving_walls").checked); - console.log("sound_on:" + document.getElementById("sound_on").checked); - let soundMutedFlag = false; - if (document.getElementById("sound_off").checked) { - soundMutedFlag = true; - } - initAudio(soundMutedFlag); - let matchOptions = en.MatchOptions.noOption; - if (document.getElementById("multi_balls").checked) { - matchOptions |= en.MatchOptions.multiBalls; - } - if (document.getElementById("moving_walls").checked) { - matchOptions |= en.MatchOptions.movingWalls; - } - initMatchOptions(matchOptions); - document.getElementById("div_game_options").remove(); - document.getElementById("div_game_instructions").remove(); - initPong(new GameArea()); - initGc(new GameComponentsClient(matchOptions, pong.ctx)); - initStartFunction(start); - initWebSocket(matchOptions); -} -function start() { - gc.text1.pos.assign(c.w * 0.5, c.h * 0.75); - countdown(c.matchStartDelay / 1000, (count) => { - gc.text1.clear(); - gc.text1.text = `${count}`; - gc.text1.update(); - }, resume); -} -function resume() { - gc.text1.text = ""; - window.addEventListener('keydown', function (e) { - pong.addKey(e.key); - }); - window.addEventListener('keyup', function (e) { - pong.deleteKey(e.key); - }); - pong.handleInputInterval = window.setInterval(handleInput, c.handleInputIntervalMS); - // pong.handleInputInterval = window.setInterval(sendLoop, c.sendLoopIntervalMS); - pong.gameLoopInterval = window.setInterval(gameLoop, c.gameLoopIntervalMS); - pong.drawLoopInterval = window.setInterval(drawLoop, c.drawLoopIntervalMS); -} diff --git a/jeu/src/client/pong.ts b/jeu/src/client/pong.ts deleted file mode 100644 index 07363807..00000000 --- a/jeu/src/client/pong.ts +++ /dev/null @@ -1,78 +0,0 @@ - -initDom(); -function initDom() { - document.getElementById("play_pong_button").addEventListener("click", init); -} - -import * as c from "./constants.js" -import * as en from "../shared_js/enums.js" -import { GameArea } from "./class/GameArea.js"; -import { GameComponentsClient } from "./class/GameComponentsClient.js"; -import { handleInput } from "./handleInput.js"; -// import { sendLoop } from "./handleInput.js"; -import { gameLoop } from "./gameLoop.js" -import { drawLoop } from "./draw.js"; -import { countdown } from "./utils.js"; -import { initWebSocket } from "./ws.js"; -import { initAudio } from "./audio.js"; - - -/* TODO: A way to delay the init of variables, but still use "const" not "let" ? */ -import { pong, gc } from "./global.js" -import { initPong, initGc, initMatchOptions, initStartFunction } from "./global.js" - - -function init() -{ - console.log("multi_balls:"+(document.getElementById("multi_balls")).checked); - console.log("moving_walls:"+(document.getElementById("moving_walls")).checked); - console.log("sound_on:"+(document.getElementById("sound_on")).checked); - - let soundMutedFlag = false; - if ( (document.getElementById("sound_off")).checked ) { - soundMutedFlag = true; - } - initAudio(soundMutedFlag); - - let matchOptions: en.MatchOptions = en.MatchOptions.noOption; - if ( (document.getElementById("multi_balls")).checked ) { - matchOptions |= en.MatchOptions.multiBalls; - } - if ( (document.getElementById("moving_walls")).checked ) { - matchOptions |= en.MatchOptions.movingWalls; - } - initMatchOptions(matchOptions); - - document.getElementById("div_game_options").remove(); - document.getElementById("div_game_instructions").remove(); - - initPong(new GameArea()); - initGc(new GameComponentsClient(matchOptions, pong.ctx)); - initStartFunction(start); - initWebSocket(matchOptions); -} - -function start() -{ - gc.text1.pos.assign(c.w*0.5, c.h*0.75); - countdown(c.matchStartDelay/1000, (count: number) => { - gc.text1.clear(); - gc.text1.text = `${count}`; - gc.text1.update(); - }, resume); -} - -function resume() -{ - gc.text1.text = ""; - window.addEventListener('keydown', function (e) { - pong.addKey(e.key); - }); - window.addEventListener('keyup', function (e) { - pong.deleteKey(e.key); - }); - pong.handleInputInterval = window.setInterval(handleInput, c.handleInputIntervalMS); - // pong.handleInputInterval = window.setInterval(sendLoop, c.sendLoopIntervalMS); - pong.gameLoopInterval = window.setInterval(gameLoop, c.gameLoopIntervalMS); - pong.drawLoopInterval = window.setInterval(drawLoop, c.drawLoopIntervalMS); -} diff --git a/jeu/src/client/pongSpectator.html b/jeu/src/client/pongSpectator.html deleted file mode 100644 index f0357cb6..00000000 --- a/jeu/src/client/pongSpectator.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - -
- -
-
-

Spectator View

-
- - - - - diff --git a/jeu/src/client/pongSpectator.js b/jeu/src/client/pongSpectator.js deleted file mode 100644 index b54a05c9..00000000 --- a/jeu/src/client/pongSpectator.js +++ /dev/null @@ -1,33 +0,0 @@ -initSpectator(); -function initSpectator() { - // Wip - init(); -} -import * as c from "./constants.js"; -import * as en from "../shared_js/enums.js"; -import { GameArea } from "./class/GameArea.js"; -import { GameComponentsClient } from "./class/GameComponentsClient.js"; -import { gameLoopSpectator } from "./gameLoop.js"; -import { drawLoop } from "./draw.js"; -import { initWebSocketSpectator } from "./ws.js"; -import { initAudio } from "./audio.js"; -/* TODO: A way to delay the init of variables, but still use "const" not "let" ? */ -import { pong } from "./global.js"; -import { initPong, initGc, initMatchOptions, initStartFunction } from "./global.js"; -function init() { - initAudio(false); - // WIP matchOptions - let matchOptions = en.MatchOptions.noOption; - initMatchOptions(matchOptions); - initPong(new GameArea()); - initGc(new GameComponentsClient(matchOptions, pong.ctx)); - initStartFunction(start); - initWebSocketSpectator(c.gameSessionIdPLACEHOLDER); -} -function start() { - resume(); -} -function resume() { - pong.gameLoopInterval = window.setInterval(gameLoopSpectator, c.gameLoopIntervalMS); - pong.drawLoopInterval = window.setInterval(drawLoop, c.drawLoopIntervalMS); -} diff --git a/jeu/src/client/pongSpectator.ts b/jeu/src/client/pongSpectator.ts deleted file mode 100644 index 4efb9a19..00000000 --- a/jeu/src/client/pongSpectator.ts +++ /dev/null @@ -1,46 +0,0 @@ - -initSpectator(); -function initSpectator() { - // Wip - init(); -} - -import * as c from "./constants.js" -import * as en from "../shared_js/enums.js" -import { GameArea } from "./class/GameArea.js"; -import { GameComponentsClient } from "./class/GameComponentsClient.js"; -import { gameLoopSpectator } from "./gameLoop.js" -import { drawLoop } from "./draw.js"; -import { initWebSocketSpectator } from "./ws.js"; -import { initAudio } from "./audio.js"; - - -/* TODO: A way to delay the init of variables, but still use "const" not "let" ? */ -import { pong, gc } from "./global.js" -import { initPong, initGc, initMatchOptions, initStartFunction } from "./global.js" - -function init() -{ - initAudio(false); - - // WIP matchOptions - let matchOptions: en.MatchOptions = en.MatchOptions.noOption; - initMatchOptions(matchOptions); - - - initPong(new GameArea()); - initGc(new GameComponentsClient(matchOptions, pong.ctx)); - initStartFunction(start); - initWebSocketSpectator(c.gameSessionIdPLACEHOLDER); -} - -function start() -{ - resume(); -} - -function resume() -{ - pong.gameLoopInterval = window.setInterval(gameLoopSpectator, c.gameLoopIntervalMS); - pong.drawLoopInterval = window.setInterval(drawLoop, c.drawLoopIntervalMS); -} diff --git a/jeu/src/client/utils.js b/jeu/src/client/utils.js deleted file mode 100644 index b4214463..00000000 --- a/jeu/src/client/utils.js +++ /dev/null @@ -1,13 +0,0 @@ -export * from "../shared_js/utils.js"; -export function countdown(count, callback, endCallback) { - console.log("countdown ", count); - if (count > 0) { - if (callback) { - callback(count); - } - setTimeout(countdown, 1000, --count, callback, endCallback); - } - else if (endCallback) { - endCallback(); - } -} diff --git a/jeu/src/client/utils.ts b/jeu/src/client/utils.ts deleted file mode 100644 index ff45234d..00000000 --- a/jeu/src/client/utils.ts +++ /dev/null @@ -1,16 +0,0 @@ - -export * from "../shared_js/utils.js" - -export function countdown(count: number, callback?: (count: number) => void, endCallback?: () => void) -{ - console.log("countdown ", count); - if (count > 0) { - if (callback) { - callback(count); - } - setTimeout(countdown, 1000, --count, callback, endCallback); - } - else if (endCallback) { - endCallback(); - } -} diff --git a/jeu/src/client/ws.js b/jeu/src/client/ws.js deleted file mode 100644 index 21990bae..00000000 --- a/jeu/src/client/ws.js +++ /dev/null @@ -1,230 +0,0 @@ -import { gc, matchOptions, startFunction } from "./global.js"; -import * as ev from "../shared_js/class/Event.js"; -import * as en from "../shared_js/enums.js"; -import * as msg from "./message.js"; -import { repeatInput } from "./handleInput.js"; -import { soundRoblox } from "./audio.js"; -import { Vector, VectorInteger } from "../shared_js/class/Vector.js"; -class ClientInfo { - constructor() { - this.id = ""; - } -} -class ClientInfoSpectator { -} -const wsPort = 8042; -const wsUrl = "ws://" + document.location.hostname + ":" + wsPort + "/pong"; -export let socket; /* TODO: A way to still use "const" not "let" ? */ -export const clientInfo = new ClientInfo(); -export const clientInfoSpectator = new ClientInfoSpectator(); // WIP, could refactor this -export function initWebSocket(options) { - socket = new WebSocket(wsUrl, "json"); - socket.addEventListener("open", (event) => { - socket.send(JSON.stringify(new ev.ClientAnnouncePlayer(options, clientInfo.id))); - }); - // socket.addEventListener("message", logListener); // for testing purpose - socket.addEventListener("message", preMatchListener); -} -function logListener(event) { - console.log("%i: " + event.data, Date.now()); -} -function preMatchListener(event) { - const data = JSON.parse(event.data); - switch (data.type) { - case en.EventTypes.assignId: - clientInfo.id = data.id; - break; - case en.EventTypes.matchmakingInProgress: - msg.matchmaking(); - break; - case en.EventTypes.matchmakingComplete: - clientInfo.side = data.side; - if (clientInfo.side === en.PlayerSide.left) { - clientInfo.racket = gc.playerLeft; - clientInfo.opponent = gc.playerRight; - } - else if (clientInfo.side === en.PlayerSide.right) { - clientInfo.racket = gc.playerRight; - clientInfo.opponent = gc.playerLeft; - } - clientInfo.opponentNextPos = new VectorInteger(clientInfo.opponent.pos.x, clientInfo.opponent.pos.y); - clientInfo.racket.color = "darkgreen"; // for testing purpose - socket.send(JSON.stringify(new ev.ClientEvent(en.EventTypes.clientPlayerReady))); // TODO: set an interval/timeout to resend until matchStart response (in case of network problem) - msg.matchmakingComplete(); - break; - case en.EventTypes.matchStart: - socket.removeEventListener("message", preMatchListener); - socket.addEventListener("message", inGameListener); - startFunction(); - break; - case en.EventTypes.matchAbort: - socket.removeEventListener("message", preMatchListener); - msg.matchAbort(); - break; - } -} -function inGameListener(event) { - const data = JSON.parse(event.data); - switch (data.type) { - case en.EventTypes.gameUpdate: - // setTimeout(gameUpdate, 500, data as ev.EventGameUpdate); // artificial latency for testing purpose - gameUpdate(data); - break; - case en.EventTypes.scoreUpdate: - scoreUpdate(data); - break; - case en.EventTypes.matchEnd: - matchEnd(data); - break; - } -} -function gameUpdate(data) { - console.log("gameUpdate"); - if (matchOptions & en.MatchOptions.movingWalls) { - gc.wallTop.pos.y = data.wallTop.y; - gc.wallBottom.pos.y = data.wallBottom.y; - } - data.ballsArr.forEach((ball, i) => { - gc.ballsArr[i].pos.assign(ball.x, ball.y); - gc.ballsArr[i].dir.assign(ball.dirX, ball.dirY); - gc.ballsArr[i].speed = ball.speed; - }); - /* // Equivalent to - gc.ballsArr.forEach((ball, i) => { - ball.pos.assign(data.ballsArr[i].x, data.ballsArr[i].y); - ball.dir.assign(data.ballsArr[i].dirX, data.ballsArr[i].dirY); - ball.speed = data.ballsArr[i].speed; - }); */ - const predictionPos = new VectorInteger(clientInfo.racket.pos.x, clientInfo.racket.pos.y); // debug - if (clientInfo.side === en.PlayerSide.left) { - clientInfo.racket.pos.assign(clientInfo.racket.pos.x, data.playerLeft.y); - } - else if (clientInfo.side === en.PlayerSide.right) { - clientInfo.racket.pos.assign(clientInfo.racket.pos.x, data.playerRight.y); - } - // interpolation - clientInfo.opponent.pos.assign(clientInfo.opponentNextPos.x, clientInfo.opponentNextPos.y); - if (clientInfo.side === en.PlayerSide.left) { - clientInfo.opponentNextPos.assign(clientInfo.opponent.pos.x, data.playerRight.y); - } - else if (clientInfo.side === en.PlayerSide.right) { - clientInfo.opponentNextPos.assign(clientInfo.opponent.pos.x, data.playerLeft.y); - } - clientInfo.opponent.dir = new Vector(clientInfo.opponentNextPos.x - clientInfo.opponent.pos.x, clientInfo.opponentNextPos.y - clientInfo.opponent.pos.y); - if (Math.abs(clientInfo.opponent.dir.x) + Math.abs(clientInfo.opponent.dir.y) !== 0) { - clientInfo.opponent.dir = clientInfo.opponent.dir.normalized(); - } - // server reconciliation - repeatInput(data.lastInputId); - // debug - if (clientInfo.racket.pos.y > predictionPos.y + 1 - || clientInfo.racket.pos.y < predictionPos.y - 1) { - console.log(`Reconciliation error: - server y: ${data.playerLeft.y} - reconciliation y: ${clientInfo.racket.pos.y} - prediction y: ${predictionPos.y}`); - } -} -function scoreUpdate(data) { - // console.log("scoreUpdate"); - if (clientInfo.side === en.PlayerSide.left && data.scoreRight > gc.scoreRight.value) { - soundRoblox.play(); - } - else if (clientInfo.side === en.PlayerSide.right && data.scoreLeft > gc.scoreLeft.value) { - soundRoblox.play(); - } - gc.scoreLeft.value = data.scoreLeft; - gc.scoreRight.value = data.scoreRight; -} -function matchEnd(data) { - if (data.winner === clientInfo.side) { - msg.win(); - if (data.forfeit) { - msg.forfeit(clientInfo.side); - } - } - else { - msg.lose(); - } - // matchEnded = true; // unused -} -// export let matchEnded = false; // unused -/* Spectator */ -export function initWebSocketSpectator(gameSessionId) { - socket = new WebSocket(wsUrl, "json"); - socket.addEventListener("open", (event) => { - socket.send(JSON.stringify(new ev.ClientAnnounceSpectator(gameSessionId))); - }); - // socket.addEventListener("message", logListener); // for testing purpose - socket.addEventListener("message", preMatchListenerSpectator); - clientInfoSpectator.playerLeftNextPos = new VectorInteger(gc.playerLeft.pos.x, gc.playerLeft.pos.y); - clientInfoSpectator.playerRightNextPos = new VectorInteger(gc.playerRight.pos.x, gc.playerRight.pos.y); -} -export function preMatchListenerSpectator(event) { - const data = JSON.parse(event.data); - if (data.type === en.EventTypes.matchStart) { - socket.removeEventListener("message", preMatchListenerSpectator); - socket.addEventListener("message", inGameListenerSpectator); - startFunction(); - } -} -function inGameListenerSpectator(event) { - const data = JSON.parse(event.data); - switch (data.type) { - case en.EventTypes.gameUpdate: - gameUpdateSpectator(data); - break; - case en.EventTypes.scoreUpdate: - scoreUpdateSpectator(data); - break; - case en.EventTypes.matchEnd: - matchEndSpectator(data); - break; - } -} -function gameUpdateSpectator(data) { - console.log("gameUpdateSpectator"); - if (matchOptions & en.MatchOptions.movingWalls) { - gc.wallTop.pos.y = data.wallTop.y; - gc.wallBottom.pos.y = data.wallBottom.y; - } - data.ballsArr.forEach((ball, i) => { - gc.ballsArr[i].pos.assign(ball.x, ball.y); - gc.ballsArr[i].dir.assign(ball.dirX, ball.dirY); - gc.ballsArr[i].speed = ball.speed; - }); - // interpolation - for (const racket of [gc.playerLeft, gc.playerRight]) { - let nextPos; - if (racket === gc.playerLeft) { - nextPos = clientInfoSpectator.playerLeftNextPos; - } - else { - nextPos = clientInfoSpectator.playerRightNextPos; - } - racket.pos.assign(nextPos.x, nextPos.y); - if (racket === gc.playerLeft) { - nextPos.assign(racket.pos.x, data.playerLeft.y); - } - else { - nextPos.assign(racket.pos.x, data.playerRight.y); - } - racket.dir = new Vector(nextPos.x - racket.pos.x, nextPos.y - racket.pos.y); - if (Math.abs(racket.dir.x) + Math.abs(racket.dir.y) !== 0) { - racket.dir = racket.dir.normalized(); - } - } -} -function scoreUpdateSpectator(data) { - console.log("scoreUpdateSpectator"); - gc.scoreLeft.value = data.scoreLeft; - gc.scoreRight.value = data.scoreRight; -} -function matchEndSpectator(data) { - console.log("matchEndSpectator"); - // WIP - /* msg.win(); - if (data.forfeit) { - msg.forfeit(clientInfo.side); - } */ -} diff --git a/jeu/src/client/ws.ts b/jeu/src/client/ws.ts deleted file mode 100644 index aa901cc0..00000000 --- a/jeu/src/client/ws.ts +++ /dev/null @@ -1,302 +0,0 @@ - -import * as c from "./constants.js" -import { gc, matchOptions, startFunction } from "./global.js" -import * as ev from "../shared_js/class/Event.js" -import * as en from "../shared_js/enums.js" -import * as msg from "./message.js"; -import { RacketClient } from "./class/RectangleClient.js"; -import { repeatInput } from "./handleInput.js"; -import { soundRoblox } from "./audio.js" -import { sleep } from "./utils.js"; -import { Vector, VectorInteger } from "../shared_js/class/Vector.js"; - -class ClientInfo { - id = ""; - side: en.PlayerSide; - racket: RacketClient; - opponent: RacketClient; - opponentNextPos: VectorInteger; -} - -class ClientInfoSpectator { - // side: en.PlayerSide; - /* WIP: playerLeftNextPos and playerRightNextPos could be in clientInfo for simplicity */ - playerLeftNextPos: VectorInteger; - playerRightNextPos: VectorInteger; -} - -const wsPort = 8042; -const wsUrl = "ws://" + document.location.hostname + ":" + wsPort + "/pong"; -export let socket: WebSocket; /* TODO: A way to still use "const" not "let" ? */ -export const clientInfo = new ClientInfo(); -export const clientInfoSpectator = new ClientInfoSpectator(); // WIP, could refactor this - -export function initWebSocket(options: en.MatchOptions) -{ - socket = new WebSocket(wsUrl, "json"); - socket.addEventListener("open", (event) => { - socket.send(JSON.stringify( new ev.ClientAnnouncePlayer(options, clientInfo.id) )); - }); - // socket.addEventListener("message", logListener); // for testing purpose - socket.addEventListener("message", preMatchListener); -} - -function logListener(this: WebSocket, event: MessageEvent) { - console.log("%i: " + event.data, Date.now()); -} - -function preMatchListener(this: WebSocket, event: MessageEvent) -{ - const data: ev.ServerEvent = JSON.parse(event.data); - switch (data.type) { - case en.EventTypes.assignId: - clientInfo.id = (data).id; - break; - case en.EventTypes.matchmakingInProgress: - msg.matchmaking(); - break; - case en.EventTypes.matchmakingComplete: - clientInfo.side = (data).side; - if (clientInfo.side === en.PlayerSide.left) - { - clientInfo.racket = gc.playerLeft; - clientInfo.opponent = gc.playerRight; - } - else if (clientInfo.side === en.PlayerSide.right) - { - clientInfo.racket = gc.playerRight; - clientInfo.opponent = gc.playerLeft; - } - clientInfo.opponentNextPos = new VectorInteger(clientInfo.opponent.pos.x, clientInfo.opponent.pos.y); - clientInfo.racket.color = "darkgreen"; // for testing purpose - socket.send(JSON.stringify( new ev.ClientEvent(en.EventTypes.clientPlayerReady) )); // TODO: set an interval/timeout to resend until matchStart response (in case of network problem) - msg.matchmakingComplete(); - break; - case en.EventTypes.matchStart: - socket.removeEventListener("message", preMatchListener); - socket.addEventListener("message", inGameListener); - startFunction(); - break; - case en.EventTypes.matchAbort: - socket.removeEventListener("message", preMatchListener); - msg.matchAbort(); - break; - } -} - -function inGameListener(this: WebSocket, event: MessageEvent) -{ - const data: ev.ServerEvent = JSON.parse(event.data); - switch (data.type) { - case en.EventTypes.gameUpdate: - // setTimeout(gameUpdate, 500, data as ev.EventGameUpdate); // artificial latency for testing purpose - gameUpdate(data as ev.EventGameUpdate); - break; - case en.EventTypes.scoreUpdate: - scoreUpdate(data as ev.EventScoreUpdate); - break; - case en.EventTypes.matchEnd: - matchEnd(data as ev.EventMatchEnd); - break; - } -} - -function gameUpdate(data: ev.EventGameUpdate) -{ - console.log("gameUpdate"); - - if (matchOptions & en.MatchOptions.movingWalls) { - gc.wallTop.pos.y = data.wallTop.y; - gc.wallBottom.pos.y = data.wallBottom.y; - } - - data.ballsArr.forEach((ball, i) => { - gc.ballsArr[i].pos.assign(ball.x, ball.y); - gc.ballsArr[i].dir.assign(ball.dirX, ball.dirY); - gc.ballsArr[i].speed = ball.speed; - }); - /* // Equivalent to - gc.ballsArr.forEach((ball, i) => { - ball.pos.assign(data.ballsArr[i].x, data.ballsArr[i].y); - ball.dir.assign(data.ballsArr[i].dirX, data.ballsArr[i].dirY); - ball.speed = data.ballsArr[i].speed; - }); */ - - const predictionPos = new VectorInteger(clientInfo.racket.pos.x, clientInfo.racket.pos.y); // debug - - if (clientInfo.side === en.PlayerSide.left) { - clientInfo.racket.pos.assign(clientInfo.racket.pos.x, data.playerLeft.y); - } - else if (clientInfo.side === en.PlayerSide.right) { - clientInfo.racket.pos.assign(clientInfo.racket.pos.x, data.playerRight.y); - } - - // interpolation - clientInfo.opponent.pos.assign(clientInfo.opponentNextPos.x, clientInfo.opponentNextPos.y); - if (clientInfo.side === en.PlayerSide.left) { - clientInfo.opponentNextPos.assign(clientInfo.opponent.pos.x, data.playerRight.y); - } - else if (clientInfo.side === en.PlayerSide.right) { - clientInfo.opponentNextPos.assign(clientInfo.opponent.pos.x, data.playerLeft.y); - } - - clientInfo.opponent.dir = new Vector( - clientInfo.opponentNextPos.x - clientInfo.opponent.pos.x, - clientInfo.opponentNextPos.y - clientInfo.opponent.pos.y - ); - - if (Math.abs(clientInfo.opponent.dir.x) + Math.abs(clientInfo.opponent.dir.y) !== 0) { - clientInfo.opponent.dir = clientInfo.opponent.dir.normalized(); - } - - // server reconciliation - repeatInput(data.lastInputId); - - // debug - if (clientInfo.racket.pos.y > predictionPos.y + 1 - || clientInfo.racket.pos.y < predictionPos.y - 1) - { - console.log( - `Reconciliation error: - server y: ${data.playerLeft.y} - reconciliation y: ${clientInfo.racket.pos.y} - prediction y: ${predictionPos.y}` - ); - } -} - -function scoreUpdate(data: ev.EventScoreUpdate) -{ - // console.log("scoreUpdate"); - if (clientInfo.side === en.PlayerSide.left && data.scoreRight > gc.scoreRight.value) { - soundRoblox.play(); - } - else if (clientInfo.side === en.PlayerSide.right && data.scoreLeft > gc.scoreLeft.value) { - soundRoblox.play(); - } - gc.scoreLeft.value = data.scoreLeft; - gc.scoreRight.value = data.scoreRight; -} - -function matchEnd(data: ev.EventMatchEnd) -{ - if (data.winner === clientInfo.side) { - msg.win(); - if (data.forfeit) { - msg.forfeit(clientInfo.side); - } - } - else { - msg.lose(); - } - // matchEnded = true; // unused -} - -// export let matchEnded = false; // unused - - - -/* Spectator */ - -export function initWebSocketSpectator(gameSessionId: string) -{ - socket = new WebSocket(wsUrl, "json"); - socket.addEventListener("open", (event) => { - socket.send(JSON.stringify( new ev.ClientAnnounceSpectator(gameSessionId) )); - }); - // socket.addEventListener("message", logListener); // for testing purpose - socket.addEventListener("message", preMatchListenerSpectator); - - clientInfoSpectator.playerLeftNextPos = new VectorInteger(gc.playerLeft.pos.x, gc.playerLeft.pos.y); - clientInfoSpectator.playerRightNextPos = new VectorInteger(gc.playerRight.pos.x, gc.playerRight.pos.y); - -} - -export function preMatchListenerSpectator(this: WebSocket, event: MessageEvent) -{ - const data: ev.ServerEvent = JSON.parse(event.data); - if (data.type === en.EventTypes.matchStart) - { - socket.removeEventListener("message", preMatchListenerSpectator); - socket.addEventListener("message", inGameListenerSpectator); - startFunction(); - } -} - -function inGameListenerSpectator(this: WebSocket, event: MessageEvent) -{ - const data: ev.ServerEvent = JSON.parse(event.data); - switch (data.type) { - case en.EventTypes.gameUpdate: - gameUpdateSpectator(data as ev.EventGameUpdate); - break; - case en.EventTypes.scoreUpdate: - scoreUpdateSpectator(data as ev.EventScoreUpdate); - break; - case en.EventTypes.matchEnd: - matchEndSpectator(data as ev.EventMatchEnd); - break; - } -} - -function gameUpdateSpectator(data: ev.EventGameUpdate) -{ - console.log("gameUpdateSpectator"); - - if (matchOptions & en.MatchOptions.movingWalls) { - gc.wallTop.pos.y = data.wallTop.y; - gc.wallBottom.pos.y = data.wallBottom.y; - } - - data.ballsArr.forEach((ball, i) => { - gc.ballsArr[i].pos.assign(ball.x, ball.y); - gc.ballsArr[i].dir.assign(ball.dirX, ball.dirY); - gc.ballsArr[i].speed = ball.speed; - }); - - // interpolation - for (const racket of [gc.playerLeft, gc.playerRight]) - { - let nextPos: VectorInteger; - if (racket === gc.playerLeft) { - nextPos = clientInfoSpectator.playerLeftNextPos; - } - else { - nextPos = clientInfoSpectator.playerRightNextPos; - } - - racket.pos.assign(nextPos.x, nextPos.y); - if (racket === gc.playerLeft) { - nextPos.assign(racket.pos.x, data.playerLeft.y); - } - else { - nextPos.assign(racket.pos.x, data.playerRight.y); - } - - racket.dir = new Vector( - nextPos.x - racket.pos.x, - nextPos.y - racket.pos.y - ); - - if (Math.abs(racket.dir.x) + Math.abs(racket.dir.y) !== 0) { - racket.dir = racket.dir.normalized(); - } - } -} - -function scoreUpdateSpectator(data: ev.EventScoreUpdate) -{ - console.log("scoreUpdateSpectator"); - gc.scoreLeft.value = data.scoreLeft; - gc.scoreRight.value = data.scoreRight; -} - -function matchEndSpectator(data: ev.EventMatchEnd) -{ - console.log("matchEndSpectator"); - // WIP - /* msg.win(); - if (data.forfeit) { - msg.forfeit(clientInfo.side); - } */ -} diff --git a/jeu/src/server/class/Client.js b/jeu/src/server/class/Client.js deleted file mode 100644 index 0b2aee48..00000000 --- a/jeu/src/server/class/Client.js +++ /dev/null @@ -1,23 +0,0 @@ -import * as ev from "../../shared_js/class/Event.js"; -export class Client { - constructor(socket, id) { - this.isAlive = true; - this.gameSession = null; - this.socket = socket; - this.id = id; - } -} -export class ClientPlayer extends Client { - constructor(socket, id, racket) { - super(socket, id); - this.matchOptions = 0; - this.inputBuffer = new ev.EventInput(); - this.lastInputId = 0; - this.racket = racket; - } -} -export class ClientSpectator extends Client { - constructor(socket, id) { - super(socket, id); - } -} diff --git a/jeu/src/server/class/Client.ts b/jeu/src/server/class/Client.ts deleted file mode 100644 index c6e4defa..00000000 --- a/jeu/src/server/class/Client.ts +++ /dev/null @@ -1,34 +0,0 @@ - -import { WebSocket } from "../wsServer.js"; -import { Racket } from "../../shared_js/class/Rectangle.js"; -import { GameSession } from "./GameSession.js"; -import * as ev from "../../shared_js/class/Event.js" -import * as en from "../../shared_js/enums.js" - -export class Client { - socket: WebSocket; - id: string; // same as "socket.id" - isAlive: boolean = true; - gameSession: GameSession = null; - constructor(socket: WebSocket, id: string) { - this.socket = socket; - this.id = id; - } -} - -export class ClientPlayer extends Client { - matchOptions: en.MatchOptions = 0; - inputBuffer: ev.EventInput = new ev.EventInput(); - lastInputId: number = 0; - racket: Racket; - constructor(socket: WebSocket, id: string, racket: Racket) { - super(socket, id); - this.racket = racket; - } -} - -export class ClientSpectator extends Client { - constructor(socket: WebSocket, id: string) { - super(socket, id); - } -} diff --git a/jeu/src/server/class/GameComponentsServer.js b/jeu/src/server/class/GameComponentsServer.js deleted file mode 100644 index e76cc052..00000000 --- a/jeu/src/server/class/GameComponentsServer.js +++ /dev/null @@ -1,8 +0,0 @@ -import { GameComponents } from "../../shared_js/class/GameComponents.js"; -export class GameComponentsServer extends GameComponents { - constructor(options) { - super(options); - this.scoreLeft = 0; - this.scoreRight = 0; - } -} diff --git a/jeu/src/server/class/GameComponentsServer.ts b/jeu/src/server/class/GameComponentsServer.ts deleted file mode 100644 index 691a3991..00000000 --- a/jeu/src/server/class/GameComponentsServer.ts +++ /dev/null @@ -1,12 +0,0 @@ - -import * as en from "../../shared_js/enums.js" -import { GameComponents } from "../../shared_js/class/GameComponents.js"; - -export class GameComponentsServer extends GameComponents { - scoreLeft: number = 0; - scoreRight: number = 0; - constructor(options: en.MatchOptions) - { - super(options); - } -} diff --git a/jeu/src/server/class/GameSession.js b/jeu/src/server/class/GameSession.js deleted file mode 100644 index 091c7057..00000000 --- a/jeu/src/server/class/GameSession.js +++ /dev/null @@ -1,212 +0,0 @@ -import * as en from "../../shared_js/enums.js"; -import * as ev from "../../shared_js/class/Event.js"; -import * as c from "../constants.js"; -import { GameComponentsServer } from "./GameComponentsServer.js"; -import { clientInputListener } from "../wsServer.js"; -import { random } from "../utils.js"; -import { wallsMovements } from "../../shared_js/wallsMovement.js"; -/* - multiples methods of GameSession have parameter "s: GameSession". - its used with calls to setTimeout(), - because "this" is not equal to the GameSession but to "this: Timeout" -*/ -export class GameSession { - constructor(id, matchOptions) { - this.playersMap = new Map(); - this.unreadyPlayersMap = new Map(); - this.spectatorsMap = new Map(); - this.gameLoopInterval = 0; - this.playersUpdateInterval = 0; - this.spectatorsUpdateInterval = 0; - this.matchEnded = false; - this.id = id; - this.matchOptions = matchOptions; - this.components = new GameComponentsServer(this.matchOptions); - } - start() { - const gc = this.components; - setTimeout(this.resume, c.matchStartDelay, this); - let timeout = c.matchStartDelay + c.newRoundDelay; - gc.ballsArr.forEach((ball) => { - setTimeout(this._newRound, timeout, this, ball); - timeout += c.newRoundDelay * 0.5; - }); - } - resume(s) { - s.playersMap.forEach((client) => { - client.socket.on("message", clientInputListener); - }); - s.actual_time = Date.now(); - s.gameLoopInterval = setInterval(s._gameLoop, c.serverGameLoopIntervalMS, s); - s.playersUpdateInterval = setInterval(s._playersUpdate, c.playersUpdateIntervalMS, s); - s.spectatorsUpdateInterval = setInterval(s._spectatorsUpdate, c.spectatorsUpdateIntervalMS, s); - } - pause(s) { - s.playersMap.forEach((client) => { - client.socket.off("message", clientInputListener); - }); - clearInterval(s.gameLoopInterval); - clearInterval(s.playersUpdateInterval); - clearInterval(s.spectatorsUpdateInterval); - } - instantInputDebug(client) { - this._handleInput(c.fixedDeltaTime, client); - } - _handleInput(delta, client) { - // if (client.inputBuffer === null) {return;} - const gc = this.components; - const input = client.inputBuffer.input; - if (input === en.InputEnum.up) { - client.racket.dir.y = -1; - } - else if (input === en.InputEnum.down) { - client.racket.dir.y = 1; - } - if (input !== en.InputEnum.noInput) { - client.racket.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); - } - client.lastInputId = client.inputBuffer.id; - // client.inputBuffer = null; - } - _gameLoop(s) { - /* s.last_time = s.actual_time; - s.actual_time = Date.now(); - s.delta_time = (s.actual_time - s.last_time) / 1000; */ - s.delta_time = c.fixedDeltaTime; - // WIP, replaced by instantInputDebug() to prevent desynchro - /* s.playersMap.forEach( (client) => { - s._handleInput(s.delta_time, client); - }); */ - const gc = s.components; - gc.ballsArr.forEach((ball) => { - s._ballMovement(s.delta_time, ball); - }); - if (s.matchOptions & en.MatchOptions.movingWalls) { - wallsMovements(s.delta_time, gc); - } - } - _ballMovement(delta, ball) { - const gc = this.components; - if (ball.ballInPlay) { - ball.moveAndBounce(delta, [gc.wallTop, gc.wallBottom, gc.playerLeft, gc.playerRight]); - if (ball.pos.x > c.w - || ball.pos.x < 0 - ball.width) { - ball.ballInPlay = false; - if (this.matchEnded) { - return; - } - this._scoreUpdate(ball); - setTimeout(this._newRound, c.newRoundDelay, this, ball); - } - } - } - _scoreUpdate(ball) { - const gc = this.components; - if (ball.pos.x > c.w) { - ++gc.scoreLeft; - } - else if (ball.pos.x < 0 - ball.width) { - ++gc.scoreRight; - } - this.playersMap.forEach((client) => { - client.socket.send(JSON.stringify(new ev.EventScoreUpdate(gc.scoreLeft, gc.scoreRight))); - }); - this.spectatorsMap.forEach((client) => { - client.socket.send(JSON.stringify(new ev.EventScoreUpdate(gc.scoreLeft, gc.scoreRight))); - }); - } - _playersUpdate(s) { - const gameState = s._gameStateSnapshot(); - s.playersMap.forEach((client) => { - gameState.lastInputId = client.lastInputId; - client.socket.send(JSON.stringify(gameState)); - }); - } - _spectatorsUpdate(s) { - const gameState = s._gameStateSnapshot(); - s.spectatorsMap.forEach((client) => { - client.socket.send(JSON.stringify(gameState)); - }); - } - _gameStateSnapshot() { - const gc = this.components; - const snapshot = new ev.EventGameUpdate(); - snapshot.playerLeft.y = gc.playerLeft.pos.y; - snapshot.playerRight.y = gc.playerRight.pos.y; - gc.ballsArr.forEach((ball) => { - snapshot.ballsArr.push({ - x: ball.pos.x, - y: ball.pos.y, - dirX: ball.dir.x, - dirY: ball.dir.y, - speed: ball.speed - }); - }); - if (this.matchOptions & en.MatchOptions.movingWalls) { - snapshot.wallTop.y = gc.wallTop.pos.y; - snapshot.wallBottom.y = gc.wallBottom.pos.y; - } - return (snapshot); - } - _newRound(s, ball) { - if (s._checkDisconnexions()) { - return; - } - // https://fr.wikipedia.org/wiki/Tennis_de_table#Nombre_de_manches - const gc = s.components; - const minScore = 11; // can be changed for testing - if (gc.scoreLeft >= minScore || gc.scoreRight >= minScore) { - if (Math.abs(gc.scoreLeft - gc.scoreRight) >= 2) { - s._matchEnd(s); - return; - } - } - ball.pos.x = c.w_mid; - ball.pos.y = random(c.h * 0.3, c.h * 0.7); - ball.speed = ball.baseSpeed; - ball.ballInPlay = true; - } - _checkDisconnexions() { - if (this.playersMap.size !== 2) { - this.matchEnded = true; - if (this.playersMap.size != 0) { - const gc = this.components; - const luckyWinner = this.playersMap.values().next().value; - let eventEnd; - if (luckyWinner.racket === gc.playerLeft) { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.left, true); - console.log("Player Left WIN (by forfeit)"); - } - else { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.right, true); - console.log("Player Right WIN (by forfeit)"); - } - luckyWinner.socket.send(JSON.stringify(eventEnd)); - this.spectatorsMap.forEach((client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); - } - return true; - } - return false; - } - _matchEnd(s) { - s.matchEnded = true; - const gc = s.components; - let eventEnd; - if (gc.scoreLeft > gc.scoreRight) { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.left); - console.log("Player Left WIN"); - } - else { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.right); - console.log("Player Right WIN"); - } - s.playersMap.forEach((client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); - s.spectatorsMap.forEach((client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); - } -} diff --git a/jeu/src/server/class/GameSession.ts b/jeu/src/server/class/GameSession.ts deleted file mode 100644 index 55879135..00000000 --- a/jeu/src/server/class/GameSession.ts +++ /dev/null @@ -1,241 +0,0 @@ - -import * as en from "../../shared_js/enums.js" -import * as ev from "../../shared_js/class/Event.js" -import * as c from "../constants.js" -import { ClientPlayer, ClientSpectator } from "./Client"; -import { GameComponentsServer } from "./GameComponentsServer.js"; -import { clientInputListener } from "../wsServer.js"; -import { random } from "../utils.js"; -import { Ball } from "../../shared_js/class/Rectangle.js"; -import { wallsMovements } from "../../shared_js/wallsMovement.js"; - -/* - multiples methods of GameSession have parameter "s: GameSession". - its used with calls to setTimeout(), - because "this" is not equal to the GameSession but to "this: Timeout" -*/ -export class GameSession { - id: string; // url ? - playersMap: Map = new Map(); - unreadyPlayersMap: Map = new Map(); - spectatorsMap: Map = new Map(); - gameLoopInterval: NodeJS.Timer | number = 0; - playersUpdateInterval: NodeJS.Timer | number = 0; - spectatorsUpdateInterval: NodeJS.Timer | number = 0; - components: GameComponentsServer; - matchOptions: en.MatchOptions; - matchEnded: boolean = false; - - actual_time: number; - last_time: number; - delta_time: number; - - constructor(id: string, matchOptions: en.MatchOptions) { - this.id = id; - this.matchOptions = matchOptions; - this.components = new GameComponentsServer(this.matchOptions); - } - start() { - const gc = this.components; - setTimeout(this.resume, c.matchStartDelay, this); - - let timeout = c.matchStartDelay + c.newRoundDelay; - gc.ballsArr.forEach((ball) => { - setTimeout(this._newRound, timeout, this, ball); - timeout += c.newRoundDelay*0.5; - }); - } - resume(s: GameSession) { - s.playersMap.forEach( (client) => { - client.socket.on("message", clientInputListener); - }); - - s.actual_time = Date.now(); - s.gameLoopInterval = setInterval(s._gameLoop, c.serverGameLoopIntervalMS, s); - s.playersUpdateInterval = setInterval(s._playersUpdate, c.playersUpdateIntervalMS, s); - s.spectatorsUpdateInterval = setInterval(s._spectatorsUpdate, c.spectatorsUpdateIntervalMS, s); - } - pause(s: GameSession) { - s.playersMap.forEach( (client) => { - client.socket.off("message", clientInputListener); - }); - - clearInterval(s.gameLoopInterval); - clearInterval(s.playersUpdateInterval); - clearInterval(s.spectatorsUpdateInterval); - } - instantInputDebug(client: ClientPlayer) { - this._handleInput(c.fixedDeltaTime, client); - } - private _handleInput(delta: number, client: ClientPlayer) { - // if (client.inputBuffer === null) {return;} - const gc = this.components; - const input = client.inputBuffer.input; - - if (input === en.InputEnum.up) { - client.racket.dir.y = -1; - } - else if (input === en.InputEnum.down) { - client.racket.dir.y = 1; - } - - if (input !== en.InputEnum.noInput) { - client.racket.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); - } - - client.lastInputId = client.inputBuffer.id; - // client.inputBuffer = null; - } - private _gameLoop(s: GameSession) { - /* s.last_time = s.actual_time; - s.actual_time = Date.now(); - s.delta_time = (s.actual_time - s.last_time) / 1000; */ - s.delta_time = c.fixedDeltaTime; - - // WIP, replaced by instantInputDebug() to prevent desynchro - /* s.playersMap.forEach( (client) => { - s._handleInput(s.delta_time, client); - }); */ - - const gc = s.components; - gc.ballsArr.forEach((ball) => { - s._ballMovement(s.delta_time, ball); - }); - - if (s.matchOptions & en.MatchOptions.movingWalls) { - wallsMovements(s.delta_time, gc); - } - } - private _ballMovement(delta: number, ball: Ball) { - const gc = this.components; - if (ball.ballInPlay) - { - ball.moveAndBounce(delta, [gc.wallTop, gc.wallBottom, gc.playerLeft, gc.playerRight]); - if (ball.pos.x > c.w - || ball.pos.x < 0 - ball.width) - { - ball.ballInPlay = false; - if (this.matchEnded) { - return; - } - this._scoreUpdate(ball); - setTimeout(this._newRound, c.newRoundDelay, this, ball); - } - } - } - private _scoreUpdate(ball: Ball) { - const gc = this.components; - if (ball.pos.x > c.w) { - ++gc.scoreLeft; - } - else if (ball.pos.x < 0 - ball.width) { - ++gc.scoreRight; - } - this.playersMap.forEach( (client) => { - client.socket.send(JSON.stringify(new ev.EventScoreUpdate(gc.scoreLeft, gc.scoreRight))); - }); - this.spectatorsMap.forEach( (client) => { - client.socket.send(JSON.stringify(new ev.EventScoreUpdate(gc.scoreLeft, gc.scoreRight))); - }); - } - private _playersUpdate(s: GameSession) { - const gameState: ev.EventGameUpdate = s._gameStateSnapshot(); - s.playersMap.forEach( (client) => { - gameState.lastInputId = client.lastInputId; - client.socket.send(JSON.stringify(gameState)); - }); - } - private _spectatorsUpdate(s: GameSession) { - const gameState = s._gameStateSnapshot(); - s.spectatorsMap.forEach( (client) => { - client.socket.send(JSON.stringify(gameState)); - }); - } - private _gameStateSnapshot() : ev.EventGameUpdate { - const gc = this.components; - const snapshot = new ev.EventGameUpdate(); - snapshot.playerLeft.y = gc.playerLeft.pos.y; - snapshot.playerRight.y = gc.playerRight.pos.y; - gc.ballsArr.forEach((ball) => { - snapshot.ballsArr.push({ - x: ball.pos.x, - y: ball.pos.y, - dirX: ball.dir.x, - dirY: ball.dir.y, - speed: ball.speed - }); - }); - if (this.matchOptions & en.MatchOptions.movingWalls) { - snapshot.wallTop.y = gc.wallTop.pos.y; - snapshot.wallBottom.y = gc.wallBottom.pos.y; - } - return (snapshot); - } - private _newRound(s: GameSession, ball: Ball) { - if (s._checkDisconnexions()) { - return; - } - // https://fr.wikipedia.org/wiki/Tennis_de_table#Nombre_de_manches - const gc = s.components; - const minScore = 11;// can be changed for testing - if (gc.scoreLeft >= minScore || gc.scoreRight >= minScore) - { - if (Math.abs(gc.scoreLeft - gc.scoreRight) >= 2) - { - s._matchEnd(s); - return; - } - } - ball.pos.x = c.w_mid; - ball.pos.y = random(c.h*0.3, c.h*0.7); - ball.speed = ball.baseSpeed; - ball.ballInPlay = true; - } - private _checkDisconnexions() { - if (this.playersMap.size !== 2) - { - this.matchEnded = true; - if (this.playersMap.size != 0) - { - const gc = this.components; - const luckyWinner: ClientPlayer = this.playersMap.values().next().value; - let eventEnd: ev.EventMatchEnd; - if (luckyWinner.racket === gc.playerLeft) { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.left, true); - console.log("Player Left WIN (by forfeit)"); - } - else { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.right, true); - console.log("Player Right WIN (by forfeit)"); - } - luckyWinner.socket.send(JSON.stringify(eventEnd)); - this.spectatorsMap.forEach( (client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); - } - return true; - } - return false; - } - private _matchEnd(s: GameSession) { - s.matchEnded = true; - const gc = s.components; - - let eventEnd: ev.EventMatchEnd; - if (gc.scoreLeft > gc.scoreRight) { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.left); - console.log("Player Left WIN"); - } - else { - eventEnd = new ev.EventMatchEnd(en.PlayerSide.right); - console.log("Player Right WIN"); - } - - s.playersMap.forEach( (client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); - s.spectatorsMap.forEach( (client) => { - client.socket.send(JSON.stringify(eventEnd)); - }); - } -} diff --git a/jeu/src/server/constants.js b/jeu/src/server/constants.js deleted file mode 100644 index 167853fb..00000000 --- a/jeu/src/server/constants.js +++ /dev/null @@ -1,7 +0,0 @@ -export * from "../shared_js/constants.js"; -// 15ms == 1000/66.666 -export const serverGameLoopIntervalMS = 15; // millisecond -export const fixedDeltaTime = serverGameLoopIntervalMS / 1000; // second -// 33.333ms == 1000/30 -export const playersUpdateIntervalMS = 1000 / 30; // millisecond -export const spectatorsUpdateIntervalMS = 1000 / 30; // millisecond diff --git a/jeu/src/server/constants.ts b/jeu/src/server/constants.ts deleted file mode 100644 index b7efffd3..00000000 --- a/jeu/src/server/constants.ts +++ /dev/null @@ -1,10 +0,0 @@ - -export * from "../shared_js/constants.js" - -// 15ms == 1000/66.666 -export const serverGameLoopIntervalMS = 15; // millisecond -export const fixedDeltaTime = serverGameLoopIntervalMS/1000; // second - -// 33.333ms == 1000/30 -export const playersUpdateIntervalMS = 1000/30; // millisecond -export const spectatorsUpdateIntervalMS = 1000/30; // millisecond diff --git a/jeu/src/server/server.js b/jeu/src/server/server.js deleted file mode 100644 index 3fda1562..00000000 --- a/jeu/src/server/server.js +++ /dev/null @@ -1,37 +0,0 @@ -import http from "http"; -import url from "url"; -import fs from "fs"; -import path from "path"; -import { wsServer } from "./wsServer.js"; -wsServer; // no-op, just for loading -const hostname = "localhost"; -const port = 8080; -const root = "../../www/"; -const server = http.createServer((req, res) => { - // let q = new URL(req.url, `http://${req.getHeaders().host}`) - let q = url.parse(req.url, true); - let filename = root + q.pathname; - fs.readFile(filename, (err, data) => { - if (err) { - res.writeHead(404, { "Content-Type": "text/html" }); - return res.end("404 Not Found"); - } - if (path.extname(filename) === ".html") { - res.writeHead(200, { "Content-Type": "text/html" }); - } - else if (path.extname(filename) === ".js") { - res.writeHead(200, { "Content-Type": "application/javascript" }); - } - else if (path.extname(filename) === ".mp3") { - res.writeHead(200, { "Content-Type": "audio/mpeg" }); - } - else if (path.extname(filename) === ".ogg") { - res.writeHead(200, { "Content-Type": "audio/ogg" }); - } - res.write(data); - return res.end(); - }); -}); -server.listen(port, hostname, () => { - console.log(`Pong running at http://${hostname}:${port}/pong.html`); -}); diff --git a/jeu/src/server/server.ts b/jeu/src/server/server.ts deleted file mode 100644 index 20801d7f..00000000 --- a/jeu/src/server/server.ts +++ /dev/null @@ -1,41 +0,0 @@ - -import http from "http"; -import url from "url"; -import fs from "fs"; -import path from "path"; - -import {wsServer} from "./wsServer.js"; wsServer; // no-op, just for loading - -const hostname = "localhost"; -const port = 8080; -const root = "../../www/"; - -const server = http.createServer((req, res) => { - // let q = new URL(req.url, `http://${req.getHeaders().host}`) - let q = url.parse(req.url, true); - let filename = root + q.pathname; - fs.readFile(filename, (err, data) => { - if (err) { - res.writeHead(404, {"Content-Type": "text/html"}); - return res.end("404 Not Found"); - } - if (path.extname(filename) === ".html") { - res.writeHead(200, {"Content-Type": "text/html"}); - } - else if (path.extname(filename) === ".js") { - res.writeHead(200, {"Content-Type": "application/javascript"}); - } - else if (path.extname(filename) === ".mp3") { - res.writeHead(200, {"Content-Type": "audio/mpeg"}); - } - else if (path.extname(filename) === ".ogg") { - res.writeHead(200, {"Content-Type": "audio/ogg"}); - } - res.write(data); - return res.end(); - }); -}); - -server.listen(port, hostname, () => { - console.log(`Pong running at http://${hostname}:${port}/pong.html`); -}); diff --git a/jeu/src/server/utils.js b/jeu/src/server/utils.js deleted file mode 100644 index 02071305..00000000 --- a/jeu/src/server/utils.js +++ /dev/null @@ -1,4 +0,0 @@ -export * from "../shared_js/utils.js"; -export function shortId(id) { - return id.substring(0, id.indexOf("-")); -} diff --git a/jeu/src/server/utils.ts b/jeu/src/server/utils.ts deleted file mode 100644 index 3cd0a4a5..00000000 --- a/jeu/src/server/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ - -export * from "../shared_js/utils.js" - -export function shortId(id: string): string { - return id.substring(0, id.indexOf("-")); -} diff --git a/jeu/src/server/wsServer.js b/jeu/src/server/wsServer.js deleted file mode 100644 index 6273e540..00000000 --- a/jeu/src/server/wsServer.js +++ /dev/null @@ -1,208 +0,0 @@ -import { WebSocketServer, WebSocket as BaseLibWebSocket } from "ws"; -export class WebSocket extends BaseLibWebSocket { -} -import { v4 as uuidv4 } from 'uuid'; -import * as en from "../shared_js/enums.js"; -import * as ev from "../shared_js/class/Event.js"; -import { Client } from "./class/Client.js"; -import { GameSession } from "./class/GameSession.js"; -import { shortId } from "./utils.js"; -// pas indispensable d'avoir un autre port si le WebSocket est relié à un serveur http préexistant ? -const wsPort = 8042; -export const wsServer = new WebSocketServer({ port: wsPort, path: "/pong" }); -const clientsMap = new Map; // socket.id/Client -const matchmakingPlayersMap = new Map; // socket.id/ClientPlayer (duplicates with clientsMap) -const gameSessionsMap = new Map; // GameSession.id(url)/GameSession -wsServer.on("connection", connectionListener); -wsServer.on("error", errorListener); -wsServer.on("close", closeListener); -function connectionListener(socket, request) { - const id = uuidv4(); - const client = new Client(socket, id); - clientsMap.set(id, client); - socket.id = id; - socket.on("pong", function heartbeat() { - client.isAlive = true; - // console.log(`client ${shortId(client.id)} is alive`); - }); - socket.on("message", function log(data) { - try { - const event = JSON.parse(data); - if (event.type === en.EventTypes.clientInput) { - return; - } - } - catch (e) { } - console.log("data: " + data); - }); - socket.once("message", clientAnnounceListener); -} -function clientAnnounceListener(data) { - try { - const msg = JSON.parse(data); - if (msg.type === en.EventTypes.clientAnnounce) { - // TODO: reconnection with msg.clientId ? - // "/pong" to play, "/pong?ID_OF_A_GAMESESSION" to spectate (or something like that) - if (msg.role === en.ClientRole.player) { - const announce = msg; - const player = clientsMap.get(this.id); - player.matchOptions = announce.matchOptions; - this.send(JSON.stringify(new ev.EventAssignId(this.id))); - this.send(JSON.stringify(new ev.ServerEvent(en.EventTypes.matchmakingInProgress))); - matchmaking(player); - } - else if (msg.role === en.ClientRole.spectator) { - const announce = msg; - const gameSession = gameSessionsMap.get(announce.gameSessionId); - if (!gameSession) { - // WIP: send "invalid game session" - return; - } - const spectator = clientsMap.get(this.id); - spectator.gameSession = gameSession; - gameSession.spectatorsMap.set(spectator.id, spectator); - this.send(JSON.stringify(new ev.ServerEvent(en.EventTypes.matchStart))); - } - } - else { - console.log("Invalid ClientAnnounce"); - } - return; - } - catch (e) { - console.log("Invalid JSON (clientAnnounceListener)"); - } - this.once("message", clientAnnounceListener); -} -function matchmaking(player) { - const minPlayersNumber = 2; - const maxPlayersNumber = 2; - const matchOptions = player.matchOptions; - matchmakingPlayersMap.set(player.id, player); - const compatiblePlayers = []; - for (const [id, client] of matchmakingPlayersMap) { - if (client.matchOptions === matchOptions) { - compatiblePlayers.push(client); - if (compatiblePlayers.length === maxPlayersNumber) { - break; - } - } - } - if (compatiblePlayers.length < minPlayersNumber) { - return; - } - // const id = gameSessionIdPLACEHOLDER; // Force ID, TESTING SPECTATOR - const id = uuidv4(); - const gameSession = new GameSession(id, matchOptions); - gameSessionsMap.set(id, gameSession); - compatiblePlayers.forEach((client) => { - matchmakingPlayersMap.delete(client.id); - client.gameSession = gameSession; - gameSession.playersMap.set(client.id, client); - gameSession.unreadyPlayersMap.set(client.id, client); - }); - // WIP: Not pretty, hardcoded two players. - // Could be done in gameSession maybe ? - compatiblePlayers[0].racket = gameSession.components.playerRight; - compatiblePlayers[1].racket = gameSession.components.playerLeft; - compatiblePlayers.forEach((client) => { - client.socket.once("message", playerReadyConfirmationListener); - }); - compatiblePlayers[0].socket.send(JSON.stringify(new ev.EventMatchmakingComplete(en.PlayerSide.right))); - compatiblePlayers[1].socket.send(JSON.stringify(new ev.EventMatchmakingComplete(en.PlayerSide.left))); - setTimeout(function abortMatch() { - if (gameSession.unreadyPlayersMap.size !== 0) { - gameSessionsMap.delete(gameSession.id); - gameSession.playersMap.forEach((client) => { - client.socket.send(JSON.stringify(new ev.ServerEvent(en.EventTypes.matchAbort))); - client.gameSession = null; - clientTerminate(client); - }); - } - }, 5000); -} -function playerReadyConfirmationListener(data) { - try { - const msg = JSON.parse(data); - if (msg.type === en.EventTypes.clientPlayerReady) { - const client = clientsMap.get(this.id); - const gameSession = client.gameSession; - gameSession.unreadyPlayersMap.delete(this.id); - if (gameSession.unreadyPlayersMap.size === 0) { - gameSession.playersMap.forEach((client) => { - client.socket.send(JSON.stringify(new ev.ServerEvent(en.EventTypes.matchStart))); - }); - gameSession.start(); - } - } - else { - console.log("Invalid playerReadyConfirmation"); - } - return; - } - catch (e) { - console.log("Invalid JSON (playerReadyConfirmationListener)"); - } - this.once("message", playerReadyConfirmationListener); -} -export function clientInputListener(data) { - try { - // const input: ev.ClientEvent = JSON.parse(data); - const input = JSON.parse(data); - if (input.type === en.EventTypes.clientInput) { - const client = clientsMap.get(this.id); - client.inputBuffer = input; - client.gameSession.instantInputDebug(client); // wip - } - else { - console.log("Invalid clientInput"); - } - } - catch (e) { - console.log("Invalid JSON (clientInputListener)"); - } -} -//////////// -//////////// -const pingInterval = setInterval(() => { - let deleteLog = ""; - clientsMap.forEach((client) => { - if (!client.isAlive) { - clientTerminate(client); - deleteLog += ` ${shortId(client.id)} |`; - } - else { - client.isAlive = false; - client.socket.ping(); - } - }); - if (deleteLog) { - console.log(`Disconnected:${deleteLog}`); - } - console.log("gameSessionMap size: " + gameSessionsMap.size); - console.log("clientsMap size: " + clientsMap.size); - console.log("matchmakingPlayersMap size: " + matchmakingPlayersMap.size); - console.log(""); -}, 4200); -function clientTerminate(client) { - client.socket.terminate(); - if (client.gameSession) { - client.gameSession.playersMap.delete(client.id); - if (client.gameSession.playersMap.size === 0) { - clearInterval(client.gameSession.playersUpdateInterval); - clearInterval(client.gameSession.spectatorsUpdateInterval); - clearInterval(client.gameSession.gameLoopInterval); - gameSessionsMap.delete(client.gameSession.id); - } - } - clientsMap.delete(client.id); - if (matchmakingPlayersMap.has(client.id)) { - matchmakingPlayersMap.delete(client.id); - } -} -function closeListener() { - clearInterval(pingInterval); -} -function errorListener(error) { - console.log("Error: " + JSON.stringify(error)); -} diff --git a/jeu/src/server/wsServer.ts b/jeu/src/server/wsServer.ts deleted file mode 100644 index 7a7e9e77..00000000 --- a/jeu/src/server/wsServer.ts +++ /dev/null @@ -1,266 +0,0 @@ - -import { WebSocketServer, WebSocket as BaseLibWebSocket } from "ws"; - -export class WebSocket extends BaseLibWebSocket { - id?: string; -} - -import { IncomingMessage } from "http"; -import { v4 as uuidv4 } from 'uuid'; - -import * as en from "../shared_js/enums.js" -import * as ev from "../shared_js/class/Event.js" -import { Client, ClientPlayer, ClientSpectator } from "./class/Client.js" -import { GameSession } from "./class/GameSession.js" -import { shortId } from "./utils.js"; -import { gameSessionIdPLACEHOLDER } from "./constants.js"; - -// pas indispensable d'avoir un autre port si le WebSocket est relié à un serveur http préexistant ? -const wsPort = 8042; -export const wsServer = new WebSocketServer({port: wsPort, path: "/pong"}); - -const clientsMap: Map = new Map; // socket.id/Client -const matchmakingPlayersMap: Map = new Map; // socket.id/ClientPlayer (duplicates with clientsMap) -const gameSessionsMap: Map = new Map; // GameSession.id(url)/GameSession - -wsServer.on("connection", connectionListener); -wsServer.on("error", errorListener); -wsServer.on("close", closeListener); - - -function connectionListener(socket: WebSocket, request: IncomingMessage) -{ - const id = uuidv4(); - const client = new Client(socket, id); - clientsMap.set(id, client); - socket.id = id; - - socket.on("pong", function heartbeat() { - client.isAlive = true; - // console.log(`client ${shortId(client.id)} is alive`); - }); - - socket.on("message", function log(data: string) { - try { - const event: ev.ClientEvent = JSON.parse(data); - if (event.type === en.EventTypes.clientInput) { - return; - } - } - catch (e) {} - console.log("data: " + data); - }); - - socket.once("message", clientAnnounceListener); -} - - -function clientAnnounceListener(this: WebSocket, data: string) -{ - try { - const msg : ev.ClientAnnounce = JSON.parse(data); - if (msg.type === en.EventTypes.clientAnnounce) - { - // TODO: reconnection with msg.clientId ? - // "/pong" to play, "/pong?ID_OF_A_GAMESESSION" to spectate (or something like that) - if (msg.role === en.ClientRole.player) - { - const announce: ev.ClientAnnouncePlayer = msg; - const player = clientsMap.get(this.id) as ClientPlayer; - player.matchOptions = announce.matchOptions; - this.send(JSON.stringify( new ev.EventAssignId(this.id) )); - this.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchmakingInProgress) )); - matchmaking(player); - } - else if (msg.role === en.ClientRole.spectator) - { - const announce: ev.ClientAnnounceSpectator = msg; - const gameSession = gameSessionsMap.get(announce.gameSessionId); - if (!gameSession) { - // WIP: send "invalid game session" - return; - } - const spectator = clientsMap.get(this.id) as ClientSpectator; - spectator.gameSession = gameSession; - gameSession.spectatorsMap.set(spectator.id, spectator); - this.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchStart) )); - } - } - else { - console.log("Invalid ClientAnnounce"); - } - return; - } - catch (e) { - console.log("Invalid JSON (clientAnnounceListener)"); - } - this.once("message", clientAnnounceListener); -} - - -function matchmaking(player: ClientPlayer) -{ - const minPlayersNumber = 2; - const maxPlayersNumber = 2; - const matchOptions = player.matchOptions; - matchmakingPlayersMap.set(player.id, player); - - const compatiblePlayers: ClientPlayer[] = []; - for (const [id, client] of matchmakingPlayersMap) - { - if (client.matchOptions === matchOptions) - { - compatiblePlayers.push(client); - if (compatiblePlayers.length === maxPlayersNumber) { - break; - } - } - } - - if (compatiblePlayers.length < minPlayersNumber) { - return; - } - - // const id = gameSessionIdPLACEHOLDER; // Force ID, TESTING SPECTATOR - const id = uuidv4(); - const gameSession = new GameSession(id, matchOptions); - gameSessionsMap.set(id, gameSession); - - compatiblePlayers.forEach((client) => { - matchmakingPlayersMap.delete(client.id); - client.gameSession = gameSession; - gameSession.playersMap.set(client.id, client); - gameSession.unreadyPlayersMap.set(client.id, client); - }); - - // WIP: Not pretty, hardcoded two players. - // Could be done in gameSession maybe ? - compatiblePlayers[0].racket = gameSession.components.playerRight; - compatiblePlayers[1].racket = gameSession.components.playerLeft; - - compatiblePlayers.forEach((client) => { - client.socket.once("message", playerReadyConfirmationListener); - }); - - compatiblePlayers[0].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.right) )); - compatiblePlayers[1].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.left) )); - - setTimeout(function abortMatch() { - if (gameSession.unreadyPlayersMap.size !== 0) - { - gameSessionsMap.delete(gameSession.id); - gameSession.playersMap.forEach((client) => { - client.socket.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchAbort) )); - client.gameSession = null; - clientTerminate(client); - }); - } - }, 5000); -} - - -function playerReadyConfirmationListener(this: WebSocket, data: string) -{ - try { - const msg : ev.ClientEvent = JSON.parse(data); - if (msg.type === en.EventTypes.clientPlayerReady) - { - const client = clientsMap.get(this.id); - const gameSession = client.gameSession; - gameSession.unreadyPlayersMap.delete(this.id); - if (gameSession.unreadyPlayersMap.size === 0) { - gameSession.playersMap.forEach( (client) => { - client.socket.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchStart) )); - }); - gameSession.start(); - } - } - else { - console.log("Invalid playerReadyConfirmation"); - } - return; - } - catch (e) { - console.log("Invalid JSON (playerReadyConfirmationListener)"); - } - this.once("message", playerReadyConfirmationListener); -} - - -export function clientInputListener(this: WebSocket, data: string) -{ - try { - // const input: ev.ClientEvent = JSON.parse(data); - const input: ev.EventInput = JSON.parse(data); - if (input.type === en.EventTypes.clientInput) - { - const client = clientsMap.get(this.id) as ClientPlayer; - client.inputBuffer = input; - client.gameSession.instantInputDebug(client); // wip - } - else { - console.log("Invalid clientInput"); - } - } - catch (e) { - console.log("Invalid JSON (clientInputListener)"); - } -} - -//////////// -//////////// - -const pingInterval = setInterval( () => { - let deleteLog = ""; - clientsMap.forEach( (client) => { - if (!client.isAlive) { - clientTerminate(client); - deleteLog += ` ${shortId(client.id)} |`; - } - else { - client.isAlive = false; - client.socket.ping(); - } - }); - - if (deleteLog) { - console.log(`Disconnected:${deleteLog}`); - } - console.log("gameSessionMap size: " + gameSessionsMap.size); - console.log("clientsMap size: " + clientsMap.size); - console.log("matchmakingPlayersMap size: " + matchmakingPlayersMap.size); - console.log(""); -}, 4200); - - -function clientTerminate(client: Client) -{ - client.socket.terminate(); - if (client.gameSession) - { - client.gameSession.playersMap.delete(client.id); - if (client.gameSession.playersMap.size === 0) - { - clearInterval(client.gameSession.playersUpdateInterval); - clearInterval(client.gameSession.spectatorsUpdateInterval); - clearInterval(client.gameSession.gameLoopInterval); - gameSessionsMap.delete(client.gameSession.id); - } - } - clientsMap.delete(client.id); - if (matchmakingPlayersMap.has(client.id)) { - matchmakingPlayersMap.delete(client.id); - } -} - - -function closeListener() -{ - clearInterval(pingInterval); -} - - -function errorListener(error: Error) -{ - console.log("Error: " + JSON.stringify(error)); -} diff --git a/jeu/src/shared_js/class/Event.js b/jeu/src/shared_js/class/Event.js deleted file mode 100644 index 9cb476ee..00000000 --- a/jeu/src/shared_js/class/Event.js +++ /dev/null @@ -1,84 +0,0 @@ -import * as en from "../enums.js"; -/* From Server */ -export class ServerEvent { - constructor(type = 0) { - this.type = type; - } -} -export class EventAssignId extends ServerEvent { - constructor(id) { - super(en.EventTypes.assignId); - this.id = id; - } -} -export class EventMatchmakingComplete extends ServerEvent { - constructor(side) { - super(en.EventTypes.matchmakingComplete); - this.side = side; - } -} -export class EventGameUpdate extends ServerEvent { - constructor() { - super(en.EventTypes.gameUpdate); - this.playerLeft = { - y: 0 - }; - this.playerRight = { - y: 0 - }; - this.ballsArr = []; - this.wallTop = { - y: 0 - }; - this.wallBottom = { - y: 0 - }; - this.lastInputId = 0; - } -} -export class EventScoreUpdate extends ServerEvent { - constructor(scoreLeft, scoreRight) { - super(en.EventTypes.scoreUpdate); - this.scoreLeft = scoreLeft; - this.scoreRight = scoreRight; - } -} -export class EventMatchEnd extends ServerEvent { - constructor(winner, forfeit = false) { - super(en.EventTypes.matchEnd); - this.winner = winner; - this.forfeit = forfeit; - } -} -/* From Client */ -export class ClientEvent { - constructor(type = 0) { - this.type = type; - } -} -export class ClientAnnounce extends ClientEvent { - constructor(role) { - super(en.EventTypes.clientAnnounce); - this.role = role; - } -} -export class ClientAnnouncePlayer extends ClientAnnounce { - constructor(matchOptions, clientId = "") { - super(en.ClientRole.player); - this.clientId = clientId; - this.matchOptions = matchOptions; - } -} -export class ClientAnnounceSpectator extends ClientAnnounce { - constructor(gameSessionId) { - super(en.ClientRole.spectator); - this.gameSessionId = gameSessionId; - } -} -export class EventInput extends ClientEvent { - constructor(input = en.InputEnum.noInput, id = 0) { - super(en.EventTypes.clientInput); - this.input = input; - this.id = id; - } -} diff --git a/jeu/src/shared_js/class/Event.ts b/jeu/src/shared_js/class/Event.ts deleted file mode 100644 index 992827e4..00000000 --- a/jeu/src/shared_js/class/Event.ts +++ /dev/null @@ -1,117 +0,0 @@ - -import * as en from "../enums.js" - -/* From Server */ -export class ServerEvent { - type: en.EventTypes; - constructor(type: en.EventTypes = 0) { - this.type = type; - } -} - -export class EventAssignId extends ServerEvent { - id: string; - constructor(id: string) { - super(en.EventTypes.assignId); - this.id = id; - } -} - -export class EventMatchmakingComplete extends ServerEvent { - side: en.PlayerSide; - constructor(side: en.PlayerSide) { - super(en.EventTypes.matchmakingComplete); - this.side = side; - } -} - -export class EventGameUpdate extends ServerEvent { - playerLeft = { - y: 0 - }; - playerRight = { - y: 0 - }; - ballsArr: { - x: number, - y: number, - dirX: number, - dirY: number, - speed: number - }[] = []; - wallTop? = { - y: 0 - }; - wallBottom? = { - y: 0 - }; - lastInputId = 0; - constructor() { // TODO: constructor that take GameComponentsServer maybe ? - super(en.EventTypes.gameUpdate); - } -} - -export class EventScoreUpdate extends ServerEvent { - scoreLeft: number; - scoreRight: number; - constructor(scoreLeft: number, scoreRight: number) { - super(en.EventTypes.scoreUpdate); - this.scoreLeft = scoreLeft; - this.scoreRight = scoreRight; - } -} - -export class EventMatchEnd extends ServerEvent { - winner: en.PlayerSide; - forfeit: boolean; - constructor(winner: en.PlayerSide, forfeit = false) { - super(en.EventTypes.matchEnd); - this.winner = winner; - this.forfeit = forfeit; - } -} - - -/* From Client */ -export class ClientEvent { - type: en.EventTypes; // readonly ? - constructor(type: en.EventTypes = 0) { - this.type = type; - } -} - -export class ClientAnnounce extends ClientEvent { - role: en.ClientRole; - constructor(role: en.ClientRole) { - super(en.EventTypes.clientAnnounce); - this.role = role; - } -} - -export class ClientAnnouncePlayer extends ClientAnnounce { - clientId: string; - matchOptions: en.MatchOptions; - constructor(matchOptions: en.MatchOptions, clientId: string = "") { - super(en.ClientRole.player); - this.clientId = clientId; - this.matchOptions = matchOptions; - } -} - -export class ClientAnnounceSpectator extends ClientAnnounce { - gameSessionId: string; - constructor(gameSessionId: string) { - super(en.ClientRole.spectator); - this.gameSessionId = gameSessionId; - } -} - -export class EventInput extends ClientEvent { - input: en.InputEnum; - id: number; - constructor(input: en.InputEnum = en.InputEnum.noInput, id: number = 0) { - super(en.EventTypes.clientInput); - this.input = input; - this.id = id; - } -} diff --git a/jeu/src/shared_js/class/GameComponents.js b/jeu/src/shared_js/class/GameComponents.js deleted file mode 100644 index d423c5c8..00000000 --- a/jeu/src/shared_js/class/GameComponents.js +++ /dev/null @@ -1,51 +0,0 @@ -import * as c from "../constants.js"; -import * as en from "../../shared_js/enums.js"; -import { VectorInteger } from "./Vector.js"; -import { Rectangle, MovingRectangle, Racket, Ball } from "./Rectangle.js"; -import { random } from "../utils.js"; -export class GameComponents { - constructor(options) { - this.ballsArr = []; - const pos = new VectorInteger; - // Rackets - pos.assign(0 + c.pw, c.h_mid - c.ph / 2); - this.playerLeft = new Racket(pos, c.pw, c.ph, c.racketSpeed); - pos.assign(c.w - c.pw - c.pw, c.h_mid - c.ph / 2); - this.playerRight = new Racket(pos, c.pw, c.ph, c.racketSpeed); - // Balls - let ballsCount = 1; - if (options & en.MatchOptions.multiBalls) { - ballsCount = c.multiBallsCount; - } - pos.assign(-c.ballSize, -c.ballSize); // ball out =) - while (this.ballsArr.length < ballsCount) { - this.ballsArr.push(new Ball(pos, c.ballSize, c.ballSpeed, c.ballSpeedIncrease)); - } - this.ballsArr.forEach((ball) => { - ball.dir.x = 1; - if (random() > 0.5) { - ball.dir.x *= -1; - } - ball.dir.y = random(0, 0.2); - if (random() > 0.5) { - ball.dir.y *= -1; - } - ball.dir = ball.dir.normalized(); - }); - // Walls - if (options & en.MatchOptions.movingWalls) { - pos.assign(0, 0); - this.wallTop = new MovingRectangle(pos, c.w, c.wallSize, c.movingWallSpeed); - this.wallTop.dir.y = -1; - pos.assign(0, c.h - c.wallSize); - this.wallBottom = new MovingRectangle(pos, c.w, c.wallSize, c.movingWallSpeed); - this.wallBottom.dir.y = 1; - } - else { - pos.assign(0, 0); - this.wallTop = new Rectangle(pos, c.w, c.wallSize); - pos.assign(0, c.h - c.wallSize); - this.wallBottom = new Rectangle(pos, c.w, c.wallSize); - } - } -} diff --git a/jeu/src/shared_js/class/GameComponents.ts b/jeu/src/shared_js/class/GameComponents.ts deleted file mode 100644 index ec36f15f..00000000 --- a/jeu/src/shared_js/class/GameComponents.ts +++ /dev/null @@ -1,63 +0,0 @@ - -import * as c from "../constants.js" -import * as en from "../../shared_js/enums.js" -import { VectorInteger } from "./Vector.js"; -import { Rectangle, MovingRectangle, Racket, Ball } from "./Rectangle.js"; -import { random } from "../utils.js"; - -export class GameComponents { - wallTop: Rectangle | MovingRectangle; - wallBottom: Rectangle | MovingRectangle; - playerLeft: Racket; - playerRight: Racket; - ballsArr: Ball[] = []; - constructor(options: en.MatchOptions) - { - const pos = new VectorInteger; - - // Rackets - pos.assign(0+c.pw, c.h_mid-c.ph/2); - this.playerLeft = new Racket(pos, c.pw, c.ph, c.racketSpeed); - pos.assign(c.w-c.pw-c.pw, c.h_mid-c.ph/2); - this.playerRight = new Racket(pos, c.pw, c.ph, c.racketSpeed); - - // Balls - let ballsCount = 1; - if (options & en.MatchOptions.multiBalls) { - ballsCount = c.multiBallsCount; - } - pos.assign(-c.ballSize, -c.ballSize); // ball out =) - while (this.ballsArr.length < ballsCount) { - this.ballsArr.push(new Ball(pos, c.ballSize, c.ballSpeed, c.ballSpeedIncrease)) - } - this.ballsArr.forEach((ball) => { - ball.dir.x = 1; - if (random() > 0.5) { - ball.dir.x *= -1; - } - - ball.dir.y = random(0, 0.2); - if (random() > 0.5) { - ball.dir.y *= -1; - } - - ball.dir = ball.dir.normalized(); - }); - - // Walls - if (options & en.MatchOptions.movingWalls) { - pos.assign(0, 0); - this.wallTop = new MovingRectangle(pos, c.w, c.wallSize, c.movingWallSpeed); - (this.wallTop).dir.y = -1; - pos.assign(0, c.h-c.wallSize); - this.wallBottom = new MovingRectangle(pos, c.w, c.wallSize, c.movingWallSpeed); - (this.wallBottom).dir.y = 1; - } - else { - pos.assign(0, 0); - this.wallTop = new Rectangle(pos, c.w, c.wallSize); - pos.assign(0, c.h-c.wallSize); - this.wallBottom = new Rectangle(pos, c.w, c.wallSize); - } - } -} diff --git a/jeu/src/shared_js/class/Rectangle.js b/jeu/src/shared_js/class/Rectangle.js deleted file mode 100644 index 0df9fa88..00000000 --- a/jeu/src/shared_js/class/Rectangle.js +++ /dev/null @@ -1,124 +0,0 @@ -import { Vector, VectorInteger } from "./Vector.js"; -import * as c from "../constants.js"; -export class Rectangle { - constructor(pos, width, height) { - this.pos = new VectorInteger(pos.x, pos.y); - this.width = width; - this.height = height; - } - collision(collider) { - const thisLeft = this.pos.x; - const thisRight = this.pos.x + this.width; - const thisTop = this.pos.y; - const thisBottom = this.pos.y + this.height; - const colliderLeft = collider.pos.x; - const colliderRight = collider.pos.x + collider.width; - const colliderTop = collider.pos.y; - const colliderBottom = collider.pos.y + collider.height; - if ((thisBottom < colliderTop) - || (thisTop > colliderBottom) - || (thisRight < colliderLeft) - || (thisLeft > colliderRight)) { - return false; - } - else { - return true; - } - } -} -export class MovingRectangle extends Rectangle { - constructor(pos, width, height, baseSpeed) { - super(pos, width, height); - this.dir = new Vector(0, 0); - this.baseSpeed = baseSpeed; - this.speed = baseSpeed; - } - move(delta) { - // console.log(`delta: ${delta}, speed: ${this.speed}, speed*delta: ${this.speed * delta}`); - // this.pos.x += Math.floor(this.dir.x * this.speed * delta); - // this.pos.y += Math.floor(this.dir.y * this.speed * delta); - this.pos.x += this.dir.x * this.speed * delta; - this.pos.y += this.dir.y * this.speed * delta; - } - moveAndCollide(delta, colliderArr) { - this._moveAndCollideAlgo(delta, colliderArr); - } - _moveAndCollideAlgo(delta, colliderArr) { - let oldPos = new VectorInteger(this.pos.x, this.pos.y); - this.move(delta); - if (colliderArr.some(this.collision, this)) { - this.pos = oldPos; - } - } -} -export class Racket extends MovingRectangle { - constructor(pos, width, height, baseSpeed) { - super(pos, width, height, baseSpeed); - } - moveAndCollide(delta, colliderArr) { - // let oldPos = new VectorInteger(this.pos.x, this.pos.y); // debug - this._moveAndCollideAlgo(delta, colliderArr); - // console.log(`y change: ${this.pos.y - oldPos.y}`); - } -} -export class Ball extends MovingRectangle { - constructor(pos, size, baseSpeed, speedIncrease) { - super(pos, size, size, baseSpeed); - this.ballInPlay = false; - this.speedIncrease = speedIncrease; - } - moveAndBounce(delta, colliderArr) { - this.move(delta); - let i = colliderArr.findIndex(this.collision, this); - if (i != -1) { - this.bounce(colliderArr[i]); - this.move(delta); - } - } - bounce(collider) { - this._bounceAlgo(collider); - } - _bounceAlgo(collider) { - /* Could be more generic, but testing only Racket is enough, - because in Pong collider can only be Racket or Wall. */ - if (collider instanceof Racket) { - this._bounceRacket(collider); - } - else { - this._bounceWall(); - } - } - _bounceWall() { - this.dir.y = this.dir.y * -1; - } - _bounceRacket(racket) { - this._bounceRacketAlgo(racket); - } - _bounceRacketAlgo(racket) { - this.speed += this.speedIncrease; - let x = this.dir.x * -1; - const angleFactorDegree = 60; - const angleFactor = angleFactorDegree / 90; - const racketHalf = racket.height / 2; - const ballMid = this.pos.y + this.height / 2; - const racketMid = racket.pos.y + racketHalf; - let impact = ballMid - racketMid; - const horizontalMargin = racketHalf * 0.15; - if (impact < horizontalMargin && impact > -horizontalMargin) { - impact = 0; - } - else if (impact > 0) { - impact = impact - horizontalMargin; - } - else if (impact < 0) { - impact = impact + horizontalMargin; - } - let y = impact / (racketHalf - horizontalMargin) * angleFactor; - this.dir.assign(x, y); - // Normalize Vector (for consistency in speed independent of direction) - if (c.normalizedSpeed) { - this.dir = this.dir.normalized(); - } - // console.log(`x: ${this.dir.x}, y: ${this.dir.y}`); - } -} diff --git a/jeu/src/shared_js/class/Rectangle.ts b/jeu/src/shared_js/class/Rectangle.ts deleted file mode 100644 index bbbb30e5..00000000 --- a/jeu/src/shared_js/class/Rectangle.ts +++ /dev/null @@ -1,142 +0,0 @@ - -import { Vector, VectorInteger } from "./Vector.js"; -import { Component, Moving } from "./interface.js"; -import * as c from "../constants.js" - -export class Rectangle implements Component { - pos: VectorInteger; - width: number; - height: number; - constructor(pos: VectorInteger, width: number, height: number) { - this.pos = new VectorInteger(pos.x, pos.y); - this.width = width; - this.height = height; - } - collision(collider: Rectangle): boolean { - const thisLeft = this.pos.x; - const thisRight = this.pos.x + this.width; - const thisTop = this.pos.y; - const thisBottom = this.pos.y + this.height; - const colliderLeft = collider.pos.x; - const colliderRight = collider.pos.x + collider.width; - const colliderTop = collider.pos.y; - const colliderBottom = collider.pos.y + collider.height; - if ((thisBottom < colliderTop) - || (thisTop > colliderBottom) - || (thisRight < colliderLeft) - || (thisLeft > colliderRight)) { - return false; - } - else { - return true; - } - } -} - -export class MovingRectangle extends Rectangle implements Moving { - dir: Vector = new Vector(0,0); - speed: number; - readonly baseSpeed: number; - constructor(pos: VectorInteger, width: number, height: number, baseSpeed: number) { - super(pos, width, height); - this.baseSpeed = baseSpeed; - this.speed = baseSpeed; - } - move(delta: number) { // Math.floor WIP until VectorInteger debug - // console.log(`delta: ${delta}, speed: ${this.speed}, speed*delta: ${this.speed * delta}`); - // this.pos.x += Math.floor(this.dir.x * this.speed * delta); - // this.pos.y += Math.floor(this.dir.y * this.speed * delta); - this.pos.x += this.dir.x * this.speed * delta; - this.pos.y += this.dir.y * this.speed * delta; - } - moveAndCollide(delta: number, colliderArr: Rectangle[]) { - this._moveAndCollideAlgo(delta, colliderArr); - } - protected _moveAndCollideAlgo(delta: number, colliderArr: Rectangle[]) { - let oldPos = new VectorInteger(this.pos.x, this.pos.y); - this.move(delta); - if (colliderArr.some(this.collision, this)) { - this.pos = oldPos; - } - } -} - -export class Racket extends MovingRectangle { - constructor(pos: VectorInteger, width: number, height: number, baseSpeed: number) { - super(pos, width, height, baseSpeed); - } - moveAndCollide(delta: number, colliderArr: Rectangle[]) { - // let oldPos = new VectorInteger(this.pos.x, this.pos.y); // debug - this._moveAndCollideAlgo(delta, colliderArr); - // console.log(`y change: ${this.pos.y - oldPos.y}`); - } -} - -export class Ball extends MovingRectangle { - readonly speedIncrease: number; - ballInPlay: boolean = false; - constructor(pos: VectorInteger, size: number, baseSpeed: number, speedIncrease: number) { - super(pos, size, size, baseSpeed); - this.speedIncrease = speedIncrease; - } - moveAndBounce(delta: number, colliderArr: Rectangle[]) { - this.move(delta); - let i = colliderArr.findIndex(this.collision, this); - if (i != -1) - { - this.bounce(colliderArr[i]); - this.move(delta); - } - } - bounce(collider?: Rectangle) { - this._bounceAlgo(collider); - } - protected _bounceAlgo(collider?: Rectangle) { - /* Could be more generic, but testing only Racket is enough, - because in Pong collider can only be Racket or Wall. */ - if (collider instanceof Racket) { - this._bounceRacket(collider); - } - else { - this._bounceWall(); - } - } - protected _bounceWall() { // Should be enough for Wall - this.dir.y = this.dir.y * -1; - } - protected _bounceRacket(racket: Racket) { - this._bounceRacketAlgo(racket); - } - protected _bounceRacketAlgo(racket: Racket) { - this.speed += this.speedIncrease; - - let x = this.dir.x * -1; - - const angleFactorDegree = 60; - const angleFactor = angleFactorDegree / 90; - const racketHalf = racket.height/2; - const ballMid = this.pos.y + this.height/2; - const racketMid = racket.pos.y + racketHalf; - - let impact = ballMid - racketMid; - const horizontalMargin = racketHalf * 0.15; - if (impact < horizontalMargin && impact > -horizontalMargin) { - impact = 0; - } - else if (impact > 0) { - impact = impact - horizontalMargin; - } - else if (impact < 0) { - impact = impact + horizontalMargin; - } - - let y = impact / (racketHalf - horizontalMargin) * angleFactor; - - this.dir.assign(x, y); - // Normalize Vector (for consistency in speed independent of direction) - if (c.normalizedSpeed) { - this.dir = this.dir.normalized(); - } - // console.log(`x: ${this.dir.x}, y: ${this.dir.y}`); - } -} diff --git a/jeu/src/shared_js/class/Vector.js b/jeu/src/shared_js/class/Vector.js deleted file mode 100644 index e20e40d0..00000000 --- a/jeu/src/shared_js/class/Vector.js +++ /dev/null @@ -1,40 +0,0 @@ -export class Vector { - constructor(x = 0, y = 0) { - this.x = x; - this.y = y; - } - assign(x, y) { - this.x = x; - this.y = y; - } - normalized() { - const normalizationFactor = Math.abs(this.x) + Math.abs(this.y); - return new Vector(this.x / normalizationFactor, this.y / normalizationFactor); - } -} -export class VectorInteger extends Vector { -} -/* -export class VectorInteger { - // private _x: number = 0; - // private _y: number = 0; - // constructor(x: number = 0, y: number = 0) { - // this._x = x; - // this._y = y; - // } - // get x(): number { - // return this._x; - // } - // set x(v: number) { - // // this._x = Math.floor(v); - // this._x = v; - // } - // get y(): number { - // return this._y; - // } - // set y(v: number) { - // // this._y = Math.floor(v); - // this._y = v; - // } -} -*/ diff --git a/jeu/src/shared_js/class/Vector.ts b/jeu/src/shared_js/class/Vector.ts deleted file mode 100644 index fbe121e5..00000000 --- a/jeu/src/shared_js/class/Vector.ts +++ /dev/null @@ -1,47 +0,0 @@ - -export class Vector { - x: number; - y: number; - constructor(x: number = 0, y: number = 0) { - this.x = x; - this.y = y; - } - assign(x: number, y: number) { - this.x = x; - this.y = y; - } - normalized() : Vector { - const normalizationFactor = Math.abs(this.x) + Math.abs(this.y); - return new Vector(this.x/normalizationFactor, this.y/normalizationFactor); - } -} - -export class VectorInteger extends Vector { - // PLACEHOLDER - // VectorInteger with set/get dont work (No draw on the screen). Why ? -} - -/* -export class VectorInteger { - // private _x: number = 0; - // private _y: number = 0; - // constructor(x: number = 0, y: number = 0) { - // this._x = x; - // this._y = y; - // } - // get x(): number { - // return this._x; - // } - // set x(v: number) { - // // this._x = Math.floor(v); - // this._x = v; - // } - // get y(): number { - // return this._y; - // } - // set y(v: number) { - // // this._y = Math.floor(v); - // this._y = v; - // } -} -*/ diff --git a/jeu/src/shared_js/class/interface.js b/jeu/src/shared_js/class/interface.js deleted file mode 100644 index cb0ff5c3..00000000 --- a/jeu/src/shared_js/class/interface.js +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/jeu/src/shared_js/class/interface.ts b/jeu/src/shared_js/class/interface.ts deleted file mode 100644 index 544d54a8..00000000 --- a/jeu/src/shared_js/class/interface.ts +++ /dev/null @@ -1,19 +0,0 @@ - -import { Vector, VectorInteger } from "./Vector.js"; - -export interface Component { - pos: VectorInteger; -} - -export interface GraphicComponent extends Component { - ctx: CanvasRenderingContext2D; - color: string; - update: () => void; - clear: (pos?: VectorInteger) => void; -} - -export interface Moving { - dir: Vector; - speed: number; // pixel per second - move(delta: number): void; -} diff --git a/jeu/src/shared_js/constants.js b/jeu/src/shared_js/constants.js deleted file mode 100644 index 283abf6c..00000000 --- a/jeu/src/shared_js/constants.js +++ /dev/null @@ -1,23 +0,0 @@ -export const CanvasWidth = 1500; -export const CanvasRatio = 1.66666; -/* ratio 5/3 (1.66) */ -export const w = CanvasWidth; -export const h = CanvasWidth / CanvasRatio; -export const w_mid = Math.floor(w / 2); -export const h_mid = Math.floor(h / 2); -export const pw = Math.floor(w * 0.017); -export const ph = pw * 6; -export const ballSize = pw; -export const wallSize = Math.floor(w * 0.01); -export const racketSpeed = Math.floor(w * 0.66); // pixel per second -export const ballSpeed = Math.floor(w * 0.66); // pixel per second -export const ballSpeedIncrease = Math.floor(ballSpeed * 0.05); // pixel per second -export const normalizedSpeed = false; // for consistency in speed independent of direction -export const matchStartDelay = 3000; // millisecond -export const newRoundDelay = 1500; // millisecond -// Game Variantes -export const multiBallsCount = 3; -export const movingWallPosMax = Math.floor(w * 0.12); -export const movingWallSpeed = Math.floor(w * 0.08); -export const gameSessionIdPLACEHOLDER = "42"; // TESTING SPECTATOR PLACEHOLDER -// for testing, force gameSession.id in wsServer.ts->matchmaking() diff --git a/jeu/src/shared_js/constants.ts b/jeu/src/shared_js/constants.ts deleted file mode 100644 index be86ba7b..00000000 --- a/jeu/src/shared_js/constants.ts +++ /dev/null @@ -1,30 +0,0 @@ - -export const CanvasWidth = 1500; -export const CanvasRatio = 1.66666; -/* ratio 5/3 (1.66) */ - -export const w = CanvasWidth; -export const h = CanvasWidth / CanvasRatio; -export const w_mid = Math.floor(w/2); -export const h_mid = Math.floor(h/2); -export const pw = Math.floor(w*0.017); -export const ph = pw*6; -export const ballSize = pw; -export const wallSize = Math.floor(w*0.01); -export const racketSpeed = Math.floor(w*0.66); // pixel per second -export const ballSpeed = Math.floor(w*0.66); // pixel per second -export const ballSpeedIncrease = Math.floor(ballSpeed*0.05); // pixel per second - -export const normalizedSpeed = false; // for consistency in speed independent of direction - -export const matchStartDelay = 3000; // millisecond -export const newRoundDelay = 1500; // millisecond - -// Game Variantes -export const multiBallsCount = 3; -export const movingWallPosMax = Math.floor(w*0.12); -export const movingWallSpeed = Math.floor(w*0.08); - - -export const gameSessionIdPLACEHOLDER = "42"; // TESTING SPECTATOR PLACEHOLDER -// for testing, force gameSession.id in wsServer.ts->matchmaking() \ No newline at end of file diff --git a/jeu/src/shared_js/enums.js b/jeu/src/shared_js/enums.js deleted file mode 100644 index ccc31a74..00000000 --- a/jeu/src/shared_js/enums.js +++ /dev/null @@ -1,43 +0,0 @@ -export var EventTypes; -(function (EventTypes) { - // Class Implemented - EventTypes[EventTypes["gameUpdate"] = 1] = "gameUpdate"; - EventTypes[EventTypes["scoreUpdate"] = 2] = "scoreUpdate"; - EventTypes[EventTypes["matchEnd"] = 3] = "matchEnd"; - EventTypes[EventTypes["assignId"] = 4] = "assignId"; - EventTypes[EventTypes["matchmakingComplete"] = 5] = "matchmakingComplete"; - // Generic - EventTypes[EventTypes["matchmakingInProgress"] = 6] = "matchmakingInProgress"; - EventTypes[EventTypes["matchStart"] = 7] = "matchStart"; - EventTypes[EventTypes["matchAbort"] = 8] = "matchAbort"; - EventTypes[EventTypes["matchNewRound"] = 9] = "matchNewRound"; - EventTypes[EventTypes["matchPause"] = 10] = "matchPause"; - EventTypes[EventTypes["matchResume"] = 11] = "matchResume"; - // Client - EventTypes[EventTypes["clientAnnounce"] = 12] = "clientAnnounce"; - EventTypes[EventTypes["clientPlayerReady"] = 13] = "clientPlayerReady"; - EventTypes[EventTypes["clientInput"] = 14] = "clientInput"; -})(EventTypes || (EventTypes = {})); -export var InputEnum; -(function (InputEnum) { - InputEnum[InputEnum["noInput"] = 0] = "noInput"; - InputEnum[InputEnum["up"] = 1] = "up"; - InputEnum[InputEnum["down"] = 2] = "down"; -})(InputEnum || (InputEnum = {})); -export var PlayerSide; -(function (PlayerSide) { - PlayerSide[PlayerSide["left"] = 1] = "left"; - PlayerSide[PlayerSide["right"] = 2] = "right"; -})(PlayerSide || (PlayerSide = {})); -export var ClientRole; -(function (ClientRole) { - ClientRole[ClientRole["player"] = 1] = "player"; - ClientRole[ClientRole["spectator"] = 2] = "spectator"; -})(ClientRole || (ClientRole = {})); -export var MatchOptions; -(function (MatchOptions) { - // binary flags, can be mixed - MatchOptions[MatchOptions["noOption"] = 0] = "noOption"; - MatchOptions[MatchOptions["multiBalls"] = 1] = "multiBalls"; - MatchOptions[MatchOptions["movingWalls"] = 2] = "movingWalls"; -})(MatchOptions || (MatchOptions = {})); diff --git a/jeu/src/shared_js/enums.ts b/jeu/src/shared_js/enums.ts deleted file mode 100644 index 108f3a66..00000000 --- a/jeu/src/shared_js/enums.ts +++ /dev/null @@ -1,46 +0,0 @@ - -export enum EventTypes { - // Class Implemented - gameUpdate = 1, - scoreUpdate, - matchEnd, - assignId, - matchmakingComplete, - - // Generic - matchmakingInProgress, - matchStart, - matchAbort, - matchNewRound, // unused - matchPause, // unused - matchResume, // unused - - // Client - clientAnnounce, - clientPlayerReady, - clientInput, - -} - -export enum InputEnum { - noInput = 0, - up = 1, - down, -} - -export enum PlayerSide { - left = 1, - right -} - -export enum ClientRole { - player = 1, - spectator -} - -export enum MatchOptions { - // binary flags, can be mixed - noOption = 0b0, - multiBalls = 1 << 0, - movingWalls = 1 << 1 -} diff --git a/jeu/src/shared_js/utils.js b/jeu/src/shared_js/utils.js deleted file mode 100644 index 2c395dcd..00000000 --- a/jeu/src/shared_js/utils.js +++ /dev/null @@ -1,18 +0,0 @@ -export function random(min = 0, max = 1) { - return Math.random() * (max - min) + min; -} -export function sleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} -export function clamp(n, min, max) { - if (n < min) - n = min; - else if (n > max) - n = max; - return (n); -} -// Typescript hack, unused -export function assertMovingRectangle(value) { - // if (value !== MovingRectangle) throw new Error("Not a MovingRectangle"); - return; -} diff --git a/jeu/src/shared_js/utils.ts b/jeu/src/shared_js/utils.ts deleted file mode 100644 index 6cba06d2..00000000 --- a/jeu/src/shared_js/utils.ts +++ /dev/null @@ -1,25 +0,0 @@ - -import { MovingRectangle } from "./class/Rectangle.js"; - -export function random(min: number = 0, max: number = 1) { - return Math.random() * (max - min) + min; -} - -export function sleep (ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -export function clamp(n: number, min: number, max: number) : number -{ - if (n < min) - n = min; - else if (n > max) - n = max; - return (n); -} - -// Typescript hack, unused -export function assertMovingRectangle(value: unknown): asserts value is MovingRectangle { - // if (value !== MovingRectangle) throw new Error("Not a MovingRectangle"); - return; -} diff --git a/jeu/src/shared_js/wallsMovement.js b/jeu/src/shared_js/wallsMovement.js deleted file mode 100644 index 3cfc9b32..00000000 --- a/jeu/src/shared_js/wallsMovement.js +++ /dev/null @@ -1,13 +0,0 @@ -import * as c from "./constants.js"; -export function wallsMovements(delta, gc) { - const wallTop = gc.wallTop; - const wallBottom = gc.wallBottom; - if (wallTop.pos.y <= 0 || wallTop.pos.y >= c.movingWallPosMax) { - wallTop.dir.y *= -1; - } - if (wallBottom.pos.y >= c.h - c.wallSize || wallBottom.pos.y <= c.h - c.movingWallPosMax) { - wallBottom.dir.y *= -1; - } - wallTop.moveAndCollide(delta, [gc.playerLeft, gc.playerRight]); - wallBottom.moveAndCollide(delta, [gc.playerLeft, gc.playerRight]); -} diff --git a/jeu/src/shared_js/wallsMovement.ts b/jeu/src/shared_js/wallsMovement.ts deleted file mode 100644 index 0f6dbe58..00000000 --- a/jeu/src/shared_js/wallsMovement.ts +++ /dev/null @@ -1,18 +0,0 @@ - -import * as c from "./constants.js"; -import { MovingRectangle } from "../shared_js/class/Rectangle.js"; -import { GameComponents } from "./class/GameComponents.js"; - -export function wallsMovements(delta: number, gc: GameComponents) -{ - const wallTop = gc.wallTop; - const wallBottom = gc.wallBottom; - if (wallTop.pos.y <= 0 || wallTop.pos.y >= c.movingWallPosMax) { - wallTop.dir.y *= -1; - } - if (wallBottom.pos.y >= c.h-c.wallSize || wallBottom.pos.y <= c.h-c.movingWallPosMax) { - wallBottom.dir.y *= -1; - } - wallTop.moveAndCollide(delta, [gc.playerLeft, gc.playerRight]); - wallBottom.moveAndCollide(delta, [gc.playerLeft, gc.playerRight]); -} diff --git a/jeu/tsconfig.json b/jeu/tsconfig.json deleted file mode 100644 index 714e097f..00000000 --- a/jeu/tsconfig.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "ES6", /* Specify what module code is generated. */ - // "rootDir": "./", /* Specify the root folder within your source files. */ - "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - "strictNullChecks": false, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -} diff --git a/jeu/www/Bit5x3.woff b/jeu/www/Bit5x3.woff deleted file mode 100644 index 72c8b2934a6ab203b58e8fe6f4d7134924143c89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3124 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 Lz@`}kCGr0P>KTfy diff --git a/jeu/www/Bit5x3.woff2 b/jeu/www/Bit5x3.woff2 deleted file mode 100644 index 27d538bf85567b90aa23deb22a234ee8c6c5b80d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2012 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

oatvYAs+uRxKfjwm6x z<0&Q5C)brB5c$cGiWDQV;46f$K#{kcQabdjg!7&HK6M&`q(Wpps$^<^=WHMH%xIud z4fU2$^=!YoY2Iicss`fJuNJO5mpZRWR=m;5VN|_kUIVq7?NjY;M4I&I^w}#_x?bb_ zr8;#UX?msEJgV8PcO5lk`N0qjcNdPrJb@u-;6c`1ijc!%aXdnX+IcVp;guRo2^oP| zG#oP2DrC!rvF*GGD14sBF-Wwfk{E5)q?R`}rBOfaS2xcijj!6D&3C8kRnM0LfKLa& z%()6{u~uyk^5Csd5L@74c8qz8y0j{+kE$ai-10RemJU$Oh_VvMlgV6l1X&5w3{uf6 zh%y;7WibF2p77p!P)R=PiAD=1I|6{5$tdX0YQb0PczOl&Y6H^#G)S&HQq6}a#ep1U z1ESLF6$>2w6X+i!N2764R5u`qUZYmQLqSxVJJd6JNFe$?mE(LjqET&zF4cFp!0qq| zM%#CP4R80(+4=6`X1&Jg=WZ8lAO?&tTLpX;do&fMGbvV4$=4ZxU<$IGmk@Jsv?WAo z5tBizlbOTodK|u1Kc-oeC<*=mXAd2+om`8)bB!A}a2**xXv+ zJMt&j74Y^Z07BOy9G*aWNi)lHfkkZI0B%_>tEH^#esGD}y>NWILID zbmtm(Db0+AI}~N(gIVV3IdRzj;dAM_^2+dtCj_*z0$4B()2b5K+A11bE_7YL^I&}X zIV=%jvjQ&x@O(czFK^1h(aG7B;^FD#{kN~V?Cfl#ln)%UvyI9aEG;b8+u5ccms$YO`k-%u1HjLxZ4zrgIJ2nr!6$D0ps4rKi(;8_IQ~Rs z>w|SUq9q{mCrYQFsv>vKcOR?)O%DQl{7k#l+s^N6Q_OD4ecdzpIUFmA?DB zB<4QD>6b6gIDv#mo7aW@61&x0_M(2b;UU@KnD?3R_47ZXUzwLAyLZ*t+G7g73y+y3 zzBB!q3-Dxs``Xu+4E_0C(dV4qx0al=ZMre%Y)Nti>o{#U!c<BT$Q$W||NA!0UlmOT|>ok8%nRNY^_ zxAgP`l}H`V?>*4(L7jb+qyJ%#YVS{!Pv=~YpB6@p-T%Ztek-@>!hg6~&0JfbB0kRv zSaUHmNid^c6MXY8$=@FI7BjJPi>w;H}*?r3QkaMK(#83@=DxX#f1Srun2?CGt2)yPLtmZaYOHT(BA gb?}<-wngr1LuWz7^n#n)<6{@ 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 diff --git a/jeu/www/sound/pong/13.ogg b/jeu/www/sound/pong/13.ogg deleted file mode 100644 index 71cfead6f5639d86ca130a6528258fa4fd514dcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4322 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 diff --git a/jeu/www/sound/pong/15.ogg b/jeu/www/sound/pong/15.ogg deleted file mode 100644 index 011f139c110360529716d44a8b602630913b6182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4199 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 Mj)rs}y6tQJpSTMp82|tP diff --git a/jeu/www/sound/pong/16.ogg b/jeu/www/sound/pong/16.ogg deleted file mode 100644 index 7e852275d2a5b5c7f409ebb1d65bafc8b5475e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4428 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 YWxk`;2jKX3tpO1Oz5u(x^SQ;~Z`7QX`~Uy| diff --git a/jeu/www/sound/pong/18.ogg b/jeu/www/sound/pong/18.ogg deleted file mode 100644 index 6ad253919ee38994ff8c7ea0f36f64d7cbf94700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4324 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 ZRGn)*LUvvBCI{1C{vGHOE(A+3{{v%VWTXH9 diff --git a/jeu/www/sound/pong/19.ogg b/jeu/www/sound/pong/19.ogg deleted file mode 100644 index f6fc42d64d57c8f3653f02da71c51e2acef2472b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4358 zcmd5<<6F5ASh4E{hUlE?4|38ZfL!bO>L!ZRJ z*=5rCkA9c%m)|yb<9Qr1T#n&nrnrRdPR6Bk5~2*~I2z8~)!o%~ohunfptF+%iJXjN zoPS0ZXZOwwE<1xyME5|U|3x#M-{C{*#waL>0k(;e#7!0S+d=tuJh9uRiiEPD{6>)t zHSj3UI-;4Pu1ae?cN!CRMBXU>$Xg?HDAOu1vu!rO@wZ&@vrUy2?R>sNA21#c*O^IP*R+FwEWB!gIZdK zlU7^ByFqcRHt-rV`#d7z8=79S8Qu-5|II@>UJUVZ=IRJQ(H9ZiY z^KQt)=h`M*AvRSVSm4y$P*>pIM>=)Qy&oO)Cr;h)nsmK{-Dug?ZnZh&^k7V4+c{lT z+Tz=>oVL?LLBvLQ%0z?zgz$LG?UG7-H=)RRcv;o%KH~8jBZE8PBAPzlS9yK`{J-_f zJnsOp9}V{Q;Ql+oVM`c;<*c|N_UJS>ereX|jNtx^U|gLO&y=wLPoFm(S|Y?!&F2ki zv`xI`rmOjS3-wnsad5+~aEG2`n}eNEnc%KN&?JLHvLxOIps(m$H-Kicj; zA`VgWLq_-v=4lqQgF7CakwL@<6+s(8`j9AlNUVEEsaqLT$BwO&rOFAF z3cXVP@4Aa2z)JwQS?X}L)By%K4H6iGcVR9VflSNGB{1k=#J{sK>=kq<>z3(n4*&qy zRTt@`03Mkpj@*1YGURmR<|T|U#=mPGAu4hRbnI%Fb)YMu=uZp!$FT>OL#MqD{GjE%xXW1H6-q$!*H#qWalY7I=g?S8 zPbT(!lW?6-K1^>d;uX^a+Ums#q%~P$dQo#Pj20sY_#=s+`X(S80FhfDvB5f_kkVAO zv5=_yhL`K6b>J0KbTxdsldg&%8g$7PPMfNDbT7wpUTBbGEsPIf27e1{Z+kCLe%AKm4K@$XS06K9+~k_@mVScdxXy#$zn&JVKJw(Rf3%RE6Gkw_LZ3nH_khXey; z6j`&D6)i!Lqa}h-J``p%-!P)51x$7M*bsMY9ZNmKU{2@2RTTN0fMvUZ@j5#qD`$+) zzOT-?&&*(XN^S|VEH~%dr^A=u9~qLd9@LY@?Vqx!c|xotVxZ-y>kzWsK^s zDW6$he%3J8ryArYR%DMdcWnE8@tCdGh3DhV$hVbpXUiti!V6FJy{G0n6@_yB90I3K zn(mYO&X+%To*>mv&UUBvcb~Z1;r2sk2I)ekLw}mS&rRPM-XZv6+nxm%U-AX4y*pT! zrv?1+0M9S`;L&2xqy3*gpIW@Lk(2$G5*Z3se&gR9cV%`(RV$dR>45vP6` za#z7YI?@q@dmfpbRdDr6s0kO5t*Jy(QDg;4qx=|Zg(6FJ6*8zsx)gDat8S8_$l81v z1SeI>kUoj70)fa+@~hJf$f)mmviSj^?iyA1WAX;dQ{2u{?2E8$dtiA zgBpr88pX4IMeCfwKvWIHrC-7Q;8gmYGDZ4MD<_R&&72Zy^{h|6vju6@qtmHbd8S_J z`kf+u4r!fLI%||W_3oPKY(E%+5guF(%o7-b(`?APMdrpa7;$Su20Pd=1mTq$PYxM@ zSu_+f*v@52xbYqAF(`b79XBmdmkYM3v&Yr!QLR$(v|rIShqTOgOwDy?>gCTD0AQO5 zfVpd}rM11n3gp3Cp)kJC&Af-Va6AV3vo7_nB9T@Nz1oa)JPnlS^6NP8q~ah) z){MyYdg(kz{{;HSz)>n)q;<^*qE{;9@K6xB^LfRj9ukPYPfnWaMwD`A=u&<63HUfX z0!_!xAK>lY`E0Jcv`w#c`MKN8G5`Y}SS$uUrfXY^GwEcTn3O9)0A~z@uJ7RwVyW-p zMJ4nge52S3Ue^!cYjr!-jzCWG2Uthwkd4F!^qp&X@&5e~_|F#p;S{|dz3Nk^-zF#9V5C&Occo4C->LAulYnynJMj$3!qx3q!P@HfOVd1?xBl~ZShc7@vfh1w@H)3 zDxBBv1_xO8*}g0OOu+-PClD?lKH=3(yA`wj*N`@{YeYpJW9fwy9o%$94mvf*N1{_c zmU`Tlhvtc>#IOnrC*EQ&L$PhP3|8DQW6)F*VS@;8fU6>`7djXybf5WnE-ygC-{|L4*#H8u|^9Z?W%@MZSIEpDdyVQ*Koxgrb?-(-Z+5kGQry72ydw7d2XgaL711Pbt1XAx|7#>dU^l#b51A}8l-&SC=?n#*h~Pl2W{vF8!A|I ztdnSs!B|-@v9`8ZhR5OX%W*hdk!T|Tt-}lU!SdwD!uIkD8$Q>6FotO#URO~+=K83! z;zG`k1(z&e{K&Cty>p0k)Hr_q&gIpjo*QpTy*;8vbqhS<&Lw+p{lr%eprU_I|RqXjkcXJ4>BI_29c3&Jn}> z_qvi!4cz>Gs$TW7P`m%Dy)HQ`B7W)pN%WLQo~|`H1Fko{&bD!y+WOtFnwNCt{_KE? zyFNfUh~dB7f5H2a@t<8SgenV9%rQ{Z>d}$%M=NrR z#$w-G-x*z+)Of%+UB^57?3d*}?^nOl;8^3xIHDguC;#Ew4J&^lI6m6GEOK1+Wb(4! zWH0}R$cJ~MrlPXk9)-SrF}RU;QC~=N0!pV}_6?aISS0*x{+sENox&^)GwDIY3icGb z9XQ{)-zxs+l_zpIKgS>5=b99t+w^HqC`*qGnb}c5zy3$r0p7<2j*XU*+4sjSsZ*S` ziu@mGnI`$nHltUmMO-Uft(`^m!MsDIjtv;s9w z`DOoO)zjLZHJ!%QSF^vrn<&lAVXWS8=n2DO47kfkgY@I!YUCmfp?CnS@xSdO`5r8kRyqzKJ3<73C zKU$=zaO7}A!8SGU*1Qf4>~aoe?q>mwbLiFN$?mxQ4+M+SXYaUpgF9UZwt)>`Aqajh I1oq&60qYcbo&W#< diff --git a/jeu/www/sound/pong/2.ogg b/jeu/www/sound/pong/2.ogg deleted file mode 100644 index 0f09bb3057cf801d9b9dd7c4c6f7feb4092f51a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4378 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 I0B1J)AM6m6LjV8( diff --git a/jeu/www/sound/pong/20.ogg b/jeu/www/sound/pong/20.ogg deleted file mode 100644 index 11ac780e985c9e1410d152434c8d0392751684d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4238 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 Xe6?FHo3(r+AdOF8TE{WQBBQ?m2bNen diff --git a/jeu/www/sound/pong/22.ogg b/jeu/www/sound/pong/22.ogg deleted file mode 100644 index b2ca975852361bc914636fdd03ace40c491f719d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4343 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 diff --git a/jeu/www/sound/pong/24.ogg b/jeu/www/sound/pong/24.ogg deleted file mode 100644 index 90093efc7e6aa6f17613621bd0b952f890a4eaf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4241 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 diff --git a/jeu/www/sound/pong/25.ogg b/jeu/www/sound/pong/25.ogg deleted file mode 100644 index 27dfe8eb65134e787b8b1a3893765dad077884a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4348 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 A%K!iX diff --git a/jeu/www/sound/pong/26.ogg b/jeu/www/sound/pong/26.ogg deleted file mode 100644 index 80cb60faaf2968a2b91934455797ca0ed2b6f1a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4399 zcmd5_w%+!!4 z$xKZ#UX5$yM}v(yR#s?fnUXP9<^-Lv>}#}g=63dr%{gM$CZK+5MbtX=e*qJM?)+OrcVgh| znrrKl&tgCRv3Z$K;gH~RBsVS5JtRE=pTdpZYC^};@LnEX9v-VaNO%H+6EBS8rY7Jw zq-Jo_cc$_5lbG>fSx{0C+IRw#)9xVUiQ#!|)|`XL9t#B*b5Y%%>%jo6+- zJ;}EXQ;@Y~$@Ski;l)_Tuq{N3QbqxT>kwCnQrJzj#ezA$OHamOqiH`598W&%-|Qr| zkuidZS0s!)ilswXKJluAL8r`EEST-9cM2<@6Z|if@#~tT(zwG4K{4In5+6jN60?ix zGit&%Q>ZJY0}SGPK7*0u{}euw(u^0|eAipZMD=W6hjmn0fh_=F^D1$9X5yTBGvEcl zveJ-3n2fi?f#Js_4q&Rx=||CV2nwS%0v?5bXnwykVQYrHwwbr3_FQ0<){w_D=9%!#W z&O7JpT0HgC=>xb8x!mj3GlouIc1g5Ow^9V2K3&9khL?nQ(ugOgEVl%}S!~OoI%j_x za-DNr8*s3r2j3T`-l-bpSY^(L~5Q z?Ncy9Eq0+vt7+v=SXDcc?yHJX|g_ zTm$(enk0NvQ+RMw_$E7M2=m{ymBD?aVCdMzFzY~j?2#Xz;GGvQe)0g@fjw64xx~5Y zE9YrN#Sc8E+hvt|RavJ$pp0O%7C@(c4g#R%o%m~5{&jMo;@BLr;fz4yXmF}2U?dQ) z9*@0AD7nX|Kf*6y1fD%DiFI|$kT8xYI$^Y!Il-T+7^*)FgaRP;q!O!bWAn+iW$W{a zhU5GkPrVbrfNZD`FqRq01e@tsaBx~%#%K60E#YsbFRg^}0cOD8tjgX(JIuN=Ao4Hv z3wccnm5@SgH-rh;p(M8UwO{|+pfKi|+u_VGCT}pD$&&i@kk<5tGkZwPemI49hjat8 zpVuc8>IBRoDNi@Sj<(MTW%7o?*}7Fs?KpdIJd-sbjC<|J{3WPQxTa6Q=@;^%g>3dj zP?$7WTf*rR@^mE}_Abug#L7MayN}5k6tD*~I1w#u)_7*0F#BN%Cnkc!!ey{0vZJ*n zPXz3t2u{SRt#CD3n>{=r++OMz!i31|9uhl3$c~9%YX?^LNl@g$a5gIgBC{g~ggqn_ zS?A4;kfO*DQsIyQ3UgTRm=WVbmbPSgfH%B~t({=9#f7RZnXA`gw7snM14{F}n(ealV&cjwq1-JfU1}UF$mQ(sN_y`N=j_zS1~}!09qw z$2nu$n_t@+Tu+aF=t%17Xt>|(`BPh}>!mcOu4JRe)7Tc;Ec`a+8>`E21VZ-i9qeo4 zLcvI&&pr)2S`2!$b2aNKotK-5d@$gs%b}`xRuzFICFIGUs;d&!%4)7$!7b-T$r5C8 zE}|mJl&)MEH>!MxOjcVePn0Q>W%BwwIk8Kgq)~BYs!_Fy*Q!j>RdG$z6q($$RaK`` zjy_XYv*e21<=mul2xSsh*6l7&+Ebp0loJpn2|>;xh-)-ll|5C+m*zo^{HzRF)+I;o ztGGyW3WD%jk2`o;URLj6G#$@ta8<<{{*!{k!6NbIaDJ>hAfXRua%+5`a^OE z?s`IwXrzWx1R_5>RGw@?PP&h9Whk=S3Hh=vC2z9Ls8OXNND4$YqDrQ8wT)?z7bXKu zYN*_Fs zQI#@@)PGPf*Qs|Jy>#Q50Wbu^R`PT(Phbd+b0F(Bi5JaeMtcYMH*;VJ!Yg$ZO z(Liv2BabEJZExlbL*W)q^te!4B8<^yj%YbUdbR3#m+I^!Qum?x#bigCQTfse09+aX zmL8SXwvMVfAQ#>W`P=h7Esrp6k!MtfYRCqB{4IY==aO!+rL&|M@+1;3171?hu!L09 zEN6*?k!%5gtq;7n?o|-a`JmB)5rqSgH4+K^S(S8O6-O(FUR5B?+wp(-vssc6WN zD-fm8D4XIKpF#haIBK=KtV)3(Mzu-_4+T*!Z&i&NA%Pe*O4rE_M6Fy7U25!TfZO2_ z=$d!_1aJ4YvB{32vqrW1uN|J&ff(>;=4`Oe!n?j8jX|=HOuSA9cyl1~nC_f~rA&7g z7c%J1HIg~-x_$&-tJ^3J1XBD4fL#h5vYuFtzH?14-v2pJ|JlMn+@bhaQ2%hp{|f&9 zfpEz`ch&#JJ}Xd|mj(*={2rN97-adObYf>&7S>abi|eHkh_T(|PA3?OPn^V92G^}c z17o!ME`wLfXG9%_LMsf_)wa<$$p;yX!{_v}^P?4utMn2g9AG$Cbomx7Fqf-Hv zat6mo^F&-|T7`uZf3~lw*q$*TR@^XS&{Ps*=>#~yRWa5V9ZVEDFzBY~%u2}?0Ja@4 z2kS&Ob&JYuk675F$q7pkk(0E7aZBu9;D6M{UlY2*h7v@+T^hSNX@y-_AsKs8FvlUu zfAA}>S@8D81AO~5EDle2N3qQHghgy_H+E(=v!T7h+R;gmX*UlL2Y|xk71Y)XB6ssY z_g-bspjc9{-$gpD!_4&Y8O~Yy;HCJBvWl?qXLz)-0@mOWOsfj8aG|WO;X?cM-g}Rp zzJw(rZ1&(C06uF)xw-mfuI?UQByS&IzrTIXi9{lk)H*ndM5Yh6X#m=THuQrH6%>B? z#@-e)6KiK{XKy#(8IN;xbeKQ?P_7tUytnw3IV#$CPuCL(+7+qfhY>dV2j-3Uw5;@; z*z)o{3*zIiSV^mUa%0Wv2l%URovSQ7HMU~O=;N%0hc*H8>hB)3``NlSS8W@2zU0XH zhS!1wqHp!xoU!zry}doPd#)d- zP;qI~L<(_{q0MtpiATb5%}!MD%(xjp;#Zf-9cE&3_< zzQ@~^zr3w!iE1S${(AY#ARXUBbxJy`%Fik5%tf~h`pNg#c779-wI$%U44QpX0DSqDRZ^ZTti#5_hnnBX{UsDIhA`Oy5khu#PTHHSW2Q_P%xVt?R(?cgA_w`Wb%$TpYH zauVmIUfFeUkMc3sa&GSY&>NfE=1lL6bDXp(0p*IJ7j0lb)ZXx*Mrkex5of2**(y{L zRx{u1=alng{}q06zprF0oV z!wEmn-SGMpd)K4wI;z=%8^8I4d0;f#a1Y1_i$=+vxGd3vZM2Tho4i^FFOA%Np5vCd z=KXulmpvc5tiqcv>2Nu-@8`5gY7fU`kGL7V8&c=hzLYW65{d0^q$7Lfzb+nBq|+T;gTn;VVZ;6>V&ZFQm*c|QQ~R|-Uov;Y7A diff --git a/jeu/www/sound/pong/27.ogg b/jeu/www/sound/pong/27.ogg deleted file mode 100644 index 13332de644c46885bb092b2b671e1a26b5bcb14d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4227 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 diff --git a/jeu/www/sound/pong/28.ogg b/jeu/www/sound/pong/28.ogg deleted file mode 100644 index 29615795329d22b87942cafaeb723234c0f6b02c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4160 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 PmeuZCcTAVmE?WK<#WD_& diff --git a/jeu/www/sound/pong/29.ogg b/jeu/www/sound/pong/29.ogg deleted file mode 100644 index 41f953432ca83a51dcd32e5fcb76f3fdde187a74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4205 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 K<#RQd)&B!XG)(^h diff --git a/jeu/www/sound/pong/31.ogg b/jeu/www/sound/pong/31.ogg deleted file mode 100644 index 4447b52aba0950509d1897bd1e580dbf21d0038a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4319 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 bgD*ug-Cjo8|C+K4e0m2+=a4^mgsJ~;6*glX diff --git a/jeu/www/sound/pong/32.ogg b/jeu/www/sound/pong/32.ogg deleted file mode 100644 index a58240a199bc12a8f2344f098a2a90198327ce87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4397 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 Bi248k diff --git a/jeu/www/sound/pong/4.ogg b/jeu/www/sound/pong/4.ogg deleted file mode 100644 index 688b1f81469413df22373bdb217f2aefe960b3e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4464 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 T&bE+U1#C;)g^QWI4TgUMw~Vm9 diff --git a/jeu/www/sound/pong/5.ogg b/jeu/www/sound/pong/5.ogg deleted file mode 100644 index d2163268bfeef79ceb362fd2dc3f7bdd13f1f3d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4220 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 I`Q4(w0+*p2tN;K2 diff --git a/jeu/www/sound/pong/7.ogg b/jeu/www/sound/pong/7.ogg deleted file mode 100644 index 9c9c994f7d387f7166b403194366e816c4baf583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4442 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 O<6q*+E4H|UN&f&x8>s>S diff --git a/jeu/www/sound/pong/8.ogg b/jeu/www/sound/pong/8.ogg deleted file mode 100644 index 0f9acf9968e994117ed9136747447e7989a19bab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4351 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 Gi2ECRx@F@4 diff --git a/jeu/www/sound/pong/9.ogg b/jeu/www/sound/pong/9.ogg deleted file mode 100644 index 15d82091bd70e6e6b7594b8358af7db583c28f53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4291 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�zdXr7cPdag)Z~el?Z)?@X z$<*y}KXHP90zJ-g5u$Ph47IDL2g5xPMUXXt35%(uU9n;={>7Lk z;Qlt9`SYPZTR)!O+f8~wwY?uS4(zS`srx+nZ*^v-WW&HB{z`R~Ms#PJ8VD@}|_ zq#tMYoEhDADYI6XCZEYStv+Tz@=OwIawYD^FG@!?M@Z849sj~LxzDN~?Ci*a{&5S- zzLtwaOU|LZVp;MSJia|j6WxI9JM?b7YybvjnXab>@1EDhq3n+fjBJy{XxvTCfiCHg zIM}?TvTV>J6jh^O7G!&7->gQ{h{A==x9_G5{apF@@pVpLZ*IMO?keg_IE78HB7kMv77+YRYsTglS6OBFRmpt5KY4ymI=WT)qv1;5*hSU8J;#6hE_KeW^%m|o zC$SGH)VQ9qY<}@nrV)K=@U#=LN$!_x#bLknu^mS@>%C2mseEf9vz=Yy5!%>^z z+SXskCkTP*AHxQ@i)vB@5qi6O8;cf|yA6&GtD$0TyC-dfldq4N+FqMg2a?p3HZ$rM9=H0p<#Jg|-oBf^XYx}cj%%+b9-n>UQLS3}HwpVa> zO-pPD(fO(S_{Sz@Z$nzzm{e7^`$h>CME^X%MFhF z&!!lS29-=f_%$TghH>hLMZxatUG4Nu+WXI0r-+G$9d#G&T=zP-P@J3U#@^qZQKy|x z=#yDT*G@fu^>PXRry(_qnEU>9g1xu;PtKgaKRJotaNEKs$Y%fD-R9RYdD5B6ujoo& zO+Ednv5P+$@IGnEe79SSs5wY3h2=4@)~q;A@+6+k^w}QM=E3)KulKL-dA$soiF)>7 zIbFwZjk7L?iuRW752YP@oV%CooJXA?tkH6~-BFw7@zT{OyVZ8z%CzOhrp=!`mi*?z zB+~eAc}tcK*fQyH;Lb?2HB3;#uVdY z+so2kS5LpOt9}&O^J*q$g5mtaar&1HKgI-dGwQlr1i5f<~ug!~;9E7}_sD(#DopL!xIE>2XU4xN)L z8k%aEDx!MTasv0LP0saJ*I+h9Z&I4|U#mYlEHYK!zJ&6HR94u3;Kt)uv9*GGRYs$O@(J#NPc_RuOLmARWM?|!HHHYSQ!7BUbZI^?lfLe@`hHBNmq_addi z#WeDz{}tSU^P~B8GjrR2x@A;oxua%BrhHb^Gi->q*&!hU1n~YDlwgXMs*;!m-^%Ee|H9>-TGX>WXz_`{~cN4p^J2-*9rVOI+?9Sm-hrPtD;wCJ!v# zv}G_?sqmU7GJ!U48fcFqRyca#OpS~zEUPopse|PBR{EKVfdKZ5=ZZ1G&aqu#?&c)W$Ckcn!pjJpJXESmnum-xJPa$@kap^)8nK z7rNHE$2Qcg{lwofcXqL4S6Rvw&| zghzUEF(}{|;bFua?EbjAq3C_V$GnJ4ftbiNz9l$MG%AcT>gp)hr5|{DQnLDJi|zS{ z2SJLlKI%=cd)|Ge8vUWbJal=Nas-S1MS%l$9cP3%bsc)FVl|Gn7uGOYFJzF>)t z>eXS&`NXdqzdp32NzCe;B*Vq*>yn>a$=htYrwNvON<%Ju-C-}gR9q`s UUsjEEkpJHXAU^UBQk$p013HTK@&Et; From 27a4bfae7a9e989539b9321143cf0e21bb8d6e82 Mon Sep 17 00:00:00 2001 From: batche Date: Mon, 19 Dec 2022 09:34:34 +0100 Subject: [PATCH 13/45] lien serveur de jeu => serveur nestjs --- srcs/requirements/nestjs/api_back/.env | 5 +- .../nestjs/api_back/package-lock.json | 1687 +++++++++-------- .../nestjs/api_back/src/app.module.ts | 4 +- .../api_back/src/game/dto/grantTicket.dto.ts | 13 + .../src/game/dto/validateTicket.dto.ts | 18 + .../api_back/src/game/entity/game.entity.ts | 3 +- .../src/game/entity/tokenGame.entity.ts | 20 + .../api_back/src/game/game.controller.ts | 58 +- .../nestjs/api_back/src/game/game.module.ts | 21 +- .../nestjs/api_back/src/game/game.service.ts | 151 +- .../api_back/src/redis/redis.service.ts | 1 - .../api_back/src/users/users.controller.ts | 1 - 12 files changed, 1124 insertions(+), 858 deletions(-) create mode 100644 srcs/requirements/nestjs/api_back/src/game/dto/grantTicket.dto.ts create mode 100644 srcs/requirements/nestjs/api_back/src/game/dto/validateTicket.dto.ts create mode 100644 srcs/requirements/nestjs/api_back/src/game/entity/tokenGame.entity.ts delete mode 100644 srcs/requirements/nestjs/api_back/src/redis/redis.service.ts diff --git a/srcs/requirements/nestjs/api_back/.env b/srcs/requirements/nestjs/api_back/.env index 7799ac26..5f815441 100644 --- a/srcs/requirements/nestjs/api_back/.env +++ b/srcs/requirements/nestjs/api_back/.env @@ -7,7 +7,7 @@ POSTGRES_DATABASE=transcendance_db # OAUTH2 42 API FORTYTWO_CLIENT_ID=u-s4t2ud-49dc7b539bcfe1acb48b928b2b281671c99fc5bfab1faca57a536ab7e0075500 -FORTYTWO_CLIENT_SECRET=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 +FORTYTWO_CLIENT_SECRET=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 FORTYTWO_CALLBACK_URL=http://transcendance:8080/api/v2/auth/redirect COOKIE_SECRET=248cdc831110eec8796d7c1edbf79835 # JWT @@ -20,3 +20,6 @@ REDIS_PORT=6379 REDIS_PASSWORD=1a5e04138b91b3d683c708e4689454c2 #2fa TWO_FACTOR_AUTHENTICATION_APP_NAME=Transcendance + +NAME_OF_REDIS_DB = tokenGameDatabase +TICKET_FOR_PLAYING_GAME_SECRET = a2aef785c388497f5fca18f9ccff37ed diff --git a/srcs/requirements/nestjs/api_back/package-lock.json b/srcs/requirements/nestjs/api_back/package-lock.json index 9678a46f..88f1e737 100644 --- a/srcs/requirements/nestjs/api_back/package-lock.json +++ b/srcs/requirements/nestjs/api_back/package-lock.json @@ -237,30 +237,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", - "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", + "@babel/generator": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.5", + "@babel/parser": "^7.20.5", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -285,12 +285,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", - "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", "dev": true, "dependencies": { - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.5", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -313,12 +313,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.3", + "@babel/compat-data": "^7.20.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -386,40 +386,40 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "dependencies": { - "@babel/types": "^7.19.4" + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -465,14 +465,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", - "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", "dev": true, "dependencies": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.4", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, "engines": { "node": ">=6.9.0" @@ -564,9 +564,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", - "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -723,12 +723,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -752,19 +752,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", - "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", + "@babel/generator": "^7.20.5", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -782,9 +782,9 @@ } }, "node_modules/@babel/types": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", - "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -834,15 +834,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -879,14 +879,14 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -911,6 +911,13 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "optional": true, + "peer": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1450,9 +1457,9 @@ } }, "node_modules/@nestjs/cli": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.1.4.tgz", - "integrity": "sha512-cvN4DcLzaqFzKRmpU3tOeLmw7+1p4XXsFLyWgteId0Szf6cAk5KJpD5jl2Kw7f39vNw9Pss8yiJ1q1CD/fcbwQ==", + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.1.5.tgz", + "integrity": "sha512-rSp26+Nv7PFtYrRSP18Gv5ZK8rRSc2SCCF5wh4SdZaVGgkxShpNq9YEfI+ik/uziN3KC5o74ppYRXGj+aHGVsA==", "dev": true, "dependencies": { "@angular-devkit/core": "14.2.2", @@ -1474,7 +1481,7 @@ "tree-kill": "1.2.2", "tsconfig-paths": "4.1.0", "tsconfig-paths-webpack-plugin": "4.0.0", - "typescript": "4.8.3", + "typescript": "4.8.4", "webpack": "5.74.0", "webpack-node-externals": "3.0.0" }, @@ -1486,9 +1493,9 @@ } }, "node_modules/@nestjs/cli/node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -1498,13 +1505,60 @@ "node": ">=4.2.0" } }, + "node_modules/@nestjs/cli/node_modules/webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, "node_modules/@nestjs/common": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.1.4.tgz", - "integrity": "sha512-hmGTZ8ShKFDqqlU02uU8e/8PNE4bnES4pcFa6s/T1pLDYWjyf/75Klunro1W4aQPHcxnnohBmB27WxMqFTPEfw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.2.1.tgz", + "integrity": "sha512-nZuo3oDsSSlC5mti/M2aCWTEIfHPGDXmBwWgPeCpRbrNz3IWd109rkajll+yxgidVjznAdBS9y00JkAVJblNYw==", "dependencies": { "iterare": "1.2.1", - "tslib": "2.4.0", + "tslib": "2.4.1", "uuid": "9.0.0" }, "funding": { @@ -1546,14 +1600,6 @@ "rxjs": "^6.0.0 || ^7.2.0" } }, - "node_modules/@nestjs/config/node_modules/dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==", - "engines": { - "node": ">=12" - } - }, "node_modules/@nestjs/config/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -1563,9 +1609,9 @@ } }, "node_modules/@nestjs/core": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.1.4.tgz", - "integrity": "sha512-S6KpGeKotPYh126hhRqYLhvg9lxSbAmGfEbK8m09crIK7CYP05t32KtT6n12xl5/iva1G4Ch87Z/3rYP76etUg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.2.1.tgz", + "integrity": "sha512-a9GkXuu8uXgNgCVW+17iI8kLCltO+HwHpU2IhR+32JKnN2WEQ1YEWU4t3GJ2MNq44YkjIw9zrKvFkjJBlYrNbQ==", "hasInstallScript": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", @@ -1573,7 +1619,7 @@ "iterare": "1.2.1", "object-hash": "3.0.0", "path-to-regexp": "3.2.0", - "tslib": "2.4.0", + "tslib": "2.4.1", "uuid": "9.0.0" }, "funding": { @@ -1612,14 +1658,6 @@ "@nestjs/common": "^8.0.0 || ^9.0.0" } }, - "node_modules/@nestjs/jwt/node_modules/@types/jsonwebtoken": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", - "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@nestjs/mapped-types": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.2.0.tgz", @@ -1649,15 +1687,15 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.1.4.tgz", - "integrity": "sha512-SLJWDa6V54QrUvzKI4Eyt7gyrjV7F9FY1uHFihshjmQfpf0ebCGacR9jzNwf01aHl0BJX3DUn/KYteBjz6DJXw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.2.1.tgz", + "integrity": "sha512-7PecaXt8lrdS1p6Vb1X/am3GGv+EO1VahyDzaEGOK6C0zwhc0VPfLtwihkjjfhS6BjpRIXXgviwEjONUvxVZnA==", "dependencies": { - "body-parser": "1.20.0", + "body-parser": "1.20.1", "cors": "2.8.5", - "express": "4.18.1", + "express": "4.18.2", "multer": "1.4.4-lts.1", - "tslib": "2.4.0" + "tslib": "2.4.1" }, "funding": { "type": "opencollective", @@ -1668,65 +1706,6 @@ "@nestjs/core": "^9.0.0" } }, - "node_modules/@nestjs/platform-express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@nestjs/platform-express/node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.10.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/@nestjs/platform-express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/@nestjs/platform-express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, "node_modules/@nestjs/schematics": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-9.0.3.tgz", @@ -1824,12 +1803,12 @@ "dev": true }, "node_modules/@nestjs/testing": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.1.4.tgz", - "integrity": "sha512-gO6b9QJyUajh38DNdss9gSE0UO7x60Jh10W4SwHEjQT1W+yxaEWr3aLyuQItTvUVY6C28XKFLTykMpr8GO28Ug==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.2.1.tgz", + "integrity": "sha512-lemXZdRSuqoZ87l0orCrS/c7gqwxeduIFOd21g9g2RUeQ4qlWPegbQDKASzbfC28klPyrgJLW4MNq7uv2JwV8w==", "dev": true, "dependencies": { - "tslib": "2.4.0" + "tslib": "2.4.1" }, "funding": { "type": "opencollective", @@ -1991,9 +1970,9 @@ } }, "node_modules/@redis/client": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.3.1.tgz", - "integrity": "sha512-FKEHpOu7Q4+cuM6VWjA54988K5jkqOxvhvj2hEGSx086lvKwXyjzO7Lya7hcirZ0/Db8FLBJN7UXsJuyoNWPJg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz", + "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==", "dependencies": { "cluster-key-slot": "1.1.1", "generic-pool": "3.9.0", @@ -2028,23 +2007,23 @@ } }, "node_modules/@redis/time-series": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz", - "integrity": "sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", "peerDependencies": { "@redis/client": "^1.0.0" } }, "node_modules/@sinclair/typebox": { - "version": "0.24.47", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.47.tgz", - "integrity": "sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A==", + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" @@ -2089,9 +2068,9 @@ "devOptional": true }, "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -2121,9 +2100,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dev": true, "dependencies": { "@babel/types": "^7.3.0" @@ -2153,9 +2132,9 @@ "dev": true }, "node_modules/@types/eslint": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.7.tgz", - "integrity": "sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw==", + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2179,12 +2158,12 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.31", "@types/qs": "*", "@types/serve-static": "*" } @@ -2257,10 +2236,9 @@ "dev": true }, "node_modules/@types/jsonwebtoken": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", - "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", - "dev": true, + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", + "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", "dependencies": { "@types/node": "*" } @@ -2280,9 +2258,9 @@ } }, "node_modules/@types/node": { - "version": "16.11.68", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.68.tgz", - "integrity": "sha512-JkRpuVz3xCNCWaeQ5EHLR/6woMbHZz/jZ7Kmc63AkU+1HxnoUugzSWMck7dsR4DvNYX8jp9wTi9K7WvnxOIQZQ==" + "version": "16.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.10.tgz", + "integrity": "sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2300,9 +2278,9 @@ } }, "node_modules/@types/passport-jwt": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.7.tgz", - "integrity": "sha512-qRQ4qlww1Yhs3IaioDKrsDNmKy6gLDLgFsGwpCnc2YqWovO2Oxu9yCQdWHMJafQ7UIuOba4C4/TNXcGkQfEjlQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.8.tgz", + "integrity": "sha512-VKJZDJUAHFhPHHYvxdqFcc5vlDht8Q2pL1/ePvKAgqRThDaCc84lSYOTQmnx3+JIkDlN+2KfhFhXIzlcVT+Pcw==", "dev": true, "dependencies": { "@types/express": "*", @@ -2357,9 +2335,9 @@ } }, "node_modules/@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "node_modules/@types/serve-static": { @@ -2378,9 +2356,9 @@ "dev": true }, "node_modules/@types/superagent": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz", - "integrity": "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.16.tgz", + "integrity": "sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ==", "dev": true, "dependencies": { "@types/cookiejar": "*", @@ -2397,14 +2375,14 @@ } }, "node_modules/@types/validator": { - "version": "13.7.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.9.tgz", - "integrity": "sha512-y5KJ1PjGXPpU4CZ7lThDu31s+FqvzhqwMOR6Go/x6xaQMFjgzwfzfOvCwABsylr/5n8sB1qFQm1Vi7TaCB8P+A==" + "version": "13.7.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.10.tgz", + "integrity": "sha512-t1yxFAR2n0+VO6hd/FJ9F2uezAZVWHLmpmlJzm1eX03+H7+HsuTAp7L8QJs+2pQCfWkP1+EXsGK9Z9v7o/qPVQ==" }, "node_modules/@types/yargs": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", - "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -2417,16 +2395,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz", - "integrity": "sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", + "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.40.1", - "@typescript-eslint/type-utils": "5.40.1", - "@typescript-eslint/utils": "5.40.1", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/type-utils": "5.46.1", + "@typescript-eslint/utils": "5.46.1", "debug": "^4.3.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -2449,14 +2428,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.1.tgz", - "integrity": "sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", + "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.40.1", - "@typescript-eslint/types": "5.40.1", - "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", "debug": "^4.3.4" }, "engines": { @@ -2476,13 +2455,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz", - "integrity": "sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", + "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.1", - "@typescript-eslint/visitor-keys": "5.40.1" + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2493,13 +2472,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz", - "integrity": "sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", + "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.40.1", - "@typescript-eslint/utils": "5.40.1", + "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/utils": "5.46.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2520,9 +2499,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.1.tgz", - "integrity": "sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", + "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2533,13 +2512,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz", - "integrity": "sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", + "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.1", - "@typescript-eslint/visitor-keys": "5.40.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2560,16 +2539,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.1.tgz", - "integrity": "sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", + "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.40.1", - "@typescript-eslint/types": "5.40.1", - "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -2586,12 +2565,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz", - "integrity": "sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", + "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/types": "5.46.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2773,9 +2752,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "devOptional": true, "bin": { "acorn": "bin/acorn" @@ -2908,9 +2887,9 @@ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -3144,9 +3123,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -3156,7 +3135,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -3340,9 +3319,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001422", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", - "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", "dev": true, "funding": [ { @@ -3420,10 +3399,13 @@ } }, "node_modules/ci-info": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", - "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", - "dev": true + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/cjs-module-lexer": { "version": "1.2.2", @@ -3746,9 +3728,9 @@ } }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", @@ -3859,6 +3841,16 @@ "node": ">=0.4.0" } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3943,9 +3935,9 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", + "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==", "engines": { "node": ">=12" } @@ -4017,9 +4009,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -4070,14 +4062,15 @@ } }, "node_modules/eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4093,14 +4086,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -4279,9 +4272,9 @@ "dev": true }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "dependencies": { "acorn": "^8.8.0", @@ -4513,29 +4506,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4554,20 +4524,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -4628,9 +4584,9 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4837,21 +4793,6 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/formidable/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5009,9 +4950,9 @@ "dev": true }, "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5163,9 +5104,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true, "engines": { "node": ">= 4" @@ -5296,6 +5237,31 @@ "node": ">= 0.10" } }, + "node_modules/ioredis": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.2.4.tgz", + "integrity": "sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==", + "optional": true, + "peer": true, + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.0.1", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -5390,6 +5356,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -5933,9 +5908,9 @@ } }, "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { "node": ">=6" @@ -6316,10 +6291,14 @@ } }, "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } }, "node_modules/js-tokens": { "version": "4.0.0", @@ -6369,9 +6348,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -6478,9 +6457,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.14.tgz", - "integrity": "sha512-McGS7GV/WjJ2KjfOGhJU1oJn29RYeo7Q+RpANRbUNMQ9gj5XArpbjurSuyYPTejFwbaUojstQ4XyWCrAzGOUXw==" + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.15.tgz", + "integrity": "sha512-sLeVLmWX17VCKKulc+aDIRHS95TxoTsKMRJi5s5gJdwlqNzMWcBCtSHHruVyXjqfi67daXM2SnLf2juSrdx5Sg==" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -6517,11 +6496,25 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "optional": true, + "peer": true + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "optional": true, + "peer": true + }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -6680,9 +6673,9 @@ } }, "node_modules/memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", "dev": true, "dependencies": { "fs-monkey": "^1.0.3" @@ -6845,6 +6838,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -6905,9 +6904,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, "node_modules/normalize-path": { @@ -7544,9 +7543,9 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -7773,9 +7772,9 @@ } }, "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -7895,16 +7894,39 @@ } }, "node_modules/redis": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.4.0.tgz", - "integrity": "sha512-tQyFG6O9iewLxxHYRyirJNklhe2QI7M/0o8q0jk7D9Z/Cxh/7oZrQyHKyjWz0TkkCls8ool/xvhL9K8zRnkaYQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz", + "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==", "dependencies": { "@redis/bloom": "1.1.0", - "@redis/client": "1.3.1", + "@redis/client": "1.4.2", "@redis/graph": "1.1.0", "@redis/json": "1.0.4", "@redis/search": "1.1.0", - "@redis/time-series": "1.0.3" + "@redis/time-series": "1.0.4" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "optional": true, + "peer": true, + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/reflect-metadata": { @@ -8072,9 +8094,9 @@ } }, "node_modules/rxjs": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", - "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dependencies": { "tslib": "^2.1.0" } @@ -8362,6 +8384,7 @@ "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, "node_modules/split2": { @@ -8379,9 +8402,9 @@ "dev": true }, "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" @@ -8399,6 +8422,13 @@ "node": ">=8" } }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "optional": true, + "peer": true + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -8496,10 +8526,9 @@ } }, "node_modules/superagent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.2.tgz", - "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", - "deprecated": "Please use v8.0.0 until https://github.com/visionmedia/superagent/issues/1743 is resolved", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.6.tgz", + "integrity": "sha512-HqSe6DSIh3hEn6cJvCkaM1BLi466f1LHi4yubR0tpewlMpk4RUFFy35bKz8SsPBwYfIIJy5eclp+3tCYAuX0bw==", "dev": true, "dependencies": { "component-emitter": "^1.3.0", @@ -8507,11 +8536,11 @@ "debug": "^4.3.4", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", - "formidable": "^2.0.1", + "formidable": "^2.1.1", "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.0", - "semver": "^7.3.7" + "semver": "^7.3.8" }, "engines": { "node": ">=6.4.0 <13 || >=14" @@ -8529,29 +8558,14 @@ "node": ">=4.0.0" } }, - "node_modules/superagent/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/supertest": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.0.tgz", - "integrity": "sha512-QgWju1cNoacP81Rv88NKkQ4oXTzGg0eNZtOoxp1ROpbS4OHY/eK5b8meShuFtdni161o5X0VQvgo7ErVyKK+Ow==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", "dev": true, "dependencies": { "methods": "^1.1.2", - "superagent": "^8.0.0" + "superagent": "^8.0.5" }, "engines": { "node": ">=6.4.0" @@ -8628,9 +8642,9 @@ } }, "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -8872,9 +8886,9 @@ } }, "node_modules/ts-loader": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", - "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -9003,9 +9017,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -9079,9 +9093,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typeorm": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.10.tgz", - "integrity": "sha512-VMKiM84EpJQ+Mz9xDIPqnfplWhyUy1d8ccaKdMY9obifxJOTFnv8GYVyPsGwG8Lk7Nb8MlttHyHWENGAhBA3WA==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.11.tgz", + "integrity": "sha512-pzdOyWbVuz/z8Ww6gqvBW4nylsM0KLdUCDExr2gR20/x1khGSVxQkjNV/3YqliG90jrWzrknYbYscpk8yxFJVg==", "dependencies": { "@sqltools/formatter": "^1.2.2", "app-root-path": "^3.0.0", @@ -9115,7 +9129,7 @@ "peerDependencies": { "@google-cloud/spanner": "^5.18.0", "@sap/hana-client": "^2.12.25", - "better-sqlite3": "^7.1.2", + "better-sqlite3": "^7.1.2 || ^8.0.0", "hdb-pool": "^0.1.6", "ioredis": "^5.0.4", "mongodb": "^3.6.0", @@ -9243,9 +9257,9 @@ } }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -9417,10 +9431,11 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -9666,9 +9681,9 @@ } }, "node_modules/yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -9676,7 +9691,7 @@ "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -9842,27 +9857,27 @@ } }, "@babel/compat-data": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", - "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", "dev": true }, "@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", + "@babel/generator": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.5", + "@babel/parser": "^7.20.5", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -9879,12 +9894,12 @@ } }, "@babel/generator": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", - "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", "dev": true, "requires": { - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.5", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -9903,12 +9918,12 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.3", + "@babel/compat-data": "^7.20.0", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", "semver": "^6.3.0" @@ -9957,34 +9972,34 @@ } }, "@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" } }, "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { - "@babel/types": "^7.19.4" + "@babel/types": "^7.20.2" } }, "@babel/helper-split-export-declaration": { @@ -10015,14 +10030,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", - "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", "dev": true, "requires": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.4", - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" } }, "@babel/highlight": { @@ -10095,9 +10110,9 @@ } }, "@babel/parser": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", - "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -10209,12 +10224,12 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/template": { @@ -10229,19 +10244,19 @@ } }, "@babel/traverse": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", - "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", + "@babel/generator": "^7.20.5", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -10255,9 +10270,9 @@ } }, "@babel/types": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", - "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.19.4", @@ -10300,15 +10315,15 @@ } }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -10337,14 +10352,14 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, "@humanwhocodes/module-importer": { @@ -10359,6 +10374,13 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "optional": true, + "peer": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -10785,9 +10807,9 @@ } }, "@nestjs/cli": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.1.4.tgz", - "integrity": "sha512-cvN4DcLzaqFzKRmpU3tOeLmw7+1p4XXsFLyWgteId0Szf6cAk5KJpD5jl2Kw7f39vNw9Pss8yiJ1q1CD/fcbwQ==", + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.1.5.tgz", + "integrity": "sha512-rSp26+Nv7PFtYrRSP18Gv5ZK8rRSc2SCCF5wh4SdZaVGgkxShpNq9YEfI+ik/uziN3KC5o74ppYRXGj+aHGVsA==", "dev": true, "requires": { "@angular-devkit/core": "14.2.2", @@ -10809,26 +10831,58 @@ "tree-kill": "1.2.2", "tsconfig-paths": "4.1.0", "tsconfig-paths-webpack-plugin": "4.0.0", - "typescript": "4.8.3", + "typescript": "4.8.4", "webpack": "5.74.0", "webpack-node-externals": "3.0.0" }, "dependencies": { "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true + }, + "webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } } } }, "@nestjs/common": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.1.4.tgz", - "integrity": "sha512-hmGTZ8ShKFDqqlU02uU8e/8PNE4bnES4pcFa6s/T1pLDYWjyf/75Klunro1W4aQPHcxnnohBmB27WxMqFTPEfw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.2.1.tgz", + "integrity": "sha512-nZuo3oDsSSlC5mti/M2aCWTEIfHPGDXmBwWgPeCpRbrNz3IWd109rkajll+yxgidVjznAdBS9y00JkAVJblNYw==", "requires": { "iterare": "1.2.1", - "tslib": "2.4.0", + "tslib": "2.4.1", "uuid": "9.0.0" } }, @@ -10843,11 +10897,6 @@ "uuid": "8.3.2" }, "dependencies": { - "dotenv": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", - "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==" - }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -10856,16 +10905,16 @@ } }, "@nestjs/core": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.1.4.tgz", - "integrity": "sha512-S6KpGeKotPYh126hhRqYLhvg9lxSbAmGfEbK8m09crIK7CYP05t32KtT6n12xl5/iva1G4Ch87Z/3rYP76etUg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.2.1.tgz", + "integrity": "sha512-a9GkXuu8uXgNgCVW+17iI8kLCltO+HwHpU2IhR+32JKnN2WEQ1YEWU4t3GJ2MNq44YkjIw9zrKvFkjJBlYrNbQ==", "requires": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", "object-hash": "3.0.0", "path-to-regexp": "3.2.0", - "tslib": "2.4.0", + "tslib": "2.4.1", "uuid": "9.0.0" } }, @@ -10876,16 +10925,6 @@ "requires": { "@types/jsonwebtoken": "8.5.8", "jsonwebtoken": "8.5.1" - }, - "dependencies": { - "@types/jsonwebtoken": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", - "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", - "requires": { - "@types/node": "*" - } - } } }, "@nestjs/mapped-types": { @@ -10901,73 +10940,15 @@ "requires": {} }, "@nestjs/platform-express": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.1.4.tgz", - "integrity": "sha512-SLJWDa6V54QrUvzKI4Eyt7gyrjV7F9FY1uHFihshjmQfpf0ebCGacR9jzNwf01aHl0BJX3DUn/KYteBjz6DJXw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.2.1.tgz", + "integrity": "sha512-7PecaXt8lrdS1p6Vb1X/am3GGv+EO1VahyDzaEGOK6C0zwhc0VPfLtwihkjjfhS6BjpRIXXgviwEjONUvxVZnA==", "requires": { - "body-parser": "1.20.0", + "body-parser": "1.20.1", "cors": "2.8.5", - "express": "4.18.1", + "express": "4.18.2", "multer": "1.4.4-lts.1", - "tslib": "2.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.10.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - } + "tslib": "2.4.1" } }, "@nestjs/schematics": { @@ -11049,12 +11030,12 @@ } }, "@nestjs/testing": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.1.4.tgz", - "integrity": "sha512-gO6b9QJyUajh38DNdss9gSE0UO7x60Jh10W4SwHEjQT1W+yxaEWr3aLyuQItTvUVY6C28XKFLTykMpr8GO28Ug==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.2.1.tgz", + "integrity": "sha512-lemXZdRSuqoZ87l0orCrS/c7gqwxeduIFOd21g9g2RUeQ4qlWPegbQDKASzbfC28klPyrgJLW4MNq7uv2JwV8w==", "dev": true, "requires": { - "tslib": "2.4.0" + "tslib": "2.4.1" } }, "@nestjs/typeorm": { @@ -11168,9 +11149,9 @@ "requires": {} }, "@redis/client": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.3.1.tgz", - "integrity": "sha512-FKEHpOu7Q4+cuM6VWjA54988K5jkqOxvhvj2hEGSx086lvKwXyjzO7Lya7hcirZ0/Db8FLBJN7UXsJuyoNWPJg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz", + "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==", "requires": { "cluster-key-slot": "1.1.1", "generic-pool": "3.9.0", @@ -11196,21 +11177,21 @@ "requires": {} }, "@redis/time-series": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz", - "integrity": "sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", "requires": {} }, "@sinclair/typebox": { - "version": "0.24.47", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.47.tgz", - "integrity": "sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A==", + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -11255,9 +11236,9 @@ "devOptional": true }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -11287,9 +11268,9 @@ } }, "@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -11319,9 +11300,9 @@ "dev": true }, "@types/eslint": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.7.tgz", - "integrity": "sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw==", + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", "dev": true, "requires": { "@types/estree": "*", @@ -11345,12 +11326,12 @@ "dev": true }, "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.31", "@types/qs": "*", "@types/serve-static": "*" } @@ -11423,10 +11404,9 @@ "dev": true }, "@types/jsonwebtoken": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", - "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", - "dev": true, + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", + "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", "requires": { "@types/node": "*" } @@ -11446,9 +11426,9 @@ } }, "@types/node": { - "version": "16.11.68", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.68.tgz", - "integrity": "sha512-JkRpuVz3xCNCWaeQ5EHLR/6woMbHZz/jZ7Kmc63AkU+1HxnoUugzSWMck7dsR4DvNYX8jp9wTi9K7WvnxOIQZQ==" + "version": "16.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.10.tgz", + "integrity": "sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==" }, "@types/parse-json": { "version": "4.0.0", @@ -11466,9 +11446,9 @@ } }, "@types/passport-jwt": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.7.tgz", - "integrity": "sha512-qRQ4qlww1Yhs3IaioDKrsDNmKy6gLDLgFsGwpCnc2YqWovO2Oxu9yCQdWHMJafQ7UIuOba4C4/TNXcGkQfEjlQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.8.tgz", + "integrity": "sha512-VKJZDJUAHFhPHHYvxdqFcc5vlDht8Q2pL1/ePvKAgqRThDaCc84lSYOTQmnx3+JIkDlN+2KfhFhXIzlcVT+Pcw==", "dev": true, "requires": { "@types/express": "*", @@ -11522,9 +11502,9 @@ } }, "@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "@types/serve-static": { @@ -11543,9 +11523,9 @@ "dev": true }, "@types/superagent": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.15.tgz", - "integrity": "sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.16.tgz", + "integrity": "sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ==", "dev": true, "requires": { "@types/cookiejar": "*", @@ -11562,14 +11542,14 @@ } }, "@types/validator": { - "version": "13.7.9", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.9.tgz", - "integrity": "sha512-y5KJ1PjGXPpU4CZ7lThDu31s+FqvzhqwMOR6Go/x6xaQMFjgzwfzfOvCwABsylr/5n8sB1qFQm1Vi7TaCB8P+A==" + "version": "13.7.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.10.tgz", + "integrity": "sha512-t1yxFAR2n0+VO6hd/FJ9F2uezAZVWHLmpmlJzm1eX03+H7+HsuTAp7L8QJs+2pQCfWkP1+EXsGK9Z9v7o/qPVQ==" }, "@types/yargs": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", - "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -11582,69 +11562,70 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz", - "integrity": "sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", + "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.40.1", - "@typescript-eslint/type-utils": "5.40.1", - "@typescript-eslint/utils": "5.40.1", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/type-utils": "5.46.1", + "@typescript-eslint/utils": "5.46.1", "debug": "^4.3.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "@typescript-eslint/parser": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.1.tgz", - "integrity": "sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", + "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.40.1", - "@typescript-eslint/types": "5.40.1", - "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz", - "integrity": "sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", + "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.1", - "@typescript-eslint/visitor-keys": "5.40.1" + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1" } }, "@typescript-eslint/type-utils": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz", - "integrity": "sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", + "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.40.1", - "@typescript-eslint/utils": "5.40.1", + "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/utils": "5.46.1", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.1.tgz", - "integrity": "sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", + "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz", - "integrity": "sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", + "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.1", - "@typescript-eslint/visitor-keys": "5.40.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11653,28 +11634,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.1.tgz", - "integrity": "sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", + "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.40.1", - "@typescript-eslint/types": "5.40.1", - "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.40.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz", - "integrity": "sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", + "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/types": "5.46.1", "eslint-visitor-keys": "^3.3.0" } }, @@ -11846,9 +11827,9 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "devOptional": true }, "acorn-import-assertions": { @@ -11934,9 +11915,9 @@ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -12115,9 +12096,9 @@ } }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -12127,7 +12108,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -12255,9 +12236,9 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-lite": { - "version": "1.0.30001422", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", - "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", "dev": true }, "chalk": { @@ -12305,9 +12286,9 @@ "dev": true }, "ci-info": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", - "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", "dev": true }, "cjs-module-lexer": { @@ -12557,9 +12538,9 @@ } }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -12637,6 +12618,13 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "optional": true, + "peer": true + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -12699,9 +12687,9 @@ } }, "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz", + "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==" }, "dotenv-expand": { "version": "8.0.3", @@ -12758,9 +12746,9 @@ } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -12799,14 +12787,15 @@ "dev": true }, "eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -12822,14 +12811,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -12949,9 +12938,9 @@ "dev": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -13096,25 +13085,6 @@ "vary": "~1.1.2" }, "dependencies": { - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -13132,14 +13102,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } } } }, @@ -13232,9 +13194,9 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -13392,17 +13354,6 @@ "hexoid": "^1.0.0", "once": "^1.4.0", "qs": "^6.11.0" - }, - "dependencies": { - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } } }, "forwarded": { @@ -13516,9 +13467,9 @@ "dev": true }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -13617,9 +13568,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true }, "import-fresh": { @@ -13716,6 +13667,24 @@ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, + "ioredis": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.2.4.tgz", + "integrity": "sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==", + "optional": true, + "peer": true, + "requires": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.0.1", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + } + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -13783,6 +13752,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -14185,9 +14160,9 @@ } }, "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, @@ -14487,9 +14462,9 @@ } }, "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", "dev": true }, "js-tokens": { @@ -14531,9 +14506,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", "dev": true }, "jsonc-parser": { @@ -14618,9 +14593,9 @@ } }, "libphonenumber-js": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.14.tgz", - "integrity": "sha512-McGS7GV/WjJ2KjfOGhJU1oJn29RYeo7Q+RpANRbUNMQ9gj5XArpbjurSuyYPTejFwbaUojstQ4XyWCrAzGOUXw==" + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.15.tgz", + "integrity": "sha512-sLeVLmWX17VCKKulc+aDIRHS95TxoTsKMRJi5s5gJdwlqNzMWcBCtSHHruVyXjqfi67daXM2SnLf2juSrdx5Sg==" }, "lines-and-columns": { "version": "1.2.4", @@ -14648,11 +14623,25 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "optional": true, + "peer": true + }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "optional": true, + "peer": true + }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -14779,9 +14768,9 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.12.tgz", + "integrity": "sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw==", "dev": true, "requires": { "fs-monkey": "^1.0.3" @@ -14905,6 +14894,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -14951,9 +14946,9 @@ "dev": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, "normalize-path": { @@ -15416,9 +15411,9 @@ "dev": true }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true }, "prettier-linter-helpers": { @@ -15589,9 +15584,9 @@ } }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } @@ -15678,16 +15673,33 @@ } }, "redis": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.4.0.tgz", - "integrity": "sha512-tQyFG6O9iewLxxHYRyirJNklhe2QI7M/0o8q0jk7D9Z/Cxh/7oZrQyHKyjWz0TkkCls8ool/xvhL9K8zRnkaYQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz", + "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==", "requires": { "@redis/bloom": "1.1.0", - "@redis/client": "1.3.1", + "@redis/client": "1.4.2", "@redis/graph": "1.1.0", "@redis/json": "1.0.4", "@redis/search": "1.1.0", - "@redis/time-series": "1.0.3" + "@redis/time-series": "1.0.4" + } + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "optional": true, + "peer": true + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "optional": true, + "peer": true, + "requires": { + "redis-errors": "^1.0.0" } }, "reflect-metadata": { @@ -15797,9 +15809,9 @@ } }, "rxjs": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", - "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "requires": { "tslib": "^2.1.0" } @@ -16043,9 +16055,9 @@ "dev": true }, "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -16059,6 +16071,13 @@ } } }, + "standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "optional": true, + "peer": true + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -16131,9 +16150,9 @@ "dev": true }, "superagent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.2.tgz", - "integrity": "sha512-QtYZ9uaNAMexI7XWl2vAXAh0j4q9H7T0WVEI/y5qaUB3QLwxo+voUgCQ217AokJzUTIVOp0RTo7fhZrwhD7A2Q==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.6.tgz", + "integrity": "sha512-HqSe6DSIh3hEn6cJvCkaM1BLi466f1LHi4yubR0tpewlMpk4RUFFy35bKz8SsPBwYfIIJy5eclp+3tCYAuX0bw==", "dev": true, "requires": { "component-emitter": "^1.3.0", @@ -16141,11 +16160,11 @@ "debug": "^4.3.4", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.0", - "formidable": "^2.0.1", + "formidable": "^2.1.1", "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.11.0", - "semver": "^7.3.7" + "semver": "^7.3.8" }, "dependencies": { "mime": { @@ -16153,26 +16172,17 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } } } }, "supertest": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.0.tgz", - "integrity": "sha512-QgWju1cNoacP81Rv88NKkQ4oXTzGg0eNZtOoxp1ROpbS4OHY/eK5b8meShuFtdni161o5X0VQvgo7ErVyKK+Ow==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", "dev": true, "requires": { "methods": "^1.1.2", - "superagent": "^8.0.0" + "superagent": "^8.0.5" } }, "supports-color": { @@ -16222,9 +16232,9 @@ } }, "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", + "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -16383,9 +16393,9 @@ } }, "ts-loader": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", - "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -16470,9 +16480,9 @@ } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "tsutils": { "version": "3.21.0", @@ -16527,9 +16537,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typeorm": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.10.tgz", - "integrity": "sha512-VMKiM84EpJQ+Mz9xDIPqnfplWhyUy1d8ccaKdMY9obifxJOTFnv8GYVyPsGwG8Lk7Nb8MlttHyHWENGAhBA3WA==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.11.tgz", + "integrity": "sha512-pzdOyWbVuz/z8Ww6gqvBW4nylsM0KLdUCDExr2gR20/x1khGSVxQkjNV/3YqliG90jrWzrknYbYscpk8yxFJVg==", "requires": { "@sqltools/formatter": "^1.2.2", "app-root-path": "^3.0.0", @@ -16581,9 +16591,9 @@ } }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "devOptional": true }, "uid-safe": { @@ -16705,10 +16715,11 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", "dev": true, + "peer": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -16881,9 +16892,9 @@ "dev": true }, "yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -16891,7 +16902,7 @@ "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { diff --git a/srcs/requirements/nestjs/api_back/src/app.module.ts b/srcs/requirements/nestjs/api_back/src/app.module.ts index 837f8baf..e3d193c6 100644 --- a/srcs/requirements/nestjs/api_back/src/app.module.ts +++ b/srcs/requirements/nestjs/api_back/src/app.module.ts @@ -7,7 +7,7 @@ import { ConfigModule } from '@nestjs/config'; import { FriendshipsModule } from './friendship/friendships.module'; import { AuthenticationModule } from './auth/42/authentication.module'; import { PassportModule } from '@nestjs/passport'; -// import { GameModule } from './game/game/game.module'; +import { GameModule } from './game/game.module'; @Module({ imports: [UsersModule, @@ -27,7 +27,7 @@ import { PassportModule } from '@nestjs/passport'; //avec une classe pour le module synchronize: true, }), - // GameModule, + GameModule, ], controllers: [AppController], providers: [AppService], diff --git a/srcs/requirements/nestjs/api_back/src/game/dto/grantTicket.dto.ts b/srcs/requirements/nestjs/api_back/src/game/dto/grantTicket.dto.ts new file mode 100644 index 00000000..21ae8c3b --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/game/dto/grantTicket.dto.ts @@ -0,0 +1,13 @@ +import { IsBoolean, IsInt, IsNotEmpty, IsNumber, IsString } from "class-validator"; + +export class GrantTicketDto { + @IsString() + @IsNotEmpty() + playerOneUsername : string + @IsString() + playerTwousername : string + @IsNumber() + gameOptions : number + @IsBoolean() + isGameIsWithInvitation : boolean +} diff --git a/srcs/requirements/nestjs/api_back/src/game/dto/validateTicket.dto.ts b/srcs/requirements/nestjs/api_back/src/game/dto/validateTicket.dto.ts new file mode 100644 index 00000000..d1d49f42 --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/game/dto/validateTicket.dto.ts @@ -0,0 +1,18 @@ +import { IsBase64, IsBoolean, IsNotEmpty, IsNumber, IsString } from "class-validator"; + +export class ValidateTicketDto { + @IsString() + @IsNotEmpty() + playerOneUsername : string + @IsString() + playerTwousername : string + @IsNumber() + gameOptions : number + @IsBoolean() + isGameIsWithInvitation : boolean + @IsNumber() + numberOfRegisteredUser : number + @IsBase64() + @IsNotEmpty() + token : string +} diff --git a/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts b/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts index b93d2088..edd4e673 100644 --- a/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts @@ -1,8 +1,7 @@ import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; @Entity('game') -export class game { - +export class Game { @PrimaryGeneratedColumn() id: number; diff --git a/srcs/requirements/nestjs/api_back/src/game/entity/tokenGame.entity.ts b/srcs/requirements/nestjs/api_back/src/game/entity/tokenGame.entity.ts new file mode 100644 index 00000000..a35132af --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/game/entity/tokenGame.entity.ts @@ -0,0 +1,20 @@ +import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; + +@Entity('tokenGame') +export class TokenGame { + + @PrimaryGeneratedColumn() + id: number; + @Column() + playerOneUsername : string + @Column({nullable: true}) + playerTwousername : string + @Column() + gameOptions : number + @Column() + isGameIsWithInvitation : boolean + @Column({default: 0, nullable: true}) + numberOfRegisteredUser : number + @Column() + token : string +} diff --git a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts index d86df072..a810c31d 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts @@ -1,4 +1,58 @@ -import { Controller } from '@nestjs/common'; +import { Body, Controller, Get, HttpException, HttpStatus, Post, Req, UseGuards } from '@nestjs/common'; +import { request } from 'http'; +import { use } from 'passport'; +import { AuthenticateGuard, TwoFactorGuard } from 'src/auth/42/guards/42guards'; +import { User } from 'src/users/entities/user.entity'; +import { UsersService } from 'src/users/users.service'; +import { GrantTicketDto } from './dto/grantTicket.dto'; +import { ValidateTicketDto } from './dto/validateTicket.dto'; +import { GameService } from './game.service'; @Controller('game') -export class GameController {} +export class GameController { + constructor (private readonly gameService : GameService, + private readonly userService : UsersService) { } + + @Post('ticket') + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + async grantTicket(@Req() req, @Body() grantTicketDto : GrantTicketDto) + { + const user : User = req.user + if (grantTicketDto.playerOneUsername != user.username) + return new HttpException('You can\'t request a game for another person.', 403 ) + else if (user.status !== "connected") + return new HttpException('You must not be in game...', 403 ) + return this.gameService.generateToken(user, grantTicketDto); + } + + //N'est valable que pour le game-serveur. + @Post('gameServer/validate') + async validateTicket(@Body() validateTicketDto : ValidateTicketDto, @Req() request) + { + if (await this.gameService.validateToken(validateTicketDto) === false) + return new HttpException("The token is not valid", HttpStatus.NOT_FOUND); + return HttpStatus.OK; + } + + @Post('decline') + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + async declineInvitation(@Body() validateTicketDto : ValidateTicketDto, @Req() req) + { + const user : User = req.user; + if (user.username !== validateTicketDto.playerTwousername) + return new HttpException("This cannot be done", HttpStatus.FORBIDDEN); + return this.gameService.declineInvitation(validateTicketDto); + } + + @Get('invitations') + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + async findInvitations(@Req() request) + { + const user : User = request.user; + return this.gameService.findInvitations(user); + } + +} diff --git a/srcs/requirements/nestjs/api_back/src/game/game.module.ts b/srcs/requirements/nestjs/api_back/src/game/game.module.ts index b9909dd5..42b69b90 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.module.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.module.ts @@ -1,9 +1,14 @@ -// import { Module } from '@nestjs/common'; -// import { GameController } from './game.controller'; -// import { GameService } from './game.service'; +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { User } from 'src/users/entities/user.entity'; +import { UsersService } from 'src/users/users.service'; +import { TokenGame } from './entity/tokenGame.entity'; +import { GameController } from './game.controller'; +import { GameService } from './game.service'; -// @Module({ -// controllers: [GameController], -// providers: [GameService] -// }) -// export class GameModule {} +@Module({ + imports: [TypeOrmModule.forFeature([TokenGame, User])], + controllers: [GameController], + providers: [GameService, UsersService] +}) +export class GameModule {} diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index 554d73dd..866b789d 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -1,5 +1,150 @@ -// import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { createCipheriv, randomBytes, scrypt } from 'crypto'; +import { User } from 'src/users/entities/user.entity'; +import { Repository } from 'typeorm'; +import { promisify } from 'util'; +import { GrantTicketDto } from './dto/grantTicket.dto'; +import { Game } from './entity/game.entity'; +import { ValidateTicketDto } from './dto/validateTicket.dto'; +import { TokenGame } from './entity/tokenGame.entity'; -// @Injectable('game') -// export class GameService {} +@Injectable() +export class GameService { + constructor ( + @InjectRepository(Game) + private readonly gameRepository : Repository, + @InjectRepository(User) + private readonly userRepository : Repository, + @InjectRepository(TokenGame) + private readonly tokenGameRepository : Repository, + ) { } + + async encryptToken(toEncrypt : string) : Promise { + const iv = randomBytes(16); + const password = process.env.TICKET_FOR_PLAYING_GAME_SECRET + new Date(); + const key = (await promisify(scrypt)(password, 'salt', 32)) as Buffer; + const cipher = createCipheriv('aes-256-ctr', key, iv); + const encryptedText = Buffer.concat([ + cipher.update(toEncrypt), + cipher.final(), + ]); + const encryptedTextToReturn = encryptedText.toString('base64'); + return encryptedTextToReturn + } + + async generateToken(user : User, grantTicketDto : GrantTicketDto) + { + if (grantTicketDto.isGameIsWithInvitation === true) + { + let secondUser : User; + (user.username === grantTicketDto.playerOneUsername) ? + secondUser = await this.userRepository.findOneBy({username : grantTicketDto.playerTwousername}) : + secondUser = await this.userRepository.findOneBy({username : grantTicketDto.playerOneUsername}) + if (!secondUser) + return new HttpException("The requested second player does not exist", HttpStatus.NOT_FOUND); + const encryptedTextToReturn = await this.encryptToken(user.username + '_' + secondUser.username + '_' + + grantTicketDto.gameOptions + '_' + grantTicketDto.isGameIsWithInvitation + '_' + new Date()) + const validateTicketDto : ValidateTicketDto = new ValidateTicketDto(); + validateTicketDto.playerOneUsername = grantTicketDto.playerOneUsername; + validateTicketDto.playerTwousername = grantTicketDto.playerTwousername; + validateTicketDto.numberOfRegisteredUser = 0; + validateTicketDto.isGameIsWithInvitation = grantTicketDto.isGameIsWithInvitation; + validateTicketDto.gameOptions = grantTicketDto.gameOptions; + validateTicketDto.token = encryptedTextToReturn; + const tok = this.tokenGameRepository.create(validateTicketDto); + this.tokenGameRepository.save(tok); + return { token : encryptedTextToReturn }; + } + else if (grantTicketDto.isGameIsWithInvitation === false) { + const encryptedTextToReturn = await this.encryptToken(user.username + '_' + + grantTicketDto.gameOptions + '_' + grantTicketDto.isGameIsWithInvitation + '_' + new Date()) + const validateTicketDto : ValidateTicketDto = new ValidateTicketDto(); + validateTicketDto.playerOneUsername = grantTicketDto.playerOneUsername; + validateTicketDto.playerTwousername = ""; + validateTicketDto.numberOfRegisteredUser = 0; + validateTicketDto.isGameIsWithInvitation = grantTicketDto.isGameIsWithInvitation; + validateTicketDto.gameOptions = grantTicketDto.gameOptions; + validateTicketDto.token = encryptedTextToReturn; + const tok = this.tokenGameRepository.create(validateTicketDto); + this.tokenGameRepository.save(tok); + return { token : encryptedTextToReturn }; + } + return new HttpException("Something went wrong !", HttpStatus.INTERNAL_SERVER_ERROR) + } + + async validateToken(validateTicketDto : ValidateTicketDto) { + + let tokenGame : TokenGame; + if (validateTicketDto.isGameIsWithInvitation === true) + { + tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') + .where('tokenGame.playerOneUsername = :playerOneUsername', {playerOneUsername : validateTicketDto.playerOneUsername}) + .andWhere('tokenGame.playerTwousername = :playerTwousername', {playerTwousername : validateTicketDto.playerTwousername}) + .andWhere('tokenGame.gameOption = :gameOption', {gameOption : validateTicketDto.gameOptions}) + .andWhere('tokenGame.isGameIsWithInvitation = :isGameIsWithInvitation', {isGameIsWithInvitation: validateTicketDto.isGameIsWithInvitation}) + .andWhere('tokenGame.token = :token', {token : validateTicketDto.token}) + .getOne(); + } + else + { + tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') + .where('tokenGame.playerOneUsername = :playerOneUsername', {playerOneUsername : validateTicketDto.playerOneUsername}) + .andWhere('tokenGame.gameOption = :gameOption', {gameOption : validateTicketDto.gameOptions}) + .andWhere('tokenGame.isGameIsWithInvitation = :isGameIsWithInvitation', {isGameIsWithInvitation: validateTicketDto.isGameIsWithInvitation}) + .andWhere('tokenGame.token = :token', {token : validateTicketDto.token}) + .getOne(); + } + if (tokenGame) + tokenGame.numberOfRegisteredUser++; + if (tokenGame && tokenGame.isGameIsWithInvitation === false) + { + this.tokenGameRepository.remove(tokenGame) + this.userRepository.update(tokenGame.playerOneUsername, {status : "In Game"}) + return true; + } + else if (tokenGame && tokenGame.isGameIsWithInvitation === true) + { + if (tokenGame.numberOfRegisteredUser === 2) + { + this.tokenGameRepository.remove(tokenGame) + this.userRepository.update(tokenGame.playerOneUsername, {status : "In Game"}) + this.userRepository.update(tokenGame.playerTwousername, {status : "In Game"}) + } + return true; + } + return false; + } + + async findInvitations(user : User) { + const game = await this.tokenGameRepository.createQueryBuilder('tokengame') + .where('tokenGame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) + .getMany(); + if (!game) + return new HttpException( "No invitations !", HttpStatus.NOT_FOUND); + let partialGame : Partial[] = []; + for (const gameToken of game) { + partialGame.push({ + playerOneUsername : gameToken.playerOneUsername, + playerTwousername : gameToken.playerTwousername, + gameOptions : gameToken.gameOptions, + isGameIsWithInvitation : gameToken.isGameIsWithInvitation, + token : gameToken.token, + }); + } + return partialGame; + } + + async declineInvitation(validateTicketDto : ValidateTicketDto) + { + const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') + .where('tokenGame.playerOneUsername = :playerOneUsername', {playerOneUsername : validateTicketDto.playerOneUsername}) + .andWhere('tokenGame.playerTwousername = :playerTwousername', {playerTwousername : validateTicketDto.playerTwousername}) + .andWhere('tokenGame.gameOption = :gameOption', {gameOption : validateTicketDto.gameOptions}) + .andWhere('tokenGame.isGameIsWithInvitation = :isGameIsWithInvitation', {isGameIsWithInvitation: validateTicketDto.isGameIsWithInvitation}) + .andWhere('tokenGame.token = :token', {token : validateTicketDto.token}) + .getOne(); + return this.tokenGameRepository.remove(tokenGame); + } +} diff --git a/srcs/requirements/nestjs/api_back/src/redis/redis.service.ts b/srcs/requirements/nestjs/api_back/src/redis/redis.service.ts deleted file mode 100644 index 1bf70bcf..00000000 --- a/srcs/requirements/nestjs/api_back/src/redis/redis.service.ts +++ /dev/null @@ -1 +0,0 @@ -import {RedisService} from "@nestjs/redis" diff --git a/srcs/requirements/nestjs/api_back/src/users/users.controller.ts b/srcs/requirements/nestjs/api_back/src/users/users.controller.ts index 181b9ac5..2cefe160 100644 --- a/srcs/requirements/nestjs/api_back/src/users/users.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/users/users.controller.ts @@ -83,7 +83,6 @@ export class UsersController { async update(@Req() req, @Body(new ValidationPipe()) usersUpdateDto: UpdateUsersDto, @Res() response : Response) { console.log("DANS PATCH USERS"); const user = await this.usersService.update(req.user.id, usersUpdateDto); - // const user : User = req.user; if (user.isEnabledTwoFactorAuth === false && user.isTwoFactorAuthenticated === true) this.usersService.setIsTwoFactorAuthenticatedWhenLogout(user.id); console.log ("Enbale 2FA " + user.isEnabledTwoFactorAuth + " Is authenticated " + user.isTwoFactorAuthenticated); From dbd95089a80874370b261a7036cf5c32c22e6cf8 Mon Sep 17 00:00:00 2001 From: batche Date: Mon, 19 Dec 2022 20:58:46 +0100 Subject: [PATCH 14/45] Game, suite et presque fin ? --- srcs/.env | 1 + .../nestjs/api_back/src/app.module.ts | 2 +- .../api_back/src/game/dto/grantTicket.dto.ts | 5 +- .../src/game/dto/validateTicket.dto.ts | 6 +- .../src/game/entity/tokenGame.entity.ts | 4 +- .../api_back/src/game/game.controller.ts | 30 +- .../nestjs/api_back/src/game/game.module.ts | 7 +- .../nestjs/api_back/src/game/game.service.ts | 159 ++++++---- .../api_back/src/users/users.controller.ts | 2 +- .../api_back/src/users/users.service.ts | 3 - .../svelte/api_front/src/App.svelte | 2 +- .../api_front/src/pages/GamePage.svelte | 106 ------- .../api_front/src/pages/game/Game.svelte | 288 +++++++++++++++--- .../svelte/api_front/src/pieces/Header.svelte | 7 +- 14 files changed, 384 insertions(+), 238 deletions(-) delete mode 100644 srcs/requirements/svelte/api_front/src/pages/GamePage.svelte diff --git a/srcs/.env b/srcs/.env index a8fbadb8..33b89fe8 100644 --- a/srcs/.env +++ b/srcs/.env @@ -1,4 +1,5 @@ NODE_ENV=development +WEBSITE_HOST=transcendance POSTGRES_USER=postgres POSTGRES_PASSWORD=9pKpKEgiamxwk5P7Ggsz POSTGRES_DB=transcendance_db diff --git a/srcs/requirements/nestjs/api_back/src/app.module.ts b/srcs/requirements/nestjs/api_back/src/app.module.ts index e3d193c6..63fa879c 100644 --- a/srcs/requirements/nestjs/api_back/src/app.module.ts +++ b/srcs/requirements/nestjs/api_back/src/app.module.ts @@ -14,6 +14,7 @@ import { GameModule } from './game/game.module'; AuthenticationModule, PassportModule.register({ session: true }), FriendshipsModule, + GameModule, ConfigModule.forRoot(), TypeOrmModule.forRoot({ type: 'postgres', @@ -27,7 +28,6 @@ import { GameModule } from './game/game.module'; //avec une classe pour le module synchronize: true, }), - GameModule, ], controllers: [AppController], providers: [AppService], diff --git a/srcs/requirements/nestjs/api_back/src/game/dto/grantTicket.dto.ts b/srcs/requirements/nestjs/api_back/src/game/dto/grantTicket.dto.ts index 21ae8c3b..c010fc11 100644 --- a/srcs/requirements/nestjs/api_back/src/game/dto/grantTicket.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/game/dto/grantTicket.dto.ts @@ -1,11 +1,12 @@ -import { IsBoolean, IsInt, IsNotEmpty, IsNumber, IsString } from "class-validator"; +import { IsBoolean, IsEmpty, IsInt, IsNotEmpty, IsNumber, IsString } from "class-validator"; +import { IsNull } from "typeorm"; export class GrantTicketDto { @IsString() @IsNotEmpty() playerOneUsername : string @IsString() - playerTwousername : string + playerTwoUsername : string @IsNumber() gameOptions : number @IsBoolean() diff --git a/srcs/requirements/nestjs/api_back/src/game/dto/validateTicket.dto.ts b/srcs/requirements/nestjs/api_back/src/game/dto/validateTicket.dto.ts index d1d49f42..8c594dda 100644 --- a/srcs/requirements/nestjs/api_back/src/game/dto/validateTicket.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/game/dto/validateTicket.dto.ts @@ -1,17 +1,15 @@ -import { IsBase64, IsBoolean, IsNotEmpty, IsNumber, IsString } from "class-validator"; +import { IsBase64, IsBoolean, IsEmpty, IsNotEmpty, IsNumber, IsString } from "class-validator"; export class ValidateTicketDto { @IsString() @IsNotEmpty() playerOneUsername : string @IsString() - playerTwousername : string + playerTwoUsername : string @IsNumber() gameOptions : number @IsBoolean() isGameIsWithInvitation : boolean - @IsNumber() - numberOfRegisteredUser : number @IsBase64() @IsNotEmpty() token : string diff --git a/srcs/requirements/nestjs/api_back/src/game/entity/tokenGame.entity.ts b/srcs/requirements/nestjs/api_back/src/game/entity/tokenGame.entity.ts index a35132af..9481b32e 100644 --- a/srcs/requirements/nestjs/api_back/src/game/entity/tokenGame.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/game/entity/tokenGame.entity.ts @@ -8,13 +8,15 @@ export class TokenGame { @Column() playerOneUsername : string @Column({nullable: true}) - playerTwousername : string + playerTwoUsername : string @Column() gameOptions : number @Column() isGameIsWithInvitation : boolean @Column({default: 0, nullable: true}) numberOfRegisteredUser : number + @Column({default : false}) + isSecondUserAcceptedRequest : boolean @Column() token : string } diff --git a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts index a810c31d..4198172b 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts @@ -10,8 +10,7 @@ import { GameService } from './game.service'; @Controller('game') export class GameController { - constructor (private readonly gameService : GameService, - private readonly userService : UsersService) { } + constructor (private readonly gameService : GameService) { } @Post('ticket') @UseGuards(AuthenticateGuard) @@ -22,10 +21,20 @@ export class GameController { if (grantTicketDto.playerOneUsername != user.username) return new HttpException('You can\'t request a game for another person.', 403 ) else if (user.status !== "connected") - return new HttpException('You must not be in game...', 403 ) + return new HttpException('You must not be in game...', HttpStatus.FORBIDDEN ) return this.gameService.generateToken(user, grantTicketDto); } + @Get('requested') + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + async requestIfAnotherUserHasRespondToquestForGame(@Req() req, @Body('playerTwoUsername') body) + { + const user : User = req.user; + return this.gameService.requestIfAnotherUserHasRespondToquestForGame(user, body); + } + + //N'est valable que pour le game-serveur. @Post('gameServer/validate') async validateTicket(@Body() validateTicketDto : ValidateTicketDto, @Req() request) @@ -38,12 +47,19 @@ export class GameController { @Post('decline') @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) - async declineInvitation(@Body() validateTicketDto : ValidateTicketDto, @Req() req) + async declineInvitation(@Body('token') token, @Req() req) { const user : User = req.user; - if (user.username !== validateTicketDto.playerTwousername) - return new HttpException("This cannot be done", HttpStatus.FORBIDDEN); - return this.gameService.declineInvitation(validateTicketDto); + return this.gameService.declineInvitation(user, token); + } + + @Post('accept') + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + async acceptInvitation(@Body('token') token, @Req() req) + { + const user : User = req.user; + return this.gameService.acceptInvitation(user, token); } @Get('invitations') diff --git a/srcs/requirements/nestjs/api_back/src/game/game.module.ts b/srcs/requirements/nestjs/api_back/src/game/game.module.ts index 42b69b90..e834599f 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.module.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.module.ts @@ -1,14 +1,17 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { Friendship } from 'src/friendship/entities/friendship.entity'; +import { FriendshipService } from 'src/friendship/friendship.service'; import { User } from 'src/users/entities/user.entity'; import { UsersService } from 'src/users/users.service'; +import { Game } from './entity/game.entity'; import { TokenGame } from './entity/tokenGame.entity'; import { GameController } from './game.controller'; import { GameService } from './game.service'; @Module({ - imports: [TypeOrmModule.forFeature([TokenGame, User])], + imports: [TypeOrmModule.forFeature([TokenGame, User, Game, Friendship])], controllers: [GameController], - providers: [GameService, UsersService] + providers: [GameService, UsersService, FriendshipService] }) export class GameModule {} diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index 866b789d..3197ca85 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -8,6 +8,7 @@ import { GrantTicketDto } from './dto/grantTicket.dto'; import { Game } from './entity/game.entity'; import { ValidateTicketDto } from './dto/validateTicket.dto'; import { TokenGame } from './entity/tokenGame.entity'; +import { UsersService } from 'src/users/users.service'; @Injectable() export class GameService { @@ -18,6 +19,7 @@ export class GameService { private readonly userRepository : Repository, @InjectRepository(TokenGame) private readonly tokenGameRepository : Repository, + private readonly userService : UsersService ) { } async encryptToken(toEncrypt : string) : Promise { @@ -35,38 +37,28 @@ export class GameService { async generateToken(user : User, grantTicketDto : GrantTicketDto) { - if (grantTicketDto.isGameIsWithInvitation === true) + if (user.status === "In Game") + return new HttpException("You can't play two games", HttpStatus.FORBIDDEN); + else if (grantTicketDto.isGameIsWithInvitation === true) { - let secondUser : User; - (user.username === grantTicketDto.playerOneUsername) ? - secondUser = await this.userRepository.findOneBy({username : grantTicketDto.playerTwousername}) : - secondUser = await this.userRepository.findOneBy({username : grantTicketDto.playerOneUsername}) + const secondUser : Partial = await this.userService.findOneByUsername(user.id.toString(), grantTicketDto.playerTwoUsername) if (!secondUser) return new HttpException("The requested second player does not exist", HttpStatus.NOT_FOUND); const encryptedTextToReturn = await this.encryptToken(user.username + '_' + secondUser.username + '_' + grantTicketDto.gameOptions + '_' + grantTicketDto.isGameIsWithInvitation + '_' + new Date()) - const validateTicketDto : ValidateTicketDto = new ValidateTicketDto(); - validateTicketDto.playerOneUsername = grantTicketDto.playerOneUsername; - validateTicketDto.playerTwousername = grantTicketDto.playerTwousername; - validateTicketDto.numberOfRegisteredUser = 0; - validateTicketDto.isGameIsWithInvitation = grantTicketDto.isGameIsWithInvitation; - validateTicketDto.gameOptions = grantTicketDto.gameOptions; - validateTicketDto.token = encryptedTextToReturn; - const tok = this.tokenGameRepository.create(validateTicketDto); + const tok = this.tokenGameRepository.create(grantTicketDto); + tok.isSecondUserAcceptedRequest = false; + tok.numberOfRegisteredUser = 0; + tok.token = encryptedTextToReturn; this.tokenGameRepository.save(tok); return { token : encryptedTextToReturn }; } else if (grantTicketDto.isGameIsWithInvitation === false) { const encryptedTextToReturn = await this.encryptToken(user.username + '_' + grantTicketDto.gameOptions + '_' + grantTicketDto.isGameIsWithInvitation + '_' + new Date()) - const validateTicketDto : ValidateTicketDto = new ValidateTicketDto(); - validateTicketDto.playerOneUsername = grantTicketDto.playerOneUsername; - validateTicketDto.playerTwousername = ""; - validateTicketDto.numberOfRegisteredUser = 0; - validateTicketDto.isGameIsWithInvitation = grantTicketDto.isGameIsWithInvitation; - validateTicketDto.gameOptions = grantTicketDto.gameOptions; - validateTicketDto.token = encryptedTextToReturn; - const tok = this.tokenGameRepository.create(validateTicketDto); + const tok = this.tokenGameRepository.create(grantTicketDto); + tok.numberOfRegisteredUser = 0; + tok.token = encryptedTextToReturn; this.tokenGameRepository.save(tok); return { token : encryptedTextToReturn }; } @@ -74,51 +66,64 @@ export class GameService { } async validateToken(validateTicketDto : ValidateTicketDto) { - - let tokenGame : TokenGame; if (validateTicketDto.isGameIsWithInvitation === true) { - tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') - .where('tokenGame.playerOneUsername = :playerOneUsername', {playerOneUsername : validateTicketDto.playerOneUsername}) - .andWhere('tokenGame.playerTwousername = :playerTwousername', {playerTwousername : validateTicketDto.playerTwousername}) - .andWhere('tokenGame.gameOption = :gameOption', {gameOption : validateTicketDto.gameOptions}) - .andWhere('tokenGame.isGameIsWithInvitation = :isGameIsWithInvitation', {isGameIsWithInvitation: validateTicketDto.isGameIsWithInvitation}) - .andWhere('tokenGame.token = :token', {token : validateTicketDto.token}) + const tokenGame : TokenGame = await this.tokenGameRepository.createQueryBuilder('tokengame') + .where('tokengame.playerOneUsername = :playerOneUsername', {playerOneUsername : validateTicketDto.playerOneUsername}) + .andWhere('tokengame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : validateTicketDto.playerTwoUsername}) + .andWhere('tokengame.gameOptions = :gameOption', {gameOption : validateTicketDto.gameOptions}) + .andWhere('tokengame.isGameIsWithInvitation = :isGameIsWithInvitation', {isGameIsWithInvitation: true}) + .andWhere('tokengame.isSecondUserAcceptedRequest = :choice', {choice : true}) + .andWhere('tokengame.token = :token', {token : validateTicketDto.token}) .getOne(); + if (tokenGame) + { + tokenGame.numberOfRegisteredUser++; + if (tokenGame.numberOfRegisteredUser === 2) + { + this.tokenGameRepository.remove(tokenGame) + const userOne : User = await this.userRepository.createQueryBuilder('user') + .where("user.username = :username", {username : tokenGame.playerOneUsername}) + .getOne(); + userOne.status = "In Game"; + this.userRepository.save(userOne); + const userTwo : User = await this.userRepository.createQueryBuilder('user') + .where("user.username = :username", {username : tokenGame.playerTwoUsername}) + .getOne(); + userTwo.status = "In Game"; + this.userRepository.save(userTwo); + } + return true; + } } - else + else if (validateTicketDto.isGameIsWithInvitation === false) { - tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') - .where('tokenGame.playerOneUsername = :playerOneUsername', {playerOneUsername : validateTicketDto.playerOneUsername}) - .andWhere('tokenGame.gameOption = :gameOption', {gameOption : validateTicketDto.gameOptions}) - .andWhere('tokenGame.isGameIsWithInvitation = :isGameIsWithInvitation', {isGameIsWithInvitation: validateTicketDto.isGameIsWithInvitation}) - .andWhere('tokenGame.token = :token', {token : validateTicketDto.token}) + const tokenGame : TokenGame = await this.tokenGameRepository.createQueryBuilder('tokengame') + .where('tokengame.playerOneUsername = :playerOneUsername', {playerOneUsername : validateTicketDto.playerOneUsername}) + .andWhere('tokengame.gameOptions = :gameOption', {gameOption : validateTicketDto.gameOptions}) + .andWhere('tokengame.isGameIsWithInvitation = :isGameIsWithInvitation', {isGameIsWithInvitation: false}) + .andWhere('tokengame.token = :token', {token : validateTicketDto.token}) .getOne(); - } - if (tokenGame) - tokenGame.numberOfRegisteredUser++; - if (tokenGame && tokenGame.isGameIsWithInvitation === false) - { - this.tokenGameRepository.remove(tokenGame) - this.userRepository.update(tokenGame.playerOneUsername, {status : "In Game"}) - return true; - } - else if (tokenGame && tokenGame.isGameIsWithInvitation === true) - { - if (tokenGame.numberOfRegisteredUser === 2) + if (tokenGame) { this.tokenGameRepository.remove(tokenGame) - this.userRepository.update(tokenGame.playerOneUsername, {status : "In Game"}) - this.userRepository.update(tokenGame.playerTwousername, {status : "In Game"}) + console.log("USERNAME : " + tokenGame.playerOneUsername) + const user : User = await this.userRepository.createQueryBuilder('user') + .where("user.username = :username", {username : tokenGame.playerOneUsername}) + .getOne(); + user.status = "In Game"; + this.userRepository.save(user); + return true; } - return true; } return false; } async findInvitations(user : User) { const game = await this.tokenGameRepository.createQueryBuilder('tokengame') - .where('tokenGame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) + .where('tokengame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) + .andWhere('tokengame.isGameIsWithInvitation = :invit', {invit : true}) + .andWhere('tokengame.isSecondUserAcceptedRequest = :choice', {choice : false}) .getMany(); if (!game) return new HttpException( "No invitations !", HttpStatus.NOT_FOUND); @@ -126,25 +131,57 @@ export class GameService { for (const gameToken of game) { partialGame.push({ playerOneUsername : gameToken.playerOneUsername, - playerTwousername : gameToken.playerTwousername, + playerTwoUsername : gameToken.playerTwoUsername, gameOptions : gameToken.gameOptions, - isGameIsWithInvitation : gameToken.isGameIsWithInvitation, token : gameToken.token, }); } return partialGame; } - async declineInvitation(validateTicketDto : ValidateTicketDto) + async declineInvitation(user : User, token : string) { - const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') - .where('tokenGame.playerOneUsername = :playerOneUsername', {playerOneUsername : validateTicketDto.playerOneUsername}) - .andWhere('tokenGame.playerTwousername = :playerTwousername', {playerTwousername : validateTicketDto.playerTwousername}) - .andWhere('tokenGame.gameOption = :gameOption', {gameOption : validateTicketDto.gameOptions}) - .andWhere('tokenGame.isGameIsWithInvitation = :isGameIsWithInvitation', {isGameIsWithInvitation: validateTicketDto.isGameIsWithInvitation}) - .andWhere('tokenGame.token = :token', {token : validateTicketDto.token}) + if (user.status === "In Game") + return new HttpException("You must finish your game before decline.", HttpStatus.FORBIDDEN) + const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokengame') + .andWhere('tokengame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) + .andWhere('tokengame.token = :token', {token : token}) .getOne(); - return this.tokenGameRepository.remove(tokenGame); + if (tokenGame) + return this.tokenGameRepository.remove(tokenGame); + return new HttpException("Invitation not found !", HttpStatus.NOT_FOUND) + } + + async acceptInvitation(user : User, token : string) + { + if (user.status === "In Game") + return new HttpException("You must finish your game before accept.", HttpStatus.FORBIDDEN) + const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') + .andWhere('tokenGame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) + .andWhere('tokenGame.token = :token', {token : token}) + .getOne(); + if (tokenGame) + { + tokenGame.isSecondUserAcceptedRequest = true; + this.tokenGameRepository.save(tokenGame) + return HttpStatus.OK + } + return new HttpException("Invitation not found !", HttpStatus.NOT_FOUND) + } + + async requestIfAnotherUserHasRespondToquestForGame(user : User, token : string) { + if (user.status === "In Game") + return new HttpException("You can't do that.", HttpStatus.BAD_REQUEST) + const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') + .andWhere('tokenGame.token = :token', {token : token}) + .andWhere('tokenGame.isSecondUserAcceptedRequest = :isSecondUserAcceptedRequest', {isSecondUserAcceptedRequest : true}) + .getOne(); + if (tokenGame && tokenGame.isSecondUserAcceptedRequest === true) + return {isSecondUserAcceptedRequest : true} + else if (tokenGame && tokenGame.isSecondUserAcceptedRequest === false) + return {isSecondUserAcceptedRequest : false} + else if (!tokenGame) + return new HttpException("Not Found", HttpStatus.NOT_FOUND) } } diff --git a/srcs/requirements/nestjs/api_back/src/users/users.controller.ts b/srcs/requirements/nestjs/api_back/src/users/users.controller.ts index 2cefe160..a7e3074d 100644 --- a/srcs/requirements/nestjs/api_back/src/users/users.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/users/users.controller.ts @@ -85,7 +85,7 @@ export class UsersController { const user = await this.usersService.update(req.user.id, usersUpdateDto); if (user.isEnabledTwoFactorAuth === false && user.isTwoFactorAuthenticated === true) this.usersService.setIsTwoFactorAuthenticatedWhenLogout(user.id); - console.log ("Enbale 2FA " + user.isEnabledTwoFactorAuth + " Is authenticated " + user.isTwoFactorAuthenticated); + console.log ("Enable 2FA " + user.isEnabledTwoFactorAuth + " Is authenticated " + user.isTwoFactorAuthenticated); if (user.isEnabledTwoFactorAuth === true && user.isTwoFactorAuthenticated === false) { response.status(201).send('2FA redirect') diff --git a/srcs/requirements/nestjs/api_back/src/users/users.service.ts b/srcs/requirements/nestjs/api_back/src/users/users.service.ts index 929d93d9..be1c19b2 100644 --- a/srcs/requirements/nestjs/api_back/src/users/users.service.ts +++ b/srcs/requirements/nestjs/api_back/src/users/users.service.ts @@ -4,12 +4,9 @@ import { User } from './entities/user.entity'; import { Repository } from 'typeorm'; import { CreateUsersDto } from './dto/create-users.dto'; import { UpdateUsersDto } from './dto/update-users.dto'; -import { Friendship } from '../friendship/entities/friendship.entity'; import { PaginationQueryDto } from 'src/common/dto/pagination-query.dto'; import { UserStats } from './entities/userStat.entities'; import { FriendshipService } from 'src/friendship/friendship.service'; -import { stringify } from 'querystring'; - // On va devoir sûrement trouver un moyen plus simple pour passer l'id, sûrement via des pipes // ou des interceptors, mais pour l'instant on va faire comme ça. @Injectable() diff --git a/srcs/requirements/svelte/api_front/src/App.svelte b/srcs/requirements/svelte/api_front/src/App.svelte index 7a383eb1..5f293b5e 100644 --- a/srcs/requirements/svelte/api_front/src/App.svelte +++ b/srcs/requirements/svelte/api_front/src/App.svelte @@ -2,7 +2,7 @@ // routing // may not need {link} here import Router, { link, replace } from "svelte-spa-router"; - import { primaryRoutes } from "./routes/primaryRoutes.js"; + import { primaryRoutes } from "./routes/primaryRoutes.js"; // import primaryRoutes from "./routes/primaryRoutes.svelte"; const conditionsFailed = (event) => { diff --git a/srcs/requirements/svelte/api_front/src/pages/GamePage.svelte b/srcs/requirements/svelte/api_front/src/pages/GamePage.svelte deleted file mode 100644 index 5e08c6f4..00000000 --- a/srcs/requirements/svelte/api_front/src/pages/GamePage.svelte +++ /dev/null @@ -1,106 +0,0 @@ - - - -

-
- game options -
- - -
-
- - -
-
- - - - - -
-
- -
-
-
- -
-

--- keys ---

-

move up: 'w' or 'up arrow'

-

move down: 's' OR 'down arrow'

-

grid on/off: 'g'

-
- -
- -
- - - - - \ No newline at end of file diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index 754776ea..11ec14ff 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -1,39 +1,153 @@ - - - +
.
-{#if optionsAreNotSet} -
-
-
- game options -
- - -
-
- - -
-
- - -
-
- -
-
+ {#if showError === true} +
+

{errorMessageWhenAttemptingToGetATicket}

- -
-

--- keys ---

-

move up: 'w' or 'up arrow'

-

move down: 's' OR 'down arrow'

-

grid on/off: 'g'

-
+ {/if} + + {#if showWaitPage === true} +
+ Connecting to the game... +
+

{waitingMessage}

+
+
+ {/if} + +{#if optionsAreNotSet} + {#if showGameOption === true} +
+
+ +
+ game options +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ {#if invite_someone === true} + + {/if} +
+ +
+
+
+
+ {/if} + {#if showInvitations} +
+ +
+ Current invitation(s) + {#if isThereAnyInvitation} + {#each invitations as invitation } +
+ {invitation.playerOneUsername} has invited you to play a pong ! + + +
+ {/each} + {/if} + {#if isThereAnyInvitation ===false} +

Currently, no one asked to play with you.

+ + {/if} +
+
+ {/if} {/if}
@@ -128,21 +316,29 @@ body { /* max-height: 80vh; */ /* overflow: hidden; */ } -#div_game_options { +#div_game { text-align: center; font-family: "Bit5x3"; color: rgb(245, 245, 245); font-size: x-large; } -#div_game_options fieldset { + +#error_notification { + text-align: center; + display: block; + font-family: "Bit5x3"; + color: rgb(143, 19, 19); + font-size: x-large; +} +#div_game fieldset { max-width: 50vw; width: auto; margin: 0 auto; } -#div_game_options fieldset div { +#div_game fieldset div { padding: 10px; } -#play_pong_button { +#pong_button { font-family: "Bit5x3"; color: rgb(245, 245, 245); background-color: #333333; diff --git a/srcs/requirements/svelte/api_front/src/pieces/Header.svelte b/srcs/requirements/svelte/api_front/src/pieces/Header.svelte index dee06c62..083f09d3 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/Header.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/Header.svelte @@ -24,6 +24,7 @@ Potato Pong Logo (push('/'))}>

Potato Pong

{/if} - {#if showWaitPage === true} -
-
- Connecting to the game... -

{waitingMessage}

-
-
- {/if} + {#if showWaitPage === true} +
+
+ Connecting to the game... +

{waitingMessage}

+
+
+ {/if} {#if optionsAreNotSet} {#if showGameOption === true} From fb7bfa009739784b3681c5ae27e804c795f5cd9e Mon Sep 17 00:00:00 2001 From: batche Date: Tue, 20 Dec 2022 17:56:18 +0100 Subject: [PATCH 19/45] jeu suite --- .../api_front/src/pages/game/Game.svelte | 192 ++++++++++++++---- 1 file changed, 149 insertions(+), 43 deletions(-) diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index 224be713..091a3741 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -34,10 +34,11 @@ let token = ""; //Game's stuff gameserver side - let sound = "on"; // possible de faire un boolean avec svelte et radio buttons ? + let sound = ""; let multi_balls = false; let moving_walls = false; - let matchOptions : enumeration.MatchOptions = enumeration.MatchOptions.noOption; + let matchOption : enumeration.MatchOptions = enumeration.MatchOptions.noOption; + //html boolean for pages let showWaitPage = false; let showInvitations = false; @@ -60,17 +61,71 @@ }) const init = async() => { + optionsAreNotSet = false + showWaitPage = true + console.log("Player two username " + playerTwoUsername) if (multi_balls === true) matchOption |= enumeration.MatchOptions.multiBalls if (moving_walls === true ) matchOption |= enumeration.MatchOptions.movingWalls - initAudio(sound) - initMatchOptions(matchOption) - optionsAreNotSet = false - initPong(new GameArea()) - initGc(new GameComponentsClient(matchOption, pong.ctx)) - initStartFunction(start) - initWebSocket(matchOption) + const res = await fetch("http://transcendance:8080/api/v2/game/ticket", { + method : "POST", + headers : {'Content-Type': 'application/json'}, + body : JSON.stringify({ + playerOneUsername : user.username, + playerTwoUsername : playerTwoUsername, + gameOptions : matchOption, + isGameIsWithInvitation : invite_someone + }) + }) + .then(x => x.json()) + .catch(error => { + console.log(error) + }) + if (res.status === 403 || res.status === 404 || res.status === 500) + { + errorMessageWhenAttemptingToGetATicket = res.message; + showError = true; + setTimeout(() => { + showError = false; + showWaitPage = false + optionsAreNotSet = true + playerTwoUsername = ""; + matchOption = 0; + token = "" + }, 5000) + return ; + } + else if (res.status === 200) + { + initAudio(sound) + initMatchOptions(matchOption) + initPong(new GameArea()) + initGc(new GameComponentsClient(matchOption, pong.ctx)) + initStartFunction(start) + initWebSocket(matchOption) + } + // const fetch = await fetch("http://transcendance:8080/api/v2/game/gameServer/validate", { + // method : "POST", + // headers : {'Content-Type': 'application/json'}, + // body : JSON.stringify({ + // playerOneUsername : user.username, + // playerTwoUsername : playerTwoUsername, + // gameOptions : matchOption, + // isGameIsWithInvitation : invite_someone, + // token : token + // }) + // }) + // .then(x => x.json()) + // .catch(error => { + // console.log(error) + // }) + // if (res.status !== 200) + // { + // showError = true; + // errorMessageWhenAttemptingToGetATicket = "Your session is not valid. Please try again." + // return ; + // } } function start() : void { @@ -133,35 +188,83 @@
.
-{#if optionsAreNotSet} -
-
-
- game options -
- - -
-
- - -
-
- - -
-
- -
-
-
-
-
-

--- keys ---

-

move up: 'w' or 'up arrow'

-

move down: 's' OR 'down arrow'

-

grid on/off: 'g'

+ {#if showError === true} +
+
+ Error +

{errorMessageWhenAttemptingToGetATicket}

+ +
+ {/if} + + {#if showWaitPage === true} +
+
+ Connecting to the game... +

{waitingMessage}

+
+
+ {/if} + +{#if optionsAreNotSet} + {#if showGameOption === true} +
+
+ +
+ game options +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ {#if invite_someone === true} + + {/if} +
+ +
+
+
+
+ {/if} + {#if showInvitations} +
+ +
+ Current invitation(s) + {#if isThereAnyInvitation} + {#each invitations as invitation } +
+ {invitation.playerOneUsername} has invited you to play a pong ! + + +
+ {/each} + {/if} + {#if isThereAnyInvitation ===false} +

Currently, no one asked to play with you.

+ + {/if} +
+
+ {/if} {/if}
@@ -173,26 +276,29 @@ @font-face { font-family: "Bit5x3"; - src: - url("/fonts/Bit5x3.woff2") format("woff2"), - local("Bit5x3"), - url("/fonts/Bit5x3.woff") format("woff"); + src: url("/fonts/Bit5x3.woff2") format("woff2"),local("Bit5x3"), url("/fonts/Bit5x3.woff") format("woff"); font-weight: normal; font-style: normal; font-display: swap; } +#preload_font { + font-family: "Bit5x3"; + opacity:0; + height:0; + width:0; + display:inline-block; +} body { margin: 0; background-color: #222425; } #canvas_container { - margin-top: 20px; text-align: center; /* border: dashed rgb(245, 245, 245) 5px; */ /* max-height: 80vh; */ /* overflow: hidden; */ } -#div_game_options { +#div_game { text-align: center; font-family: "Bit5x3"; color: rgb(245, 245, 245); From 77857a873d3b6dfa1d7d4308a230150182e382f9 Mon Sep 17 00:00:00 2001 From: batche Date: Tue, 20 Dec 2022 20:23:15 +0100 Subject: [PATCH 20/45] Vive le rouge ! --- .../game_back/src/server/class/GameSession.ts | 7 +- .../game_back/src/server/constants.ts | 2 +- .../game_back/src/server/wsServer.ts | 13 +- .../api_back/src/game/dto/createGame.dto.ts | 15 ++ .../api_back/src/game/dto/updateGame.dto.ts | 12 ++ .../api_back/src/game/entity/game.entity.ts | 6 +- .../api_back/src/game/game.controller.ts | 17 +- .../nestjs/api_back/src/game/game.service.ts | 31 ++- .../api_front/src/pages/game/Game.Luke.svelte | 186 ++++++++++++++++++ .../api_front/src/pages/game/Game.svelte | 99 ++++------ .../src/pages/game/client/class/GameArea.ts | 9 +- 11 files changed, 311 insertions(+), 86 deletions(-) create mode 100644 srcs/requirements/nestjs/api_back/src/game/dto/createGame.dto.ts create mode 100644 srcs/requirements/nestjs/api_back/src/game/dto/updateGame.dto.ts create mode 100644 srcs/requirements/svelte/api_front/src/pages/game/Game.Luke.svelte diff --git a/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts b/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts index 78e645f5..92680332 100644 --- a/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts +++ b/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts @@ -82,7 +82,7 @@ export class GameSession { else if (input === en.InputEnum.down) { client.racket.dir.y = 1; } - + if (input !== en.InputEnum.noInput) { client.racket.moveAndCollide(delta, [gc.wallTop, gc.wallBottom]); } @@ -220,7 +220,7 @@ export class GameSession { } return false; } - private async _matchEnd(winner: en.PlayerSide, forfeit_flag: boolean = false) + private async _matchEnd(winner: en.PlayerSide, forfeit_flag: boolean = false) { this.matchEnded = true; let eventEnd: ev.EventMatchEnd; @@ -232,7 +232,6 @@ export class GameSession { client.socket.send(JSON.stringify(eventEnd)); }); - /* // WIP nest , send match result const gc = this.components; await fetch(c.addressBackEnd + "/game/matchEnd", { @@ -245,7 +244,7 @@ export class GameSession { scoreLeft: gc.scoreLeft, scoreRight: gc.scoreRight, }) - }); */ + }); // logs if (winner === en.PlayerSide.left) { diff --git a/srcs/requirements/game_server/game_back/src/server/constants.ts b/srcs/requirements/game_server/game_back/src/server/constants.ts index 3ab0ce0b..3ae3e722 100644 --- a/srcs/requirements/game_server/game_back/src/server/constants.ts +++ b/srcs/requirements/game_server/game_back/src/server/constants.ts @@ -9,4 +9,4 @@ export const fixedDeltaTime = serverGameLoopIntervalMS/1000; // second export const playersUpdateIntervalMS = 1000/30; // millisecond export const spectatorsUpdateIntervalMS = 1000/30; // millisecond -export const addressBackEnd = "http://backend_dev:3000"; +export const addressBackEnd = "http://backend_dev:3000/api/v2"; diff --git a/srcs/requirements/game_server/game_back/src/server/wsServer.ts b/srcs/requirements/game_server/game_back/src/server/wsServer.ts index 0001b002..1bfb3761 100644 --- a/srcs/requirements/game_server/game_back/src/server/wsServer.ts +++ b/srcs/requirements/game_server/game_back/src/server/wsServer.ts @@ -66,7 +66,7 @@ async function clientAnnounceListener(this: WebSocket, data: string) if (msg.role === en.ClientRole.player) { const announce: ev.ClientAnnouncePlayer = msg; - + // WIP nest, fetch token validation const body = { playerOneUsername: announce.username, @@ -78,7 +78,7 @@ async function clientAnnounceListener(this: WebSocket, data: string) if (announce.privateMatch) { body.playerTwoUsername = announce.playerTwoUsername; } - const response = await fetch(c.addressBackEnd + "/game/validateToken", + const response = await fetch(c.addressBackEnd + "/game/gameserver/validate", { method: "POST", headers: { @@ -163,12 +163,12 @@ function publicMatchmaking(player: ClientPlayer) function privateMatchmaking(player: ClientPlayer) -{ +{ const minPlayersNumber = 2; const maxPlayersNumber = 2; privateMatchmakingMap.set(player.id, player); const matchOptions = player.matchOptions; - + const token = player.token; const compatiblePlayers: ClientPlayer[] = []; for (const [id, client] of privateMatchmakingMap) @@ -243,17 +243,18 @@ async function playerReadyConfirmationListener(this: WebSocket, data: string) { // WIP nest , send gameSession.id const gameSessionPlayersIterator = gameSession.playersMap.values(); - const response = await fetch(c.addressBackEnd + "/game/newGameSession", + const response = await fetch(c.addressBackEnd + "/game/gameserver/creategame", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ - id: gameSession.id, + gameServerIdOfTheMatch : gameSession.id, gameOptions: gameSession.matchOptions, playerOneUsername: (gameSessionPlayersIterator.next().value).username, playerTwoUsername: (gameSessionPlayersIterator.next().value).username, + }) }); if (!response.ok) diff --git a/srcs/requirements/nestjs/api_back/src/game/dto/createGame.dto.ts b/srcs/requirements/nestjs/api_back/src/game/dto/createGame.dto.ts new file mode 100644 index 00000000..86931237 --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/game/dto/createGame.dto.ts @@ -0,0 +1,15 @@ +import { IsBoolean, IsNotEmpty, IsNumber, IsString } from "class-validator"; + +export class CreateGameDto { + @IsString() + @IsNotEmpty() + gameServerIdOfTheMatch : string + @IsNumber() + @IsNotEmpty() + gameOptions: number + @IsString() + @IsNotEmpty() + playerOneUsername : string + @IsString() + playerTwoUsername : string +} diff --git a/srcs/requirements/nestjs/api_back/src/game/dto/updateGame.dto.ts b/srcs/requirements/nestjs/api_back/src/game/dto/updateGame.dto.ts new file mode 100644 index 00000000..54c89757 --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/game/dto/updateGame.dto.ts @@ -0,0 +1,12 @@ +import { IsBoolean, IsNotEmpty, IsNumber, IsString } from "class-validator"; + +export class UpdateGameDto { + @IsNumber() + @IsNotEmpty() + playerOneUsernameResult : number + @IsNumber() + @IsNotEmpty() + playerTwoUsernameResult : number + @IsBoolean() + isMatchIsFinished : boolean +} diff --git a/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts b/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts index edd4e673..44257efe 100644 --- a/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts +++ b/srcs/requirements/nestjs/api_back/src/game/entity/game.entity.ts @@ -11,15 +11,15 @@ export class Game { @Column() playerTwoUsername: string - @Column() + @Column({default : 0, nullable : true}) playerOneUsernameResult : number - @Column() + @Column({default : 0, nullable : true}) playerTwoUsernameResult : number @Column() gameServerIdOfTheMatch: string - @Column({default: false}) //éric pourra trouver un meilleur mot : ongoing ? + @Column({default: false, nullable : true}) //éric pourra trouver un meilleur mot : ongoing ? isMatchIsFinished: boolean } diff --git a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts index ff3c3ce3..da476766 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts @@ -1,9 +1,11 @@ import { Body, Controller, Get, HttpException, HttpStatus, Post, Req, UseGuards } from '@nestjs/common'; +import { Console } from 'console'; import { request } from 'http'; import { use } from 'passport'; import { AuthenticateGuard, TwoFactorGuard } from 'src/auth/42/guards/42guards'; import { User } from 'src/users/entities/user.entity'; import { UsersService } from 'src/users/users.service'; +import { CreateGameDto } from './dto/createGame.dto'; import { GrantTicketDto } from './dto/grantTicket.dto'; import { ValidateTicketDto } from './dto/validateTicket.dto'; import { TokenGame } from './entity/tokenGame.entity'; @@ -21,8 +23,8 @@ export class GameController { const user : User = req.user if (grantTicketDto.playerOneUsername != user.username) return new HttpException('You can\'t request a game for another person.', 403 ) - else if (user.status !== "connected") - return new HttpException('You must not be in game...', HttpStatus.FORBIDDEN ) + // else if (user.status !== "connected") + // return new HttpException('You must not be in game...', HttpStatus.FORBIDDEN ) return this.gameService.generateToken(user, grantTicketDto); } @@ -37,11 +39,12 @@ export class GameController { //N'est valable que pour le game-serveur. - @Post('gameServer/validate') + @Post('gameserver/validate') async validateTicket(@Body() validateTicketDto : ValidateTicketDto, @Req() request) { if (await this.gameService.validateToken(validateTicketDto) === false) return new HttpException("The token is not valid", HttpStatus.NOT_FOUND); + console.log("200 retourné côté nest") return HttpStatus.OK; } @@ -72,4 +75,12 @@ export class GameController { return this.gameService.findInvitations(user); } + @Post('gameserver/creategame') + async createGame(@Body() creategameDto : CreateGameDto) + { + return this.gameService.createGame(creategameDto); + } + + + } diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index 2f556387..e6bb953c 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -9,6 +9,7 @@ import { Game } from './entity/game.entity'; import { ValidateTicketDto } from './dto/validateTicket.dto'; import { TokenGame } from './entity/tokenGame.entity'; import { UsersService } from 'src/users/users.service'; +import { CreateGameDto } from './dto/createGame.dto'; @Injectable() export class GameService { @@ -37,9 +38,10 @@ export class GameService { async generateToken(user : User, grantTicketDto : GrantTicketDto) { - if (user.status === "In Game") - return new HttpException("You can't play two games", HttpStatus.FORBIDDEN); - else if (grantTicketDto.isGameIsWithInvitation === true) + // if (user.status === "In Game") + // return new HttpException("You can't play two games", HttpStatus.FORBIDDEN); + // else + if (grantTicketDto.isGameIsWithInvitation === true) { const secondUser : Partial = await this.userService.findOneByUsername(user.id.toString(), grantTicketDto.playerTwoUsername) if (!secondUser) @@ -141,8 +143,8 @@ export class GameService { async declineInvitation(user : User, token : string) { - if (user.status === "In Game") - return new HttpException("You must finish your game before decline.", HttpStatus.FORBIDDEN) + // if (user.status === "In Game") + // return new HttpException("You must finish your game before decline.", HttpStatus.FORBIDDEN) const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokengame') .andWhere('tokengame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) .andWhere('tokengame.token = :token', {token : token}) @@ -154,8 +156,8 @@ export class GameService { async acceptInvitation(user : User, token : string) { - if (user.status === "In Game") - return new HttpException("You must finish your game before accept.", HttpStatus.FORBIDDEN) + // if (user.status === "In Game") + // return new HttpException("You must finish your game before accept.", HttpStatus.FORBIDDEN) const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') .andWhere('tokenGame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) .andWhere('tokenGame.token = :token', {token : token}) @@ -170,8 +172,8 @@ export class GameService { } async requestIfAnotherUserHasRespondToquestForGame(user : User, token : string) { - if (user.status === "In Game") - return new HttpException("You can't do that.", HttpStatus.BAD_REQUEST) + // if (user.status === "In Game") + // return new HttpException("You can't do that.", HttpStatus.BAD_REQUEST) const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') .where('tokenGame.token = :token', {token : token}) .andWhere('tokenGame.isSecondUserAcceptedRequest = :isSecondUserAcceptedRequest', {isSecondUserAcceptedRequest : true}) @@ -183,5 +185,16 @@ export class GameService { else if (!tokenGame) return new HttpException("Not Found", HttpStatus.NOT_FOUND) } + + + async createGame(creategameDto : CreateGameDto) + { + const game = this.gameRepository.create(creategameDto) + this.gameRepository.save(game); + if (!game) + return HttpStatus.INTERNAL_SERVER_ERROR + console.log("200 retourné pour la création de partie") + return HttpStatus.OK + } } diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.Luke.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.Luke.svelte new file mode 100644 index 00000000..dd096e4c --- /dev/null +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.Luke.svelte @@ -0,0 +1,186 @@ + + + + + + + + +{#if optionsAreNotSet} +
+
+
+ game options +
+ + +
+
+ + +
+
+ + + + + + +
+
+ +
+
+
+
+
+

--- keys ---

+

move up: 'w' or 'up arrow'

+

move down: 's' OR 'down arrow'

+

grid on/off: 'g'

+
+{/if} + +
+ +
+ + + diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index 091a3741..759d1eba 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -20,21 +20,13 @@ let user; let allUsers; - - //init function - let isSecondPlayerAnsweredYes = false; - let isSecondPlayerRefused = false; - let isSomethingWentWrong = true; - - //Game's stuff nest side let optionsAreNotSet = true; - let invite_someone = false; + let isSomeoneIsIvited = false; let playerTwoUsername = ""; - let token = ""; //Game's stuff gameserver side - let sound = ""; + let sound = "on"; let multi_balls = false; let moving_walls = false; let matchOption : enumeration.MatchOptions = enumeration.MatchOptions.noOption; @@ -44,6 +36,7 @@ let showInvitations = false; let showGameOption = true; let showError = false; + let showCanvas = false; let isThereAnyInvitation = false; let invitations; @@ -51,8 +44,6 @@ let waitingMessage = "Please wait..." let errorMessageWhenAttemptingToGetATicket = ""; - let responseToCheckIfOtherUserHasAnswered; - onMount( async() => { user = await fetch('http://transcendance:8080/api/v2/user') .then( x => x.json() ); @@ -68,23 +59,24 @@ matchOption |= enumeration.MatchOptions.multiBalls if (moving_walls === true ) matchOption |= enumeration.MatchOptions.movingWalls - const res = await fetch("http://transcendance:8080/api/v2/game/ticket", { + + const responseWhenGrantToken = fetch("http://transcendance:8080/api/v2/game/ticket", { method : "POST", headers : {'Content-Type': 'application/json'}, body : JSON.stringify({ playerOneUsername : user.username, playerTwoUsername : playerTwoUsername, gameOptions : matchOption, - isGameIsWithInvitation : invite_someone + isGameIsWithInvitation : isSomeoneIsIvited }) }) - .then(x => x.json()) - .catch(error => { - console.log(error) - }) - if (res.status === 403 || res.status === 404 || res.status === 500) + const responseFromServer = await responseWhenGrantToken; + console.log("Response.ok : " + responseFromServer.ok ) + console.log("//") + const responseInjson = await responseFromServer.json() + if (!responseFromServer.ok || !responseInjson.token) { - errorMessageWhenAttemptingToGetATicket = res.message; + errorMessageWhenAttemptingToGetATicket = responseInjson.message; showError = true; setTimeout(() => { showError = false; @@ -92,40 +84,27 @@ optionsAreNotSet = true playerTwoUsername = ""; matchOption = 0; - token = "" }, 5000) - return ; } - else if (res.status === 200) + else { - initAudio(sound) + showError = false + showWaitPage = false + const token = responseInjson.token + console.log("Token === " + token) + if (sound === "off") { + initAudio(true); + } + else if (sound === "on") { + initAudio(false); + } initMatchOptions(matchOption) initPong(new GameArea()) initGc(new GameComponentsClient(matchOption, pong.ctx)) initStartFunction(start) - initWebSocket(matchOption) + console.log("Avant init websocket") + initWebSocket(matchOption, token, user.username) } - // const fetch = await fetch("http://transcendance:8080/api/v2/game/gameServer/validate", { - // method : "POST", - // headers : {'Content-Type': 'application/json'}, - // body : JSON.stringify({ - // playerOneUsername : user.username, - // playerTwoUsername : playerTwoUsername, - // gameOptions : matchOption, - // isGameIsWithInvitation : invite_someone, - // token : token - // }) - // }) - // .then(x => x.json()) - // .catch(error => { - // console.log(error) - // }) - // if (res.status !== 200) - // { - // showError = true; - // errorMessageWhenAttemptingToGetATicket = "Your session is not valid. Please try again." - // return ; - // } } function start() : void { @@ -134,10 +113,10 @@ gc.text1.clear(); gc.text1.text = `${count}`; gc.text1.update(); - }, resume); + }, responseWhenGrantTokenume); } - function resume(): void { + function responseWhenGrantTokenume(): void { gc.text1.text = ""; window.addEventListener('keydown', function (e) { pong.addKey(e.key); @@ -160,6 +139,7 @@ showInvitations = true; invitations = await fetch("http://transcendance:8080/api/v2/game/invitations") .then(x => x.json()) + console.log(...invitations) } const rejectInvitation = async() => { @@ -188,12 +168,13 @@
.
+ {#if showError === true}
Error

{errorMessageWhenAttemptingToGetATicket}

- +
{/if} @@ -223,14 +204,18 @@
- - + + + + + +
- +
- {#if invite_someone === true} + {#if isSomeoneIsIvited === true} - -
-
- - -
-
- - - - - - -
-
- - -
- {#if isSomeoneIsIvited === true} - - {/if} -
- -
- -
- - {/if} - {#if showInvitations} -
- -
- Current invitation(s) - {#if isThereAnyInvitation} - {#each invitations as invitation } -
- {invitation.playerOneUsername} has invited you to play a pong ! - - -
- {/each} - {/if} - {#if isThereAnyInvitation ===false} -

Currently, no one asked to play with you.

- - {/if} -
-
- {/if} -{/if} - -
- {#if showWaitPage === true} -
+ {#if showWaitPage === true} +
Connecting to the game...

{waitingMessage}

{/if} - -
+ + + +{#if optionsAreNotSet} + {#if showGameOption === true} +
+
initGame()}> +
+ +
+ game options +
+ + +
+
+ + +
+
+

sound :

+ + + + +
+
+ + +
+ {#if isSomeoneIsIvited === true} + + {/if} +
+ +
+
+
+ +
+
+ {/if} + + {#if showInvitations} +
+
+ +
+ Current invitation(s) + {#if isThereAnyInvitation} + {#each invitations as invitation } +
+ {invitation.playerOneUsername} has invited you to play a pong ! + + +
+ {/each} + {/if} + {#if isThereAnyInvitation === false} +

Currently, no one asked to play with you.

+ + {/if} +
+
+
+ {/if} +{/if} + + + +
+ +
@@ -284,6 +320,14 @@ body { /* max-height: 80vh; */ /* overflow: hidden; */ } + +#users_name { + text-align: center; + font-family: "Bit5x3"; + color: rgb(245, 245, 245); + font-size: x-large; +} + #div_game { text-align: center; font-family: "Bit5x3"; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/class/GameArea.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/class/GameArea.ts index cd11aba6..5483baa4 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/class/GameArea.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/class/GameArea.ts @@ -9,10 +9,13 @@ export class GameArea { canvas: HTMLCanvasElement; ctx: CanvasRenderingContext2D; constructor() { - this.canvas = document.getElementById("gameArea"); + this.canvas = document.createElement("canvas"); this.ctx = this.canvas.getContext("2d") as CanvasRenderingContext2D; this.canvas.width = c.CanvasWidth; this.canvas.height = c.CanvasWidth / c.CanvasRatio; + let container = document.getElementById("canvas_container"); + if (container) + container.insertBefore(this.canvas, container.childNodes[0]); } addKey(key: string) { key = key.toLowerCase(); diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts index dc9a88fd..0f741150 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts @@ -34,6 +34,8 @@ export const clientInfoSpectator = new ClientInfoSpectator(); // WIP, could refa export function initWebSocket(options: en.MatchOptions, token: string, username: string, privateMatch = false, playerTwoUsername?: string) { socket = new WebSocket(wsUrl, "json"); + console.log("Infos from ws.ts : options => " + options + " token => " + token + " username => " + username + " priavte match => " + privateMatch + + " player two => " + playerTwoUsername) socket.addEventListener("open", (event) => { if (privateMatch) { socket.send(JSON.stringify( new ev.ClientAnnouncePlayer(options, token, username, privateMatch, playerTwoUsername) )); From e78632489672956a5f54d7cf76714c2f4a19f317 Mon Sep 17 00:00:00 2001 From: batche Date: Wed, 21 Dec 2022 16:38:34 +0100 Subject: [PATCH 23/45] fin du game --- .../nestjs/api_back/src/game/game.service.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index dbd653c3..11fdf377 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -161,9 +161,6 @@ export class GameService { async acceptInvitation(user : User, token : string) { - // if (user.status === "In Game") - // return new HttpException("You must finish your game before accept.", HttpStatus.FORBIDDEN) - console.log("On accepte l'invitation") const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') .andWhere('tokenGame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) .andWhere('tokenGame.token = :token', {token : token}) @@ -201,6 +198,12 @@ export class GameService { if (!game) return HttpStatus.INTERNAL_SERVER_ERROR console.log("200 retourné pour la création de partie") + const playerOne = await this.userRepository.findOneBy({username : game.playerOneUsername}) + const playerTwo = await this.userRepository.findOneBy({username : game.playerTwoUsername}) + playerOne.status = "In Game" + playerTwo.status = "In Game" + this.userRepository.save(playerOne) + this.userRepository.save(playerTwo) return HttpStatus.OK } @@ -216,7 +219,7 @@ export class GameService { const playerOne = await this.userRepository.findOneBy({username : game.playerOneUsername}) const playerTwo = await this.userRepository.findOneBy({username : game.playerTwoUsername}) if (!playerOne || !playerTwo) - return new HttpException("Internal Server Error. Impossible to update the database", HttpStatus.INTERNAL_SERVER_ERROR); + return new HttpException("Internal Server Error. Impossible to update the database", HttpStatus.INTERNAL_SERVER_ERROR); if (game.playerOneUsernameResult === game.playerTwoUsernameResult) { this.userService.incrementDraws(playerOne.id) @@ -232,6 +235,10 @@ export class GameService { this.userService.incrementVictories(playerOne.id) this.userService.incrementDefeats(playerTwo.id) } + playerOne.status = "Connected" + playerTwo.status = "Connected" + this.userRepository.save(playerOne) + this.userRepository.save(playerTwo) return HttpStatus.OK } } From eb1a5b47dd6096b8c8ec674c4c46c1ac7409240e Mon Sep 17 00:00:00 2001 From: batche Date: Wed, 21 Dec 2022 17:13:50 +0100 Subject: [PATCH 24/45] =?UTF-8?q?Ajout=20du=20ranking=20c=C3=B4t=C3=A9=20b?= =?UTF-8?q?ack,=20reste=20=C3=A0=20l'impl=C3=A9menter=20c=C3=B4t=C3=A9=20f?= =?UTF-8?q?ront?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api_back/src/game/game.controller.ts | 32 ++++++++++++------- .../nestjs/api_back/src/game/game.service.ts | 21 +++++++++++- srcs/requirements/nginx/conf/default.conf | 4 +++ 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts index 540ebe3d..ed867b4f 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts @@ -16,6 +16,16 @@ import { GameService } from './game.service'; export class GameController { constructor (private readonly gameService : GameService) { } + + @Get('ranking') + @UseGuards(AuthenticateGuard) + @UseGuards(TwoFactorGuard) + async getRankingForAllUsers(@Req() req) + { + const currentUser : User = req.user + return this.gameService.getRankingForAllUsers(currentUser); + } + @Post('ticket') @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) @@ -38,17 +48,6 @@ export class GameController { return this.gameService.requestIfAnotherUserHasRespondToquestForGame(user, token); } - - //N'est valable que pour le game-serveur. - @Post('gameserver/validate') - async validateTicket(@Body() validateTicketDto : ValidateTicketDto, @Req() request) - { - if (await this.gameService.validateToken(validateTicketDto) === false) - return new HttpException("The token is not valid", HttpStatus.NOT_FOUND); - console.log("200 retourné côté nest") - return HttpStatus.OK; - } - @Post('decline') @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) @@ -76,6 +75,17 @@ export class GameController { return this.gameService.findInvitations(user); } + // + //N'est valable que pour le game-serveur. + @Post('gameserver/validate') + async validateTicket(@Body() validateTicketDto : ValidateTicketDto, @Req() request) + { + if (await this.gameService.validateToken(validateTicketDto) === false) + return new HttpException("The token is not valid", HttpStatus.NOT_FOUND); + console.log("200 retourné côté nest") + return HttpStatus.OK; + } + @Post('gameserver/creategame') async createGame(@Body() creategameDto : CreateGameDto) { diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index 11fdf377..b7904f7a 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -11,6 +11,7 @@ import { TokenGame } from './entity/tokenGame.entity'; import { UsersService } from 'src/users/users.service'; import { CreateGameDto } from './dto/createGame.dto'; import { UpdateGameDto } from './dto/updateGame.dto'; +import { FriendshipService } from 'src/friendship/friendship.service'; @Injectable() export class GameService { @@ -21,9 +22,27 @@ export class GameService { private readonly userRepository : Repository, @InjectRepository(TokenGame) private readonly tokenGameRepository : Repository, - private readonly userService : UsersService + private readonly userService : UsersService, + private readonly friendShipService : FriendshipService ) { } + async getRankingForAllUsers(currentUser : User) { + const users = await this.userRepository.createQueryBuilder("user") + .leftJoinAndSelect("user.stats", "stats") + .orderBy('stats.winGame', "DESC") + .getMany(); + if (!users) + return new HttpException("No ranking for now.", HttpStatus.NOT_FOUND) + const partialUser : Partial[] = [] + for (const user of users) + { + if (await this.friendShipService.findIfUserIsBlockedOrHasBlocked(currentUser.id.toString(), user.id.toString()) === false) + partialUser.push({username : user.username, stats : user.stats }) + } + return partialUser; + } + + async encryptToken(toEncrypt : string) : Promise { const iv = randomBytes(16); const password = process.env.TICKET_FOR_PLAYING_GAME_SECRET + new Date(); diff --git a/srcs/requirements/nginx/conf/default.conf b/srcs/requirements/nginx/conf/default.conf index 3e75fb56..27e5cb23 100644 --- a/srcs/requirements/nginx/conf/default.conf +++ b/srcs/requirements/nginx/conf/default.conf @@ -11,6 +11,10 @@ server { proxy_pass http://backend_dev:3000; } + location /api/v2/game/gameserver { + deny all; + } + location /pong { proxy_pass http://game_server:8042/pong; proxy_http_version 1.1; From a1472c9059347e8f97c74cfba746798c8e7ec6ce Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 21 Dec 2022 19:35:40 +0100 Subject: [PATCH 25/45] SpectatorMatchList first test --- .../src/pages/SpectatorMatchList.svelte | 33 +++++++++++++++++++ .../api_front/src/pieces/MatchListElem.svelte | 18 ++++++++++ .../api_front/src/routes/primaryRoutes.js | 4 ++- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 srcs/requirements/svelte/api_front/src/pages/SpectatorMatchList.svelte create mode 100644 srcs/requirements/svelte/api_front/src/pieces/MatchListElem.svelte diff --git a/srcs/requirements/svelte/api_front/src/pages/SpectatorMatchList.svelte b/srcs/requirements/svelte/api_front/src/pages/SpectatorMatchList.svelte new file mode 100644 index 00000000..af6094c2 --- /dev/null +++ b/srcs/requirements/svelte/api_front/src/pages/SpectatorMatchList.svelte @@ -0,0 +1,33 @@ + + + + + {#each arr as match} + + {/each} + + + + + diff --git a/srcs/requirements/svelte/api_front/src/pieces/MatchListElem.svelte b/srcs/requirements/svelte/api_front/src/pieces/MatchListElem.svelte new file mode 100644 index 00000000..22a65dc3 --- /dev/null +++ b/srcs/requirements/svelte/api_front/src/pieces/MatchListElem.svelte @@ -0,0 +1,18 @@ + + + +
  • + {match.id} "{match.playerOneUsername}" VS "{match.playerTwoUsername}" +
  • + + + + diff --git a/srcs/requirements/svelte/api_front/src/routes/primaryRoutes.js b/srcs/requirements/svelte/api_front/src/routes/primaryRoutes.js index f21ac83a..55ff9f47 100644 --- a/srcs/requirements/svelte/api_front/src/routes/primaryRoutes.js +++ b/srcs/requirements/svelte/api_front/src/routes/primaryRoutes.js @@ -5,7 +5,8 @@ import TwoFactorAuthentication from '../pages/TwoFactorAuthentication.svelte'; import UnauthorizedAccessPage from '../pages/UnauthorizedAccessPage.svelte'; import { wrap } from 'svelte-spa-router/wrap' import TestPage from '../pages/TmpTestPage.svelte'; -import Game from '../pages/game/Game.svelte' +import Game from '../pages/game/Game.svelte'; +import SpectatorMatchList from '../pages/SpectatorMatchList.svelte'; @@ -13,6 +14,7 @@ export const primaryRoutes = { '/': SplashPage, '/2fa': TwoFactorAuthentication, '/game': Game, + '/matchlist': SpectatorMatchList, '/test': wrap({ component: TestPage, conditions: [ From 84062d5a89c0e372625b197b6a3db6edf33f4b61 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Thu, 22 Dec 2022 00:27:41 +0100 Subject: [PATCH 26/45] changes in Game.svelte + playerOne is always in left + kick players after match end + slow down ball and player + re in Makefile --- Makefile | 3 +- memo.txt | 16 +- .../game_back/src/server/class/GameSession.ts | 12 +- .../game_back/src/server/wsServer.ts | 24 ++- .../game_back/src/shared_js/constants.ts | 4 +- .../src/pages/SpectatorMatchList.svelte | 2 + .../api_front/src/pages/game/Game.svelte | 197 +++++++++--------- .../src/pages/game/client/class/GameArea.ts | 14 +- .../src/pages/game/client/handleInput.ts | 5 +- .../api_front/src/pages/game/client/ws.ts | 11 +- .../src/pages/game/shared_js/constants.ts | 4 +- .../svelte/api_front/src/pieces/Header.svelte | 1 + 12 files changed, 159 insertions(+), 134 deletions(-) diff --git a/Makefile b/Makefile index ba00eaec..fed7dc65 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,7 @@ start_dev: start_prod: docker compose -f ${DOCKERCOMPOSEPATH} start prod -restart:stop - @make up +re: down dev down: docker compose -f ${DOCKERCOMPOSEPATH} -v down diff --git a/memo.txt b/memo.txt index b9730741..fb6b762c 100644 --- a/memo.txt +++ b/memo.txt @@ -2,13 +2,14 @@ DONE : TODO : - routes gameServer -> Nest : - - validation - - creation de partie - - fin de partie + - refactoring, + Write independent init script like old pong.ts, + to limit the numbers of imports and clutter in svelte script. + - If in game, destroy game scripts stuff when changing page. + (I need to dig deeper in svelte to know how this could work) - mode spectateur - - quelques routes cote serveur - - une interface cote front (liste des matchs en cours) + - quelques routes cote serveur + - une interface cote front (liste des matchs en cours) - etat du client (en ligne, en jeu, ...) - le chat @@ -20,6 +21,9 @@ TODO : BUG : - Bug de son étonnant dans le front, ça pop une fois de temps en temps : Uncaught (in promise) DOMException: The element has no supported sources. + 18.ogg et 24.ogg bug peut-etre. + - l'avatar ne se charge pas après avoir redémarré les containers (mais sans avoir supprimé les volumes) + normal ou oubli ? -_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- - Comment fonctionne .env ? Comment faire pour ne pas le push sur le depot ? diff --git a/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts b/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts index 896dfacb..caedea3f 100644 --- a/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts +++ b/srcs/requirements/game_server/game_back/src/server/class/GameSession.ts @@ -4,7 +4,7 @@ import * as ev from "../../shared_js/class/Event.js" import * as c from "../constants.js" import { ClientPlayer, ClientSpectator } from "./Client"; import { GameComponentsServer } from "./GameComponentsServer.js"; -import { clientInputListener } from "../wsServer.js"; +import { clientInputListener, clientTerminate } from "../wsServer.js"; import { random } from "../utils.js"; import { Ball } from "../../shared_js/class/Rectangle.js"; import { wallsMovements } from "../../shared_js/wallsMovement.js"; @@ -246,6 +246,16 @@ export class GameSession { }) }); + const gameSession = this; + setTimeout(function kickRemainingClients() { + gameSession.spectatorsMap.forEach((client) => { + clientTerminate(client); + }); + gameSession.playersMap.forEach((client) => { + clientTerminate(client); + }); + }, 15000); + // logs if (winner === en.PlayerSide.left) { console.log("Player Left WIN"); diff --git a/srcs/requirements/game_server/game_back/src/server/wsServer.ts b/srcs/requirements/game_server/game_back/src/server/wsServer.ts index 509450b3..e4e86197 100644 --- a/srcs/requirements/game_server/game_back/src/server/wsServer.ts +++ b/srcs/requirements/game_server/game_back/src/server/wsServer.ts @@ -202,19 +202,21 @@ function createGameSession(playersArr: ClientPlayer[], matchOptions: en.MatchOpt client.gameSession = gameSession; gameSession.playersMap.set(client.id, client); gameSession.unreadyPlayersMap.set(client.id, client); - }); - - // WIP: Not pretty, hardcoded two players. - // Could be done in gameSession maybe ? - playersArr[0].racket = gameSession.components.playerRight; - playersArr[1].racket = gameSession.components.playerLeft; - - playersArr.forEach((client) => { client.socket.once("message", playerReadyConfirmationListener); }); - playersArr[0].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.right) )); - playersArr[1].socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.left) )); + // REFACTORING: Not pretty, hardcoded two players. + // Could be done in gameSession maybe ? + const gameSessionPlayersIterator = gameSession.playersMap.values(); + let player: ClientPlayer; + player = (gameSessionPlayersIterator.next().value); + player.racket = gameSession.components.playerLeft; + player.socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.left) )); + + player = (gameSessionPlayersIterator.next().value); + player.racket = gameSession.components.playerRight; + player.socket.send(JSON.stringify( new ev.EventMatchmakingComplete(en.PlayerSide.right) )); + // REFACTORING setTimeout(function abortMatch() { if (gameSession.unreadyPlayersMap.size !== 0) @@ -335,7 +337,7 @@ const pingInterval = setInterval( () => { }, 4200); -function clientTerminate(client: Client) +export function clientTerminate(client: Client) { client.socket.terminate(); if (client.gameSession) diff --git a/srcs/requirements/game_server/game_back/src/shared_js/constants.ts b/srcs/requirements/game_server/game_back/src/shared_js/constants.ts index be86ba7b..44c282c2 100644 --- a/srcs/requirements/game_server/game_back/src/shared_js/constants.ts +++ b/srcs/requirements/game_server/game_back/src/shared_js/constants.ts @@ -11,8 +11,8 @@ export const pw = Math.floor(w*0.017); export const ph = pw*6; export const ballSize = pw; export const wallSize = Math.floor(w*0.01); -export const racketSpeed = Math.floor(w*0.66); // pixel per second -export const ballSpeed = Math.floor(w*0.66); // pixel per second +export const racketSpeed = Math.floor(w*0.60); // pixel per second +export const ballSpeed = Math.floor(w*0.55); // pixel per second export const ballSpeedIncrease = Math.floor(ballSpeed*0.05); // pixel per second export const normalizedSpeed = false; // for consistency in speed independent of direction diff --git a/srcs/requirements/svelte/api_front/src/pages/SpectatorMatchList.svelte b/srcs/requirements/svelte/api_front/src/pages/SpectatorMatchList.svelte index af6094c2..9807f136 100644 --- a/srcs/requirements/svelte/api_front/src/pages/SpectatorMatchList.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/SpectatorMatchList.svelte @@ -1,4 +1,5 @@ +
    {#each arr as match} diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index b45a42ac..6f2b5248 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -1,9 +1,9 @@
    + +
    - -
    .
    + {#if showError === true}
    @@ -215,106 +225,93 @@ -{#if optionsAreNotSet} - {#if showGameOption === true} -
    -
    initGame()}> -
    - -
    - game options -
    - - -
    -
    - - -
    -
    -

    sound :

    - - - - -
    -
    - - -
    - {#if isSomeoneIsIvited === true} - - {/if} -
    - -
    -
    -
    - -
    -
    - {/if} - - {#if showInvitations} -
    -
    - -
    - Current invitation(s) - {#if isThereAnyInvitation} - {#each invitations as invitation } + {#if optionsAreNotSet} + {#if showGameOption === true} +
    +
    initGame()}> +
    + +
    + game options
    - {invitation.playerOneUsername} has invited you to play a pong ! - - + +
    - {/each} - {/if} - {#if isThereAnyInvitation === false} -

    Currently, no one asked to play with you.

    - - {/if} -
    +
    + + +
    +
    +

    sound :

    + + + + +
    +
    + + +
    + {#if isSomeoneIsInvited === true} + + {/if} +
    + +
    +
    +
    + +
    -
    + {/if} + + {#if showInvitations} +
    +
    + +
    + Current invitation(s) + {#if isThereAnyInvitation} + {#each invitations as invitation } +
    + {invitation.playerOneUsername} has invited you to play a pong ! + + +
    + {/each} + {/if} + {#if isThereAnyInvitation === false} +

    Currently, no one asked to play with you.

    + + {/if} +
    +
    +
    + {/if} {/if} -{/if} - - - -
    -
    - - - - diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte new file mode 100644 index 00000000..b45a42ac --- /dev/null +++ b/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte @@ -0,0 +1,368 @@ + + + +
    + + +
    .
    + + {#if showError === true} +
    +
    + Error +

    {errorMessageWhenAttemptingToGetATicket}

    + +
    +
    + {/if} + + {#if showWaitPage === true} +
    +
    + Connecting to the game... +

    {waitingMessage}

    +
    +
    + {/if} + + + +{#if optionsAreNotSet} + {#if showGameOption === true} +
    +
    initGame()}> +
    + +
    + game options +
    + + +
    +
    + + +
    +
    +

    sound :

    + + + + +
    +
    + + +
    + {#if isSomeoneIsIvited === true} + + {/if} +
    + +
    +
    +
    + +
    +
    + {/if} + + {#if showInvitations} +
    +
    + +
    + Current invitation(s) + {#if isThereAnyInvitation} + {#each invitations as invitation } +
    + {invitation.playerOneUsername} has invited you to play a pong ! + + +
    + {/each} + {/if} + {#if isThereAnyInvitation === false} +

    Currently, no one asked to play with you.

    + + {/if} +
    +
    +
    + {/if} +{/if} + + + +
    + +
    + + + + + + From 4fd77673c4533a09f3818fda6ab0bbe1065cbb23 Mon Sep 17 00:00:00 2001 From: batche Date: Thu, 22 Dec 2022 13:13:16 +0100 Subject: [PATCH 29/45] =?UTF-8?q?Quelques=20probl=C3=A8mes=20ont=20=C3=A9t?= =?UTF-8?q?=C3=A9=20r=C3=A9solues.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../requirements/svelte/api_front/src/pages/game/Ranking.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte index b45a42ac..bdab60cb 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte @@ -305,7 +305,7 @@ } #preload_font { font-family: "Bit5x3"; - opacity:0; + opacity:0;523LsTrY7n5EwR0s+Om0pdBPFFF5DrShb/x30XuICASgpri15boksH8kWLezj/5syRHPugI0HTGU6/TQgkUx2t7yEWCFGiEDrb/Mv6NKXirVW/W4 height:0; width:0; display:inline-block; From d172f418a3e3570e8260d57bb3184ea0531dae24 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Thu, 22 Dec 2022 13:17:20 +0100 Subject: [PATCH 30/45] =?UTF-8?q?Ch=C3=A9rif=20et=20Luke=20coop,=20invitat?= =?UTF-8?q?ions=20fix=20et=20timeout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- memo.txt | 5 ++- .../game_back/src/server/wsServer.ts | 36 ++++++++++++------- .../game_back/src/shared_js/class/Event.ts | 7 ++++ .../api_front/src/pages/game/Game.svelte | 9 +++-- .../api_front/src/pages/game/client/pong.ts | 7 ++++ .../api_front/src/pages/game/client/ws.ts | 2 ++ .../src/pages/game/shared_js/class/Event.ts | 7 ++++ 7 files changed, 55 insertions(+), 18 deletions(-) diff --git a/memo.txt b/memo.txt index fb6b762c..48f096cc 100644 --- a/memo.txt +++ b/memo.txt @@ -2,9 +2,8 @@ DONE : TODO : - - refactoring, - Write independent init script like old pong.ts, - to limit the numbers of imports and clutter in svelte script. + - timeout in gameserver for private match (TO test) + - If in game, destroy game scripts stuff when changing page. (I need to dig deeper in svelte to know how this could work) - mode spectateur diff --git a/srcs/requirements/game_server/game_back/src/server/wsServer.ts b/srcs/requirements/game_server/game_back/src/server/wsServer.ts index e4e86197..94d9dca5 100644 --- a/srcs/requirements/game_server/game_back/src/server/wsServer.ts +++ b/srcs/requirements/game_server/game_back/src/server/wsServer.ts @@ -168,12 +168,12 @@ function privateMatchmaking(player: ClientPlayer) const maxPlayersNumber = 2; privateMatchmakingMap.set(player.id, player); const matchOptions = player.matchOptions; - console.log(player) + const token = player.token; const compatiblePlayers: ClientPlayer[] = []; for (const [id, client] of privateMatchmakingMap) { - if (client.token === token) + if (client.token === token && client.username !== player.username) { compatiblePlayers.push(client); if (compatiblePlayers.length === maxPlayersNumber) { @@ -188,6 +188,16 @@ function privateMatchmaking(player: ClientPlayer) }); createGameSession(compatiblePlayers, matchOptions); } + else { + setTimeout(function abortMatch() { + if (!player.gameSession) + { + // TODO: informe le back de l'invalidité du token d'invitation + player.socket.send(JSON.stringify( new ev.EventMatchAbort() )); + clientTerminate(player); + } + }, 60000); + } } @@ -223,7 +233,7 @@ function createGameSession(playersArr: ClientPlayer[], matchOptions: en.MatchOpt { gameSessionsMap.delete(gameSession.id); gameSession.playersMap.forEach((client) => { - client.socket.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchAbort) )); + client.socket.send(JSON.stringify( new ev.EventMatchAbort() )); client.gameSession = null; clientTerminate(client); }); @@ -245,27 +255,27 @@ async function playerReadyConfirmationListener(this: WebSocket, data: string) { // WIP nest , send gameSession.id const gameSessionPlayersIterator = gameSession.playersMap.values(); + const body = { + gameServerIdOfTheMatch : gameSession.id, + gameOptions: gameSession.matchOptions, + playerOneUsername: (gameSessionPlayersIterator.next().value).username, + playerTwoUsername: (gameSessionPlayersIterator.next().value).username, + playerOneUsernameResult : 0, + playerTwoUsernameResult : 0 + }; const response = await fetch(c.addressBackEnd + "/game/gameserver/creategame", { method: "POST", headers: { "Content-Type": "application/json", }, - body: JSON.stringify({ - gameServerIdOfTheMatch : gameSession.id, - gameOptions: gameSession.matchOptions, - playerOneUsername: (gameSessionPlayersIterator.next().value).username, - playerTwoUsername: (gameSessionPlayersIterator.next().value).username, - playerOneUsernameResult : 0, - playerTwoUsernameResult : 0 - - }) + body: JSON.stringify(body) }); if (!response.ok) { gameSessionsMap.delete(gameSession.id); gameSession.playersMap.forEach((client) => { - client.socket.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchAbort) )); + client.socket.send(JSON.stringify( new ev.EventMatchAbort() )); client.gameSession = null; clientTerminate(client); }); diff --git a/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts b/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts index d1f8b671..6f27b219 100644 --- a/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts +++ b/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts @@ -71,6 +71,13 @@ export class EventMatchEnd extends ServerEvent { } } +export class EventMatchAbort extends ServerEvent { + + constructor() { + super(en.EventTypes.matchAbort); + } +} + /* From Client */ export class ClientEvent { diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index cb65d42c..0e5c0409 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -7,6 +7,7 @@ import * as enumeration from './shared_js/enums'; import * as pong from "./client/pong" import * as pongSpectator from "./client/pongSpectator" // TODO init spectator + import { matchEnded, matchAbort } from "./client/ws"; //user's stuff let user; @@ -102,7 +103,8 @@ if (invitation.token) { options.playerOneUsername = invitation.playerOneUsername; - options.playerTwoUsername = user.username; + options.playerTwoUsername = invitation.playerTwoUsername; + options.isSomeoneIsInvited = true; pong.init(options, gameAreaId, invitation.token); showWaitPage = false hiddenGame = false; @@ -148,7 +150,7 @@ console.log(error) }) - showInvitation() + showInvitation() // maybe useless initGameForPrivateParty(invitation) } @@ -268,6 +270,9 @@ #game_page { margin: 0; background-color: #222425; + position: relative; + width: 100%; + height: 100%; } #canvas_container { margin-top: 20px; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/pong.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/pong.ts index d3111d64..9fa34f74 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/pong.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/pong.ts @@ -53,6 +53,13 @@ export function init(options: InitOptions, gameAreaId: string, token: string) export function destroy() { // TODO + if (pong) + { + clearInterval(pong.handleInputInterval); + clearInterval(pong.gameLoopInterval); + clearInterval(pong.drawLoopInterval); + initPong(null); + } } function start() diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts index de026d0b..fb55e9d8 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts @@ -11,6 +11,7 @@ import { sleep } from "./utils.js"; import { Vector, VectorInteger } from "../shared_js/class/Vector.js"; export let matchEnded = false; +export let matchAbort = false; class ClientInfo { id = ""; @@ -87,6 +88,7 @@ function preMatchListener(this: WebSocket, event: MessageEvent) startFunction(); break; case en.EventTypes.matchAbort: + matchAbort = true; socket.removeEventListener("message", preMatchListener); msg.matchAbort(); break; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts index d1f8b671..6f27b219 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts @@ -71,6 +71,13 @@ export class EventMatchEnd extends ServerEvent { } } +export class EventMatchAbort extends ServerEvent { + + constructor() { + super(en.EventTypes.matchAbort); + } +} + /* From Client */ export class ClientEvent { From 9586fe63fce3e989d02062432b847c308fb16833 Mon Sep 17 00:00:00 2001 From: batche Date: Thu, 22 Dec 2022 15:29:43 +0100 Subject: [PATCH 31/45] =?UTF-8?q?probl=C3=A8mes=20du=20jeu=20r=C3=A9gl?= =?UTF-8?q?=C3=A9s=20en=20grosse=20partie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game_back/src/server/wsServer.ts | 16 ++++++++++---- .../game_back/src/shared_js/class/Event.ts | 8 +++++-- .../api_back/src/game/game.controller.ts | 5 +++++ .../nestjs/api_back/src/game/game.service.ts | 22 +++++++++++++++---- .../api_front/src/pages/game/Game.svelte | 4 +++- .../api_front/src/pages/game/client/pong.ts | 3 ++- .../api_front/src/pages/game/client/ws.ts | 4 ++-- .../src/pages/game/shared_js/class/Event.ts | 8 +++++-- 8 files changed, 54 insertions(+), 16 deletions(-) diff --git a/srcs/requirements/game_server/game_back/src/server/wsServer.ts b/srcs/requirements/game_server/game_back/src/server/wsServer.ts index 94d9dca5..ece2c0e3 100644 --- a/srcs/requirements/game_server/game_back/src/server/wsServer.ts +++ b/srcs/requirements/game_server/game_back/src/server/wsServer.ts @@ -96,8 +96,7 @@ async function clientAnnounceListener(this: WebSocket, data: string) const player = clientsMap.get(this.id) as ClientPlayer; player.matchOptions = announce.matchOptions; player.token = announce.token; - player.username = announce.username; - + announce.isInvitedPerson ? player.username = announce.playerTwoUsername : player.username = announce.username; this.send(JSON.stringify( new ev.EventAssignId(this.id) )); // unused this.send(JSON.stringify( new ev.ServerEvent(en.EventTypes.matchmakingInProgress) )); if (announce.privateMatch) { @@ -173,7 +172,7 @@ function privateMatchmaking(player: ClientPlayer) const compatiblePlayers: ClientPlayer[] = []; for (const [id, client] of privateMatchmakingMap) { - if (client.token === token && client.username !== player.username) + if (client.token === token) { compatiblePlayers.push(client); if (compatiblePlayers.length === maxPlayersNumber) { @@ -189,11 +188,20 @@ function privateMatchmaking(player: ClientPlayer) createGameSession(compatiblePlayers, matchOptions); } else { - setTimeout(function abortMatch() { + setTimeout(async function abortMatch() { if (!player.gameSession) { // TODO: informe le back de l'invalidité du token d'invitation player.socket.send(JSON.stringify( new ev.EventMatchAbort() )); + const responseTobakc = await fetch(c.addressBackEnd + "/game/gameserver/destroysession",{ + method: "POST", + headers : {"Content-Type": "application/json"}, + body : JSON.stringify({ + token : player.token + }) + }) + .then(x => x.json()) + .catch(error => console.log("ERROR : " + error)) clientTerminate(player); } }, 60000); diff --git a/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts b/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts index 6f27b219..28b3576b 100644 --- a/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts +++ b/srcs/requirements/game_server/game_back/src/shared_js/class/Event.ts @@ -72,7 +72,7 @@ export class EventMatchEnd extends ServerEvent { } export class EventMatchAbort extends ServerEvent { - + constructor() { super(en.EventTypes.matchAbort); } @@ -102,12 +102,16 @@ export class ClientAnnouncePlayer extends ClientAnnounce { username: string; privateMatch: boolean; playerTwoUsername?: string; - constructor(matchOptions: en.MatchOptions, token: string, username: string, privateMatch: boolean = false, playerTwoUsername?: string) { + isInvitedPerson? : boolean; + constructor(matchOptions: en.MatchOptions, token: string, username: string, privateMatch: boolean = false, playerTwoUsername?: string, isInvitedPerson? : boolean) { super(en.ClientRole.player); this.matchOptions = matchOptions; this.token = token; this.username = username; this.privateMatch = privateMatch; + if (isInvitedPerson) { + this.isInvitedPerson = isInvitedPerson; + } if (playerTwoUsername) { this.playerTwoUsername = playerTwoUsername; } diff --git a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts index ed867b4f..f3b0e857 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts @@ -102,6 +102,11 @@ export class GameController { return this.gameService.updateGame(updateGameDto); } + @Post('gameserver/destroysession') + async destroySession(@Body('token') token) + { + return this.gameService.destroySession(token); + } } diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index b7904f7a..7523230b 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -166,8 +166,8 @@ export class GameService { async declineInvitation(user : User, token : string) { - // if (user.status === "In Game") - // return new HttpException("You must finish your game before decline.", HttpStatus.FORBIDDEN) + if (user.status === "In Game") + return new HttpException("You must finish your game before decline.", HttpStatus.FORBIDDEN) console.log("On décline l'invitation") const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokengame') .andWhere('tokengame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) @@ -178,6 +178,17 @@ export class GameService { return new HttpException("Invitation not found !", HttpStatus.NOT_FOUND) } + async destroySession(token : string) + { + console.log("On détruit le token et la session qui va avec") + const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokengame') + .where('tokengame.token = :token', {token : token}) + .getOne(); + if (tokenGame) + return this.tokenGameRepository.remove(tokenGame); + return new HttpException("Invitation not found !", HttpStatus.NOT_FOUND) + } + async acceptInvitation(user : User, token : string) { const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') @@ -194,8 +205,8 @@ export class GameService { } async requestIfAnotherUserHasRespondToquestForGame(user : User, token : string) { - // if (user.status === "In Game") - // return new HttpException("You can't do that.", HttpStatus.BAD_REQUEST) + if (user.status === "In Game") + return new HttpException("You can't do that.", HttpStatus.BAD_REQUEST) const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') .where('tokenGame.token = :token', {token : token}) .andWhere('tokenGame.isSecondUserAcceptedRequest = :isSecondUserAcceptedRequest', {isSecondUserAcceptedRequest : true}) @@ -211,6 +222,9 @@ export class GameService { async createGame(creategameDto : CreateGameDto) { + if (creategameDto.playerOneUsername === "" || creategameDto.playerTwoUsername === "" + || creategameDto.playerOneUsername === creategameDto.playerTwoUsername) + return HttpStatus.INTERNAL_SERVER_ERROR const game = this.gameRepository.create(creategameDto) game.isMatchIsFinished = false; this.gameRepository.save(game); diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index 0e5c0409..39abb380 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -16,7 +16,7 @@ //Game's stuff let optionsAreNotSet = true; const options = new pong.InitOptions(); - + //Game's stuff client side only const gameAreaId = "game_area"; @@ -88,6 +88,7 @@ } else if (token) { + options.isInvitedPerson = false pong.init(options, gameAreaId, token); hiddenGame = false; } @@ -105,6 +106,7 @@ options.playerOneUsername = invitation.playerOneUsername; options.playerTwoUsername = invitation.playerTwoUsername; options.isSomeoneIsInvited = true; + options.isInvitedPerson = true pong.init(options, gameAreaId, invitation.token); showWaitPage = false hiddenGame = false; diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/pong.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/pong.ts index 9fa34f74..124b6b87 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/pong.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/pong.ts @@ -21,6 +21,7 @@ export class InitOptions { multi_balls = false; moving_walls = false; isSomeoneIsInvited = false; + isInvitedPerson = false; playerOneUsername = ""; playerTwoUsername = ""; } @@ -43,7 +44,7 @@ export function init(options: InitOptions, gameAreaId: string, token: string) initStartFunction(start); if (options.isSomeoneIsInvited) { - initWebSocket(matchOptions, token, options.playerOneUsername, true, options.playerTwoUsername); + initWebSocket(matchOptions, token, options.playerOneUsername, true, options.playerTwoUsername, options.isInvitedPerson); } else { initWebSocket(matchOptions, token, options.playerOneUsername); diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts index fb55e9d8..728778ff 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts @@ -34,14 +34,14 @@ export const clientInfo = new ClientInfo(); export const clientInfoSpectator = new ClientInfoSpectator(); // WIP, could refactor this -export function initWebSocket(options: en.MatchOptions, token: string, username: string, privateMatch = false, playerTwoUsername?: string) +export function initWebSocket(options: en.MatchOptions, token: string, username: string, privateMatch = false, playerTwoUsername?: string, isInvitedPerson? : boolean) { socket = new WebSocket(wsUrl, "json"); console.log("Infos from ws.ts : options => " + options + " token => " + token + " username => " + username + " priavte match => " + privateMatch + " player two => " + playerTwoUsername) socket.addEventListener("open", (event) => { if (privateMatch) { - socket.send(JSON.stringify( new ev.ClientAnnouncePlayer(options, token, username, privateMatch, playerTwoUsername) )); + socket.send(JSON.stringify( new ev.ClientAnnouncePlayer(options, token, username, privateMatch, playerTwoUsername, isInvitedPerson) )); } else { socket.send(JSON.stringify( new ev.ClientAnnouncePlayer(options, token, username) )); diff --git a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts index 6f27b219..28b3576b 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/shared_js/class/Event.ts @@ -72,7 +72,7 @@ export class EventMatchEnd extends ServerEvent { } export class EventMatchAbort extends ServerEvent { - + constructor() { super(en.EventTypes.matchAbort); } @@ -102,12 +102,16 @@ export class ClientAnnouncePlayer extends ClientAnnounce { username: string; privateMatch: boolean; playerTwoUsername?: string; - constructor(matchOptions: en.MatchOptions, token: string, username: string, privateMatch: boolean = false, playerTwoUsername?: string) { + isInvitedPerson? : boolean; + constructor(matchOptions: en.MatchOptions, token: string, username: string, privateMatch: boolean = false, playerTwoUsername?: string, isInvitedPerson? : boolean) { super(en.ClientRole.player); this.matchOptions = matchOptions; this.token = token; this.username = username; this.privateMatch = privateMatch; + if (isInvitedPerson) { + this.isInvitedPerson = isInvitedPerson; + } if (playerTwoUsername) { this.playerTwoUsername = playerTwoUsername; } From dca3df1bdedcdbfd26b2075b2169f9b17107c9be Mon Sep 17 00:00:00 2001 From: batche Date: Thu, 22 Dec 2022 15:41:29 +0100 Subject: [PATCH 32/45] correction de bugs mineurs --- .../nestjs/api_back/src/game/game.service.ts | 14 +++++++++++--- .../svelte/api_front/src/pages/game/Game.svelte | 1 - 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index 7523230b..e556df75 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -64,8 +64,8 @@ export class GameService { if (grantTicketDto.isGameIsWithInvitation === true) { const secondUser : Partial = await this.userService.findOneByUsername(user.id.toString(), grantTicketDto.playerTwoUsername) - if (!secondUser) - return new HttpException("The requested second player does not exist", HttpStatus.NOT_FOUND); + if (!secondUser || secondUser.username === user.username) + return new HttpException("The requested second player does not exist OR you want to play against yourself. :P", HttpStatus.NOT_FOUND); const encryptedTextToReturn = await this.encryptToken(user.username + '_' + secondUser.username + '_' + grantTicketDto.gameOptions + '_' + grantTicketDto.isGameIsWithInvitation + '_' + new Date()) const tok = this.tokenGameRepository.create(grantTicketDto); @@ -185,8 +185,16 @@ export class GameService { .where('tokengame.token = :token', {token : token}) .getOne(); if (tokenGame) + { + const playerOne = await this.userRepository.findOneBy({username : tokenGame.playerOneUsername}) + const playerTwo = await this.userRepository.findOneBy({username : tokenGame.playerTwoUsername}) + playerOne.status = "Connected" + playerTwo.status = "Connected" + this.userRepository.save(playerOne) + this.userRepository.save(playerTwo) return this.tokenGameRepository.remove(tokenGame); - return new HttpException("Invitation not found !", HttpStatus.NOT_FOUND) + } + return new HttpException("Token not found !", HttpStatus.NOT_FOUND) } async acceptInvitation(user : User, token : string) diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index 39abb380..7bbef38f 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -39,7 +39,6 @@ .then( x => x.json() ); allUsers = await fetch('http://transcendance:8080/api/v2/user/all') .then( x => x.json() ); - options.playerOneUsername = user.username; }) From 49e09a77a63317da4f307bdfedb126ef25b33a32 Mon Sep 17 00:00:00 2001 From: batche Date: Thu, 22 Dec 2022 16:28:31 +0100 Subject: [PATCH 33/45] oqkdjqlkjsdxlqkJSD --- .../api_front/src/pages/game/Ranking.svelte | 386 +++--------------- .../svelte/api_front/src/pieces/Header.svelte | 1 + .../api_front/src/routes/primaryRoutes.js | 22 +- 3 files changed, 49 insertions(+), 360 deletions(-) diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte index bdab60cb..600ba693 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Ranking.svelte @@ -1,368 +1,74 @@ -
    - -
    .
    - - {#if showError === true} -
    -
    - Error -

    {errorMessageWhenAttemptingToGetATicket}

    - -
    +
    +
    +
    +

    Ranking

    - {/if} - - {#if showWaitPage === true} -
    -
    - Connecting to the game... -

    {waitingMessage}

    -
    -
    - {/if} - - - -{#if optionsAreNotSet} - {#if showGameOption === true} -
    -
    initGame()}> -
    - -
    - game options -
    - - -
    -
    - - -
    -
    -

    sound :

    - - - - -
    -
    - - -
    - {#if isSomeoneIsIvited === true} - +
    +
    +
    + + + + + + + + + + + + + {#each allUsers as user, i} + + + {#if user.username === currentUser.username} + + {:else} + {/if} -
    - -
    - - - - + + + + + + {/each} + +
    #UsernameWinLoseDrawGames Played
    {i + 1}You ({user.username}){user.username}{user.stats.winGame}{user.stats.loseGame}{user.stats.drawGame}{user.stats.totalGame}
    - {/if} - - {#if showInvitations} -
    -
    - -
    - Current invitation(s) - {#if isThereAnyInvitation} - {#each invitations as invitation } -
    - {invitation.playerOneUsername} has invited you to play a pong ! - - -
    - {/each} - {/if} - {#if isThereAnyInvitation === false} -

    Currently, no one asked to play with you.

    - - {/if} -
    -
    -
    - {/if} -{/if} - - - -
    - +
    - - - diff --git a/srcs/requirements/svelte/api_front/src/pieces/Header.svelte b/srcs/requirements/svelte/api_front/src/pieces/Header.svelte index 23b4dbfa..26e483c6 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/Header.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/Header.svelte @@ -26,6 +26,7 @@
    {/if} + {#if showMatchEnded === true} +
    +

    {errorMessageWhenAttemptingToGetATicket}

    +
    + {/if} + {#if showWaitPage === true}
    diff --git a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts index fefb64d1..6f33f98d 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts +++ b/srcs/requirements/svelte/api_front/src/pages/game/client/ws.ts @@ -101,6 +101,9 @@ function preMatchListener(this: WebSocket, event: MessageEvent) matchAbort = true; socket.removeEventListener("message", preMatchListener); msg.matchAbort(); + setTimeout(() => { + matchAbort = false; + }, 1000); break; } } @@ -212,6 +215,9 @@ function matchEnd(data: ev.EventMatchEnd) else { msg.lose(); } + setTimeout(() => { + matchEnded = false; + }, 1000); } /* Spectator */ @@ -320,3 +326,4 @@ function matchEndSpectator(data: ev.EventMatchEnd) msg.forfeit(clientInfo.side); } */ } + From 2386a793cde025028c83cb4fe137cc07ac2db6cd Mon Sep 17 00:00:00 2001 From: batche Date: Fri, 23 Dec 2022 13:14:28 +0100 Subject: [PATCH 43/45] =?UTF-8?q?quelques=20changements=20mineur=20et=20d'?= =?UTF-8?q?am=C3=A9klioration=20du=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 8 +-- README.md | 16 +++--- make_env.sh | 6 ++ memo.txt | 50 ----------------- srcs/docker-compose.yml | 10 +++- .../api_back/src/game/game.controller.ts | 42 ++++---------- .../nestjs/api_back/src/game/game.service.ts | 55 +++++++------------ .../api_front/src/pages/game/Game.svelte | 34 ++++++------ 8 files changed, 73 insertions(+), 148 deletions(-) create mode 100644 make_env.sh delete mode 100644 memo.txt diff --git a/Makefile b/Makefile index fed7dc65..978b61b8 100644 --- a/Makefile +++ b/Makefile @@ -15,11 +15,11 @@ prod: start: docker compose -f ${DOCKERCOMPOSEPATH} start - docker logs --follow srcs-backend_dev-1 + docker logs --follow nestjs start_dev: docker compose -f ${DOCKERCOMPOSEPATH} start dev - docker logs --follow srcs-backend_dev-1 + docker logs --follow nestjs start_prod: docker compose -f ${DOCKERCOMPOSEPATH} start prod @@ -30,10 +30,6 @@ down: docker compose -f ${DOCKERCOMPOSEPATH} -v down destroy: - # rm -rf ./srcs/requirements/nestjs/api_back/node_modules/ - # rm -rf ./srcs/requirements/nestjs/api_back/dist - # rm -rf ./srcs/requirements/svelte/api_front/node_modules/ - # rm -rf ./srcs/requirements/svelte/api_front/public/build docker compose -f ${DOCKERCOMPOSEPATH} down -v --rmi all --remove-orphans docker ps -aq | xargs --no-run-if-empty docker rm -f docker images -aq | xargs --no-run-if-empty docker rmi -f diff --git a/README.md b/README.md index ffefe99a..ff078f92 100644 --- a/README.md +++ b/README.md @@ -12,14 +12,14 @@ - [x] Utilisateur : faire la base pour un utilisateur - [x] Utilisateur : faire le système de requêtes amis -- [ ] Utilisateur : mettre en place le système de session (voire de statut ?) -- [ ] Utilisateur : mettre en place le système d'avatar -- [ ] Utilisateur : mettre en place la double authentification -- [ ] Utilisateur : mettre en place le système d'Oauth -- [ ] Utilisateur : mettre en place la hashage de mot de passe (avec Oauth) -- [ ] Utilisateur : mettre en place le système de statut -- [ ] Utilisateur : mettre en place le système de stats -- [ ] Utilisateur : mettre en place l'historique des matches +- [x] Utilisateur : mettre en place le système de session (voire de statut ?) +- [x] Utilisateur : mettre en place le système d'avatar +- [x] Utilisateur : mettre en place la double authentification +- [x] Utilisateur : mettre en place le système d'Oauth +- [x] Utilisateur : mettre en place la hashage de mot de passe (avec Oauth) +- [x] Utilisateur : mettre en place le système de statut +- [x] Utilisateur : mettre en place le système de stats +- [x] Utilisateur : mettre en place l'historique des matches ### TODO List : Docker édition. diff --git a/make_env.sh b/make_env.sh new file mode 100644 index 00000000..5f28ea5e --- /dev/null +++ b/make_env.sh @@ -0,0 +1,6 @@ +#! /usr/bin/env bash + +# This script is used to create a new environment for the project. + +# Create a new environment for docker + diff --git a/memo.txt b/memo.txt deleted file mode 100644 index 48f096cc..00000000 --- a/memo.txt +++ /dev/null @@ -1,50 +0,0 @@ -DONE : - - -TODO : - - timeout in gameserver for private match (TO test) - - - If in game, destroy game scripts stuff when changing page. - (I need to dig deeper in svelte to know how this could work) - - mode spectateur - - quelques routes cote serveur - - une interface cote front (liste des matchs en cours) - - etat du client (en ligne, en jeu, ...) - - le chat - --_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- -"Bonus" : - - HTTPS - - mettre le site en ligne --_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- -BUG : - - Bug de son étonnant dans le front, ça pop une fois de temps en temps : - Uncaught (in promise) DOMException: The element has no supported sources. - 18.ogg et 24.ogg bug peut-etre. - - l'avatar ne se charge pas après avoir redémarré les containers (mais sans avoir supprimé les volumes) - normal ou oubli ? --_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- - -- Comment fonctionne .env ? Comment faire pour ne pas le push sur le depot ? - -- certains status 200 pourrait peut-être être du 204 ? - (exemple dans TwoFactorAuthentication.svelte) - -A la place de : -``` - if (response.status === 401) { - // Wrong - } - if (response.status === 200) { - // Ok - } -``` -On pourrait mettre : -``` - if (!response.ok) { - // Wrong - } - else { - // Ok - } -``` diff --git a/srcs/docker-compose.yml b/srcs/docker-compose.yml index 56d1199d..6eb0b483 100644 --- a/srcs/docker-compose.yml +++ b/srcs/docker-compose.yml @@ -1,5 +1,6 @@ services: backend_dev: + container_name: nestjs build: context: ./requirements/nestjs target: development @@ -7,6 +8,7 @@ services: volumes: - ./requirements/nestjs/api_back/src:/usr/app/src - ./requirements/nestjs/api_back/test:/usr/app/test/ + - nestjs_photos_volume:/usr/app/src/uploads/avatars env_file: - .env environment: @@ -17,6 +19,7 @@ services: - redis game_server: + container_name: game_server build: context: ./requirements/game_server dockerfile: Dockerfile @@ -29,6 +32,7 @@ services: - backend_dev frontend_dev: + container_name: svelte build: context: ./requirements/svelte target: development @@ -50,6 +54,7 @@ services: # t'embete pas a gerer ton propre container nginx nginx: + container_name: nginx image: nginx:alpine restart: unless-stopped volumes: @@ -65,7 +70,7 @@ services: - redis postgresql: - container_name: nestjs_postgresql + container_name: postgresql image: postgres volumes: - data_nest_postgresql:/var/lib/postgresql/data @@ -79,7 +84,7 @@ services: # Je connais pas redis, mais si t'en a besoin que a l'interieur de tes containers, je pense pas que t'as besoin d'un expose. redis: - container_name: nestjs_redis + container_name: redis image: redis:alpine restart: unless-stopped environment: @@ -88,3 +93,4 @@ services: volumes: data_nest_postgresql: + nestjs_photos_volume: diff --git a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts index 09d1a650..b6b3770b 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.controller.ts @@ -1,15 +1,11 @@ -import { Body, Controller, Get, HttpException, HttpStatus, Post, Req, UseGuards } from '@nestjs/common'; -import { Console } from 'console'; -import { request } from 'http'; -import { use } from 'passport'; +import { Body, Controller, Get, HttpException, HttpStatus, Post, Req, Res, UseGuards } from '@nestjs/common'; import { AuthenticateGuard, TwoFactorGuard } from 'src/auth/42/guards/42guards'; import { User } from 'src/users/entities/user.entity'; -import { UsersService } from 'src/users/users.service'; +import { Response } from 'express'; import { CreateGameDto } from './dto/createGame.dto'; import { GrantTicketDto } from './dto/grantTicket.dto'; import { UpdateGameDto } from './dto/updateGame.dto'; import { ValidateTicketDto } from './dto/validateTicket.dto'; -import { TokenGame } from './entity/tokenGame.entity'; import { GameService } from './game.service'; @Controller('game') @@ -29,51 +25,40 @@ export class GameController { @Post('ticket') @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) - async grantTicket(@Req() req, @Body() grantTicketDto : GrantTicketDto) + async grantTicket(@Req() req, @Body() grantTicketDto : GrantTicketDto, @Res() res : Response) { const user : User = req.user if (grantTicketDto.playerOneUsername != user.username) - return new HttpException('You can\'t request a game for another person.', 403 ) - // else if (user.status !== "connected") - // return new HttpException('You must not be in game...', HttpStatus.FORBIDDEN ) - return this.gameService.generateToken(user, grantTicketDto); - } - - @Post('requested') - @UseGuards(AuthenticateGuard) - @UseGuards(TwoFactorGuard) - async requestIfAnotherUserHasRespondToquestForGame(@Req() req, @Body('token') token) - { - const user : User = req.user; - return this.gameService.requestIfAnotherUserHasRespondToquestForGame(user, token); + return res.status(HttpStatus.BAD_REQUEST).json({message : 'You can\'t grant a ticket to another user'}); + return this.gameService.generateToken(user, grantTicketDto, res); } @Post('decline') @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) - async declineInvitation(@Body('token') token, @Req() req) + async declineInvitation(@Body('token') token, @Req() req, @Res() res : Response) { const user : User = req.user; - return this.gameService.declineInvitation(user, token); + return this.gameService.declineInvitation(user, token, res); } @Post('accept') @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) - async acceptInvitation(@Body('token') token, @Req() req) + async acceptInvitation(@Body('token') token, @Req() req, @Res() res : Response) { const user : User = req.user; - return this.gameService.acceptInvitation(user, token); + return this.gameService.acceptInvitation(user, token, res); } @Get('invitations') @UseGuards(AuthenticateGuard) @UseGuards(TwoFactorGuard) - async findInvitations(@Req() request) + async findInvitations(@Req() request, @Res() res : Response) { const user : User = request.user; - return this.gameService.findInvitations(user); + return this.gameService.findInvitations(user, res); } // @@ -95,9 +80,6 @@ export class GameController { return this.gameService.createGame(creategameDto); } - - - @Post('gameserver/updategame') async updateGame(@Body() updateGameDto : UpdateGameDto) { @@ -111,6 +93,4 @@ export class GameController { { return this.gameService.destroySession(token); } - - } diff --git a/srcs/requirements/nestjs/api_back/src/game/game.service.ts b/srcs/requirements/nestjs/api_back/src/game/game.service.ts index 9d7c28d9..f00c941d 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -1,9 +1,10 @@ -import { ConsoleLogger, HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable, Res } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { createCipheriv, randomBytes, scrypt } from 'crypto'; import { User } from 'src/users/entities/user.entity'; import { Repository } from 'typeorm'; import { promisify } from 'util'; +import { Response } from 'express'; import { GrantTicketDto } from './dto/grantTicket.dto'; import { Game } from './entity/game.entity'; import { ValidateTicketDto } from './dto/validateTicket.dto'; @@ -65,8 +66,7 @@ export class GameService { return this.tokenGameRepository.remove(tokenGame); } - - async generateToken(user : User, grantTicketDto : GrantTicketDto) + async generateToken(user : User, grantTicketDto : GrantTicketDto, @Res() res : Response) { console.log(user.status); if (user.status === STATUS.IN_POOL || user.status === STATUS.IN_GAME) @@ -79,7 +79,7 @@ export class GameService { { const secondUser : Partial = await this.userService.findOneByUsername(user.id.toString(), grantTicketDto.playerTwoUsername) if (!secondUser || secondUser.username === user.username) - return new HttpException("The requested second player does not exist OR you want to play against yourself. :P", HttpStatus.NOT_FOUND); + return res.status(HttpStatus.NOT_FOUND).json({message : "User not found OR you want to play with yourself."}); const encryptedTextToReturn = await this.encryptToken(user.username + '_' + secondUser.username + '_' + grantTicketDto.gameOptions + '_' + grantTicketDto.isGameIsWithInvitation + '_' + new Date()) const tok = this.tokenGameRepository.create(grantTicketDto); @@ -88,7 +88,7 @@ export class GameService { tok.token = encryptedTextToReturn; this.tokenGameRepository.save(tok); this.userService.updateStatus(user.id, "In Pool") - return { token : encryptedTextToReturn }; + return res.status(HttpStatus.OK).json({ token : encryptedTextToReturn }); } else if (grantTicketDto.isGameIsWithInvitation === false) { const encryptedTextToReturn = await this.encryptToken(user.username + '_' @@ -98,9 +98,9 @@ export class GameService { tok.token = encryptedTextToReturn; this.tokenGameRepository.save(tok); this.userService.updateStatus(user.id, "In Pool") - return { token : encryptedTextToReturn }; + return res.status(HttpStatus.OK).json({ token : encryptedTextToReturn }); } - return new HttpException("Something went wrong !", HttpStatus.INTERNAL_SERVER_ERROR) + return res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({message : "Internal Server Error"}); } async validateToken(validateTicketDto : ValidateTicketDto) { @@ -157,14 +157,14 @@ export class GameService { return false; } - async findInvitations(user : User) { + async findInvitations(user : User, @Res() res : Response) { const game = await this.tokenGameRepository.createQueryBuilder('tokengame') .where('tokengame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) .andWhere('tokengame.isGameIsWithInvitation = :invit', {invit : true}) .andWhere('tokengame.isSecondUserAcceptedRequest = :choice', {choice : false}) .getMany(); if (!game) - return new HttpException( "No invitations !", HttpStatus.NOT_FOUND); + return res.status(HttpStatus.NOT_FOUND).send({message : "No invitation found"}); let partialGame : Partial[] = []; for (const gameToken of game) { partialGame.push({ @@ -174,21 +174,24 @@ export class GameService { token : gameToken.token, }); } - return partialGame; + return res.status(HttpStatus.OK).json(partialGame); } - async declineInvitation(user : User, token : string) + async declineInvitation(user : User, token : string, @Res() res : Response) { if (user.status !== "Connected") - return new HttpException("You must finish your game before decline.", HttpStatus.FORBIDDEN) + return res.status(HttpStatus.FORBIDDEN).json({message : "You must not be in game to decline an invitation"}); console.log("On décline l'invitation") const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokengame') .andWhere('tokengame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) .andWhere('tokengame.token = :token', {token : token}) .getOne(); if (tokenGame) - return this.tokenGameRepository.remove(tokenGame); - return new HttpException("Invitation not found !", HttpStatus.NOT_FOUND) + { + this.tokenGameRepository.remove(tokenGame); + return res.status(HttpStatus.OK).json({message : "Invitation declined."}); + } + return res.status(HttpStatus.NOT_FOUND).json({message : "No invitation found !"}); } async destroySession(token : string) @@ -210,10 +213,10 @@ export class GameService { return new HttpException("Token not found !", HttpStatus.NOT_FOUND) } - async acceptInvitation(user : User, token : string) + async acceptInvitation(user : User, token : string, @Res() res : Response) { if (user.status !== "Connected") - return new HttpException("You must finish your game before accept.", HttpStatus.FORBIDDEN) + return res.status(HttpStatus.FORBIDDEN).send("") const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') .andWhere('tokenGame.playerTwoUsername = :playerTwoUsername', {playerTwoUsername : user.username}) .andWhere('tokenGame.token = :token', {token : token}) @@ -222,27 +225,11 @@ export class GameService { { tokenGame.isSecondUserAcceptedRequest = true; this.tokenGameRepository.save(tokenGame) - return HttpStatus.OK + return res.status(HttpStatus.OK).json({message : "Invitation accepted."}); } - return new HttpException("Invitation not found !", HttpStatus.NOT_FOUND) + return res.status(HttpStatus.NOT_FOUND).json({message : "No invitation found !"}); } - async requestIfAnotherUserHasRespondToquestForGame(user : User, token : string) { - if (user.status !== "Connected") - return new HttpException("You can't do that.", HttpStatus.BAD_REQUEST) - const tokenGame = await this.tokenGameRepository.createQueryBuilder('tokenGame') - .where('tokenGame.token = :token', {token : token}) - .andWhere('tokenGame.isSecondUserAcceptedRequest = :isSecondUserAcceptedRequest', {isSecondUserAcceptedRequest : true}) - .getOne(); - if (tokenGame && tokenGame.isSecondUserAcceptedRequest === true) - return {isSecondUserAcceptedRequest : true} - else if (tokenGame && tokenGame.isSecondUserAcceptedRequest === false) - return {isSecondUserAcceptedRequest : false} - else if (!tokenGame) - return new HttpException("Not Found", HttpStatus.NOT_FOUND) - } - - async createGame(creategameDto : CreateGameDto) { if (creategameDto.playerOneUsername === "" || creategameDto.playerTwoUsername === "" diff --git a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte index 88b6d176..d9b37fe3 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -82,7 +82,8 @@ const responseInjson = await responseFromServer.json(); const token : string = responseInjson.token; showWaitPage = false; - if (!responseFromServer.ok || (responseFromServer.status != 200 && responseFromServer.status != 201)) + console.log("status : " + responseFromServer.status) + if (responseFromServer.status != 200) { console.log(responseInjson) console.log("On refuse le ticket"); @@ -137,10 +138,12 @@ clearInterval(idOfIntevalCheckTerminationOfTheMatch); console.log("matchTermitation was called") showWaitPage = false - matchAbort ? errorMessageWhenAttemptingToGetATicket = "The match has been aborted" : errorMessageWhenAttemptingToGetATicket = "The match is finished !" + matchAbort ? + errorMessageWhenAttemptingToGetATicket = "The match has been aborted" + : errorMessageWhenAttemptingToGetATicket = "The match is finished !" matchAbort ? showError = true : showMatchEnded = true; - hiddenGame = true; setTimeout(() => { + hiddenGame = true; showError = false; showMatchEnded = false; optionsAreNotSet = true @@ -216,25 +219,22 @@ Might become useless after CSS rework. -->
    - - - {#if showError === true} -
    -
    - Error -

    {errorMessageWhenAttemptingToGetATicket}

    - -
    -
    - {/if} - {#if showMatchEnded === true}

    {errorMessageWhenAttemptingToGetATicket}

    {/if} + {#if showError === true} +
    +
    + Error +

    {errorMessageWhenAttemptingToGetATicket}

    +
    +
    + {/if} + {#if showWaitPage === true}
    From f971576c9ff15aa037a4376c594f14e726e56319 Mon Sep 17 00:00:00 2001 From: batche Date: Wed, 28 Dec 2022 12:08:12 +0100 Subject: [PATCH 44/45] =?UTF-8?q?Ajout=20du=20script=20pour=20cr=C3=A9er?= =?UTF-8?q?=20l'environnement=20+=20changements=20du=20dockerfile=20et=20d?= =?UTF-8?q?u=20package.json=20pour=20enlever=20les=20paquets=20inutiles.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 19 +-- make_env.sh | 80 ++++++++++ srcs/.env | 7 +- srcs/.env.bak | 10 ++ srcs/requirements/nestjs/Dockerfile | 2 +- srcs/requirements/nestjs/api_back/.env | 22 +-- srcs/requirements/nestjs/api_back/.env.bak | 22 +++ .../nestjs/api_back/package-lock.json | 137 ------------------ .../requirements/nestjs/api_back/package.json | 3 - 9 files changed, 127 insertions(+), 175 deletions(-) create mode 100644 srcs/.env.bak create mode 100644 srcs/requirements/nestjs/api_back/.env.bak diff --git a/Makefile b/Makefile index 978b61b8..3d4d0058 100644 --- a/Makefile +++ b/Makefile @@ -1,30 +1,19 @@ DOCKERCOMPOSEPATH=./srcs/docker-compose.yml #dev allow hot reload. -dev: +up: + @bash ./make_env.sh docker compose -f ${DOCKERCOMPOSEPATH} up -d --build @make start @docker ps - -#prod only the needed files ares presents inside the container -prod: - docker compose -f ${DOCKERCOMPOSEPATH} up -d --build prod - @make start_prod - @docker ps - start: docker compose -f ${DOCKERCOMPOSEPATH} start docker logs --follow nestjs -start_dev: - docker compose -f ${DOCKERCOMPOSEPATH} start dev - docker logs --follow nestjs +all : up -start_prod: - docker compose -f ${DOCKERCOMPOSEPATH} start prod - -re: down dev +re: down up down: docker compose -f ${DOCKERCOMPOSEPATH} -v down diff --git a/make_env.sh b/make_env.sh index 5f28ea5e..55da918f 100644 --- a/make_env.sh +++ b/make_env.sh @@ -3,4 +3,84 @@ # This script is used to create a new environment for the project. # Create a new environment for docker +ENV_FILE_DOCKER=./srcs/.env +ENV_FILE_NESTJS=./srcs/requirements/nestjs/api_back/.env +# Create a new environment for docker +if [ -f "$ENV_FILE_DOCKER" ] && [ -f "$ENV_FILE_NESTJS" ]; then + echo "The file $ENV_FILE_DOCKER and $ENV_FILE_NESTJS already exists. Do you want to overwrite them ? (y/n)" + read -p "Enter your choice : " OVERWRITE + if [ "$OVERWRITE" = "y" ]; then + rm "$ENV_FILE_DOCKER" && rm "$ENV_FILE_NESTJS" + else + echo "The file $ENV_FILE_DOCKER and $ENV_FILE_NESTJS will not be overwritten. The script will exit." + exit 0 + fi +fi + +echo "Creating a new environment for docker" +read -p "Enter the env configuration for nestjs : \"1\" for development OR \"2\" for production : " NODE_ENV + +if [ "$NODE_ENV" = "1" ]; then + echo "NODE_ENV=development" > "$ENV_FILE_DOCKER" +elif [ "$NODE_ENV" = "2" ]; then + echo "NODE_ENV=production" > "$ENV_FILE_DOCKER" +else + echo "You entered a wrong value. The default value will be used (development)." + echo "NODE_ENV=development" > "$ENV_FILE_DOCKER" +fi +read -p "Enter the name of the host like \"localhost\" : " PROJECT_HOST +echo "WEBSITE_HOST=$PROJECT_HOST" >> "$ENV_FILE_DOCKER" +echo "WEBSITE_PORT=8080" >> "$ENV_FILE_DOCKER" +echo "POSTGRES_USER=postgres" >> "$ENV_FILE_DOCKER" +echo "POSTGRES_PASSWORD=$(openssl rand -base64 32)" >> "$ENV_FILE_DOCKER" +echo "POSTGRES_DB=transcendance_db" >> "$ENV_FILE_DOCKER" +echo "POSTGRES_HOST=postgresql" >> "$ENV_FILE_DOCKER" +echo "POSTGRES_PORT=5432" >> "$ENV_FILE_DOCKER" +echo "REDIS_HOST=redis" >> "$ENV_FILE_DOCKER" +echo "REDIS_PORT=6379" >> "$ENV_FILE_DOCKER" +echo "REDIS_PASSWORD=$(openssl rand -base64 32)" >> "$ENV_FILE_DOCKER" + +# Create a new environment for nestjs +echo "Creating a new environment for nestjs" + +if [ "$NODE_ENV" = "1" ]; then + echo "NODE_ENV=development" > "$ENV_FILE_NESTJS" +elif [ "$NODE_ENV" = "2" ]; then + echo "NODE_ENV=production" > "$ENV_FILE_NESTJS" +else + echo "NODE_ENV=development" > "$ENV_FILE_NESTJS" +fi + + +echo "WEBSITE_HOST=$PROJECT_HOST" >> "$ENV_FILE_NESTJS" +echo "WEBSITE_PORT=8080" >> "$ENV_FILE_NESTJS" +echo "POSTGRES_USER=postgres" >> "$ENV_FILE_NESTJS" +echo "POSTGRES_PASSWORD=$POSTGRES_PASSSWORD" >> "$ENV_FILE_NESTJS" +echo "POSTGRES_DB=transcendance_db" >> "$ENV_FILE_NESTJS" +echo "POSTGRES_HOST=postgresql" >> "$ENV_FILE_NESTJS" +echo "POSTGRES_PORT=5432" >> "$ENV_FILE_NESTJS" + +echo "In the next steps, we'll need to enter the client secret and client id of the 42 api" + +read -p "Enter the client id of the 42 api : " CLIENT_ID +echo "FORTYTWO_CLIENT_ID=$CLIENT_ID" >> "$ENV_FILE_NESTJS" + + +read -p "Enter the client secret of the 42 api : " CLIENT_SECRET +echo "FORTYTWO_CLIENT_SECRET=$CLIENT_SECRET" >> "$ENV_FILE_NESTJS" +echo "FORTYTWO_CALLBACK_URL=http://$PROJECT_HOST:8080/api/v2/auth/redirect" >> "$ENV_FILE_NESTJS" + +echo "COOKIE_SECRET=$(openssl rand -base64 32)" >> "$ENV_FILE_NESTJS" + +echo "PORT=3000" >> "$ENV_FILE_NESTJS" + +echo "REDIS_HOST=redis" >> "$ENV_FILE_DOCKER" +echo "REDIS_PORT=6379" >> "$ENV_FILE_DOCKER" +echo "REDIS_PASSWORD=$REDIS_PASSWORD" >> "$ENV_FILE_DOCKER" + +echo "TWO_FACTOR_AUTHENTICATION_APP_NAME=Transcendance" >> "$ENV_FILE_NESTJS" + +echo "TICKET_FOR_PLAYING_GAME_SECRET=$(openssl rand -base64 32)" >> "$ENV_FILE_NESTJS" + +echo "The environment has been created successfully. You can now wait for the docker to build the project." diff --git a/srcs/.env b/srcs/.env index 33b89fe8..c63e1cc3 100644 --- a/srcs/.env +++ b/srcs/.env @@ -1,10 +1,13 @@ NODE_ENV=development WEBSITE_HOST=transcendance POSTGRES_USER=postgres -POSTGRES_PASSWORD=9pKpKEgiamxwk5P7Ggsz +POSTGRES_PASSWORD=unPCFsMxZwwCguGFMTmKgCySt6o5uX76QsKyabKS89I= POSTGRES_DB=transcendance_db POSTGRES_HOST=postgresql POSTGRES_PORT=5432 REDIS_HOST=redis REDIS_PORT=6379 -REDIS_PASSWORD=1a5e04138b91b3d683c708e4689454c2 +REDIS_PASSWORD=yiCFcBSrFv7DXVBmydtwL9unzNA2MjbB70XspflHHPc= +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASSWORD= diff --git a/srcs/.env.bak b/srcs/.env.bak new file mode 100644 index 00000000..33b89fe8 --- /dev/null +++ b/srcs/.env.bak @@ -0,0 +1,10 @@ +NODE_ENV=development +WEBSITE_HOST=transcendance +POSTGRES_USER=postgres +POSTGRES_PASSWORD=9pKpKEgiamxwk5P7Ggsz +POSTGRES_DB=transcendance_db +POSTGRES_HOST=postgresql +POSTGRES_PORT=5432 +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASSWORD=1a5e04138b91b3d683c708e4689454c2 diff --git a/srcs/requirements/nestjs/Dockerfile b/srcs/requirements/nestjs/Dockerfile index 7b7b7e7c..f64878ff 100644 --- a/srcs/requirements/nestjs/Dockerfile +++ b/srcs/requirements/nestjs/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /usr/app COPY ./api_back ./ COPY ./api_back/.env ./.env COPY ./api_back/src/uploads/avatars/default.png ./uploads/avatars/default.png - +RUN npm install RUN npm ci diff --git a/srcs/requirements/nestjs/api_back/.env b/srcs/requirements/nestjs/api_back/.env index 5f815441..e1dc7bcd 100644 --- a/srcs/requirements/nestjs/api_back/.env +++ b/srcs/requirements/nestjs/api_back/.env @@ -1,25 +1,13 @@ NODE_ENV=development +POSTGRES_USER=postgres +POSTGRES_PASSWORD= +POSTGRES_DB=transcendance_db POSTGRES_HOST=postgresql POSTGRES_PORT=5432 -POSTGRES_USERNAME=postgres -POSTGRES_PASSWORD=9pKpKEgiamxwk5P7Ggsz -POSTGRES_DATABASE=transcendance_db - -# OAUTH2 42 API FORTYTWO_CLIENT_ID=u-s4t2ud-49dc7b539bcfe1acb48b928b2b281671c99fc5bfab1faca57a536ab7e0075500 FORTYTWO_CLIENT_SECRET=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 FORTYTWO_CALLBACK_URL=http://transcendance:8080/api/v2/auth/redirect -COOKIE_SECRET=248cdc831110eec8796d7c1edbf79835 -# JWT -JWT_SECRET=442d774798979fcc14a4a2b6b7535902 -# Misc +COOKIE_SECRET=JsqrZopdOb3zuAkZd+8xDkPHOhEMmbz4eAlJ+liEo0U= PORT=3000 -#Redis -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_PASSWORD=1a5e04138b91b3d683c708e4689454c2 -#2fa TWO_FACTOR_AUTHENTICATION_APP_NAME=Transcendance - -NAME_OF_REDIS_DB = tokenGameDatabase -TICKET_FOR_PLAYING_GAME_SECRET = a2aef785c388497f5fca18f9ccff37ed +TICKET_FOR_PLAYING_GAME_SECRET=5MkACVi80PE+7XGrG3Tij3+BE3RJk0h0v7NI0uFJswg= diff --git a/srcs/requirements/nestjs/api_back/.env.bak b/srcs/requirements/nestjs/api_back/.env.bak new file mode 100644 index 00000000..736b6f5f --- /dev/null +++ b/srcs/requirements/nestjs/api_back/.env.bak @@ -0,0 +1,22 @@ +NODE_ENV=development +POSTGRES_HOST=postgresql +POSTGRES_PORT=5432 +POSTGRES_USERNAME=postgres +POSTGRES_PASSWORD=9pKpKEgiamxwk5P7Ggsz +POSTGRES_DATABASE=transcendance_db + +# OAUTH2 42 API +FORTYTWO_CLIENT_ID=u-s4t2ud-49dc7b539bcfe1acb48b928b2b281671c99fc5bfab1faca57a536ab7e0075500 +FORTYTWO_CLIENT_SECRET=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 +FORTYTWO_CALLBACK_URL=http://transcendance:8080/api/v2/auth/redirect +COOKIE_SECRET=248cdc831110eec8796d7c1edbf79835 +# Misc +PORT=3000 +#Redis +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASSWORD=1a5e04138b91b3d683c708e4689454c2 +#2fa +TWO_FACTOR_AUTHENTICATION_APP_NAME=Transcendance + +TICKET_FOR_PLAYING_GAME_SECRET = a2aef785c388497f5fca18f9ccff37ed diff --git a/srcs/requirements/nestjs/api_back/package-lock.json b/srcs/requirements/nestjs/api_back/package-lock.json index 88f1e737..55b90341 100644 --- a/srcs/requirements/nestjs/api_back/package-lock.json +++ b/srcs/requirements/nestjs/api_back/package-lock.json @@ -12,7 +12,6 @@ "@nestjs/common": "^9.0.0", "@nestjs/config": "^2.2.0", "@nestjs/core": "^9.0.0", - "@nestjs/jwt": "^9.0.0", "@nestjs/mapped-types": "^1.2.0", "@nestjs/passport": "^9.0.0", "@nestjs/platform-express": "^9.0.0", @@ -29,7 +28,6 @@ "otplib": "^12.0.1", "passport": "^0.6.0", "passport-42": "^1.2.6", - "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", "pg": "^8.8.0", "qrcode": "^1.5.1", @@ -48,7 +46,6 @@ "@types/jest": "28.1.8", "@types/multer": "^1.4.7", "@types/node": "^16.0.0", - "@types/passport-jwt": "^3.0.7", "@types/passport-local": "^1.0.34", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", @@ -1646,18 +1643,6 @@ } } }, - "node_modules/@nestjs/jwt": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-9.0.0.tgz", - "integrity": "sha512-ZsXGY/wMYKzEhymw2+dxiwrHTRKIKrGszx6r2EjQqNLypdXMQu0QrujwZJ8k3+XQV4snmuJwwNakQoA2ILfq8w==", - "dependencies": { - "@types/jsonwebtoken": "8.5.8", - "jsonwebtoken": "8.5.1" - }, - "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0" - } - }, "node_modules/@nestjs/mapped-types": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.2.0.tgz", @@ -2235,14 +2220,6 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "node_modules/@types/jsonwebtoken": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", - "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -2277,17 +2254,6 @@ "@types/express": "*" } }, - "node_modules/@types/passport-jwt": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.8.tgz", - "integrity": "sha512-VKJZDJUAHFhPHHYvxdqFcc5vlDht8Q2pL1/ePvKAgqRThDaCc84lSYOTQmnx3+JIkDlN+2KfhFhXIzlcVT+Pcw==", - "dev": true, - "dependencies": { - "@types/express": "*", - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" - } - }, "node_modules/@types/passport-local": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.34.tgz", @@ -6377,35 +6343,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -6593,7 +6530,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7219,15 +7155,6 @@ "node": ">= 6.0.0" } }, - "node_modules/passport-jwt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", - "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", - "dependencies": { - "jsonwebtoken": "^8.2.0", - "passport-strategy": "^1.0.0" - } - }, "node_modules/passport-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", @@ -8183,7 +8110,6 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -10918,15 +10844,6 @@ "uuid": "9.0.0" } }, - "@nestjs/jwt": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-9.0.0.tgz", - "integrity": "sha512-ZsXGY/wMYKzEhymw2+dxiwrHTRKIKrGszx6r2EjQqNLypdXMQu0QrujwZJ8k3+XQV4snmuJwwNakQoA2ILfq8w==", - "requires": { - "@types/jsonwebtoken": "8.5.8", - "jsonwebtoken": "8.5.1" - } - }, "@nestjs/mapped-types": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.2.0.tgz", @@ -11403,14 +11320,6 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "@types/jsonwebtoken": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz", - "integrity": "sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A==", - "requires": { - "@types/node": "*" - } - }, "@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", @@ -11445,17 +11354,6 @@ "@types/express": "*" } }, - "@types/passport-jwt": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.8.tgz", - "integrity": "sha512-VKJZDJUAHFhPHHYvxdqFcc5vlDht8Q2pL1/ePvKAgqRThDaCc84lSYOTQmnx3+JIkDlN+2KfhFhXIzlcVT+Pcw==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" - } - }, "@types/passport-local": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.34.tgz", @@ -14527,30 +14425,6 @@ "universalify": "^2.0.0" } }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -14710,7 +14584,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -15177,15 +15050,6 @@ "passport-oauth2": "^1.4.0" } }, - "passport-jwt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz", - "integrity": "sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==", - "requires": { - "jsonwebtoken": "^8.2.0", - "passport-strategy": "^1.0.0" - } - }, "passport-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", @@ -15873,7 +15737,6 @@ "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } diff --git a/srcs/requirements/nestjs/api_back/package.json b/srcs/requirements/nestjs/api_back/package.json index f92f86b3..900692ec 100644 --- a/srcs/requirements/nestjs/api_back/package.json +++ b/srcs/requirements/nestjs/api_back/package.json @@ -24,13 +24,11 @@ "@nestjs/common": "^9.0.0", "@nestjs/config": "^2.2.0", "@nestjs/core": "^9.0.0", - "@nestjs/jwt": "^9.0.0", "@nestjs/mapped-types": "^1.2.0", "@nestjs/passport": "^9.0.0", "@nestjs/platform-express": "^9.0.0", "@nestjs/typeorm": "^9.0.1", "@types/express-session": "^1.17.5", - "@types/redis": "^4.0.11", "@types/validator": "^13.7.9", "class-transformer": "^0.5.1", "class-validator": "^0.13.2", @@ -41,7 +39,6 @@ "otplib": "^12.0.1", "passport": "^0.6.0", "passport-42": "^1.2.6", - "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", "pg": "^8.8.0", "qrcode": "^1.5.1", From efb9af8df9a8d1531c808f9692b245a603668824 Mon Sep 17 00:00:00 2001 From: batche Date: Wed, 28 Dec 2022 12:23:41 +0100 Subject: [PATCH 45/45] suppression de fichiers inutiles --- srcs/.env.bak | 10 --------- srcs/requirements/nestjs/api_back/.env.bak | 22 ------------------- .../requirements/nestjs/api_back/package.json | 1 - 3 files changed, 33 deletions(-) delete mode 100644 srcs/.env.bak delete mode 100644 srcs/requirements/nestjs/api_back/.env.bak diff --git a/srcs/.env.bak b/srcs/.env.bak deleted file mode 100644 index 33b89fe8..00000000 --- a/srcs/.env.bak +++ /dev/null @@ -1,10 +0,0 @@ -NODE_ENV=development -WEBSITE_HOST=transcendance -POSTGRES_USER=postgres -POSTGRES_PASSWORD=9pKpKEgiamxwk5P7Ggsz -POSTGRES_DB=transcendance_db -POSTGRES_HOST=postgresql -POSTGRES_PORT=5432 -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_PASSWORD=1a5e04138b91b3d683c708e4689454c2 diff --git a/srcs/requirements/nestjs/api_back/.env.bak b/srcs/requirements/nestjs/api_back/.env.bak deleted file mode 100644 index 736b6f5f..00000000 --- a/srcs/requirements/nestjs/api_back/.env.bak +++ /dev/null @@ -1,22 +0,0 @@ -NODE_ENV=development -POSTGRES_HOST=postgresql -POSTGRES_PORT=5432 -POSTGRES_USERNAME=postgres -POSTGRES_PASSWORD=9pKpKEgiamxwk5P7Ggsz -POSTGRES_DATABASE=transcendance_db - -# OAUTH2 42 API -FORTYTWO_CLIENT_ID=u-s4t2ud-49dc7b539bcfe1acb48b928b2b281671c99fc5bfab1faca57a536ab7e0075500 -FORTYTWO_CLIENT_SECRET=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 -FORTYTWO_CALLBACK_URL=http://transcendance:8080/api/v2/auth/redirect -COOKIE_SECRET=248cdc831110eec8796d7c1edbf79835 -# Misc -PORT=3000 -#Redis -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_PASSWORD=1a5e04138b91b3d683c708e4689454c2 -#2fa -TWO_FACTOR_AUTHENTICATION_APP_NAME=Transcendance - -TICKET_FOR_PLAYING_GAME_SECRET = a2aef785c388497f5fca18f9ccff37ed diff --git a/srcs/requirements/nestjs/api_back/package.json b/srcs/requirements/nestjs/api_back/package.json index 900692ec..8fe7ff7f 100644 --- a/srcs/requirements/nestjs/api_back/package.json +++ b/srcs/requirements/nestjs/api_back/package.json @@ -57,7 +57,6 @@ "@types/jest": "28.1.8", "@types/multer": "^1.4.7", "@types/node": "^16.0.0", - "@types/passport-jwt": "^3.0.7", "@types/passport-local": "^1.0.34", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0",