Matches almost done still refining

This commit is contained in:
2026-01-02 21:45:37 +00:00
parent b9df0a4d4a
commit c3f8c3fff0
9 changed files with 468 additions and 30 deletions
+138
View File
@@ -0,0 +1,138 @@
import { getMatch, addMatch } from "../state/match.js";
import BiscaMatch from "../classes/BiscaMatch.js";
import axios from "axios";
const API_URL = "http://localhost:8000/api/v1";
export default (io, socket) => {
const createMatchEmitter = (matchId) => (eventName, payload) => {
io.to(`match_${matchId}`).emit(eventName, payload);
};
socket.on("match:enter", async (data) => {
const { matchId } = data;
if (!socket.user || !socket.user.id) {
return socket.emit("error", { message: "User not authenticated" });
}
const userId = socket.user.id;
const room = `match_${matchId}`;
let match = getMatch(matchId);
if (!match) {
try {
console.log(`A pedir match ${matchId} à API...`);
const res = await axios.get(`${API_URL}/matches/${matchId}`, {
headers: { Authorization: socket.token },
});
const matchData = res.data.data || res.data;
match = new BiscaMatch(
matchData,
createMatchEmitter(matchId),
socket.token
);
addMatch(match);
console.log(`Match ${matchId} carregado em memória.`);
} catch (e) {
console.error("Erro ao carregar Match da API:", e.message);
socket.emit("error", "Match not found or API error");
return;
}
} else {
match.token = socket.token;
}
if (match) {
match.token = socket.token;
}
match.emitStateCallback = createMatchEmitter(matchId);
if (userId !== match.player1Id && match.player2Id === 1) {
console.log(`User ${userId} a substituir o Ghost no Match ${matchId}`);
await match.joinPlayer(userId);
}
socket.join(room);
console.log(`Socket ${socket.id} entrou na sala ${room}`);
if (match.status === "Playing") {
socket.emit("match:update", match.getState());
} else {
socket.emit("match:waiting", { msg: "Waiting for opponent..." });
}
});
socket.on("game:play-card", (data) => {
const { matchId, cardId } = data;
const match = getMatch(matchId);
if (!match || match.status !== "Playing") {
console.log(
"Tentativa de jogar sem match ativo ou match não encontrado."
);
return;
}
const result = match.playCard(socket.user.id, cardId);
if (result && result.error) {
console.log(
`❌ [Erro Jogo] User ${socket.user.id} tentou jogar carta ${cardId} mas: ${result.error}`
);
socket.emit("error", { message: result.error });
return;
}
if (match.currentGame) {
io.to(`match_${matchId}`).emit(
"game:update",
match.currentGame.getStateForPlayer(socket.user.id)
);
}
});
socket.on("debug:end-game", async (data) => {
const { matchId } = data;
const match = getMatch(matchId);
if (match) {
console.log(`[DEBUG] User ${socket.user.id} a forçar fim de jogo.`);
// Simula que o user que clicou ganhou 120 pontos
const winnerId = socket.user.id;
const loserId =
winnerId == match.player1Id ? match.player2Id : match.player1Id;
// Objeto de resultado falso para fechar o jogo
const fakeResult = {
winnerId: winnerId,
loserId: loserId,
isDraw: false,
player1_points: winnerId == match.player1Id ? 120 : 0,
player2_points: winnerId == match.player2Id ? 120 : 0,
player1_id: match.player1Id,
player2_id: match.player2Id,
};
await match.handleGameEnd(fakeResult);
}
});
// DEBUG: Forçar fim do Match Completo
socket.on("debug:end-match", async (data) => {
const { matchId } = data;
const match = getMatch(matchId);
if (match) {
console.log(`[DEBUG] User ${socket.user.id} a forçar fim de MATCH.`);
// Dá 4 marcas a quem clicou
match.marks[socket.user.id] = 4;
await match.finishMatch();
// Emite o estado final
io.to(`match_${matchId}`).emit("match:ended", match.getState());
}
});
};