#nullable disable using NadekoBot.Modules.Searches.Common; using System.Net.Http.Json; namespace NadekoBot.Modules.Searches.Services; public class AnimeSearchService : INService { private readonly IBotCache _cache; private readonly IHttpClientFactory _httpFactory; public AnimeSearchService(IBotCache cache, IHttpClientFactory httpFactory) { _cache = cache; _httpFactory = httpFactory; } public async Task GetAnimeData(string query) { if (string.IsNullOrWhiteSpace(query)) throw new ArgumentNullException(nameof(query)); TypedKey GetKey(string link) => new TypedKey($"anime2:{link}"); try { var suffix = Uri.EscapeDataString(query.Replace("/", " ", StringComparison.InvariantCulture)); var link = $"https://aniapi.nadeko.bot/anime/{suffix}"; link = link.ToLowerInvariant(); var result = await _cache.GetAsync(GetKey(link)); if (!result.TryPickT0(out var data, out _)) { using var http = _httpFactory.CreateClient(); data = await http.GetFromJsonAsync(link); await _cache.AddAsync(GetKey(link), data, expiry: TimeSpan.FromHours(12)); } return data; } catch { return null; } } public async Task GetMangaData(string query) { if (string.IsNullOrWhiteSpace(query)) throw new ArgumentNullException(nameof(query)); TypedKey GetKey(string link) => new TypedKey($"manga2:{link}"); try { var link = "https://aniapi.nadeko.bot/manga/" + Uri.EscapeDataString(query.Replace("/", " ", StringComparison.InvariantCulture)); link = link.ToLowerInvariant(); var result = await _cache.GetAsync(GetKey(link)); if (!result.TryPickT0(out var data, out _)) { using var http = _httpFactory.CreateClient(); data = await http.GetFromJsonAsync(link); await _cache.AddAsync(GetKey(link), data, expiry: TimeSpan.FromHours(3)); } return data; } catch { return null; } } }