passion_retro/static/js/games/bac-play.js
2025-09-12 11:11:44 +02:00

161 lines
6.9 KiB
JavaScript

document.addEventListener('DOMContentLoaded', () => {
const container = document.querySelector('.container');
const gameId = container.dataset.gameId;
const players = document.querySelector('#playersList');
const countdownDisplay = document.querySelector('#countdownDisplay');
const buttonFinish = document.querySelector('#buttonFinish');
const playerId = buttonFinish.dataset.playerId;
const roundId = container.dataset.roundId;
let countdownInterval = null;
/* Fonction pour récupérer les informations de la partie */
const fetchGameInfo = async () => {
try {
const response = await fetch(`/games/api/bac/${gameId}/info_party`);
const data = await response.json();
// Mise à jour de la liste des joueurs
players.innerHTML = "";
Object.values(data.players).forEach(player => {
const listItem = document.createElement("li");
const status = player.status === "playing" ? '<i>En train de jouer...</i>' : 'A fini de jouer';
listItem.innerHTML = `${player.username} (${status})`;
players.appendChild(listItem);
});
const allPlayersOvered = data.players.every(player => player.status === "overed");
// Gestion du décompte
if (data.countdown_started && data.current_phase === "finish_game") {
if (!countdownInterval && data.countdown_time > 0) {
startCountdown(data.countdown_time);
countdownDisplay.style.display = "block"; // Affiche le décompte
} else if (data.countdown_time <= 0 || allPlayersOvered) {
clearInterval(countdownInterval); // Arrête l'intervalle si actif
countdownDisplay.style.display = "none"; // Cache le décompte
stopGame();
}
}
// On vérifie que le joueur est bien la liste des joueurs et que son status est overed
console.log(data.players)
console.log(playerId)
const player = data.players.find(player => player.username === playerId);
console.log(player)
if(player && player.status === "overed") {
clearInterval(countdownInterval); // Arrête l'intervalle si actif
countdownDisplay.style.display = "none"; // Cache le décompte
buttonFinish.style.display = "none"; // Cache le bouton de fin de partie
document.querySelector('#textFinished').style.display = "block"; // Affiche le message de fin de partie
// window.location.href = `/games/bac/party/${gameId}/results`;
} else {
console.log('Le joueur n\'a pas terminé la partie');
}
} catch (error) {
console.error("Erreur lors de la récupération des informations de la partie :", error);
}
};
/* Fonction pour démarrer le décompte */
const startCountdown = (initialTime) => {
console.log("Démarrage du décompte...");
let countdownTime = initialTime;
countdownInterval = setInterval(() => {
// Affichage du décompte
console.log(`Temps restant : ${countdownTime} seconde${countdownTime > 1 ? 's' : ''}`);
countdownTime--;
countdownDisplay.style.display = "block";
countdownDisplay.textContent = `Temps restant : ${countdownTime} seconde${countdownTime > 1 ? 's' : ''}`;
if (countdownTime <= 0) {
clearInterval(countdownInterval);
countdownDisplay.style.display = "none"; // Cache le décompte
buttonFinish.style.display = "none"; // Cache le bouton
stopGame();
}
}, 1000);
};
/* Fonction pour gérer la soumission du formulaire */
const handleFormSubmit = async (form) => {
try {
const formData = new FormData(form);
const response = await fetch(form.action, {
method: "POST",
body: formData,
});
if (response.ok) {
console.log("Formulaire soumis avec succès.");
buttonFinish.style.display = "none"; // Cache le bouton
document.querySelector('#textFinished').style.display = "block"; // Affiche le message
// Lance le décompte pour tous les joueurs
const countdownResponse = await startCountdownForAllPlayers();
if (countdownResponse && countdownResponse.success) {
await fetchGameInfo(); // Rafraîchit les informations
}
} else {
console.error("Erreur lors de la soumission du formulaire :", response.status);
}
} catch (error) {
console.error("Erreur réseau lors de la soumission du formulaire :", error);
}
};
/* Fonction pour informer le serveur de démarrer le décompte */
const startCountdownForAllPlayers = async () => {
console.log('On appelle l\'API pour lancer le décompte');
try {
const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
const response = await fetch(`/games/api/${gameId}/start_countdown?type=finish_game`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-CSRFToken": csrfToken,
},
body: JSON.stringify({})
});
const data = await response.json();
if (!response.ok) {
console.error("Erreur lors du démarrage du décompte :", response.status);
console.error("Détails de l'erreur:", data);
}
return data;
} catch (error) {
console.error("Erreur réseau lors du démarrage du décompte :", error);
return null;
}
};
/* Fonction pour gérer la fin de la partie */
const stopGame = async () => {
try {
const response = await fetch(`/games/api/bac/${gameId}/end_game`);
if (response.ok) {
console.log('Partie terminée.');
window.location.href = `/games/bac/party/${gameId}/results`;
} else {
console.error("Erreur lors de la fin de la partie :", response.status);
}
} catch (error) {
console.error("Erreur réseau lors de la fin de la partie :", error);
}
};
/* Initialisation */
const form = document.querySelector('form');
if (form) {
form.addEventListener('submit', (e) => {
e.preventDefault(); // Empêche le rechargement de la page
handleFormSubmit(form);
});
}
fetchGameInfo();
setInterval(fetchGameInfo, 3000); // Vérifie les informations toutes les 3 secondes
});