fix: cache .coins result to avoid ratelimits

This commit is contained in:
Kwoth
2024-07-07 10:05:01 +00:00
parent 25fa8a3852
commit 1d760a548e
2 changed files with 23 additions and 15 deletions

View File

@@ -201,11 +201,10 @@ public partial class Searches
.Paginated() .Paginated()
.PageItems(async (page) => .PageItems(async (page) =>
{ {
var coins = await _service.GetTopCoins(page + 1); var coins = await _service.GetTopCoins(page);
return coins; return coins;
}) })
.PageSize(1) .PageSize(10)
.Page((items, _) => .Page((items, _) =>
{ {
var embed = _sender.CreateEmbed() var embed = _sender.CreateEmbed()

View File

@@ -4,6 +4,7 @@ using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing.Processing; using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing;
using System.Collections.ObjectModel;
using System.Globalization; using System.Globalization;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
@@ -214,16 +215,24 @@ public class CryptoService : INService
return points; return points;
} }
private static TypedKey<IReadOnlyCollection<GeckoCoinsResult>> GetTopCoinsKey()
=> new($"crypto:top_coins");
public async Task<IReadOnlyCollection<GeckoCoinsResult>?> GetTopCoins(int page) public async Task<IReadOnlyCollection<GeckoCoinsResult>?> GetTopCoins(int page)
{ {
if (page >= 25)
page = 24;
using var http = _httpFactory.CreateClient(); using var http = _httpFactory.CreateClient();
http.AddFakeHeaders(); http.AddFakeHeaders();
var result = await http.GetFromJsonAsync<List<GeckoCoinsResult>>( var result = await _cache.GetOrAddAsync<IReadOnlyCollection<GeckoCoinsResult>>(GetTopCoinsKey(),
$"https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&page={page}&per_page=10"); async () => await http.GetFromJsonAsync<List<GeckoCoinsResult>>(
"https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=250")
?? []);
return result; return result!.Skip(page * 10).Take(10).ToList();
} }
} }