From b72042a263fa3b70b1e2777a8c89c01502318b93 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Sun, 15 Jan 2023 00:00:35 +0100 Subject: [PATCH 1/2] Game invitation from chat WIP (missing username) + fetchUser() and fetchAllUsers() + changes accept/declineInvitation() --- .../nestjs/api_back/src/game/game.service.ts | 12 ++++--- .../api_front/src/pages/game/Game.svelte | 26 ++++++++++---- .../src/pages/game/GameSpectator.svelte | 35 +++++++++--------- .../src/pieces/chat/Layout_user.svelte | 11 +++++- .../api_front/src/pieces/store_invitation.ts | 4 +++ .../svelte/api_front/src/pieces/utils.ts | 36 +++++++++++++++++++ 6 files changed, 96 insertions(+), 28 deletions(-) create mode 100644 srcs/requirements/svelte/api_front/src/pieces/store_invitation.ts 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 d6ca27c5..4e6d4805 100644 --- a/srcs/requirements/nestjs/api_back/src/game/game.service.ts +++ b/srcs/requirements/nestjs/api_back/src/game/game.service.ts @@ -200,8 +200,10 @@ export class GameService { async declineInvitation(user : User, token : string, @Res() res : Response) { - if (user.status !== STATUS.CONNECTED) - return res.status(HttpStatus.FORBIDDEN).json({message : "You must not be in game to decline an invitation"}); + /* Luke: le check de user.status n'est pas fonctionnel avec l'implémentation des invitations dans le front. + Ça me semble dispensable, je désactive donc pour le moment plutôt que de refaire l'implémentation front. */ + // if (user.status !== STATUS.CONNECTED) + // 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}) @@ -236,8 +238,10 @@ export class GameService { async acceptInvitation(user : User, token : string, @Res() res : Response) { - if (user.status !== STATUS.CONNECTED) - return res.status(HttpStatus.FORBIDDEN).send("") + /* Luke: le check de user.status n'est pas fonctionnel avec l'implémentation des invitations dans le front. + Ça me semble dispensable, je désactive donc pour le moment plutôt que de refaire l'implémentation front. */ + // if (user.status !== STATUS.CONNECTED) + // 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}) 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 b45ab9bb..893aeb93 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/Game.svelte @@ -4,11 +4,13 @@ import { fade, fly } from 'svelte/transition'; import Header from '../../pieces/Header.svelte'; - import { fetchAvatar } from "../../pieces/utils"; + import { fetchUser, fetchAllUsers, fetchAvatar } from "../../pieces/utils"; import * as pong from "./client/pong"; import { gameState } from "./client/ws"; + import { invited_username } from '../../pieces/store_invitation'; + //user's stuff let user; let allUsers; @@ -36,11 +38,21 @@ const watchMatchStartIntervalRate = 111; onMount( async() => { - user = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user`) - .then( x => x.json() ); - allUsers = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user/all`) - .then( x => x.json() ); + user = await fetchUser(); + allUsers = await fetchAllUsers(); + + if (!user) { + showError = true; + errorMessage = "User load failed"; + return; + } + options.playerOneUsername = user.username; + if ($invited_username) { + options.isSomeoneIsInvited = true; + options.playerTwoUsername = $invited_username; + invited_username.set(""); + } }) onDestroy( async() => { @@ -298,8 +310,8 @@ {#if options.isSomeoneIsInvited} {/if} diff --git a/srcs/requirements/svelte/api_front/src/pages/game/GameSpectator.svelte b/srcs/requirements/svelte/api_front/src/pages/game/GameSpectator.svelte index d0ba4bc7..dfa4d63b 100644 --- a/srcs/requirements/svelte/api_front/src/pages/game/GameSpectator.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/game/GameSpectator.svelte @@ -6,15 +6,11 @@ import Header from '../../pieces/Header.svelte'; import MatchListElem from "../../pieces/MatchListElem.svelte"; import type { Match } from "../../pieces/Match"; - import { fetchAvatar } from "../../pieces/utils"; + import { fetchUser, fetchAllUsers, fetchAvatar } from "../../pieces/utils"; import * as pongSpectator from "./client/pongSpectator"; import { gameState } from "./client/ws"; - //user's stuff - let user; - let allUsers; - let playerOneAvatar; let playerTwoAvatar; @@ -30,13 +26,7 @@ const watchGameStateIntervalRate = 142; onMount( async() => { - user = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user`) - .then( x => x.json() ); - allUsers = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user/all`) - .then( x => x.json() ); - const responseForMatchList = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/game/match/all`) - const jsonForMatchList = await responseForMatchList.json(); - matchList = jsonForMatchList; + matchList = await fetchMatchList(); }) onDestroy( async() => { @@ -82,12 +72,25 @@ async function resetPage() { hiddenGame = true; pongSpectator.destroy(); - fetchMatchList(); + matchList = await fetchMatchList(); }; - async function fetchMatchList() { - matchList = await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/game/match/all`) - .then( x => x.json() ); + async function fetchMatchList() + { + return fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/game/match/all`) + .then((response) => { + if (!response.ok) { + throw new Error("All matchs not retrieved"); + } + return response.json(); + }) + .then((body) => { + return body; + }) + .catch((error) => { + console.log("catch fetchMatchList: ", error); + return []; + }); }; diff --git a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_user.svelte b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_user.svelte index 7fe25b94..b5abf6f3 100644 --- a/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_user.svelte +++ b/srcs/requirements/svelte/api_front/src/pieces/chat/Layout_user.svelte @@ -8,6 +8,15 @@ let mute = "mute"; let block = "block"; + import { push } from "svelte-spa-router"; + import { invited_username } from '../store_invitation'; + function game_invitation() + { + const usernamePLACEHOLDER = "hulamy"; + invited_username.set(usernamePLACEHOLDER); + push("/game"); + } +
@@ -40,7 +49,7 @@ -