119 lines
5.1 KiB
Java
119 lines
5.1 KiB
Java
package com.example.telegaapp.controller;
|
|
|
|
import com.example.telegaapp.dto.*;
|
|
import com.example.telegaapp.model.Player;
|
|
import com.example.telegaapp.model.Room;
|
|
import com.example.telegaapp.service.GameService;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.messaging.handler.annotation.MessageMapping;
|
|
import org.springframework.messaging.handler.annotation.Payload;
|
|
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
|
|
import org.springframework.messaging.simp.SimpMessagingTemplate;
|
|
import org.springframework.stereotype.Controller;
|
|
|
|
@Controller
|
|
@RequiredArgsConstructor
|
|
public class SocketController {
|
|
|
|
private final GameService gameService;
|
|
private final SimpMessagingTemplate messagingTemplate;
|
|
|
|
@MessageMapping("/create")
|
|
public void createRoom(@Payload CreateRequest request, SimpMessageHeaderAccessor headerAccessor) {
|
|
if (headerAccessor.getUser() == null) {
|
|
System.err.println("Error: User is null in createRoom. SessionID: " + headerAccessor.getSessionId());
|
|
return;
|
|
}
|
|
String sessionId = headerAccessor.getUser().getName();
|
|
System.out.println("Received create request from session: " + sessionId + ", name: " + request.getPlayerName());
|
|
Player host = new Player(sessionId, request.getUserId(), request.getPlayerName(), null, true);
|
|
|
|
Room room = gameService.createRoom(host);
|
|
|
|
// Send the player info back to the user so they know their session ID
|
|
messagingTemplate.convertAndSendToUser(sessionId, "/queue/player-info", host);
|
|
|
|
// Notify the creator specifically about the room
|
|
messagingTemplate.convertAndSendToUser(sessionId, "/queue/created", room);
|
|
}
|
|
|
|
@MessageMapping("/join")
|
|
public void joinRoom(@Payload JoinRequest request, SimpMessageHeaderAccessor headerAccessor) {
|
|
if (headerAccessor.getUser() == null) {
|
|
System.err.println("Error: User is null in joinRoom. SessionID: " + headerAccessor.getSessionId());
|
|
return;
|
|
}
|
|
String sessionId = headerAccessor.getUser().getName();
|
|
System.out.println("Received join request from session: " + sessionId + ", room: " + request.getRoomId());
|
|
Player player = new Player(sessionId, request.getUserId(), request.getPlayerName(), null, false);
|
|
|
|
Room room = gameService.joinRoom(request.getRoomId(), player);
|
|
|
|
if (room != null) {
|
|
// Send the player info back to the user
|
|
messagingTemplate.convertAndSendToUser(sessionId, "/queue/player-info", player);
|
|
|
|
// Send the room info back to the user
|
|
messagingTemplate.convertAndSendToUser(sessionId, "/queue/created", room);
|
|
|
|
// Notify everyone in the room
|
|
messagingTemplate.convertAndSend("/topic/room/" + room.getRoomId(), room);
|
|
} else {
|
|
// Send error to user
|
|
messagingTemplate.convertAndSendToUser(sessionId, "/queue/errors", "Room not found");
|
|
}
|
|
}
|
|
|
|
@MessageMapping("/team/join")
|
|
public void joinTeam(@Payload TeamJoinRequest request, SimpMessageHeaderAccessor headerAccessor) {
|
|
if (headerAccessor.getUser() == null) {
|
|
System.err.println("Error: User is null in joinTeam.");
|
|
return;
|
|
}
|
|
String sessionId = headerAccessor.getUser().getName();
|
|
gameService.joinTeam(request.getRoomId(), sessionId, request.getTeamId());
|
|
|
|
gameService.getRoom(request.getRoomId()).ifPresent(room -> {
|
|
messagingTemplate.convertAndSend("/topic/room/" + room.getRoomId(), room);
|
|
});
|
|
}
|
|
|
|
@MessageMapping("/start")
|
|
public void startGame(@Payload StartGameRequest request, SimpMessageHeaderAccessor headerAccessor) {
|
|
if (headerAccessor.getUser() == null) {
|
|
System.err.println("Error: User is null in startGame.");
|
|
return;
|
|
}
|
|
gameService.startGame(request.getRoomId(), request.getDifficulty());
|
|
|
|
gameService.getRoom(request.getRoomId()).ifPresent(room -> {
|
|
messagingTemplate.convertAndSend("/topic/room/" + room.getRoomId(), room);
|
|
});
|
|
}
|
|
|
|
@MessageMapping("/game-action")
|
|
public void gameAction(@Payload GameActionRequest request, SimpMessageHeaderAccessor headerAccessor) {
|
|
if (headerAccessor.getUser() == null) {
|
|
return;
|
|
}
|
|
gameService.handleGameAction(request);
|
|
|
|
gameService.getRoom(request.getRoomId()).ifPresent(room -> {
|
|
messagingTemplate.convertAndSend("/topic/room/" + room.getRoomId(), room);
|
|
});
|
|
}
|
|
|
|
@MessageMapping("/next-round")
|
|
public void nextRound(@Payload StartGameRequest request, SimpMessageHeaderAccessor headerAccessor) {
|
|
// Reusing StartGameRequest as it contains roomId
|
|
if (headerAccessor.getUser() == null) {
|
|
return;
|
|
}
|
|
gameService.nextRound(request.getRoomId());
|
|
|
|
gameService.getRoom(request.getRoomId()).ifPresent(room -> {
|
|
messagingTemplate.convertAndSend("/topic/room/" + room.getRoomId(), room);
|
|
});
|
|
}
|
|
}
|