-
-
⚠️
-
¿Abandonar la sala?
-
Si sales de la sala, perderás tu lugar en el equipo.
-
-
diff --git a/clases/ClaseEquipoxUsuario.php b/clases/ClaseEquipoxUsuario.php
index 326397c..d419265 100644
--- a/clases/ClaseEquipoxUsuario.php
+++ b/clases/ClaseEquipoxUsuario.php
@@ -60,17 +60,18 @@ 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 +85,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 +127,143 @@ 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. Eliminamos las relaciones
+ * entre preguntas y partida.
+ */
+ $sqlPartidaxPregunta = "DELETE FROM partidaxpregunta WHERE idPartida = :idPartida";
+
+ $consultaPartidaxPregunta = $conexion->prepare($sqlPartidaxPregunta);
+ $consultaPartidaxPregunta->bindParam(':idPartida', $idPartida, PDO::PARAM_INT);
+ $consultaPartidaxPregunta->execute();
+
+ /*
+ * 7. 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..40ced89 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)}
@@ -174,14 +174,15 @@ function mostrarSala(partida, equipos, jugadores) {
let accionesSalaHTML = "";
if (usuarioYaEstaEnEquipo) {
+ const esHost = partida.idUsuario == idUsuarioSesion;
let botonIniciarHTML = "";
// Solo el host puede iniciar la partida
- if (partida.idUsuario == idUsuarioSesion) {
+ if (esHost) {
botonIniciarHTML = `
- 🎮 ¡Iniciar Partida!
+ ¡Iniciar Partida!
`;
}
@@ -191,7 +192,8 @@ function mostrarSala(partida, equipos, jugadores) {
+ data-id-partida="${partida.idPartida}"
+ data-es-host="${esHost}">
Abandonar sala
@@ -263,12 +265,34 @@ let botonAbandonarReferencia = null;
// A. Al hacer clic en el botón "Abandonar sala" de la tarjeta, abrimos el modal
$(document).on("click", ".btn-abandonar-sala", function () {
botonAbandonarReferencia = $(this);
+
+ const esHost = $(this).data("es-host") === true || $(this).data("es-host") === "true";
+ const titulo = $("#modalAbandonarSalaLabel");
+ const mensaje = $("#modalAbandonarSalaMensaje");
+ const botonConfirmar = $("#btnConfirmarAbandonar");
+
+ if (esHost) {
+ titulo.text("¿Abandonar la sala?");
+ mensaje.text(
+ "Si abandonas la sala como anfitrión, la partida terminará para todos los jugadores.",
+ );
+ botonConfirmar.text("Sí, abandonar");
+ } else {
+ titulo.text("¿Abandonar la sala?");
+ mensaje.text(
+ "Si sales de la sala, perderás tu lugar en el equipo.",
+ );
+ botonConfirmar.text("Sí, salir");
+ }
+
const modal = new bootstrap.Modal(
document.getElementById("modalAbandonarSala"),
);
+
modal.show();
});
+
// B. Al hacer clic en "Sí, salir" dentro del modal Kahoot
$(document).on("click", "#btnConfirmarAbandonar", function () {
const modalEl = document.getElementById("modalAbandonarSala");