2026-01-03 14:07:04 +00:00
|
|
|
import {
|
|
|
|
|
WebSocketGateway,
|
|
|
|
|
WebSocketServer,
|
|
|
|
|
SubscribeMessage,
|
|
|
|
|
OnGatewayConnection,
|
|
|
|
|
OnGatewayDisconnect,
|
|
|
|
|
} from '@nestjs/websockets';
|
|
|
|
|
import { Server, Socket } from 'socket.io';
|
|
|
|
|
import { RoomsService } from '../rooms/rooms.service';
|
|
|
|
|
|
|
|
|
|
@WebSocketGateway({
|
|
|
|
|
cors: {
|
2026-01-04 21:48:55 +00:00
|
|
|
// Примечание: декоратор выполняется на этапе инициализации,
|
|
|
|
|
// ConfigModule.forRoot() уже загружает переменные в process.env
|
2026-01-03 14:07:04 +00:00
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|