Example #1
0
        /// <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));
        }
Example #2
0
        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);
        }
Example #3
0
        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));
        }
Example #4
0
        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);
        }
Example #5
0
        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));
        }
Example #6
0
        /// <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));
        }
Example #7
0
        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();
            }
        }
Example #8
0
        public async Task OpenWebpage(Parsers.Models.Item item)
        {
            var queryResult = await Query(item);

            nativeBrowser.Open(queryResult.Uri);
        }