Import initial du site depuis le serveur
This commit is contained in:
+105
-105
@@ -1,106 +1,106 @@
|
||||
// Fonction et variables essentiel
|
||||
|
||||
async function SqlRequest(action, params = {}) {
|
||||
try {
|
||||
const response = await fetch('RequestsHandler.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
action: action,
|
||||
params: params
|
||||
})
|
||||
});
|
||||
|
||||
const resultat = await response.json();
|
||||
|
||||
if (resultat.success) {
|
||||
return resultat;
|
||||
} else {
|
||||
console.error("Erreur :", resultat.error);
|
||||
}
|
||||
} catch (erreur) {
|
||||
console.error("Erreur de communication :", erreur);
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------
|
||||
|
||||
function addPlayer() {
|
||||
// 1. On récupère le conteneur
|
||||
const container = document.getElementById('players_container');
|
||||
|
||||
// 2. On crée une nouvelle ligne
|
||||
const newRow = document.createElement('div');
|
||||
newRow.className = 'player-row';
|
||||
|
||||
console.log(container.children.length); // Affiche le nombre de joueurs actuels (pour le debug)
|
||||
// 3. On met le HTML dedans (avec le bouton supprimer intégré)
|
||||
newRow.innerHTML = `
|
||||
<p>${container.children.length+1}</p>
|
||||
<input type="text" name="players[]" placeholder="Nom du joueur" required>
|
||||
<button type="button" onclick="removePlayer(this)">🗑️</button>
|
||||
`;
|
||||
|
||||
// 4. On l'ajoute au conteneur
|
||||
container.appendChild(newRow);
|
||||
}
|
||||
|
||||
function removePlayer(btn) {
|
||||
// On supprime le parent du bouton (la div 'player-row')
|
||||
btn.parentElement.remove();
|
||||
}
|
||||
|
||||
function deleteGame(idPartie) {
|
||||
if (confirm("Êtes-vous sûr de vouloir supprimer cette partie ? Tous les joueurs associés seront effacés.")) {
|
||||
|
||||
// On prépare les données à envoyer
|
||||
let formData = new FormData();
|
||||
formData.append('game_id', idPartie);
|
||||
|
||||
fetch('delete_game.php', {
|
||||
method: 'POST',
|
||||
body: formData // On envoie l'ID au PHP
|
||||
})
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
alert(data);
|
||||
// Au lieu de reload, on peut rediriger vers l'accueil
|
||||
window.location.href = 'index.php';
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Erreur:', error);
|
||||
alert('Impossible de supprimer la partie.');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const loginForm = document.getElementById('create_game_form');
|
||||
loginForm.addEventListener('submit', async function(event) {
|
||||
event.preventDefault();
|
||||
|
||||
const start_money = parseInt(this.querySelector('input[name="start_money"]').value);
|
||||
const blind = parseInt(this.querySelector('input[name="blind"]').value);
|
||||
const name = this.querySelector('input[name="game_name"]').value;
|
||||
const players = this.querySelectorAll('input[name="players[]"]');
|
||||
let response = await SqlRequest('createGame', {name: name, start_money: start_money, blind: blind});
|
||||
console.log(response, response.success, response.game_id, parseInt(response.game_id));
|
||||
|
||||
if (response.success) {
|
||||
const gameId = parseInt(response.game_id);
|
||||
for (const player of players) {
|
||||
await SqlRequest('addPlayer', {game_id: gameId, name: player.value, money: start_money});
|
||||
}
|
||||
const result = await SqlRequest('setFirstPlayer', {game_id: gameId})
|
||||
console.log(result)
|
||||
if (result.success) {
|
||||
window.location.href = 'admin-login.html?game_id=' + gameId;
|
||||
} else {
|
||||
console.error("Erreur lors de la définition du premier joueur :", result.error);
|
||||
}
|
||||
} else {
|
||||
console.error("Erreur lors de la création de la partie :", response.error);
|
||||
}
|
||||
// Fonction et variables essentiel
|
||||
|
||||
async function SqlRequest(action, params = {}) {
|
||||
try {
|
||||
const response = await fetch('RequestsHandler.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
action: action,
|
||||
params: params
|
||||
})
|
||||
});
|
||||
|
||||
const resultat = await response.json();
|
||||
|
||||
if (resultat.success) {
|
||||
return resultat;
|
||||
} else {
|
||||
console.error("Erreur :", resultat.error);
|
||||
}
|
||||
} catch (erreur) {
|
||||
console.error("Erreur de communication :", erreur);
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------
|
||||
|
||||
function addPlayer() {
|
||||
// 1. On récupère le conteneur
|
||||
const container = document.getElementById('players_container');
|
||||
|
||||
// 2. On crée une nouvelle ligne
|
||||
const newRow = document.createElement('div');
|
||||
newRow.className = 'player-row';
|
||||
|
||||
console.log(container.children.length); // Affiche le nombre de joueurs actuels (pour le debug)
|
||||
// 3. On met le HTML dedans (avec le bouton supprimer intégré)
|
||||
newRow.innerHTML = `
|
||||
<p>${container.children.length+1}</p>
|
||||
<input type="text" name="players[]" placeholder="Nom du joueur" required>
|
||||
<button type="button" onclick="removePlayer(this)">🗑️</button>
|
||||
`;
|
||||
|
||||
// 4. On l'ajoute au conteneur
|
||||
container.appendChild(newRow);
|
||||
}
|
||||
|
||||
function removePlayer(btn) {
|
||||
// On supprime le parent du bouton (la div 'player-row')
|
||||
btn.parentElement.remove();
|
||||
}
|
||||
|
||||
function deleteGame(idPartie) {
|
||||
if (confirm("Êtes-vous sûr de vouloir supprimer cette partie ? Tous les joueurs associés seront effacés.")) {
|
||||
|
||||
// On prépare les données à envoyer
|
||||
let formData = new FormData();
|
||||
formData.append('game_id', idPartie);
|
||||
|
||||
fetch('delete_game.php', {
|
||||
method: 'POST',
|
||||
body: formData // On envoie l'ID au PHP
|
||||
})
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
alert(data);
|
||||
// Au lieu de reload, on peut rediriger vers l'accueil
|
||||
window.location.href = 'index.php';
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Erreur:', error);
|
||||
alert('Impossible de supprimer la partie.');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const loginForm = document.getElementById('create_game_form');
|
||||
loginForm.addEventListener('submit', async function(event) {
|
||||
event.preventDefault();
|
||||
|
||||
const start_money = parseInt(this.querySelector('input[name="start_money"]').value);
|
||||
const blind = parseInt(this.querySelector('input[name="blind"]').value);
|
||||
const name = this.querySelector('input[name="game_name"]').value;
|
||||
const players = this.querySelectorAll('input[name="players[]"]');
|
||||
let response = await SqlRequest('createGame', {name: name, start_money: start_money, blind: blind});
|
||||
console.log(response, response.success, response.game_id, parseInt(response.game_id));
|
||||
|
||||
if (response.success) {
|
||||
const gameId = parseInt(response.game_id);
|
||||
for (const player of players) {
|
||||
await SqlRequest('addPlayer', {game_id: gameId, name: player.value, money: start_money});
|
||||
}
|
||||
const result = await SqlRequest('setFirstPlayer', {game_id: gameId})
|
||||
console.log(result)
|
||||
if (result.success) {
|
||||
window.location.href = 'admin-login.html?game_id=' + gameId;
|
||||
} else {
|
||||
console.error("Erreur lors de la définition du premier joueur :", result.error);
|
||||
}
|
||||
} else {
|
||||
console.error("Erreur lors de la création de la partie :", response.error);
|
||||
}
|
||||
});
|
||||
+550
-550
File diff suppressed because it is too large
Load Diff
+91
-91
@@ -1,91 +1,91 @@
|
||||
|
||||
|
||||
async function SqlRequest(action, params = {}) {
|
||||
try {
|
||||
const response = await fetch('RequestsHandler.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
action: action,
|
||||
params: params
|
||||
})
|
||||
});
|
||||
|
||||
const resultat = await response.json();
|
||||
|
||||
if (resultat.success) {
|
||||
return resultat;
|
||||
} else {
|
||||
console.error("Erreur :", resultat.error);
|
||||
}
|
||||
} catch (erreur) {
|
||||
console.error("Erreur de communication :", erreur);
|
||||
}
|
||||
}
|
||||
|
||||
window.onload = async function() {
|
||||
loadData();
|
||||
};
|
||||
|
||||
async function loadData() {
|
||||
const container = document.getElementById('games_list');
|
||||
const response = await SqlRequest('get_all_games');
|
||||
const games = response.games;
|
||||
|
||||
if (Object.keys(games).length <= 0) {
|
||||
container.innerHTML = "<p>Aucune partie en cours.</p>";
|
||||
return;
|
||||
}
|
||||
|
||||
let futurHtml = "";
|
||||
|
||||
for (const game of games) {
|
||||
// 1. On récupère les joueurs de manière asynchrone AVANT de construire le HTML du jeu
|
||||
const players = await getPlayers(game.id);
|
||||
|
||||
// 2. On prépare le HTML de la liste des joueurs
|
||||
let playersHtml = "";
|
||||
players.forEach(player => {
|
||||
if (player.game_id === game.id) {
|
||||
playersHtml += `<p>${player.name}</p>`;
|
||||
}
|
||||
});
|
||||
|
||||
// 3. On assemble le tout
|
||||
futurHtml += `
|
||||
<li>
|
||||
<details class="mon-accordeon">
|
||||
<summary>${game.name}</summary>
|
||||
<div class='container-parent'>
|
||||
<div class='right'>
|
||||
<p>Start Money: ${game.start_money}</p>
|
||||
<p>Blind: ${game.start_blind}</p>
|
||||
<button class="btn-join-list" onclick="window.location.href='player-selector.php?game_id=${game.id}'">Rejoindre</button>
|
||||
<button class="btn-admin-join-list" onclick="joinGameAsAdmin(${game.id})">Rejoindre en tant qu'Admin</button>
|
||||
</div>
|
||||
<div class='left'>
|
||||
${playersHtml}
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</li>
|
||||
`;
|
||||
}
|
||||
|
||||
container.innerHTML = '<ul>' + futurHtml + "</ul>";
|
||||
}
|
||||
|
||||
async function getPlayers(id) {
|
||||
const response = await SqlRequest('getPlayers', {game_id: id});
|
||||
const players = response.players;
|
||||
return players;
|
||||
}
|
||||
|
||||
async function joinGameAsAdmin(gameId) {
|
||||
// Redirige vers la page de connexion admin avec le gameId en paramètre
|
||||
window.location.href = `admin-login.html?game_id=${gameId}`;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
async function SqlRequest(action, params = {}) {
|
||||
try {
|
||||
const response = await fetch('RequestsHandler.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
action: action,
|
||||
params: params
|
||||
})
|
||||
});
|
||||
|
||||
const resultat = await response.json();
|
||||
|
||||
if (resultat.success) {
|
||||
return resultat;
|
||||
} else {
|
||||
console.error("Erreur :", resultat.error);
|
||||
}
|
||||
} catch (erreur) {
|
||||
console.error("Erreur de communication :", erreur);
|
||||
}
|
||||
}
|
||||
|
||||
window.onload = async function() {
|
||||
loadData();
|
||||
};
|
||||
|
||||
async function loadData() {
|
||||
const container = document.getElementById('games_list');
|
||||
const response = await SqlRequest('get_all_games');
|
||||
const games = response.games;
|
||||
|
||||
if (Object.keys(games).length <= 0) {
|
||||
container.innerHTML = "<p>Aucune partie en cours.</p>";
|
||||
return;
|
||||
}
|
||||
|
||||
let futurHtml = "";
|
||||
|
||||
for (const game of games) {
|
||||
// 1. On récupère les joueurs de manière asynchrone AVANT de construire le HTML du jeu
|
||||
const players = await getPlayers(game.id);
|
||||
|
||||
// 2. On prépare le HTML de la liste des joueurs
|
||||
let playersHtml = "";
|
||||
players.forEach(player => {
|
||||
if (player.game_id === game.id) {
|
||||
playersHtml += `<p>${player.name}</p>`;
|
||||
}
|
||||
});
|
||||
|
||||
// 3. On assemble le tout
|
||||
futurHtml += `
|
||||
<li>
|
||||
<details class="mon-accordeon">
|
||||
<summary>${game.name}</summary>
|
||||
<div class='container-parent'>
|
||||
<div class='right'>
|
||||
<p>Start Money: ${game.start_money}</p>
|
||||
<p>Blind: ${game.start_blind}</p>
|
||||
<button class="btn-join-list" onclick="window.location.href='player-selector.php?game_id=${game.id}'">Rejoindre</button>
|
||||
<button class="btn-admin-join-list" onclick="joinGameAsAdmin(${game.id})">Rejoindre en tant qu'Admin</button>
|
||||
</div>
|
||||
<div class='left'>
|
||||
${playersHtml}
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</li>
|
||||
`;
|
||||
}
|
||||
|
||||
container.innerHTML = '<ul>' + futurHtml + "</ul>";
|
||||
}
|
||||
|
||||
async function getPlayers(id) {
|
||||
const response = await SqlRequest('getPlayers', {game_id: id});
|
||||
const players = response.players;
|
||||
return players;
|
||||
}
|
||||
|
||||
async function joinGameAsAdmin(gameId) {
|
||||
// Redirige vers la page de connexion admin avec le gameId en paramètre
|
||||
window.location.href = `admin-login.html?game_id=${gameId}`;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+489
-489
@@ -1,489 +1,489 @@
|
||||
|
||||
|
||||
// Fonction et variables essentiel
|
||||
|
||||
const activePlayerLabel = document.getElementById('active-player-name');
|
||||
let gameData = null;
|
||||
let currentPlayer = null;
|
||||
let playersData = [];
|
||||
|
||||
async function SqlRequest(action, params = {}) {
|
||||
try {
|
||||
const response = await fetch('RequestsHandler.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
action: action,
|
||||
params: params
|
||||
})
|
||||
});
|
||||
|
||||
const resultat = await response.json();
|
||||
|
||||
if (resultat.success) {
|
||||
return resultat;
|
||||
} else {
|
||||
console.error("Erreur :", resultat.error);
|
||||
}
|
||||
} catch (erreur) {
|
||||
console.error("Erreur de communication :", erreur);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function startRealTimeSync(gameId) {
|
||||
const evtSource = new EventSource(`stream.php?game_id=${gameId}`);
|
||||
|
||||
evtSource.onmessage = function(event) {
|
||||
const data = JSON.parse(event.data);
|
||||
|
||||
// On met à jour nos variables globales avec les données fraîches du serveur
|
||||
gameData = data.game;
|
||||
playersData = data.players;
|
||||
|
||||
console.log("🔄 Table synchronisée");
|
||||
|
||||
// On rafraîchit l'affichage sans recharger la page
|
||||
updateClientInterface();
|
||||
};
|
||||
|
||||
evtSource.onerror = function() {
|
||||
console.log("⚠️ Connexion perdue, tentative de reconnexion...");
|
||||
};
|
||||
}
|
||||
|
||||
// Fonction pour ouvrir le menu administrateur
|
||||
function toggleAdminMenu() {
|
||||
const menu = document.getElementById('admin-menu');
|
||||
menu.classList.toggle('active');
|
||||
}
|
||||
|
||||
// Fonctions pour démarrer la page
|
||||
window.onload = async function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const gId = urlParams.get('game_id');
|
||||
const result = await SqlRequest('is_admin');
|
||||
console.log("Vérification des droits administrateur :", result);
|
||||
if (!result.is_admin) {
|
||||
alert("Vous n'avez pas les droits pour accéder à cette page.");
|
||||
window.location.href = 'index.html';
|
||||
}
|
||||
gameData = await getGame();
|
||||
playersData = await getPlayers();
|
||||
|
||||
document.getElementById('title_page').textContent = "Vue Administrateur - " + gameData.name + " - PokerPaf";
|
||||
updateClientInterface();
|
||||
|
||||
startRealTimeSync(gId);
|
||||
}
|
||||
|
||||
async function updateClientInterface() {
|
||||
setupPlayers();
|
||||
getCurrentPlayer();
|
||||
refreshAdminPanel();
|
||||
|
||||
activePlayerLabel.textContent = `${currentPlayer.name} (${currentPlayer.money} 🪙)`;
|
||||
}
|
||||
|
||||
function refreshAdminPanel() {
|
||||
const adminPanel = document.getElementById('admin-lock-control');
|
||||
if (!adminPanel) return;
|
||||
|
||||
let statsItem = document.getElementById('stat-item');
|
||||
if (statsItem) {
|
||||
statsItem.innerHTML = `
|
||||
MISE ACTUELLE: <strong id="current-bet">${gameData.last_bet}</strong><br>
|
||||
POT ACTUEL <strong id="current-pot">${gameData.pot}</strong>
|
||||
`;
|
||||
}
|
||||
|
||||
const isLocked = Number(gameData.is_locked) === 1;
|
||||
let lockSwitch = document.getElementById('lock-switch');
|
||||
|
||||
// On ne crée le HTML que s'il n'existe pas encore
|
||||
if (!lockSwitch) {
|
||||
adminPanel.innerHTML = `
|
||||
<div class="admin-control-group">
|
||||
<span>Autoriser le jeu :</span>
|
||||
<label class="switch">
|
||||
<input type="checkbox" id="lock-switch" ${!isLocked ? 'checked' : ''} onchange="toggleGameLock(this)">
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
`;
|
||||
} else {
|
||||
// Si le switch existe, on met à jour son état SEULEMENT si l'admin ne le touche pas
|
||||
if (document.activeElement !== lockSwitch) {
|
||||
lockSwitch.checked = !isLocked;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fonction pour envoyer l'ordre au serveur
|
||||
async function toggleGameLock(checkbox) {
|
||||
const status = checkbox.checked ? 0 : 1;
|
||||
|
||||
// 1. On change d'abord le statut de verrouillage
|
||||
const response = await SqlRequest('toggle_lock', {
|
||||
game_id: gameData.id,
|
||||
status: status
|
||||
});
|
||||
|
||||
if (response && response.success) {
|
||||
// 2. Si on vient de DÉVERROUILLER (status 0), on reset le joueur actif
|
||||
if (status === 0) {
|
||||
console.log("🔓 Déverrouillage : Réinitialisation au joueur après le Dealer...");
|
||||
await resetToPostDealerPlayer();
|
||||
}
|
||||
} else {
|
||||
alert("Erreur lors du changement de statut");
|
||||
checkbox.checked = !checkbox.checked;
|
||||
}
|
||||
}
|
||||
|
||||
async function resetToPostDealerPlayer() {
|
||||
// On cherche l'index du dealer dans playersData
|
||||
const dealerIndex = playersData.findIndex(p => Number(p.is_dealer) === 1);
|
||||
|
||||
// Le premier joueur à parler est (dealer + 1), mais on doit gérer la boucle du tableau
|
||||
// et sauter les joueurs qui se sont couchés (is_folded)
|
||||
let nextIndex = (dealerIndex + 1) % playersData.length;
|
||||
|
||||
// Sécurité : on cherche le prochain qui n'est pas couché
|
||||
let attempts = 0;
|
||||
while (playersData[nextIndex].is_folded && attempts < playersData.length) {
|
||||
nextIndex = (nextIndex + 1) % playersData.length;
|
||||
attempts++;
|
||||
}
|
||||
|
||||
const firstPlayerId = playersData[nextIndex].id;
|
||||
|
||||
// On envoie l'ordre au serveur de mettre ce joueur en actif
|
||||
await SqlRequest('set_current_player', {
|
||||
game_id: gameData.id,
|
||||
player_id: firstPlayerId
|
||||
});
|
||||
}
|
||||
|
||||
async function setupPlayers() {
|
||||
const PokerTable = document.getElementById('table');
|
||||
PokerTable.innerHTML = ''; // Clear existing players
|
||||
let newHtml = ``;
|
||||
|
||||
newHtml += `
|
||||
<div class="pot-area">
|
||||
<div class="total-pot">${gameData.pot}</div>
|
||||
<div id="Mise" class="current-bet-display">Mise: ${gameData.last_bet}</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
playersData.forEach((player, index) => {
|
||||
// On s'assure de comparer avec le nombre 1 car la BDD renvoie souvent des strings ou des entiers
|
||||
const isDealer = Number(player.is_dealer) === 1;
|
||||
|
||||
newHtml += `
|
||||
<div class="player-slot slot-${index}${player.is_folded ? ' blur-effect' : ''}${player.money <= 0 ? ' All-in-Blur' : ''}" onclick="changePlayer(${player.id})" data-id="${player.id}">
|
||||
<div class="player-info${gameData.current_player_id == player.id ? ' active' : ''}">
|
||||
|
||||
${isDealer ? '<div class="dealer-badge">D</div>' : ''}
|
||||
|
||||
<span class="player-name">J${index + 1} : ${player.name}</span>
|
||||
<span class="player-money">${player.money} 🪙</span><br>
|
||||
<span class="player-bet">Mise: ${player.current_bet} 🪙</span>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
});
|
||||
|
||||
PokerTable.innerHTML = newHtml;
|
||||
}
|
||||
|
||||
async function getGame(id = null) {
|
||||
let gameId;
|
||||
if (id === null) {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
gameId = urlParams.get('game_id');
|
||||
} else {
|
||||
gameId = id;
|
||||
}
|
||||
|
||||
const response = await SqlRequest('getGame', { game_id: gameId });
|
||||
if (response.success) {
|
||||
return response.game;
|
||||
} else {
|
||||
console.error("Erreur lors de la récupération du jeu :", response.error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function getPlayers() {
|
||||
const response = await SqlRequest('getPlayers', { game_id: gameData.id });
|
||||
if (response.success) {
|
||||
return response.players;
|
||||
} else {
|
||||
console.error("Erreur lors de la récupération des joueurs :", response.error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
async function getCurrentPlayer() {
|
||||
currentPlayer = playersData.find(player => player.id === gameData.current_player_id);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Fonctions pour les actions
|
||||
async function changePlayer(id = null) {
|
||||
if (id === null) {
|
||||
const response = await SqlRequest('next_player', { game_id: gameData.id, current_player_id: gameData.current_player_id });
|
||||
if (response.success) {
|
||||
gameData.current_player_id = response.next_player_id;
|
||||
} else {
|
||||
console.error("Erreur lors du passage au joueur suivant :", response.error);
|
||||
}
|
||||
} else {
|
||||
const response = await SqlRequest('set_current_player', { game_id: gameData.id, player_id: id });
|
||||
if (response.success) {
|
||||
gameData.current_player_id = id;
|
||||
} else {
|
||||
console.error("Erreur lors du changement de joueur :", response.error);
|
||||
}
|
||||
}
|
||||
updateClientInterface();
|
||||
}
|
||||
|
||||
async function playerFold() {
|
||||
const response = await SqlRequest('fold', { player_id: gameData.current_player_id });
|
||||
if (response.success) {
|
||||
playersData = await getPlayers();
|
||||
changePlayer();
|
||||
} else {
|
||||
console.error("Erreur lors du fold :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
async function playerRaise() {
|
||||
const betAmount = parseInt(document.getElementById('raise-amount').value);
|
||||
|
||||
if (betAmount <= 0) {
|
||||
alert("Veuillez entrer un montant de mise valide.");
|
||||
return;
|
||||
}
|
||||
const amount = betAmount + gameData.last_bet - currentPlayer.current_bet;
|
||||
|
||||
if (currentPlayer.money < amount) {
|
||||
alert("Vous n'avez pas assez d'argent pour cette mise.");
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await SqlRequest('raise', { game_id: gameData.id, player_id: gameData.current_player_id, amount: amount, current_bet: currentPlayer.current_bet });
|
||||
if (response.success) {
|
||||
gameData.last_bet = currentPlayer.current_bet + amount;
|
||||
gameData.pot += amount;
|
||||
playersData = await getPlayers();
|
||||
changePlayer();
|
||||
} else {
|
||||
console.error("Erreur lors du raise :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
async function playerFollow() {
|
||||
if (currentPlayer.current_bet >= gameData.last_bet) {
|
||||
changePlayer();
|
||||
return;
|
||||
}
|
||||
|
||||
let delta_amount = gameData.last_bet - currentPlayer.current_bet;
|
||||
if (currentPlayer.money < delta_amount) {
|
||||
delta_amount = currentPlayer.money;
|
||||
}
|
||||
|
||||
const response = await SqlRequest('follow', { game_id: gameData.id, player_id: gameData.current_player_id, amount: delta_amount });
|
||||
if (response.success) {
|
||||
gameData.pot += delta_amount;
|
||||
playersData = await getPlayers();
|
||||
changePlayer();
|
||||
} else {
|
||||
console.error("Erreur lors du follow :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
async function playerAllIn() {
|
||||
const response = await SqlRequest('all_in', { game_id: gameData.id, player_id: gameData.current_player_id });
|
||||
if (response.success) {
|
||||
gameData = await getGame(gameData.id);
|
||||
playersData = await getPlayers();
|
||||
changePlayer();
|
||||
} else {
|
||||
console.error("Erreur lors du all-in :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Fonctions pour les actions administratives
|
||||
async function endGame() {
|
||||
await SqlRequest('update_game_status', {
|
||||
game_id: gameData.id,
|
||||
status: 'deciding'
|
||||
});
|
||||
// 1. On vérifie si le panel existe déjà pour éviter les doublons
|
||||
if (document.querySelector('.win-overlay')) return;
|
||||
|
||||
// 2. Création de l'overlay (on l'appelle win-overlay pour le CSS)
|
||||
const winOverlay = document.createElement('div');
|
||||
winOverlay.className = 'win-overlay';
|
||||
|
||||
// 3. Création du panel blanc/bleu
|
||||
const winPanel = document.createElement('div');
|
||||
winPanel.className = 'win-panel';
|
||||
winPanel.innerHTML = `
|
||||
<h2>🏆 La partie est terminée ! 🏆<br>Qui a gagné ?</h2>
|
||||
<div id="winner-buttons-area"></div>
|
||||
<button class="btn-spaction" onclick="this.parentElement.parentElement.remove()">Annuler</button>
|
||||
`;
|
||||
|
||||
winOverlay.appendChild(winPanel);
|
||||
|
||||
// IMPORTANCE : On l'attache au BODY pour qu'il soit au-dessus de TOUT (même l'admin)
|
||||
document.body.appendChild(winOverlay);
|
||||
|
||||
const area = document.getElementById('winner-buttons-area');
|
||||
const playerElements = document.querySelectorAll('.player-slot');
|
||||
|
||||
playerElements.forEach(slot => {
|
||||
const id = slot.getAttribute('data-id');
|
||||
// On récupère le nom proprement
|
||||
const nameElement = slot.querySelector('.player-name');
|
||||
const name = nameElement ? nameElement.textContent.replace('VOUS', '').replace(':', '').trim() : "Joueur " + id;
|
||||
|
||||
const btn = document.createElement('button');
|
||||
btn.className = 'btn-win';
|
||||
btn.innerText = name;
|
||||
btn.onclick = () => declareWinner(id);
|
||||
area.appendChild(btn);
|
||||
});
|
||||
|
||||
// On supprime la ligne qui cherchait 'end-game-screen' car winOverlay fait déjà le job
|
||||
}
|
||||
async function declareWinner(playerId) {
|
||||
console.log("Début de la procédure de victoire...");
|
||||
|
||||
// 1. Première requête : On définit le gagnant
|
||||
const resWinner = await SqlRequest('set_winner', {
|
||||
game_id: gameData.id,
|
||||
player_id: playerId
|
||||
});
|
||||
|
||||
if (resWinner && resWinner.success) {
|
||||
console.log("✅ Winner ID mis à jour en BDD");
|
||||
|
||||
// 2. Deuxième requête : On passe le statut à 'finished'
|
||||
// C'est cette requête qui va déclencher l'écran de victoire chez les joueurs via le SSE
|
||||
const resStatus = await SqlRequest('update_game_status', {
|
||||
game_id: gameData.id,
|
||||
status: 'finished'
|
||||
});
|
||||
|
||||
if (resStatus && resStatus.success) {
|
||||
console.log("✅ Statut passé à 'finished'");
|
||||
|
||||
// On met a jour les valeurs dans BDD
|
||||
const result = await SqlRequest('declare_winner', {
|
||||
game_id: gameData.id,
|
||||
player_id: playerId
|
||||
});
|
||||
|
||||
if (result && result.success){
|
||||
// Mise à jour de l'interface Admin
|
||||
showAdminWinPanel(playerId);
|
||||
} else {
|
||||
console.log("Dommage tu y étais presque")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
alert("Erreur lors de la mise à jour du gagnant.");
|
||||
}
|
||||
}
|
||||
|
||||
// Fonction isolée pour l'affichage du panel admin (plus propre)
|
||||
function showAdminWinPanel(playerId) {
|
||||
const container = document.querySelector('.table-container');
|
||||
if (container) container.classList.remove('blur-effect');
|
||||
|
||||
const winPanel = document.querySelector('.win-panel');
|
||||
if (winPanel) {
|
||||
const winner = playersData.find(p => p.id == playerId);
|
||||
winPanel.innerHTML = `
|
||||
<h2>🏆 Victoire de ${winner ? winner.name : 'Joueur'}</h2>
|
||||
<p>Le pot de ${gameData.pot} 🪙 lui a été attribué.</p>
|
||||
<button class="btn-spaction" onclick="StartNewGame()">Nouvelle Manche</button>
|
||||
`;
|
||||
}
|
||||
}
|
||||
async function StartNewGame() {
|
||||
// 1. On force le verrouillage (status: 1) avant de relancer
|
||||
try {
|
||||
const response = await SqlRequest('toggle_lock', {
|
||||
game_id: gameData.id,
|
||||
status: 1 // 1 pour verrouillé
|
||||
});
|
||||
|
||||
if (response.success) {
|
||||
console.log("Partie verrouillée, relance en cours...");
|
||||
// 2. On recharge la page pour démarrer la nouvelle main
|
||||
const response = await SqlRequest('update_game_status', {
|
||||
game_id: gameData.id,
|
||||
status: 'playing'
|
||||
});
|
||||
if(response.success){
|
||||
window.location.reload();
|
||||
} else {
|
||||
console.error("Erreur de changement de status :", response.error);
|
||||
}
|
||||
} else {
|
||||
console.error("Erreur de verrouillage :", response.error);
|
||||
// Optionnel : on recharge quand même ou on affiche une alerte
|
||||
window.location.reload();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur réseau :", error);
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
async function addMoney() {
|
||||
let amount = parseInt(document.getElementById('money-amount').value);
|
||||
if (isNaN(amount)) {
|
||||
alert("Veuillez entrer un montant valide.");
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await SqlRequest('add_money', { player_id: gameData.current_player_id, amount: amount });
|
||||
if (response.success) {
|
||||
playersData = await getPlayers();
|
||||
updateClientInterface();
|
||||
} else {
|
||||
console.error("Erreur lors de l'ajout d'argent :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteGame() {
|
||||
const confirmation = confirm("Êtes-vous sûr de vouloir supprimer cette partie ? Cette action est irréversible.");
|
||||
if (!confirmation) return;
|
||||
|
||||
const response = await SqlRequest('delete_game', { game_id: gameData.id });
|
||||
if (response.success) {
|
||||
console.log("Partie supprimée avec succès.", response.success);
|
||||
window.location.replace('index.html');
|
||||
} else {
|
||||
console.error("Erreur lors de la suppression du jeu :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Fonction et variables essentiel
|
||||
|
||||
const activePlayerLabel = document.getElementById('active-player-name');
|
||||
let gameData = null;
|
||||
let currentPlayer = null;
|
||||
let playersData = [];
|
||||
|
||||
async function SqlRequest(action, params = {}) {
|
||||
try {
|
||||
const response = await fetch('RequestsHandler.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
action: action,
|
||||
params: params
|
||||
})
|
||||
});
|
||||
|
||||
const resultat = await response.json();
|
||||
|
||||
if (resultat.success) {
|
||||
return resultat;
|
||||
} else {
|
||||
console.error("Erreur :", resultat.error);
|
||||
}
|
||||
} catch (erreur) {
|
||||
console.error("Erreur de communication :", erreur);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function startRealTimeSync(gameId) {
|
||||
const evtSource = new EventSource(`stream.php?game_id=${gameId}`);
|
||||
|
||||
evtSource.onmessage = function(event) {
|
||||
const data = JSON.parse(event.data);
|
||||
|
||||
// On met à jour nos variables globales avec les données fraîches du serveur
|
||||
gameData = data.game;
|
||||
playersData = data.players;
|
||||
|
||||
console.log("🔄 Table synchronisée");
|
||||
|
||||
// On rafraîchit l'affichage sans recharger la page
|
||||
updateClientInterface();
|
||||
};
|
||||
|
||||
evtSource.onerror = function() {
|
||||
console.log("⚠️ Connexion perdue, tentative de reconnexion...");
|
||||
};
|
||||
}
|
||||
|
||||
// Fonction pour ouvrir le menu administrateur
|
||||
function toggleAdminMenu() {
|
||||
const menu = document.getElementById('admin-menu');
|
||||
menu.classList.toggle('active');
|
||||
}
|
||||
|
||||
// Fonctions pour démarrer la page
|
||||
window.onload = async function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const gId = urlParams.get('game_id');
|
||||
const result = await SqlRequest('is_admin');
|
||||
console.log("Vérification des droits administrateur :", result);
|
||||
if (!result.is_admin) {
|
||||
alert("Vous n'avez pas les droits pour accéder à cette page.");
|
||||
window.location.href = 'index.html';
|
||||
}
|
||||
gameData = await getGame();
|
||||
playersData = await getPlayers();
|
||||
|
||||
document.getElementById('title_page').textContent = "Vue Administrateur - " + gameData.name + " - PokerPaf";
|
||||
updateClientInterface();
|
||||
|
||||
startRealTimeSync(gId);
|
||||
}
|
||||
|
||||
async function updateClientInterface() {
|
||||
setupPlayers();
|
||||
getCurrentPlayer();
|
||||
refreshAdminPanel();
|
||||
|
||||
activePlayerLabel.textContent = `${currentPlayer.name} (${currentPlayer.money} 🪙)`;
|
||||
}
|
||||
|
||||
function refreshAdminPanel() {
|
||||
const adminPanel = document.getElementById('admin-lock-control');
|
||||
if (!adminPanel) return;
|
||||
|
||||
let statsItem = document.getElementById('stat-item');
|
||||
if (statsItem) {
|
||||
statsItem.innerHTML = `
|
||||
MISE ACTUELLE: <strong id="current-bet">${gameData.last_bet}</strong><br>
|
||||
POT ACTUEL <strong id="current-pot">${gameData.pot}</strong>
|
||||
`;
|
||||
}
|
||||
|
||||
const isLocked = Number(gameData.is_locked) === 1;
|
||||
let lockSwitch = document.getElementById('lock-switch');
|
||||
|
||||
// On ne crée le HTML que s'il n'existe pas encore
|
||||
if (!lockSwitch) {
|
||||
adminPanel.innerHTML = `
|
||||
<div class="admin-control-group">
|
||||
<span>Autoriser le jeu :</span>
|
||||
<label class="switch">
|
||||
<input type="checkbox" id="lock-switch" ${!isLocked ? 'checked' : ''} onchange="toggleGameLock(this)">
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
`;
|
||||
} else {
|
||||
// Si le switch existe, on met à jour son état SEULEMENT si l'admin ne le touche pas
|
||||
if (document.activeElement !== lockSwitch) {
|
||||
lockSwitch.checked = !isLocked;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fonction pour envoyer l'ordre au serveur
|
||||
async function toggleGameLock(checkbox) {
|
||||
const status = checkbox.checked ? 0 : 1;
|
||||
|
||||
// 1. On change d'abord le statut de verrouillage
|
||||
const response = await SqlRequest('toggle_lock', {
|
||||
game_id: gameData.id,
|
||||
status: status
|
||||
});
|
||||
|
||||
if (response && response.success) {
|
||||
// 2. Si on vient de DÉVERROUILLER (status 0), on reset le joueur actif
|
||||
if (status === 0) {
|
||||
console.log("🔓 Déverrouillage : Réinitialisation au joueur après le Dealer...");
|
||||
await resetToPostDealerPlayer();
|
||||
}
|
||||
} else {
|
||||
alert("Erreur lors du changement de statut");
|
||||
checkbox.checked = !checkbox.checked;
|
||||
}
|
||||
}
|
||||
|
||||
async function resetToPostDealerPlayer() {
|
||||
// On cherche l'index du dealer dans playersData
|
||||
const dealerIndex = playersData.findIndex(p => Number(p.is_dealer) === 1);
|
||||
|
||||
// Le premier joueur à parler est (dealer + 1), mais on doit gérer la boucle du tableau
|
||||
// et sauter les joueurs qui se sont couchés (is_folded)
|
||||
let nextIndex = (dealerIndex + 1) % playersData.length;
|
||||
|
||||
// Sécurité : on cherche le prochain qui n'est pas couché
|
||||
let attempts = 0;
|
||||
while (playersData[nextIndex].is_folded && attempts < playersData.length) {
|
||||
nextIndex = (nextIndex + 1) % playersData.length;
|
||||
attempts++;
|
||||
}
|
||||
|
||||
const firstPlayerId = playersData[nextIndex].id;
|
||||
|
||||
// On envoie l'ordre au serveur de mettre ce joueur en actif
|
||||
await SqlRequest('set_current_player', {
|
||||
game_id: gameData.id,
|
||||
player_id: firstPlayerId
|
||||
});
|
||||
}
|
||||
|
||||
async function setupPlayers() {
|
||||
const PokerTable = document.getElementById('table');
|
||||
PokerTable.innerHTML = ''; // Clear existing players
|
||||
let newHtml = ``;
|
||||
|
||||
newHtml += `
|
||||
<div class="pot-area">
|
||||
<div class="total-pot">${gameData.pot}</div>
|
||||
<div id="Mise" class="current-bet-display">Mise: ${gameData.last_bet}</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
playersData.forEach((player, index) => {
|
||||
// On s'assure de comparer avec le nombre 1 car la BDD renvoie souvent des strings ou des entiers
|
||||
const isDealer = Number(player.is_dealer) === 1;
|
||||
|
||||
newHtml += `
|
||||
<div class="player-slot slot-${index}${player.is_folded ? ' blur-effect' : ''}${player.money <= 0 ? ' All-in-Blur' : ''}" onclick="changePlayer(${player.id})" data-id="${player.id}">
|
||||
<div class="player-info${gameData.current_player_id == player.id ? ' active' : ''}">
|
||||
|
||||
${isDealer ? '<div class="dealer-badge">D</div>' : ''}
|
||||
|
||||
<span class="player-name">J${index + 1} : ${player.name}</span>
|
||||
<span class="player-money">${player.money} 🪙</span><br>
|
||||
<span class="player-bet">Mise: ${player.current_bet} 🪙</span>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
});
|
||||
|
||||
PokerTable.innerHTML = newHtml;
|
||||
}
|
||||
|
||||
async function getGame(id = null) {
|
||||
let gameId;
|
||||
if (id === null) {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
gameId = urlParams.get('game_id');
|
||||
} else {
|
||||
gameId = id;
|
||||
}
|
||||
|
||||
const response = await SqlRequest('getGame', { game_id: gameId });
|
||||
if (response.success) {
|
||||
return response.game;
|
||||
} else {
|
||||
console.error("Erreur lors de la récupération du jeu :", response.error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function getPlayers() {
|
||||
const response = await SqlRequest('getPlayers', { game_id: gameData.id });
|
||||
if (response.success) {
|
||||
return response.players;
|
||||
} else {
|
||||
console.error("Erreur lors de la récupération des joueurs :", response.error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
async function getCurrentPlayer() {
|
||||
currentPlayer = playersData.find(player => player.id === gameData.current_player_id);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Fonctions pour les actions
|
||||
async function changePlayer(id = null) {
|
||||
if (id === null) {
|
||||
const response = await SqlRequest('next_player', { game_id: gameData.id, current_player_id: gameData.current_player_id });
|
||||
if (response.success) {
|
||||
gameData.current_player_id = response.next_player_id;
|
||||
} else {
|
||||
console.error("Erreur lors du passage au joueur suivant :", response.error);
|
||||
}
|
||||
} else {
|
||||
const response = await SqlRequest('set_current_player', { game_id: gameData.id, player_id: id });
|
||||
if (response.success) {
|
||||
gameData.current_player_id = id;
|
||||
} else {
|
||||
console.error("Erreur lors du changement de joueur :", response.error);
|
||||
}
|
||||
}
|
||||
updateClientInterface();
|
||||
}
|
||||
|
||||
async function playerFold() {
|
||||
const response = await SqlRequest('fold', { player_id: gameData.current_player_id });
|
||||
if (response.success) {
|
||||
playersData = await getPlayers();
|
||||
changePlayer();
|
||||
} else {
|
||||
console.error("Erreur lors du fold :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
async function playerRaise() {
|
||||
const betAmount = parseInt(document.getElementById('raise-amount').value);
|
||||
|
||||
if (betAmount <= 0) {
|
||||
alert("Veuillez entrer un montant de mise valide.");
|
||||
return;
|
||||
}
|
||||
const amount = betAmount + gameData.last_bet - currentPlayer.current_bet;
|
||||
|
||||
if (currentPlayer.money < amount) {
|
||||
alert("Vous n'avez pas assez d'argent pour cette mise.");
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await SqlRequest('raise', { game_id: gameData.id, player_id: gameData.current_player_id, amount: amount, current_bet: currentPlayer.current_bet });
|
||||
if (response.success) {
|
||||
gameData.last_bet = currentPlayer.current_bet + amount;
|
||||
gameData.pot += amount;
|
||||
playersData = await getPlayers();
|
||||
changePlayer();
|
||||
} else {
|
||||
console.error("Erreur lors du raise :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
async function playerFollow() {
|
||||
if (currentPlayer.current_bet >= gameData.last_bet) {
|
||||
changePlayer();
|
||||
return;
|
||||
}
|
||||
|
||||
let delta_amount = gameData.last_bet - currentPlayer.current_bet;
|
||||
if (currentPlayer.money < delta_amount) {
|
||||
delta_amount = currentPlayer.money;
|
||||
}
|
||||
|
||||
const response = await SqlRequest('follow', { game_id: gameData.id, player_id: gameData.current_player_id, amount: delta_amount });
|
||||
if (response.success) {
|
||||
gameData.pot += delta_amount;
|
||||
playersData = await getPlayers();
|
||||
changePlayer();
|
||||
} else {
|
||||
console.error("Erreur lors du follow :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
async function playerAllIn() {
|
||||
const response = await SqlRequest('all_in', { game_id: gameData.id, player_id: gameData.current_player_id });
|
||||
if (response.success) {
|
||||
gameData = await getGame(gameData.id);
|
||||
playersData = await getPlayers();
|
||||
changePlayer();
|
||||
} else {
|
||||
console.error("Erreur lors du all-in :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
// Fonctions pour les actions administratives
|
||||
async function endGame() {
|
||||
await SqlRequest('update_game_status', {
|
||||
game_id: gameData.id,
|
||||
status: 'deciding'
|
||||
});
|
||||
// 1. On vérifie si le panel existe déjà pour éviter les doublons
|
||||
if (document.querySelector('.win-overlay')) return;
|
||||
|
||||
// 2. Création de l'overlay (on l'appelle win-overlay pour le CSS)
|
||||
const winOverlay = document.createElement('div');
|
||||
winOverlay.className = 'win-overlay';
|
||||
|
||||
// 3. Création du panel blanc/bleu
|
||||
const winPanel = document.createElement('div');
|
||||
winPanel.className = 'win-panel';
|
||||
winPanel.innerHTML = `
|
||||
<h2>🏆 La partie est terminée ! 🏆<br>Qui a gagné ?</h2>
|
||||
<div id="winner-buttons-area"></div>
|
||||
<button class="btn-spaction" onclick="this.parentElement.parentElement.remove()">Annuler</button>
|
||||
`;
|
||||
|
||||
winOverlay.appendChild(winPanel);
|
||||
|
||||
// IMPORTANCE : On l'attache au BODY pour qu'il soit au-dessus de TOUT (même l'admin)
|
||||
document.body.appendChild(winOverlay);
|
||||
|
||||
const area = document.getElementById('winner-buttons-area');
|
||||
const playerElements = document.querySelectorAll('.player-slot');
|
||||
|
||||
playerElements.forEach(slot => {
|
||||
const id = slot.getAttribute('data-id');
|
||||
// On récupère le nom proprement
|
||||
const nameElement = slot.querySelector('.player-name');
|
||||
const name = nameElement ? nameElement.textContent.replace('VOUS', '').replace(':', '').trim() : "Joueur " + id;
|
||||
|
||||
const btn = document.createElement('button');
|
||||
btn.className = 'btn-win';
|
||||
btn.innerText = name;
|
||||
btn.onclick = () => declareWinner(id);
|
||||
area.appendChild(btn);
|
||||
});
|
||||
|
||||
// On supprime la ligne qui cherchait 'end-game-screen' car winOverlay fait déjà le job
|
||||
}
|
||||
async function declareWinner(playerId) {
|
||||
console.log("Début de la procédure de victoire...");
|
||||
|
||||
// 1. Première requête : On définit le gagnant
|
||||
const resWinner = await SqlRequest('set_winner', {
|
||||
game_id: gameData.id,
|
||||
player_id: playerId
|
||||
});
|
||||
|
||||
if (resWinner && resWinner.success) {
|
||||
console.log("✅ Winner ID mis à jour en BDD");
|
||||
|
||||
// 2. Deuxième requête : On passe le statut à 'finished'
|
||||
// C'est cette requête qui va déclencher l'écran de victoire chez les joueurs via le SSE
|
||||
const resStatus = await SqlRequest('update_game_status', {
|
||||
game_id: gameData.id,
|
||||
status: 'finished'
|
||||
});
|
||||
|
||||
if (resStatus && resStatus.success) {
|
||||
console.log("✅ Statut passé à 'finished'");
|
||||
|
||||
// On met a jour les valeurs dans BDD
|
||||
const result = await SqlRequest('declare_winner', {
|
||||
game_id: gameData.id,
|
||||
player_id: playerId
|
||||
});
|
||||
|
||||
if (result && result.success){
|
||||
// Mise à jour de l'interface Admin
|
||||
showAdminWinPanel(playerId);
|
||||
} else {
|
||||
console.log("Dommage tu y étais presque")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
alert("Erreur lors de la mise à jour du gagnant.");
|
||||
}
|
||||
}
|
||||
|
||||
// Fonction isolée pour l'affichage du panel admin (plus propre)
|
||||
function showAdminWinPanel(playerId) {
|
||||
const container = document.querySelector('.table-container');
|
||||
if (container) container.classList.remove('blur-effect');
|
||||
|
||||
const winPanel = document.querySelector('.win-panel');
|
||||
if (winPanel) {
|
||||
const winner = playersData.find(p => p.id == playerId);
|
||||
winPanel.innerHTML = `
|
||||
<h2>🏆 Victoire de ${winner ? winner.name : 'Joueur'}</h2>
|
||||
<p>Le pot de ${gameData.pot} 🪙 lui a été attribué.</p>
|
||||
<button class="btn-spaction" onclick="StartNewGame()">Nouvelle Manche</button>
|
||||
`;
|
||||
}
|
||||
}
|
||||
async function StartNewGame() {
|
||||
// 1. On force le verrouillage (status: 1) avant de relancer
|
||||
try {
|
||||
const response = await SqlRequest('toggle_lock', {
|
||||
game_id: gameData.id,
|
||||
status: 1 // 1 pour verrouillé
|
||||
});
|
||||
|
||||
if (response.success) {
|
||||
console.log("Partie verrouillée, relance en cours...");
|
||||
// 2. On recharge la page pour démarrer la nouvelle main
|
||||
const response = await SqlRequest('update_game_status', {
|
||||
game_id: gameData.id,
|
||||
status: 'playing'
|
||||
});
|
||||
if(response.success){
|
||||
window.location.reload();
|
||||
} else {
|
||||
console.error("Erreur de changement de status :", response.error);
|
||||
}
|
||||
} else {
|
||||
console.error("Erreur de verrouillage :", response.error);
|
||||
// Optionnel : on recharge quand même ou on affiche une alerte
|
||||
window.location.reload();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur réseau :", error);
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
async function addMoney() {
|
||||
let amount = parseInt(document.getElementById('money-amount').value);
|
||||
if (isNaN(amount)) {
|
||||
alert("Veuillez entrer un montant valide.");
|
||||
return;
|
||||
}
|
||||
|
||||
const response = await SqlRequest('add_money', { player_id: gameData.current_player_id, amount: amount });
|
||||
if (response.success) {
|
||||
playersData = await getPlayers();
|
||||
updateClientInterface();
|
||||
} else {
|
||||
console.error("Erreur lors de l'ajout d'argent :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
async function deleteGame() {
|
||||
const confirmation = confirm("Êtes-vous sûr de vouloir supprimer cette partie ? Cette action est irréversible.");
|
||||
if (!confirmation) return;
|
||||
|
||||
const response = await SqlRequest('delete_game', { game_id: gameData.id });
|
||||
if (response.success) {
|
||||
console.log("Partie supprimée avec succès.", response.success);
|
||||
window.location.replace('index.html');
|
||||
} else {
|
||||
console.error("Erreur lors de la suppression du jeu :", response.error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user