idUsuario = $idUsuario; $this->nombreUsuario = $nombreUsuario; $this->contrasena = $contrasena; $this->email = $email; $this->avatar = $avatar; $this->cookie = $cookie; $this->aciertos = $aciertos; $this->victorias = $victorias; $this->derrotas = $derrotas; } public function getIdUsuario(): ?int { return $this->idUsuario; } public function getNombreUsuario(): string { return $this->nombreUsuario; } public function setNombreUsuario(string $nombreUsuario): void { $this->nombreUsuario = $nombreUsuario; } public function getContrasena(): string { return $this->contrasena; } public function setContrasena(string $contrasena): void { $this->contrasena = $contrasena; } public function getEmail(): string { return $this->email; } public function setEmail(string $email): void { $this->email = $email; } public function getAvatar(): ?string { return $this->avatar; } public function setAvatar(?string $avatar): void { $this->avatar = $avatar; } public function getCookie(): ?string { return $this->cookie; } public function setCookie(?string $cookie): void { $this->cookie = $cookie; } public function getAciertos(): int { return $this->aciertos; } public function setAciertos(int $aciertos): void { $this->aciertos = $aciertos; } public function getVictorias(): int { return $this->victorias; } public function setVictorias(int $victorias): void { $this->victorias = $victorias; } public function getDerrotas(): int { return $this->derrotas; } public function setDerrotas(int $derrotas): void { $this->derrotas = $derrotas; } public function registrar() { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $sql = "INSERT INTO usuario (nombreUsuario, contrasena, email, avatar, cookie, aciertos, victorias, derrotas) VALUES (:nombre, :pass, :email, :avatar, :cookie, :aciertos, :victorias, :derrotas)"; $stmt = $conexion->prepare($sql); $passHash = password_hash($this->contrasena, PASSWORD_BCRYPT); $stmt->execute([ ':nombre' => $this->nombreUsuario, ':pass' => $passHash, ':email' => $this->email, ':avatar' => $this->avatar, ':cookie' => $this->cookie, ':aciertos' => $this->aciertos, ':victorias' => $this->victorias, ':derrotas' => $this->derrotas ]); $this->idUsuario = (int)$conexion->lastInsertId(); return [ 'exito' => 'Usuario registrado correctamente', 'exito_tecnico' => $this->idUsuario ]; } catch (PDOException $error) { return [ 'error' => 'Ocurrió un error al registrar el usuario.', 'error_tecnico' => $error->getMessage() ]; } } public static function buscarPorId($id) { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $sql = "SELECT * FROM usuario WHERE idUsuario = :id"; $stmt = $conexion->prepare($sql); $stmt->execute([':id' => $id]); $datos = $stmt->fetch(PDO::FETCH_ASSOC); if ($datos) { return new Usuario( $datos['nombreUsuario'], $datos['contrasena'], $datos['email'], $datos['avatar'], $datos['cookie'], (int)$datos['aciertos'], (int)$datos['victorias'], (int)$datos['derrotas'], (int)$datos['idUsuario'] ); } return [ 'error' => 'No se encontró ningún usuario con ese ID.' ]; } catch (PDOException $error) { return [ 'error' => 'Ocurrió un error al buscar el usuario.', 'error_tecnico' => $error->getMessage() ]; } } public static function buscarPorEmail($email) { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $sql = "SELECT * FROM usuario WHERE email = :email"; $stmt = $conexion->prepare($sql); $stmt->execute([':email' => $email]); $datos = $stmt->fetch(PDO::FETCH_ASSOC); if ($datos) { return new Usuario( $datos['nombreUsuario'], $datos['contrasena'], $datos['email'], $datos['avatar'], $datos['cookie'], (int)$datos['aciertos'], (int)$datos['victorias'], (int)$datos['derrotas'], (int)$datos['idUsuario'] ); } return null; // No existe usuario con ese email } catch (PDOException $error) { return [ 'error' => 'Ocurrió un error al buscar el usuario por email.', 'error_tecnico' => $error->getMessage() ]; } } public static function login($email, $contrasena) { $usuario = self::buscarPorEmail($email); // El usuario no existe if (!($usuario instanceof Usuario)) { // Limpiamos posibles datos de sesión anteriores unset($_SESSION['idUsuario']); unset($_SESSION['email']); unset($_SESSION['nombreUsuario']); unset($_SESSION['avatar']); return null; } // Comprobamos la contraseña if (password_verify($contrasena, $usuario->getContrasena())) { // Usuario validado correctamente $_SESSION['idUsuario'] = $usuario->getIdUsuario(); $_SESSION['email'] = $usuario->getEmail(); $_SESSION['nombreUsuario'] = $usuario->getNombreUsuario(); $_SESSION['avatar'] = $usuario->getAvatar(); // Devolvemos el usuario como hasta ahora return $usuario; } // Contraseña incorrecta unset($_SESSION['idUsuario']); unset($_SESSION['email']); unset($_SESSION['nombreUsuario']); unset($_SESSION['avatar']); return null; } public function cambiarNombre($nuevoNombre) { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $sql = "UPDATE usuario SET nombreUsuario = :nombre WHERE idUsuario = :id"; $stmt = $conexion->prepare($sql); $stmt->execute([ ':nombre' => $nuevoNombre, ':id' => $this->idUsuario ]); // Actualizamos también el objeto actual $this->nombreUsuario = $nuevoNombre; return [ 'exito' => 'Nombre actualizado correctamente.' ]; } catch (PDOException $error) { return [ 'error' => 'Ocurrió un error al actualizar el nombre.', 'error_tecnico' => $error->getMessage() ]; } } public function cambiarAvatar($archivo) { $carpeta = __DIR__ . '/../img/avatars/'; // Creamos la carpeta si no existe if (!is_dir($carpeta)) { mkdir($carpeta, 0755, true); } // Obtenemos la extensión según el tipo MIME $tipo = mime_content_type($archivo['tmp_name']); $extensiones = [ 'image/jpeg' => 'jpg', 'image/png' => 'png', 'image/gif' => 'gif', 'image/webp' => 'webp' ]; if (!isset($extensiones[$tipo])) { return [ 'error' => 'Formato de imagen no permitido.' ]; } $extension = $extensiones[$tipo]; // Nombre único para evitar conflictos $nombreArchivo = 'avatar_' . $this->idUsuario . '.' . $extension; $rutaCompleta = $carpeta . $nombreArchivo; // Guardamos la imagen if (!move_uploaded_file($archivo['tmp_name'], $rutaCompleta)) { return [ 'error' => 'No se pudo guardar la imagen.' ]; } // Ruta que utilizará el HTML $rutaAvatar = 'img/avatars/' . $nombreArchivo; $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $sql = "UPDATE usuario SET avatar = :avatar WHERE idUsuario = :id"; $stmt = $conexion->prepare($sql); $stmt->execute([ ':avatar' => $rutaAvatar, ':id' => $this->idUsuario ]); // Actualizamos también el objeto actual $this->avatar = $rutaAvatar; return [ 'exito' => 'Avatar actualizado correctamente.', 'avatar' => $rutaAvatar ]; } catch (PDOException $error) { return [ 'error' => 'Ocurrió un error al actualizar el avatar.', 'error_tecnico' => $error->getMessage() ]; } } }