Host2 #11
@@ -7,6 +7,7 @@
|
|||||||
<title>Trivial - Lobby</title>
|
<title>Trivial - Lobby</title>
|
||||||
<link rel="icon" type="image/svg+xml" href="img/favicon/favicon.svg">
|
<link rel="icon" type="image/svg+xml" href="img/favicon/favicon.svg">
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.13.1/font/bootstrap-icons.min.css">
|
||||||
<link rel="stylesheet" href="css/index.css">
|
<link rel="stylesheet" href="css/index.css">
|
||||||
<link rel="stylesheet" href="css/buscadorSala.css">
|
<link rel="stylesheet" href="css/buscadorSala.css">
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
+205
-37
@@ -61,16 +61,16 @@ class EquipoxUsuario
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public function obtenerSalaUsuario($idUsuario)
|
public function obtenerSalaUsuario($idUsuario)
|
||||||
{
|
{
|
||||||
$conexion = conexionBD();
|
$conexion = conexionBD();
|
||||||
|
|
||||||
if (is_array($conexion)) {
|
if (is_array($conexion)) {
|
||||||
return $conexion;
|
return $conexion;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
$sql = "
|
$sql = "
|
||||||
SELECT
|
SELECT
|
||||||
exu.idEquipo,
|
exu.idEquipo,
|
||||||
exp.idPartida
|
exp.idPartida
|
||||||
@@ -84,41 +84,40 @@ class EquipoxUsuario
|
|||||||
LIMIT 1
|
LIMIT 1
|
||||||
";
|
";
|
||||||
|
|
||||||
$consulta = $conexion->prepare($sql);
|
$consulta = $conexion->prepare($sql);
|
||||||
|
|
||||||
$consulta->bindParam(
|
$consulta->bindParam(
|
||||||
':idUsuario',
|
':idUsuario',
|
||||||
$idUsuario,
|
$idUsuario,
|
||||||
PDO::PARAM_INT
|
PDO::PARAM_INT
|
||||||
);
|
);
|
||||||
|
|
||||||
$consulta->execute();
|
$consulta->execute();
|
||||||
|
|
||||||
$resultado = $consulta->fetch(PDO::FETCH_ASSOC);
|
$resultado = $consulta->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
if (!$resultado) {
|
if (!$resultado) {
|
||||||
|
|
||||||
|
return [
|
||||||
|
'asociado' => false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'asociado' => false
|
'asociado' => true,
|
||||||
|
'idEquipo' => $resultado['idEquipo'],
|
||||||
|
'idPartida' => $resultado['idPartida']
|
||||||
|
];
|
||||||
|
} catch (PDOException $error) {
|
||||||
|
|
||||||
|
return [
|
||||||
|
'error' => 'Ocurrió un error al obtener la sala del usuario.',
|
||||||
|
'error_tecnico' => $error->getMessage()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
|
||||||
'asociado' => true,
|
|
||||||
'idEquipo' => $resultado['idEquipo'],
|
|
||||||
'idPartida' => $resultado['idPartida']
|
|
||||||
];
|
|
||||||
|
|
||||||
} catch (PDOException $error) {
|
|
||||||
|
|
||||||
return [
|
|
||||||
'error' => 'Ocurrió un error al obtener la sala del usuario.',
|
|
||||||
'error_tecnico' => $error->getMessage()
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public static function salirDeSala($idUsuario)
|
public static function salirDeSala($idUsuario)
|
||||||
{
|
{
|
||||||
$conexion = conexionBD();
|
$conexion = conexionBD();
|
||||||
|
|
||||||
@@ -127,21 +126,190 @@ public static function salirDeSala($idUsuario)
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$sql = "DELETE FROM equipoxusuario WHERE idUsuario = :idUsuario";
|
|
||||||
|
// 1. Averiguamos el equipo y la partida del usuario
|
||||||
|
$sql = "
|
||||||
|
SELECT exu.idEquipo, exp.idPartida, p.idUsuario AS idHost FROM equipoxusuario exu INNER JOIN equipoxpartida exp ON exu.idEquipo = exp.idEquipo INNER JOIN partida p ON exp.idPartida = p.idPartida WHERE exu.idUsuario = :idUsuario LIMIT 1";
|
||||||
|
|
||||||
$consulta = $conexion->prepare($sql);
|
$consulta = $conexion->prepare($sql);
|
||||||
$consulta->bindParam(':idUsuario', $idUsuario, PDO::PARAM_INT);
|
$consulta->bindParam(
|
||||||
|
':idUsuario',
|
||||||
|
$idUsuario,
|
||||||
|
PDO::PARAM_INT
|
||||||
|
);
|
||||||
$consulta->execute();
|
$consulta->execute();
|
||||||
|
|
||||||
|
$datosSala = $consulta->fetch(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
// El usuario no pertenece a ninguna sala
|
||||||
|
if (!$datosSala) {
|
||||||
|
return [
|
||||||
|
'error' => 'No perteneces a ninguna sala.'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$idEquipo = (int)$datosSala['idEquipo'];
|
||||||
|
$idPartida = (int)$datosSala['idPartida'];
|
||||||
|
$idHost = (int)$datosSala['idHost'];
|
||||||
|
|
||||||
|
// Comenzamos una transacción
|
||||||
|
$conexion->beginTransaction();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 2. Comprobamos si quien abandona es el HOST
|
||||||
|
*/
|
||||||
|
if ($idUsuario === $idHost) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Obtenemos todos los equipos pertenecientes
|
||||||
|
* a esta partida.
|
||||||
|
*/
|
||||||
|
$sqlEquipos = "
|
||||||
|
SELECT idEquipo
|
||||||
|
FROM equipoxpartida
|
||||||
|
WHERE idPartida = :idPartida
|
||||||
|
";
|
||||||
|
|
||||||
|
$consultaEquipos = $conexion->prepare($sqlEquipos);
|
||||||
|
$consultaEquipos->bindParam(
|
||||||
|
':idPartida',
|
||||||
|
$idPartida,
|
||||||
|
PDO::PARAM_INT
|
||||||
|
);
|
||||||
|
$consultaEquipos->execute();
|
||||||
|
|
||||||
|
$equipos = $consultaEquipos->fetchAll(PDO::FETCH_COLUMN);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 3. Eliminamos los jugadores de esos equipos
|
||||||
|
* de la tabla equipoxusuario.
|
||||||
|
*/
|
||||||
|
if (!empty($equipos)) {
|
||||||
|
|
||||||
|
$placeholders = implode(
|
||||||
|
',',
|
||||||
|
array_fill(0, count($equipos), '?')
|
||||||
|
);
|
||||||
|
|
||||||
|
$sqlUsuarios = "
|
||||||
|
DELETE FROM equipoxusuario
|
||||||
|
WHERE idEquipo IN ($placeholders)
|
||||||
|
";
|
||||||
|
|
||||||
|
$consultaUsuarios = $conexion->prepare($sqlUsuarios);
|
||||||
|
$consultaUsuarios->execute($equipos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 4. Eliminamos las relaciones
|
||||||
|
* entre equipos y partida.
|
||||||
|
*/
|
||||||
|
$sqlEquipoxPartida = "
|
||||||
|
DELETE FROM equipoxpartida
|
||||||
|
WHERE idPartida = :idPartida
|
||||||
|
";
|
||||||
|
|
||||||
|
$consultaEquipoxPartida = $conexion->prepare(
|
||||||
|
$sqlEquipoxPartida
|
||||||
|
);
|
||||||
|
|
||||||
|
$consultaEquipoxPartida->bindParam(
|
||||||
|
':idPartida',
|
||||||
|
$idPartida,
|
||||||
|
PDO::PARAM_INT
|
||||||
|
);
|
||||||
|
|
||||||
|
$consultaEquipoxPartida->execute();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 5. Eliminamos los equipos.
|
||||||
|
*
|
||||||
|
* Los equipos ya no tienen relaciones con
|
||||||
|
* usuarios ni con la partida.
|
||||||
|
*/
|
||||||
|
if (!empty($equipos)) {
|
||||||
|
|
||||||
|
$placeholders = implode(
|
||||||
|
',',
|
||||||
|
array_fill(0, count($equipos), '?')
|
||||||
|
);
|
||||||
|
|
||||||
|
$sqlEliminarEquipos = "
|
||||||
|
DELETE FROM equipo
|
||||||
|
WHERE idEquipo IN ($placeholders)
|
||||||
|
";
|
||||||
|
|
||||||
|
$consultaEliminarEquipos =
|
||||||
|
$conexion->prepare($sqlEliminarEquipos);
|
||||||
|
|
||||||
|
$consultaEliminarEquipos->execute($equipos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 6. Finalmente eliminamos la partida.
|
||||||
|
*/
|
||||||
|
$sqlPartida = "
|
||||||
|
DELETE FROM partida
|
||||||
|
WHERE idPartida = :idPartida
|
||||||
|
";
|
||||||
|
|
||||||
|
$consultaPartida = $conexion->prepare($sqlPartida);
|
||||||
|
|
||||||
|
$consultaPartida->bindParam(
|
||||||
|
':idPartida',
|
||||||
|
$idPartida,
|
||||||
|
PDO::PARAM_INT
|
||||||
|
);
|
||||||
|
|
||||||
|
$consultaPartida->execute();
|
||||||
|
|
||||||
|
// Todo ha ido correctamente
|
||||||
|
$conexion->commit();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'exito' => true,
|
||||||
|
'salaEliminada' => true,
|
||||||
|
'mensaje' => 'La sala ha sido eliminada correctamente.'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 7. Si NO es el host, simplemente abandona
|
||||||
|
* su relación con el equipo.
|
||||||
|
*/
|
||||||
|
$sqlSalir = "
|
||||||
|
DELETE FROM equipoxusuario
|
||||||
|
WHERE idUsuario = :idUsuario
|
||||||
|
";
|
||||||
|
|
||||||
|
$consultaSalir = $conexion->prepare($sqlSalir);
|
||||||
|
|
||||||
|
$consultaSalir->bindParam(
|
||||||
|
':idUsuario',
|
||||||
|
$idUsuario,
|
||||||
|
PDO::PARAM_INT
|
||||||
|
);
|
||||||
|
|
||||||
|
$consultaSalir->execute();
|
||||||
|
|
||||||
|
$conexion->commit();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'exito' => true,
|
'exito' => true,
|
||||||
'mensaje' => 'Usuario eliminado de la sala correctamente.'
|
'salaEliminada' => false,
|
||||||
|
'mensaje' => 'Has abandonado la sala correctamente.'
|
||||||
];
|
];
|
||||||
} catch (PDOException $error) {
|
} catch (PDOException $error) {
|
||||||
|
|
||||||
|
// Si había una transacción activa, la deshacemos
|
||||||
|
if ($conexion->inTransaction()) {
|
||||||
|
$conexion->rollBack();
|
||||||
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'error' => 'Ocurrió un error al salir de la sala.',
|
'error' => 'Ocurrió un error al abandonar la sala.',
|
||||||
'error_tecnico' => $error->getMessage()
|
'error_tecnico' => $error->getMessage()
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -130,7 +130,7 @@ function mostrarSala(partida, equipos, jugadores) {
|
|||||||
esHost ? "jugador-host" : ""
|
esHost ? "jugador-host" : ""
|
||||||
}">
|
}">
|
||||||
<div>
|
<div>
|
||||||
<span class="avatar">${esHost ? "👑" : "👤"}</span>
|
<span class="avatar">${esHost ? '<i class="bi bi-award-fill"></i>' : '<i class="bi bi-person-fill"></i>'}</span>
|
||||||
${escapeHTML(jugador.nombreUsuario)}
|
${escapeHTML(jugador.nombreUsuario)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ function mostrarSala(partida, equipos, jugadores) {
|
|||||||
botonIniciarHTML = `
|
botonIniciarHTML = `
|
||||||
<a href="juego.php?idPartida=${partida.idPartida}"
|
<a href="juego.php?idPartida=${partida.idPartida}"
|
||||||
class="btn btn-success btn-lg px-4">
|
class="btn btn-success btn-lg px-4">
|
||||||
🎮 ¡Iniciar Partida!
|
<i class="bi bi-controller"></i> ¡Iniciar Partida!
|
||||||
</a>
|
</a>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user