import { Server, Socket } from "socket.io"; import { GameManager } from "../services/gameManager"; export function setupSocketHandlers(io: Server, socket: Socket, gameManager: GameManager) { console.log(`Setting up socket handlers for ${socket.id}`); // Join room socket.on("joinRoom", (data: { roomId?: string; nickname: string }) => { const { roomId, nickname } = data; // Create or join room const room = roomId ? gameManager.joinRoom(roomId, socket.id, nickname) : gameManager.createRoom(socket.id, nickname); if (room) { socket.join(room.id); // Get complete game data for frontend const board = gameManager.getGameBoard(room.id); const currentPlayer = gameManager.getCurrentPlayer(room.id); const stats = gameManager.getGameStats(room.id); socket.emit("roomJoined", { roomId: room.id, playerId: socket.id, playerColor: room.players[socket.id]?.color, gameState: { board, boardShape: room.game.getShape(), currentPlayer, moveHistory: room.game.getHistory(), currentMoveIndex: room.game.getCurrentStep(), capturedStones: { black: stats?.capturedByBlack || 0, white: stats?.capturedByWhite || 0 }, gameStatus: room.gameState.gameStatus, winner: room.gameState.winner } }); // Notify other players socket.to(room.id).emit("playerJoined", { playerId: socket.id, nickname: nickname }); console.log(`Player ${socket.id} joined room ${room.id}`); } else { socket.emit("error", { message: "Failed to join room" }); } }); // Leave room socket.on("leaveRoom", () => { const room = gameManager.getPlayerRoom(socket.id); if (room) { socket.leave(room.id); gameManager.leaveRoom(room.id, socket.id); // Notify others socket.to(room.id).emit("playerLeft", { playerId: socket.id }); } }); // Game moves socket.on("makeMove", (data: { x: number; y: number; z: number }) => { const room = gameManager.getPlayerRoom(socket.id); if (room && gameManager.makeMove(room.id, socket.id, data)) { // Get updated game data const board = gameManager.getGameBoard(room.id); const currentPlayer = gameManager.getCurrentPlayer(room.id); const stats = gameManager.getGameStats(room.id); const lastStep = room.game.getLastStep(); // Broadcast game update to all players in the room io.to(room.id).emit("gameUpdate", { board, currentPlayer, lastMove: data, capturedStones: { black: stats?.capturedByBlack || 0, white: stats?.capturedByWhite || 0 }, capturedPositions: lastStep?.capturedPositions, moveHistory: room.game.getHistory(), currentMoveIndex: room.game.getCurrentStep() }); } else { socket.emit("error", { message: "Invalid move" }); } }); // Pass turn socket.on("pass", () => { const room = gameManager.getPlayerRoom(socket.id); if (room && gameManager.passTurn(room.id, socket.id)) { const currentPlayer = gameManager.getCurrentPlayer(room.id); io.to(room.id).emit("gameUpdate", { currentPlayer, action: "pass", moveHistory: room.game.getHistory(), currentMoveIndex: room.game.getCurrentStep() }); // Check for consecutive passes (game end) if (gameManager.checkConsecutivePasses(room.id)) { const territory = gameManager.getTerritory(room.id); io.to(room.id).emit("gameEnded", { winner: room.gameState.winner, reason: "double-pass", territory }); } } }); // Resign socket.on("resign", () => { const room = gameManager.getPlayerRoom(socket.id); if (room && gameManager.resign(room.id, socket.id)) { io.to(room.id).emit("gameEnded", { winner: room.gameState.winner, reason: "resignation" }); } }); // Chat messages socket.on("chatMessage", (data: { content: string }) => { const room = gameManager.getPlayerRoom(socket.id); if (room) { const player = room.players[socket.id]; io.to(room.id).emit("chatMessage", { author: player?.nickname || "Unknown", content: data.content, playerId: socket.id }); } }); // Handle disconnection socket.on("disconnect", () => { console.log(`Client disconnected: ${socket.id}`); const room = gameManager.getPlayerRoom(socket.id); if (room) { gameManager.leaveRoom(room.id, socket.id); socket.to(room.id).emit("playerDisconnected", { playerId: socket.id }); } }); }