Skip to content

Commit 43133cb

Browse files
authored
Merge pull request #977 from Sidekick-Poe/feature/ninja-details-fix
Fixed 'Open Website' link on Poe.Ninja prices
2 parents ec80ac8 + 5e46b61 commit 43133cb

File tree

7 files changed

+108
-6
lines changed

7 files changed

+108
-6
lines changed

src/Sidekick.Apis.PoeNinja/Exchange/NinjaExchangeProvider.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Sidekick.Apis.Poe.Items;
33
using Sidekick.Apis.PoeNinja.Clients;
44
using Sidekick.Apis.PoeNinja.Exchange.Models;
5+
using Sidekick.Apis.PoeNinja.IndexState;
56
using Sidekick.Apis.PoeNinja.Items.Models;
67
using Sidekick.Common.Cache;
78
using Sidekick.Common.Settings;
@@ -10,7 +11,8 @@ namespace Sidekick.Apis.PoeNinja.Exchange;
1011
public class NinjaExchangeProvider(
1112
INinjaClient ninjaClient,
1213
ISettingsService settingsService,
13-
ICacheProvider cacheProvider) : INinjaExchangeProvider
14+
ICacheProvider cacheProvider,
15+
INinjaIndexStateProvider indexStateProvider) : INinjaExchangeProvider
1416
{
1517
private async Task<string> GetCacheKey(string type)
1618
{
@@ -46,10 +48,10 @@ private async Task<string> GetCacheKey(string type)
4648

4749
private async Task<Uri> GetDetailsUri(NinjaExchangeItem item)
4850
{
49-
var league = await settingsService.GetLeague();
5051
var game = await settingsService.GetGame();
5152
var gamePath = game == GameType.PathOfExile1 ? "" : "poe2/";
52-
return new Uri($"https://poe.ninja/{gamePath}economy/{league?.ToLowerInvariant()}/{item.Page.Url}/{item.DetailsId}");
53+
var leagueIndexState = await indexStateProvider.GetLeague();
54+
return new Uri($"https://poe.ninja/{gamePath}economy/{leagueIndexState?.Url}/{item.Page.Url}/{item.DetailsId}");
5355
}
5456

5557
private async Task<ApiOverviewResult?> GetResult(string type)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using Sidekick.Apis.PoeNinja.IndexState.Models;
2+
namespace Sidekick.Apis.PoeNinja.IndexState;
3+
4+
public interface INinjaIndexStateProvider
5+
{
6+
Task<IndexStateLeague?> GetLeague();
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Sidekick.Apis.PoeNinja.IndexState.Models;
2+
3+
public class IndexStateLeague
4+
{
5+
public string? Name { get; set; }
6+
7+
public string? Url { get; set; }
8+
9+
public string? DisplayName { get; set; }
10+
11+
public bool Hardcore { get; set; }
12+
13+
public bool Indexed { get; set; }
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Sidekick.Apis.PoeNinja.IndexState.Models;
2+
3+
public class IndexStateModel
4+
{
5+
public List<IndexStateLeague> EconomyLeagues { get; set; } = [];
6+
7+
public DateTimeOffset LastUpdated { get; set; } = DateTimeOffset.Now;
8+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using Sidekick.Apis.Poe.Extensions;
2+
using Sidekick.Apis.PoeNinja.Clients;
3+
using Sidekick.Apis.PoeNinja.IndexState.Models;
4+
using Sidekick.Common.Cache;
5+
using Sidekick.Common.Enums;
6+
using Sidekick.Common.Settings;
7+
namespace Sidekick.Apis.PoeNinja.IndexState;
8+
9+
public class NinjaIndexStateProvider(
10+
INinjaClient ninjaClient,
11+
ICacheProvider cacheProvider,
12+
ISettingsService settingsService) : INinjaIndexStateProvider
13+
{
14+
private async Task<string> GetCacheKey()
15+
{
16+
var game = await settingsService.GetGame();
17+
return $"PoeNinjaIndexState_{game.GetValueAttribute()}";
18+
}
19+
20+
public async Task<IndexStateLeague?> GetLeague()
21+
{
22+
var result = await GetResult();
23+
if (result == null) return null;
24+
25+
var league = await settingsService.GetLeague();
26+
var line = result.EconomyLeagues.FirstOrDefault(x => x.Name == league);
27+
return line ?? null;
28+
29+
async Task<bool> CheckCacheIsValid(IndexStateModel? model = null)
30+
{
31+
var lastUpdate = model?.LastUpdated ?? DateTimeOffset.MinValue;
32+
var isCacheTimeValid = DateTimeOffset.Now - lastUpdate <= TimeSpan.FromHours(12);
33+
if (isCacheTimeValid) return true;
34+
35+
var cacheKey = await GetCacheKey();
36+
cacheProvider.Delete(cacheKey);
37+
return false;
38+
}
39+
40+
async Task<IndexStateModel?> GetResult()
41+
{
42+
var cache = await GetOrUpdateCache();
43+
if (!await CheckCacheIsValid(cache))
44+
{
45+
return await GetOrUpdateCache();
46+
}
47+
48+
return cache;
49+
}
50+
51+
async Task<IndexStateModel?> GetOrUpdateCache()
52+
{
53+
var cacheKey = await GetCacheKey();
54+
return await cacheProvider.GetOrSet(cacheKey, async () => await Fetch(), x => x.EconomyLeagues.Count != 0);
55+
}
56+
57+
async Task<IndexStateModel> Fetch()
58+
{
59+
var game = await settingsService.GetGame();
60+
var response = await ninjaClient.Fetch<IndexStateModel>(game, "data/index-state");
61+
if (response == null) return new();
62+
63+
response.LastUpdated = DateTimeOffset.Now;
64+
return response;
65+
}
66+
}
67+
}

src/Sidekick.Apis.PoeNinja/StartupExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.Extensions.DependencyInjection;
22
using Sidekick.Apis.PoeNinja.Clients;
33
using Sidekick.Apis.PoeNinja.Exchange;
4+
using Sidekick.Apis.PoeNinja.IndexState;
45
using Sidekick.Apis.PoeNinja.Items;
56
using Sidekick.Apis.PoeNinja.Stash;
67
using Sidekick.Common;
@@ -16,6 +17,7 @@ public static IServiceCollection AddSidekickPoeNinjaApi(this IServiceCollection
1617
services.AddSingleton<INinjaExchangeProvider, NinjaExchangeProvider>();
1718
services.AddSingleton<INinjaStashProvider, NinjaStashProvider>();
1819
services.AddSingleton<INinjaPageProvider, NinjaPageProvider>();
20+
services.AddSingleton<INinjaIndexStateProvider, NinjaIndexStateProvider>();
1921
services.AddSidekickInitializableService<INinjaItemProvider, NinjaItemProvider>();
2022

2123
return services;

src/Sidekick.Apis.PoeNinja/Stash/NinjaStashProvider.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Sidekick.Apis.Poe.Extensions;
22
using Sidekick.Apis.Poe.Items;
33
using Sidekick.Apis.PoeNinja.Clients;
4+
using Sidekick.Apis.PoeNinja.IndexState;
45
using Sidekick.Apis.PoeNinja.Items.Models;
56
using Sidekick.Apis.PoeNinja.Stash.Models;
67
using Sidekick.Common.Cache;
@@ -10,7 +11,8 @@ namespace Sidekick.Apis.PoeNinja.Stash;
1011
public class NinjaStashProvider(
1112
INinjaClient ninjaClient,
1213
ISettingsService settingsService,
13-
ICacheProvider cacheProvider) : INinjaStashProvider
14+
ICacheProvider cacheProvider,
15+
INinjaIndexStateProvider indexStateProvider) : INinjaStashProvider
1416
{
1517
private async Task<string> GetCacheKey(string type)
1618
{
@@ -35,10 +37,10 @@ private async Task<string> GetCacheKey(string type)
3537

3638
private async Task<Uri?> GetDetailsUri(NinjaStashItem item)
3739
{
38-
var league = await settingsService.GetLeague();
3940
var game = await settingsService.GetGame();
4041
var gamePath = game == GameType.PathOfExile1 ? "" : "poe2/";
41-
return new Uri($"https://poe.ninja/{gamePath}economy/{league?.ToLowerInvariant()}/{item.Page.Url}/{item.DetailsId}");
42+
var leagueIndexState = await indexStateProvider.GetLeague();
43+
return new Uri($"https://poe.ninja/{gamePath}economy/{leagueIndexState?.Url}/{item.Page.Url}/{item.DetailsId}");
4244
}
4345

4446
private async Task<ApiOverviewResult?> GetResult(string type)

0 commit comments

Comments
 (0)