Versión inicial funcional de MyDiary
This commit is contained in:
@@ -0,0 +1,418 @@
|
||||
<?php
|
||||
if(session_status() === PHP_SESSION_NONE){
|
||||
session_start();
|
||||
}
|
||||
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/MyDiary/includes/conexionBD.php';
|
||||
|
||||
class ApiJuego{
|
||||
private $clientId;
|
||||
private $clientSecret;
|
||||
private $accessToken;
|
||||
|
||||
public function __construct(){
|
||||
$this->clientId = $_ENV['clientIdIGDB'];
|
||||
$this->clientSecret = $_ENV['clientSecretIGDB'];
|
||||
$this->accessToken = null;
|
||||
} // Fin __construct()
|
||||
|
||||
private function obtenerToken(){
|
||||
|
||||
// Comprobamos si tenemos un token guardado en sesión y si todavía no ha caducado.
|
||||
if(isset($_SESSION['igdb_access_token']) && isset($_SESSION['igdb_token_expira']) && time() < $_SESSION['igdb_token_expira']){
|
||||
|
||||
$this->accessToken = $_SESSION['igdb_access_token'];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// No tenemos token o ha caducado. Pedimos uno nuevo a Twitch.
|
||||
|
||||
$curl = curl_init();
|
||||
|
||||
curl_setopt($curl, CURLOPT_URL, 'https://id.twitch.tv/oauth2/token');
|
||||
curl_setopt($curl, CURLOPT_POST, true);
|
||||
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
|
||||
curl_setopt($curl, CURLOPT_POSTFIELDS,
|
||||
[
|
||||
'client_id' => $this->clientId,
|
||||
'client_secret' => $this->clientSecret,
|
||||
'grant_type' => 'client_credentials'
|
||||
]
|
||||
);
|
||||
|
||||
$respuesta = curl_exec($curl);
|
||||
|
||||
if(curl_errno($curl)){
|
||||
|
||||
$error = curl_error($curl);
|
||||
|
||||
curl_close($curl);
|
||||
|
||||
return [
|
||||
'error' => 'No se pudo obtener el token de IGDB.',
|
||||
'error_tecnico' => $error
|
||||
];
|
||||
}
|
||||
|
||||
$codigoHTTP = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
||||
|
||||
curl_close($curl);
|
||||
|
||||
$resultado = json_decode(
|
||||
$respuesta,
|
||||
true
|
||||
);
|
||||
|
||||
if($codigoHTTP < 200 || $codigoHTTP >= 300 || isset($resultado['error'])){
|
||||
|
||||
return [
|
||||
'error' => 'No se pudo obtener el token de IGDB.',
|
||||
'error_tecnico' => $resultado
|
||||
];
|
||||
}
|
||||
|
||||
// Guardamos el token en la sesión.
|
||||
|
||||
$this->accessToken = $resultado['access_token'];
|
||||
|
||||
$_SESSION['igdb_access_token'] = $resultado['access_token'];
|
||||
|
||||
// Dejamos un margen de 60 segundos antes de considerar que el token ha caducado.
|
||||
|
||||
$_SESSION['igdb_token_expira'] = time() + $resultado['expires_in'] - 60;
|
||||
|
||||
return true;
|
||||
} // Fin obtenerToken()
|
||||
|
||||
private function peticion($endpoint, $consulta){
|
||||
|
||||
// Si no tenemos token, lo obtenemos
|
||||
if($this->accessToken === null){
|
||||
|
||||
$resultado = $this->obtenerToken();
|
||||
|
||||
if(is_array($resultado)){
|
||||
return $resultado;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$curl = curl_init();
|
||||
|
||||
curl_setopt($curl, CURLOPT_URL, 'https://api.igdb.com/v4/'.$endpoint);
|
||||
curl_setopt($curl, CURLOPT_POST, true);
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
|
||||
|
||||
curl_setopt($curl, CURLOPT_POSTFIELDS, $consulta);
|
||||
|
||||
curl_setopt($curl, CURLOPT_HTTPHEADER,
|
||||
[
|
||||
'Client-ID: '.$this->clientId,
|
||||
'Authorization: Bearer '.$this->accessToken,
|
||||
'Content-Type: text/plain'
|
||||
]
|
||||
);
|
||||
|
||||
$respuesta = curl_exec($curl);
|
||||
|
||||
$codigoHTTP = curl_getinfo($curl, CURLINFO_HTTP_CODE);
|
||||
|
||||
if(curl_errno($curl)){
|
||||
|
||||
$error = curl_error($curl);
|
||||
|
||||
curl_close($curl);
|
||||
|
||||
return [
|
||||
'error' => $error
|
||||
];
|
||||
}
|
||||
|
||||
curl_close($curl);
|
||||
|
||||
// Si el token ha caducado o ha quedado invalidado, obtenemos otro
|
||||
if($codigoHTTP == 401){
|
||||
|
||||
// Eliminamos el token almacenado.
|
||||
unset($_SESSION['igdb_access_token']);
|
||||
unset($_SESSION['igdb_token_expira']);
|
||||
|
||||
$this->accessToken = null;
|
||||
|
||||
// Obtenemos uno nuevo.
|
||||
$resultado = $this->obtenerToken();
|
||||
|
||||
if(is_array($resultado)){
|
||||
return $resultado;
|
||||
}
|
||||
|
||||
// Reintentamos la misma petición.
|
||||
return $this->peticion(
|
||||
$endpoint,
|
||||
$consulta
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
$resultado = json_decode($respuesta, true);
|
||||
|
||||
if($codigoHTTP < 200 || $codigoHTTP >= 300){
|
||||
|
||||
return [
|
||||
'error' => 'IGDB devolvió un error.',
|
||||
'error_tecnico' => $resultado
|
||||
];
|
||||
}
|
||||
|
||||
return $resultado;
|
||||
|
||||
} // Fin peticion()
|
||||
|
||||
public function buscar($nombre){
|
||||
|
||||
$nombre = addslashes($nombre);
|
||||
|
||||
$consulta = '
|
||||
fields id,name,first_release_date,cover.image_id;
|
||||
search "'.$nombre.'";
|
||||
limit 16;
|
||||
';
|
||||
|
||||
$respuesta = $this->peticion('games', $consulta);
|
||||
|
||||
return $respuesta;
|
||||
} // Fin buscar()
|
||||
|
||||
public function detalles($idApi){
|
||||
|
||||
$consulta = '
|
||||
fields
|
||||
id,
|
||||
name,
|
||||
summary,
|
||||
first_release_date,
|
||||
cover.image_id,
|
||||
rating,
|
||||
genres.name,
|
||||
platforms.name,
|
||||
franchises.name,
|
||||
expansions.name,
|
||||
dlcs.name,
|
||||
involved_companies.company.name,
|
||||
involved_companies.developer,
|
||||
involved_companies.publisher;
|
||||
where id = '.$idApi.';
|
||||
';
|
||||
|
||||
$respuesta = $this->peticion('games', $consulta);
|
||||
|
||||
if(isset($respuesta['error'])){
|
||||
return $respuesta;
|
||||
}
|
||||
|
||||
if(empty($respuesta)){
|
||||
return [
|
||||
'error' => 'No se encontró el videojuego solicitado.'
|
||||
];
|
||||
}
|
||||
|
||||
$juego = $respuesta[0];
|
||||
|
||||
// Duración estimada
|
||||
$consultaDuracion = 'fields normally,hastily,completely; where game_id = '.$idApi.';';
|
||||
$duracion = $this->peticion('game_time_to_beats', $consultaDuracion);
|
||||
|
||||
if(!isset($duracion['error']) && !empty($duracion)){
|
||||
$juego['time_to_beat'] = $duracion[0];
|
||||
}
|
||||
|
||||
return $juego;
|
||||
|
||||
} // Fin detalles()
|
||||
|
||||
public function transformarDatos($resultado){
|
||||
|
||||
$juego = [];
|
||||
|
||||
$juego['idApi'] = $resultado['id'];
|
||||
|
||||
$juego['nombreJuego'] = $resultado['name'];
|
||||
|
||||
if(isset($resultado['first_release_date'])){
|
||||
|
||||
$juego['anoJuego'] = date('Y', $resultado['first_release_date']);
|
||||
|
||||
}else{
|
||||
$juego['anoJuego'] = '';
|
||||
}
|
||||
|
||||
if(isset($resultado['rating'])){
|
||||
|
||||
$juego['ratingAvgJuego'] = number_format($resultado['rating'] / 20, 2);
|
||||
}else{
|
||||
$juego['ratingAvgJuego'] = null;
|
||||
}
|
||||
|
||||
$juego['sinopsisJuego'] = $resultado['summary'] ?? '';
|
||||
|
||||
|
||||
// Poster
|
||||
if(isset($resultado['cover']['image_id']) && !empty($resultado['cover']['image_id'])
|
||||
){
|
||||
$imageId = $resultado['cover']['image_id'];
|
||||
$juego['posterJuego'] = 'https://images.igdb.com/igdb/image/upload/t_cover_big_2x/'.$imageId.'.jpg';
|
||||
|
||||
}else{
|
||||
$juego['posterJuego'] = '';
|
||||
}
|
||||
|
||||
|
||||
// Géneros
|
||||
$generos = [];
|
||||
|
||||
if(isset($resultado['genres'])){
|
||||
|
||||
foreach($resultado['genres'] as $genero){
|
||||
|
||||
if(isset($genero['name'])){
|
||||
$generos[] = $genero['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$juego['generoJuego'] = implode(', ', $generos);
|
||||
|
||||
|
||||
// Plataformas
|
||||
$plataformas = [];
|
||||
|
||||
if(isset($resultado['platforms'])){
|
||||
|
||||
foreach($resultado['platforms'] as $plataforma){
|
||||
|
||||
if(isset($plataforma['name'])){
|
||||
|
||||
$nombrePlataforma = $plataforma['name'];
|
||||
|
||||
if($nombrePlataforma === 'PC (Microsoft Windows)'){
|
||||
$nombrePlataforma = 'PC';
|
||||
}
|
||||
|
||||
$plataformas[] = $nombrePlataforma;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$juego['plataformasJuego'] = implode(', ', $plataformas);
|
||||
|
||||
// Metemos las plataformas como array, para usarlas en el select
|
||||
$juego['opcionesPlataformasJuego'] = $plataformas;
|
||||
|
||||
|
||||
// Desarrolladores y editores
|
||||
$desarrolladores = [];
|
||||
$editores = [];
|
||||
|
||||
if(isset($resultado['involved_companies'])){
|
||||
|
||||
foreach($resultado['involved_companies'] as $empresa){
|
||||
|
||||
if(
|
||||
!isset($empresa['company']) ||
|
||||
!isset($empresa['company']['name'])
|
||||
){
|
||||
continue;
|
||||
}
|
||||
|
||||
$nombreEmpresa = $empresa['company']['name'];
|
||||
|
||||
if(
|
||||
isset($empresa['developer']) &&
|
||||
$empresa['developer'] === true
|
||||
){
|
||||
$desarrolladores[] = $nombreEmpresa;
|
||||
}
|
||||
|
||||
if(
|
||||
isset($empresa['publisher']) &&
|
||||
$empresa['publisher'] === true
|
||||
){
|
||||
$editores[] = $nombreEmpresa;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$juego['desarrolladorJuego'] = implode(', ', array_unique($desarrolladores));
|
||||
|
||||
$juego['editorJuego'] = implode(', ', array_unique($editores));
|
||||
|
||||
|
||||
// Franquicias
|
||||
$franquicias = [];
|
||||
|
||||
if(isset($resultado['franchises'])){
|
||||
|
||||
foreach($resultado['franchises'] as $franquicia){
|
||||
|
||||
if(isset($franquicia['name'])){
|
||||
$franquicias[] = $franquicia['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$juego['franquiciaJuego'] = implode(', ', array_unique($franquicias));
|
||||
|
||||
|
||||
// Expansiones
|
||||
$expansiones = [];
|
||||
|
||||
if(isset($resultado['expansions'])){
|
||||
|
||||
foreach($resultado['expansions'] as $expansion){
|
||||
|
||||
if(isset($expansion['name'])){
|
||||
$expansiones[] = $expansion['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$juego['expansionJuego'] = implode(', ', array_unique($expansiones));
|
||||
|
||||
|
||||
// DLCs
|
||||
$dlcs = [];
|
||||
|
||||
if(isset($resultado['dlcs'])){
|
||||
|
||||
foreach($resultado['dlcs'] as $dlc){
|
||||
|
||||
if(isset($dlc['name'])){
|
||||
$dlcs[] = $dlc['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$juego['dlcJuego'] = implode(', ', array_unique($dlcs));
|
||||
|
||||
// Duración estimada
|
||||
if(
|
||||
isset($resultado['time_to_beat']) &&
|
||||
isset($resultado['time_to_beat']['normally'])
|
||||
){
|
||||
$horas = $resultado['time_to_beat']['normally'] / 3600;
|
||||
|
||||
$juego['duracionJuego'] = round($horas, 1).' h';
|
||||
}else{
|
||||
$juego['duracionJuego'] = '';
|
||||
}
|
||||
|
||||
|
||||
return $juego;
|
||||
} // Fin transformarDatos()
|
||||
|
||||
} // Fin clase ApiJuego
|
||||
|
||||
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user