From 0c4c6e816cf4ebc31f88e23a6585fa948918fa0f Mon Sep 17 00:00:00 2001 From: Kieran Date: Wed, 6 Mar 2024 14:41:08 +0000 Subject: [PATCH] Get game --- .../Controllers/GameInfoController.cs | 33 +++++++++---------- NostrStreamer/Extensions.cs | 13 ++++++++ NostrStreamer/Services/GameDb.cs | 26 +++++++++++++++ 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/NostrStreamer/Controllers/GameInfoController.cs b/NostrStreamer/Controllers/GameInfoController.cs index 916c946..356482d 100644 --- a/NostrStreamer/Controllers/GameInfoController.cs +++ b/NostrStreamer/Controllers/GameInfoController.cs @@ -1,36 +1,33 @@ using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; -using NostrStreamer.ApiModel; using NostrStreamer.Services; namespace NostrStreamer.Controllers; [Route("/api/v1/games")] -public class GameInfoController : Controller +public class GameInfoController(GameDb gameDb) : Controller { - private readonly GameDb _gameDb; - - public GameInfoController(GameDb gameDb) - { - _gameDb = gameDb; - } - [HttpGet] public async Task GetGames([FromQuery] string q, [FromQuery] int limit = 10) { - var data = await _gameDb.SearchGames(q, limit); + var data = await gameDb.SearchGames(q, limit); - var mapped = data?.Select(a => new GameInfo() - { - Id = $"igdb:{a.Id}", - Name = a.Name, - Cover = $"https://images.igdb.com/igdb/image/upload/t_cover_big_2x/{a.Cover?.ImageId}.jpg", - Genres = a.Genres.Select(b => b.Name).ToList() - }); + var mapped = data?.Select(a => a.ToGameInfo()); return Json(mapped, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }); } -} + + [HttpGet("{id}")] + public async Task GetGame([FromQuery] string id) + { + var data = await gameDb.GetGame(id); + + return Json(data?.ToGameInfo(), new JsonSerializerSettings() + { + NullValueHandling = NullValueHandling.Ignore + }); + } +} \ No newline at end of file diff --git a/NostrStreamer/Extensions.cs b/NostrStreamer/Extensions.cs index 04894b4..96d5c32 100644 --- a/NostrStreamer/Extensions.cs +++ b/NostrStreamer/Extensions.cs @@ -1,12 +1,14 @@ using Amazon; using Amazon.Runtime; using Amazon.S3; +using Igdb; using MaxMind.GeoIP2; using Newtonsoft.Json; using Nostr.Client.Identifiers; using Nostr.Client.Json; using Nostr.Client.Keys; using Nostr.Client.Messages; +using NostrStreamer.ApiModel; using NostrStreamer.Database; namespace NostrStreamer; @@ -119,6 +121,17 @@ public static class Extensions var ev = NostrJson.Deserialize(stream.Event); return ev!.ToIdentifier(); } + + public static GameInfo ToGameInfo(this Game a) + { + return new GameInfo + { + Id = $"igdb:{a.Id}", + Name = a.Name, + Cover = $"https://images.igdb.com/igdb/image/upload/t_cover_big_2x/{a.Cover?.ImageId}.jpg", + Genres = a.Genres.Select(b => b.Name).ToList() + }; + } } public class Variant diff --git a/NostrStreamer/Services/GameDb.cs b/NostrStreamer/Services/GameDb.cs index 87735f6..86cc173 100644 --- a/NostrStreamer/Services/GameDb.cs +++ b/NostrStreamer/Services/GameDb.cs @@ -77,6 +77,32 @@ public class GameDb return default; } + + public async Task GetGame(string id) + { + await RefreshToken(); + + var req = new HttpRequestMessage(HttpMethod.Post, "https://api.igdb.com/v4/games.pb"); + req.Headers.Add("Client-ID", _config.ClientId); + req.Headers.Authorization = new("Bearer", _currentToken?.AccessToken); + req.Content = new StringContent($"fields id,cover.image_id,genres.name,name; where id = {id};"); + + var rsp = await _client.SendAsync(req); + if (rsp.IsSuccessStatusCode) + { + var rspStream = await rsp.Content.ReadAsStreamAsync(); + + var ret = GameResult.Parser.ParseFrom(rspStream); + return ret.Games.FirstOrDefault(); + } + else + { + var content = await rsp.Content.ReadAsStringAsync(); + _logger.LogWarning("Failed to fetch games {msg}", content); + } + + return default; + } class Token {