import { WebSocketGateway, WebSocketServer, SubscribeMessage, OnGatewayConnection, OnGatewayDisconnect, } from '@nestjs/websockets'; import { Server, Socket } from 'socket.io'; import { RoomsService } from '../rooms/rooms.service'; @WebSocketGateway({ cors: { // Примечание: декоратор выполняется на этапе инициализации, // ConfigModule.forRoot() уже загружает переменные в process.env origin: process.env.CORS_ORIGIN || 'http://localhost:5173', credentials: true, }, }) export class GameGateway implements OnGatewayConnection, OnGatewayDisconnect { @WebSocketServer() server: Server; constructor(private roomsService: RoomsService) {} handleConnection(client: Socket) { console.log(`Client connected: ${client.id}`); } handleDisconnect(client: Socket) { console.log(`Client disconnected: ${client.id}`); } @SubscribeMessage('joinRoom') async handleJoinRoom(client: Socket, payload: { roomCode: string; userId: string }) { client.join(payload.roomCode); const room = await this.roomsService.getRoomByCode(payload.roomCode); this.server.to(payload.roomCode).emit('roomUpdate', room); } @SubscribeMessage('startGame') async handleStartGame(client: Socket, payload: { roomId: string; roomCode: string }) { await this.roomsService.updateRoomStatus(payload.roomId, 'PLAYING'); const room = await this.roomsService.getRoomByCode(payload.roomCode); if (room) { this.server.to(room.code).emit('gameStarted', room); } } @SubscribeMessage('revealAnswer') handleRevealAnswer(client: Socket, payload: { roomCode: string; answerIndex: number }) { this.server.to(payload.roomCode).emit('answerRevealed', payload); } @SubscribeMessage('updateScore') async handleUpdateScore(client: Socket, payload: { participantId: string; score: number; roomCode: string }) { await this.roomsService.updateParticipantScore(payload.participantId, payload.score); this.server.to(payload.roomCode).emit('scoreUpdated', payload); } @SubscribeMessage('nextQuestion') handleNextQuestion(client: Socket, payload: { roomCode: string }) { this.server.to(payload.roomCode).emit('questionChanged', payload); } @SubscribeMessage('endGame') async handleEndGame(client: Socket, payload: { roomId: string; roomCode: string }) { await this.roomsService.updateRoomStatus(payload.roomId, 'FINISHED'); this.server.to(payload.roomCode).emit('gameEnded', payload); } }