Skip to content

Commit

Permalink
feat: game invite prototype
Browse files Browse the repository at this point in the history
  • Loading branch information
GuiMartinelli committed Nov 28, 2023
1 parent 1331bcf commit 569e2c1
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 1 deletion.
4 changes: 4 additions & 0 deletions backend/src/game/dto/game.invite.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export class GameInviteDto {
inviting: string;
guest: string;
}
35 changes: 35 additions & 0 deletions backend/src/game/game.gateway.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { GameService } from './game.service';
import { GameDto } from './dto/game.dto';
import { GameLobbyService } from './lobby/game.lobby.service';
import { GameMoveDto } from './dto/game.move';
import { GameInviteDto } from './dto/game.invite.dto';
import { JwtService } from '@nestjs/jwt';
import { Logger } from '@nestjs/common';

Expand Down Expand Up @@ -70,6 +71,40 @@ export class GameGateway implements OnGatewayConnection, OnGatewayDisconnect {
}
}

@SubscribeMessage('createInvite')
inviteGame(client: Socket, info: GameInviteDto) {
const user = client.handshake.auth.token;
const decodedUser = this.jwtService.decode(user).sub;

if (this.gameService.checkGuestAvailability(info.guest, this.gamesPlaying)) {
this.gameLobby.invitePlayer1(client, decodedUser)
this.logger.log(`Client ${client.id} created a invite game`);
client.emit('sendInvite', `game_${client.id}`);
} else {
client.emit('inviteRejected', `game_${client.id}`);
}
}

@SubscribeMessage('inviteAccepted')
inviteAccepted(client: Socket, info: GameInviteDto) {
const user = client.handshake.auth.token;
const decodedUser = this.jwtService.decode(user).sub;

const game = this.gameLobby.invitePlayer2(client, decodedUser, info);
if (game == undefined)
client.emit('inviteRejected', `game_${info.inviting}`);
this.gamesPlaying[game.gameId] = game;
this.gameService.restartBall(this.gamesPlaying[game.gameId]);
this.gameServer.to(game.gameId).emit('gameCreated', game.gameId);
this.startGame(client, game.gameId);
}

@SubscribeMessage('inviteRejected')
inviteRejected(client: Socket, info: GameInviteDto) {
this.gameLobby.inviteRejected(info)
client.emit('inviteRejected', `game_${info.inviting}`);
}

@SubscribeMessage('startGame')
startGame(client: Socket, gameId: string) {
const game = this.gamesPlaying[gameId];
Expand Down
8 changes: 8 additions & 0 deletions backend/src/game/game.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,14 @@ export class GameService {
}
}

checkGuestAvailability(player: string, gamesPlaying: Map<string, GameDto>): boolean {
gamesPlaying.forEach((value: GameDto) => {
if (value.player1.login == player || value.player2.login == player)
return false
});
return true;
}

private async storeGameResult(gameDto: GameDto) {
await this.updatePlayerVictory(gameDto);

Expand Down
36 changes: 35 additions & 1 deletion backend/src/game/lobby/game.lobby.service.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { Injectable, Logger } from '@nestjs/common';
import { GameDto } from '../dto/game.dto';
import { GameInviteDto } from '../dto/game.invite.dto';

@Injectable()
export class GameLobbyService {
public PADDLE_WIDTH: number;
public PADDLE_HEIGHT: number;
private lobby: GameDto[] = [];
private invite_lobby = new Map<string, GameDto>();
private PLAYER_INITIAL_X = 0;
private CANVAS_WIDTH = 858;
private CANVAS_HEIGHT = 525;
Expand All @@ -14,8 +16,8 @@ export class GameLobbyService {
joinPlayer1(player: any, login: string): boolean {
if (this.lobby.length == 0) {
const gameDto = this.initGame(player.id);
this.lobby.push(gameDto);
gameDto.player1.login = login;
this.lobby.push(gameDto);
this.logger.log(`Client player 1 joined`);
player.join(`game_${gameDto.player1.socketId}`);
return true;
Expand All @@ -41,6 +43,38 @@ export class GameLobbyService {
return gameDto;
}

invitePlayer1(player: any, login: string) {
const gameDto = this.initGame(player.id);
gameDto.player1.login = login;
this.invite_lobby.set(`game_${player.id}`, gameDto);
this.logger.log(`Client player 1 joined invite game`);
player.join(`game_${gameDto.player1.socketId}`);
}

invitePlayer2(player: any, login: string, info: GameInviteDto) {
const gameDto = this.invite_lobby[`game_${info.inviting}`];
if (gameDto == undefined)
return undefined;
gameDto.player2 = {
login,
socketId: player.id,
userId: '',
x: gameDto.canvas.width - this.PLAYER_INITIAL_X - this.PADDLE_WIDTH,
y: this.CANVAS_HEIGHT / 2 - this.PADDLE_HEIGHT / 2,
width: this.PADDLE_WIDTH,
height: this.PADDLE_HEIGHT,
};
player.join(`game_${info.inviting}`);
this.logger.log(`Client player 2 joined invited game`);
this.invite_lobby.delete(`game_${info.inviting}`);
return gameDto;
}

inviteRejected(info: GameInviteDto) {
this.logger.log(`Client player 2 rejected invited game`);
this.invite_lobby.delete(`game_${info.inviting}`);
}

initGame(player1Id: string): GameDto {
const gameDto: GameDto = {
gameId: `game_${player1Id}`,
Expand Down

0 comments on commit 569e2c1

Please sign in to comment.