/// <summary> /// Creates and returns a URI link for the given item in a format matching that of the poe gamepedia website /// Only works with items that are not rare or magic /// </summary> private Uri CreateItemWikiLink(Parsers.Models.Item item) { // determine search link, so wiki can be opened for any item var searchLink = item.Rarity == languageProvider.Language.RarityUnique ? item.Name : item.Type; // replace space encodes with '_' to match the link layout of the poe wiki and then url encode it var itemLink = System.Net.WebUtility.UrlEncode(searchLink.Replace(" ", "_")); return(new Uri(WIKI_BASE_URI + itemLink)); }
private async Task <QueryResult <string> > Query(Parsers.Models.Item item) { logger.Log("Querying Trade API."); QueryResult <string> result = null; try { // TODO: More complex logic for determining bulk vs regular search // Maybe also add Fragments to bulk search string path = ""; string json = ""; string baseUri = null; if (item is CurrencyItem || item is DivinationCardItem) { path = $"exchange/{configuration.LeagueId}"; json = JsonSerializer.Serialize(new BulkQueryRequest(item, languageProvider.Language, staticItemCategoryService), poeApiClient.Options); baseUri = languageProvider.Language.PoeTradeExchangeBaseUrl + configuration.LeagueId; } else { path = $"search/{configuration.LeagueId}"; json = JsonSerializer.Serialize(new QueryRequest(item, languageProvider.Language), poeApiClient.Options); baseUri = languageProvider.Language.PoeTradeSearchBaseUrl + configuration.LeagueId; } var body = new StringContent(json, Encoding.UTF8, "application/json"); var response = await httpClientProvider.HttpClient.PostAsync(languageProvider.Language.PoeTradeApiBaseUrl + path, body); if (response.IsSuccessStatusCode) { var test = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStreamAsync(); result = await JsonSerializer.DeserializeAsync <QueryResult <string> >(content, poeApiClient.Options); result.Uri = new Uri($"{baseUri}/{result.Id}"); } else { logger.Log("Querying failed."); } } catch (Exception e) { logger.Log("Querying error."); logger.LogException(e); return(null); } return(result); }
public void Open(Parsers.Models.Item item) { if (item == null) { return; } if (languageProvider.Current.Name != languageProvider.DefaultLanguage) // Only English for now { return; } if (string.IsNullOrEmpty(item.Name)) { logger.Log("Failed to open PoeDb for item", LogState.Error); return; } nativeBrowser.Open(CreateUri(item)); }
public async Task <QueryResult <ListingResult> > GetListings(Parsers.Models.Item item) { var queryResult = await Query(item); if (queryResult != null) { var result = await Task.WhenAll(Enumerable.Range(0, 2).Select(x => GetListings(queryResult, x))); return(new QueryResult <ListingResult>() { Id = queryResult.Id, Result = result.Where(x => x != null).SelectMany(x => x.Result).ToList(), Total = queryResult.Total, Item = item, Uri = queryResult.Uri }); } return(null); }
private Uri CreateUri(Parsers.Models.Item item) { string subUrl; if (item.Rarity == languageProvider.Language.RarityUnique) { subUrl = SubUrlUnique; } else if (item.Rarity == languageProvider.Language.RarityGem) { subUrl = SubUrlGem; } else { subUrl = SubUrlItem; } var searchLink = item.Rarity == languageProvider.Language.RarityUnique ? item.Name : item.Type; string wikiLink = subUrl + searchLink.Replace(" ", "+"); return(new Uri(PoeDbBaseUri + wikiLink)); }
/// <summary> /// Attempts to generate and open the wiki link for the given item /// </summary> public void Open(Parsers.Models.Item item) { if (item == null) { return; } // only available for english portal if (!languageProvider.IsEnglish) { return; } // Most items will open the basetype wiki link. // Does not work for unique items that are not identified. if (string.IsNullOrEmpty(item.Name)) { logger.Log("Failed to open the wiki for the specified item.", LogState.Error); return; } nativeBrowser.Open(CreateItemWikiLink(item)); }
public QueryRequest(Parsers.Models.Item item, ILanguage language) { Query.Status.Option = StatusType.Online; var itemType = item.GetType(); if (itemType == typeof(EquippableItem)) { if (((EquippableItem)item).Rarity == language.RarityUnique) { Query.Name = item.Name; Query.Filters.TypeFilter.Filters.Rarity = new FilterOption() { Option = "Unique", }; } else { Query.Type = item.Type; Query.Filters.TypeFilter.Filters.Rarity = new FilterOption() { Option = "nonunique", }; if (!int.TryParse(((EquippableItem)item).ItemLevel, out var result)) { throw new Exception("Couldn't parse Item Level"); } if (result >= 86) { Query.Filters.MiscFilters.Filters.ItemLevel = new FilterValue() { Min = 86 }; } else { Query.Filters.MiscFilters.Filters.ItemLevel = new FilterValue() { Min = result, Max = result, }; } switch (((EquippableItem)item).Influence) { case InfluenceType.None: break; case InfluenceType.Shaper: Query.Filters.MiscFilters.Filters.ShaperItem = new FilterOption() { Option = "true" }; break; case InfluenceType.Crusader: Query.Filters.MiscFilters.Filters.CrusaderItem = new FilterOption() { Option = "true" }; break; case InfluenceType.Elder: Query.Filters.MiscFilters.Filters.ElderItem = new FilterOption() { Option = "true" }; break; case InfluenceType.Hunter: Query.Filters.MiscFilters.Filters.HunterItem = new FilterOption() { Option = "true" }; break; case InfluenceType.Redeemer: Query.Filters.MiscFilters.Filters.RedeemerItem = new FilterOption() { Option = "true" }; break; case InfluenceType.Warlord: Query.Filters.MiscFilters.Filters.WarlordItem = new FilterOption() { Option = "true" }; break; } } if (((EquippableItem)item).Links != null) // Auto Search 5+ Links { Query.Filters.SocketFilter.Filters.Links = ((EquippableItem)item).Links; } } else if (itemType == typeof(OrganItem)) { Query.Term = item.Name; Query.Filters.TypeFilter.Filters.Category = new FilterOption() { Option = "monster.sample" }; } else if (itemType == typeof(CurrencyItem)) { Query.Type = item.Name; } else if (itemType == typeof(GemItem)) { Query.Type = item.Type; if (!int.TryParse(((GemItem)item).Level, out var result)) { throw new Exception("Unable to parse Gem Level"); } Query.Filters.MiscFilters = new MiscFilter(); Query.Filters.MiscFilters.Filters.GemLevel = new FilterValue() { Min = result, Max = result, }; if (!int.TryParse(((GemItem)item).Quality, out result)) { throw new Exception("Unable to parse Gem Quality"); } Query.Filters.MiscFilters.Filters.Quality = new FilterValue() { Min = result, Max = result, }; Query.Filters.MiscFilters.Filters.Corrupted = new FilterOption() { Option = item.IsCorrupted ? "true" : "false" }; } else if (itemType == typeof(FragmentItem)) { Query.Type = item.Type; } else if (itemType == typeof(MapItem)) { if (((MapItem)item).Rarity == language.RarityUnique) { Query.Name = item.Name; Query.Filters.TypeFilter.Filters.Rarity = new FilterOption() { Option = "Unique", }; } else { Query.Type = item.Type; Query.Filters.TypeFilter.Filters.Rarity = new FilterOption() { Option = "nonunique", }; } if (!int.TryParse(((MapItem)item).MapTier, out var result)) { throw new Exception("Unable to parse Map Tier"); } Query.Filters.MapFilter.Filters.MapTier = new FilterValue() // Search correct map tier { Min = result, Max = result, }; Query.Filters.MapFilter.Filters.Blighted = new FilterOption() { Option = ((MapItem)item).IsBlight, }; } else if (itemType == typeof(ProphecyItem)) { Query.Name = item.Name; } else { throw new NotImplementedException(); } }
public async Task OpenWebpage(Parsers.Models.Item item) { var queryResult = await Query(item); nativeBrowser.Open(queryResult.Uri); }