import axios from "axios"; import { getGame, createGame } from "../state/game.js"; import { getUser } from "../state/connection.js"; const API_URL = "http://localhost:8000/api/v1"; async function saveGameResult(gameId, result, token) { try { const payload = { status: "Ended", is_draw: result.isDraw, total_time: result.totalTime, player1_points: result.player1_points, player2_points: result.player2_points, }; if (!result.isDraw && result.winnerId) { payload.winner_user_id = result.winnerId; payload.loser_user_id = result.loserId; } await axios.put(`${API_URL}/games/${gameId}`, payload, { headers: { Authorization: token }, }); console.log(`[DB] Game ${gameId} saved.`); } catch (error) { console.error(`[DB Error] Game ${gameId}:`, error.message); } } export default (io, socket) => { socket.on("join-game", async ({ gameId }) => { const user = getUser(socket.id); if (!user) { socket.emit("error", { message: "Not authenticated." }); return; } let game = getGame(gameId); if (!game) { try { const token = socket.handshake.auth.token; const response = await axios.get(`${API_URL}/games/${gameId}`, { headers: { Authorization: token }, }); const gameData = response.data.data || response.data; if (gameData.status === "Ended") { socket.emit("error", { message: "Game already finished." }); return; } if ( gameData.player1_user_id != user.id && gameData.player2_user_id != user.id && gameData.player2_user_id !== 1 ) { socket.emit("error", { message: "You are not in this game." }); return; } const p1Name = gameData.player1?.name || "Player 1"; const p2Name = gameData.player2?.name || "Player 2"; const type = gameData.type == "9" ? 9 : 3; game = createGame( gameId, type, { id: gameData.player1_user_id, name: p1Name }, { id: gameData.player2_user_id, name: p2Name } ); } catch (error) { socket.emit("error", { message: "Failed to join game." }); return; } } const GHOST_ID = 1; if (game && game.players) { if (!game.players[user.id]) { if (game.players[GHOST_ID]) { delete game.players[GHOST_ID]; game.players[user.id] = { id: user.id, name: user.name, hand: [], points: 0, tricks: 0, }; } } } socket.join(`game_${gameId}`); if (game && game.players[user.id]) { socket.emit("game-state", game.getStateForPlayer(user.id)); console.log(`--> Estado enviado para User ${user.id}`); } else { socket.emit("error", { message: "Error joining game state." }); } }); socket.on("play-card", ({ gameId, cardId }) => { const user = getUser(socket.id); const game = getGame(gameId); if (!game || !user) return; const result = game.playCard(user.id, cardId); if (result.error) { socket.emit("game-error", { message: result.error }); return; } const roomName = `game_${gameId}`; const socketsInRoom = io.sockets.adapter.rooms.get(roomName); if (socketsInRoom) { for (const socketId of socketsInRoom) { const s = io.sockets.sockets.get(socketId); const u = getUser(socketId); if (u && game.players[u.id]) { s.emit("game-state", game.getStateForPlayer(u.id)); } } } if (result.action === "trick_resolved") { io.to(roomName).emit("trick-end", result.trickResult); } if (result.action === "game_ended") { io.to(roomName).emit("game-over", { winnerId: result.winnerId, isDraw: result.isDraw, p1Points: result.player1_points, p2Points: result.player2_points, }); saveGameResult(gameId, result, socket.handshake.auth.token); } }); };