Skip to content

Commit

Permalink
Merge pull request #104 from Sidekick-Poe/feature/annointment-support
Browse files Browse the repository at this point in the history
Add support for item anointments
  • Loading branch information
leMicin committed Jan 5, 2023
2 parents 1bf7944 + 47bf064 commit 91c4eef
Show file tree
Hide file tree
Showing 25 changed files with 243 additions and 24 deletions.
12 changes: 12 additions & 0 deletions src/Sidekick.Apis.PoeWiki/ApiModels/ItemIdResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
using Sidekick.Apis.PoeWiki.JsonConverters;

namespace Sidekick.Apis.PoeWiki.ApiModels
{
public class ItemIdResult
{
[JsonPropertyName("item id")]
public string ItemId { get; set; }
}
}
15 changes: 15 additions & 0 deletions src/Sidekick.Apis.PoeWiki/ApiModels/ItemNameMetadataIdResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
using Sidekick.Apis.PoeWiki.JsonConverters;

namespace Sidekick.Apis.PoeWiki.ApiModels
{
public class ItemNameMetadataIdResult
{
[JsonPropertyName("name")]
public string Name { get; set; }

[JsonPropertyName("metadata id")]
public string MetadataId { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace Sidekick.Apis.PoeWiki.ApiModels
{
public class ItemResult
public class MapItemResult
{
public string Name { get; set; }

Expand Down
4 changes: 4 additions & 0 deletions src/Sidekick.Apis.PoeWiki/IPoeWikiClient.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Sidekick.Apis.PoeWiki.ApiModels;
using Sidekick.Apis.PoeWiki.Models;
using Sidekick.Common.Game.Items;
using Sidekick.Common.Game.Items.Modifiers;

namespace Sidekick.Apis.PoeWiki
{
public interface IPoeWikiClient
{
public bool IsEnabled { get; }
public Task<Map> GetMap(Item item);
public Task<List<string>> GetOilsMetadataIdsFromEnchantment(ModifierLine modifierLine);
public Task<List<ItemNameMetadataIdResult>> GetMetadataIdsFromItemNames(List<string> itemNames);
public void OpenUri(Map map);
public void OpenUri(ItemDrop itemDrop);
public void OpenUri(Boss boss);
Expand Down
14 changes: 14 additions & 0 deletions src/Sidekick.Apis.PoeWiki/IPoeWikiDataProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sidekick.Apis.PoeWiki
{
public interface IPoeWikiDataProvider
{
Task Initialize();
Dictionary<string, string> BlightOilNamesByMetadataIds { get; }
}
}
2 changes: 1 addition & 1 deletion src/Sidekick.Apis.PoeWiki/Models/ItemDrop.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace Sidekick.Apis.PoeWiki.Models
{
public class ItemDrop
{
public ItemDrop(ItemResult itemResult)
public ItemDrop(MapItemResult itemResult)
{
Name = itemResult.Name;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Sidekick.Apis.PoeWiki/Models/Map.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace Sidekick.Apis.PoeWiki.Models
{
public class Map
{
public Map(MapResult map, List<BossResult> bosses, List<ItemResult> items)
public Map(MapResult map, List<BossResult> bosses, List<MapItemResult> items)
{
Id = map.AreaId;
Name = map.Name;
Expand Down
87 changes: 77 additions & 10 deletions src/Sidekick.Apis.PoeWiki/PoeWikiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
using Sidekick.Apis.PoeWiki.Extensions;
using Sidekick.Apis.PoeWiki.Models;
using Sidekick.Common.Browser;
using Sidekick.Common.Cache;
using Sidekick.Common.Game.Items;
using Sidekick.Common.Game.Items.Modifiers;
using Sidekick.Common.Game.Languages;
using Sidekick.Common.Settings;

Expand All @@ -32,8 +34,6 @@ public class PoeWikiClient : IPoeWikiClient
private const string PoeWiki_BaseUri = "https://www.poewiki.net/";
private const string PoeWiki_SubUrl = "w/index.php?search=";

public bool IsEnabled { get; }

public PoeWikiClient(ILogger<PoeWikiClient> logger,
IHttpClientFactory httpClientFactory,
IGameLanguageProvider gameLanguageProvider,
Expand All @@ -55,10 +55,10 @@ public PoeWikiClient(ILogger<PoeWikiClient> logger,
this.gameLanguageProvider = gameLanguageProvider;
this.browserProvider = browserProvider;
this.settings = settings;

IsEnabled = this.gameLanguageProvider.IsEnglish() && this.settings.PoeWikiMap_Enable;
}

public bool IsEnabled => gameLanguageProvider.IsEnglish() && settings.PoeWikiData_Enable;

private async Task<MapResult> GetMapResult(Item item)
{
try
Expand All @@ -72,9 +72,9 @@ private async Task<MapResult> GetMapResult(Item item)

new("tables", "maps,items,areas"),

new("join_on", @"items._pageID=maps._pageID,maps.area_id=areas.id"),
new("join_on", "items._pageID=maps._pageID,maps.area_id=areas.id"),

new("fields", @"items.name,maps.area_id,areas.boss_monster_ids,items.drop_monsters"),
new("fields", "items.name,maps.area_id,areas.boss_monster_ids,items.drop_monsters"),

new("group_by", "items.name"),

Expand Down Expand Up @@ -109,7 +109,7 @@ private async Task<List<BossResult>> GetBossesResult(MapResult mapResult)

new("tables", "monsters"),

new("fields", @"monsters.name,monsters.metadata_id"),
new("fields", "monsters.name,monsters.metadata_id"),

new("where", @$"monsters.metadata_id IN ({mapResult.BossMonsterIds.ToQueryString()})"),
});
Expand All @@ -128,7 +128,7 @@ private async Task<List<BossResult>> GetBossesResult(MapResult mapResult)
return null;
}

private async Task<List<ItemResult>> GetItemsResult(MapResult mapResult)
private async Task<List<MapItemResult>> GetItemsResult(MapResult mapResult)
{
try
{
Expand All @@ -140,14 +140,14 @@ private async Task<List<ItemResult>> GetItemsResult(MapResult mapResult)

new("tables", "items"),

new("fields", @"items.drop_areas,items.flavour_text,items.drop_text,items.class_id,items.drop_monsters,items.name,items.drop_enabled"),
new("fields", "items.drop_areas,items.flavour_text,items.drop_text,items.class_id,items.drop_monsters,items.name,items.drop_enabled"),

new("where", @$"items.drop_areas HOLDS '{mapResult.AreaId}'"),
});

var response = await client.GetAsync(query.ToString());
var content = await response.Content.ReadAsStreamAsync();
var result = await JsonSerializer.DeserializeAsync<CargoQueryResult<ItemResult>>(content, options);
var result = await JsonSerializer.DeserializeAsync<CargoQueryResult<MapItemResult>>(content, options);

return result.CargoQuery.Select(x => x.Title).ToList();
}
Expand All @@ -159,6 +159,73 @@ private async Task<List<ItemResult>> GetItemsResult(MapResult mapResult)
return null;
}

public async Task<List<string>> GetOilsMetadataIdsFromEnchantment(ModifierLine modifierLine)
{
try
{
var enchantmentText = modifierLine.Text.Replace("Allocates ", string.Empty);

var query = new QueryBuilder(new List<KeyValuePair<string, string>>
{
new("action", "cargoquery"),
new("format", "json"),
new("limit", "500"),

new("tables", "blight_crafting_recipes,blight_crafting_recipes_items,mods,passive_skills"),

new("join_on", "blight_crafting_recipes_items.recipe_id=blight_crafting_recipes.id,blight_crafting_recipes.modifier_id=mods.id,blight_crafting_recipes.passive_id=passive_skills.id"),

new("fields", "blight_crafting_recipes_items.item_id"),

new("where", @$"passive_skills.name='{enchantmentText}' OR mods.stat_text='{enchantmentText}'"),
});

var response = await client.GetAsync(query.ToString());
var content = await response.Content.ReadAsStreamAsync();
var result = await JsonSerializer.DeserializeAsync<CargoQueryResult<ItemIdResult>>(content, options);

return result.CargoQuery.Select(x => x.Title.ItemId).ToList();

}
catch (Exception e)
{
logger.LogWarning(e, "Error while trying to get oils from enchantment from poewiki.net.");
}

return null;
}

public async Task<List<ItemNameMetadataIdResult>> GetMetadataIdsFromItemNames(List<string> itemNames)
{
try
{
var query = new QueryBuilder(new List<KeyValuePair<string, string>>
{
new("action", "cargoquery"),
new("format", "json"),
new("limit", "500"),

new("tables", "items"),

new("fields", "items.name,items.metadata_id"),

new("where", @$"items.name IN ({itemNames.ToQueryString()})"),
});

var response = await client.GetAsync(query.ToString());
var content = await response.Content.ReadAsStreamAsync();
var result = await JsonSerializer.DeserializeAsync<CargoQueryResult<ItemNameMetadataIdResult>>(content, options);

return result.CargoQuery.Select(x => x.Title).ToList();
}
catch (Exception e)
{
logger.LogWarning(e, "Error while trying to get item metadata ids from poewiki.net.");
}

return null;
}

public async Task<Map> GetMap(Item item)
{
// Only maps.
Expand Down
55 changes: 55 additions & 0 deletions src/Sidekick.Apis.PoeWiki/PoeWikiDataProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Sidekick.Apis.PoeWiki.ApiModels;
using Sidekick.Common.Cache;
using Sidekick.Common.Game.Languages;

namespace Sidekick.Apis.PoeWiki
{
public class PoeWikiDataProvider : IPoeWikiDataProvider
{
private readonly ICacheProvider cacheProvider;
private readonly IPoeWikiClient poeWikiClient;

private readonly List<string> oilNames;

public PoeWikiDataProvider(ICacheProvider cacheProvider,
IPoeWikiClient poeWikiClient)
{
this.cacheProvider = cacheProvider;
this.poeWikiClient = poeWikiClient;

oilNames = new List<string>() {
"Clear Oil",
"Sepia Oil",
"Amber Oil",
"Verdant Oil",
"Teal Oil",
"Azure Oil",
"Indigo Oil",
"Violet Oil",
"Crimson Oil",
"Black Oil",
"Opalescent Oil",
"Silver Oil",
"Golden Oil",
};
}

public Dictionary<string, string> BlightOilNamesByMetadataIds { get; private set; } = new();

public async Task Initialize()
{
var result = await cacheProvider.GetOrSet("PoeWikiBlightOils", () => poeWikiClient.GetMetadataIdsFromItemNames(oilNames));

if (result != null)
{
BlightOilNamesByMetadataIds = result?.ToDictionary(x => x.MetadataId, x => x.Name);
}
}
}
}
1 change: 1 addition & 0 deletions src/Sidekick.Apis.PoeWiki/StartupExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public static IServiceCollection AddSidekickPoeWikiApi(this IServiceCollection s
services.AddHttpClient();

services.AddTransient<IPoeWikiClient, PoeWikiClient>();
services.AddSingleton<IPoeWikiDataProvider, PoeWikiDataProvider>();

return services;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Sidekick.Common/Settings/ISettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,6 @@ public interface ISettings

DateTimeOffset? PoeNinja_LastClear { get; set; }

bool PoeWikiMap_Enable { get; set; }
bool PoeWikiData_Enable { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Sidekick.Apis.Poe.Parser.Patterns;
using Sidekick.Apis.Poe.Pseudo;
using Sidekick.Apis.PoeNinja;
using Sidekick.Apis.PoeWiki;
using Sidekick.Common;
using Sidekick.Common.Blazor.Views;
using Sidekick.Common.Game.Languages;
Expand Down Expand Up @@ -37,6 +38,7 @@ public partial class Initialization : ComponentBase
[Inject] private IUILanguageProvider UILanguageProvider { get; set; }
[Inject] private IEnglishModifierProvider EnglishModifierProvider { get; set; }
[Inject] private IPoeNinjaClient PoeNinjaClient { get; set; }
[Inject] private IPoeWikiDataProvider PoeWikiDataProvider { get; set; }

private int Count { get; set; } = 0;
private int Completed { get; set; } = 0;
Expand Down Expand Up @@ -75,6 +77,7 @@ public async Task Handle()
await Run(() => ModifierProvider.Initialize());
await Run(() => PseudoModifierProvider.Initialize());
await Run(() => PoeNinjaClient.Initialize());
await Run(() => PoeWikiDataProvider.Initialize());

if (!HasRun)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

<ItemGroup>
<ProjectReference Include="..\Sidekick.Apis.PoeNinja\Sidekick.Apis.PoeNinja.csproj" />
<ProjectReference Include="..\Sidekick.Apis.PoeWiki\Sidekick.Apis.PoeWiki.csproj" />
<ProjectReference Include="..\Sidekick.Apis.Poe\Sidekick.Apis.Poe.csproj" />
<ProjectReference Include="..\Sidekick.Common.Blazor\Sidekick.Common.Blazor.csproj" />
<ProjectReference Include="..\Sidekick.Common.Game\Sidekick.Common.Game.csproj" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,6 @@ public SettingsResources(IStringLocalizer<SettingsResources> resources)
public string Wiki => resources["Wiki"];
public string Wiki_Key_Open => resources["Wiki_Key_Open"];
public string Wiki_Preferred => resources["Wiki_Preferred"];
public string PoeWikiMap_Enable => resources["PoeWikiMap_Enable"];
public string PoeWikiData_Enable => resources["PoeWikiData_Enable"];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@
<data name="Trade_Normalize_Values" xml:space="preserve">
<value>Normalize values in the trade filters (-5 difference or 10%)</value>
</data>
<data name="PoeWikiMap_Enable" xml:space="preserve">
<value>Show additional map info from poewiki.net (only works if Game Language is in English)</value>
<data name="PoeWikiData_Enable" xml:space="preserve">
<value>Show additional information from poewiki.net such as item anointments and map drops. (only works if Game Language is in English)</value>
</data>
</root>
</root>
4 changes: 4 additions & 0 deletions src/Sidekick.Modules.Settings/Pages/General.razor
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@
</CardHeaderContent>
</MudCardHeader>
<MudCardContent Class="pt-0">
<div>
<MudCheckBox Label="@Resources.PoeWikiData_Enable"
@bind-Checked="@ViewModel.PoeWikiData_Enable"></MudCheckBox>
</div>
<ThemeSelect @bind-Value="ViewModel.Theme" />
<div>
<MudCheckBox Label="@Resources.General_RetainClipboard"
Expand Down
4 changes: 0 additions & 4 deletions src/Sidekick.Modules.Settings/Pages/Map.razor
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@
</CardHeaderContent>
</MudCardHeader>
<MudCardContent>
<div>
<MudCheckBox Label="@Resources.PoeWikiMap_Enable"
@bind-Checked="@ViewModel.PoeWikiMap_Enable"></MudCheckBox>
</div>
<div>
<MudCheckBox Label="@Resources.Map_CloseWithMouse"
@bind-Checked="@ViewModel.Map_CloseWithMouse"></MudCheckBox>
Expand Down
2 changes: 1 addition & 1 deletion src/Sidekick.Modules.Settings/Settings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,6 @@ public class Settings : ISettings

public DateTimeOffset? PoeNinja_LastClear { get; set; } = null;

public bool PoeWikiMap_Enable { get; set; } = true;
public bool PoeWikiData_Enable { get; set; } = true;
}
}
Loading

0 comments on commit 91c4eef

Please sign in to comment.