k-l-lambda's picture
updated
502af73
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
});
}
});
}