Files
AliasApp/src/main/java/com/example/telegaapp/controller/SocketController.java
T
2025-12-04 17:25:19 +03:00

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);
});
}
}