diff --git a/buscadorSala.php b/buscadorSala.php
index 5d1c20a..6c0b7b2 100644
--- a/buscadorSala.php
+++ b/buscadorSala.php
@@ -7,6 +7,7 @@
Trivial - Lobby
+
diff --git a/clases/ClaseEquipoxUsuario.php b/clases/ClaseEquipoxUsuario.php
index 326397c..bdd556f 100644
--- a/clases/ClaseEquipoxUsuario.php
+++ b/clases/ClaseEquipoxUsuario.php
@@ -61,16 +61,16 @@ class EquipoxUsuario
}
}
public function obtenerSalaUsuario($idUsuario)
-{
- $conexion = conexionBD();
+ {
+ $conexion = conexionBD();
- if (is_array($conexion)) {
- return $conexion;
- }
+ if (is_array($conexion)) {
+ return $conexion;
+ }
- try {
+ try {
- $sql = "
+ $sql = "
SELECT
exu.idEquipo,
exp.idPartida
@@ -84,41 +84,40 @@ class EquipoxUsuario
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();
- $resultado = $consulta->fetch(PDO::FETCH_ASSOC);
+ $resultado = $consulta->fetch(PDO::FETCH_ASSOC);
- if (!$resultado) {
+ if (!$resultado) {
+
+ return [
+ 'asociado' => false
+ ];
+ }
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();
@@ -127,21 +126,190 @@ public static function salirDeSala($idUsuario)
}
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->bindParam(':idUsuario', $idUsuario, PDO::PARAM_INT);
+ $consulta->bindParam(
+ ':idUsuario',
+ $idUsuario,
+ PDO::PARAM_INT
+ );
$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 [
'exito' => true,
- 'mensaje' => 'Usuario eliminado de la sala correctamente.'
+ 'salaEliminada' => false,
+ 'mensaje' => 'Has abandonado la sala correctamente.'
];
} catch (PDOException $error) {
+
+ // Si había una transacción activa, la deshacemos
+ if ($conexion->inTransaction()) {
+ $conexion->rollBack();
+ }
+
return [
- 'error' => 'Ocurrió un error al salir de la sala.',
+ 'error' => 'Ocurrió un error al abandonar la sala.',
'error_tecnico' => $error->getMessage()
];
}
}
-
}
diff --git a/js/buscadorSala.js b/js/buscadorSala.js
index b6773b4..857aae5 100644
--- a/js/buscadorSala.js
+++ b/js/buscadorSala.js
@@ -130,7 +130,7 @@ function mostrarSala(partida, equipos, jugadores) {
esHost ? "jugador-host" : ""
}">
- ${esHost ? "👑" : "👤"}
+ ${esHost ? '' : ''}
${escapeHTML(jugador.nombreUsuario)}
@@ -181,7 +181,7 @@ function mostrarSala(partida, equipos, jugadores) {
botonIniciarHTML = `
- 🎮 ¡Iniciar Partida!
+ ¡Iniciar Partida!
`;
}