private MyListingsSalesItem ProcessSellListings(HtmlNode item, string currency)
        {
            var node        = item.SelectSingleNode(".//span[@class='market_listing_price']");
            var date        = Regex.Match(item.InnerText, @"Listed: (.+)?\s").Groups[1].Value.Trim();
            var priceString = node.InnerText.Replace("\r", string.Empty).Replace("\n", string.Empty)
                              .Replace("\t", string.Empty).Replace(" ", string.Empty);

            if (priceString.Contains("Sold!"))
            {
                return(null);
            }

            var    game = item.SelectSingleNode("//span[@class='market_listing_game_name']").InnerText;
            double price;

            try
            {
                var priceParse     = priceString.Split('(')[0];
                var currencySymbol = SteamCurrencies.Currencies[currency];
                priceParse = priceParse.Replace(currencySymbol, string.Empty);
                var parseDouble = NumberUtils.TryParseDouble(priceParse, out price);
                if (parseDouble == false)
                {
                    throw new SteamException($"Cannot parse order listing price - {priceString}");
                }
            }
            catch (SteamException)
            {
                throw;
            }
            catch (Exception e)
            {
                throw new SteamException($"Cannot parse order listing price - {priceString} - {e.Message}");
            }

            var saleIdMatch = Regex.Match(item.InnerHtml, "(?<=mylisting_)([0-9]*)(?=_name)");

            if (!saleIdMatch.Success)
            {
                throw new SteamException("Cannot find sale listing ID");
            }

            var saleIdParse = long.TryParse(saleIdMatch.Value, out var saleId);

            if (!saleIdParse)
            {
                throw new SteamException($"Cannot parse sale listing ID - {saleIdMatch.Value}");
            }

            var imageUrl = item.SelectSingleNode($"//img[contains(@id, 'mylisting_{saleId}_image')]").Attributes["src"]
                           .Value;

            imageUrl = Regex.Match(imageUrl, "image/(.*)/").Groups[1].Value;

            var urlNode = item.SelectSingleNode(".//a[@class='market_listing_item_name_link']");

            if (urlNode == null)
            {
                throw new SteamException("Cannot find sale listing url");
            }

            var url = urlNode.Attributes["href"].Value;

            var hashName = MarketUtils.HashNameFromUrl(url);
            var appId    = MarketUtils.AppIdFromUrl(url);

            var nameNode = urlNode.InnerText;

            var result = new MyListingsSalesItem
            {
                AppId    = appId,
                HashName = hashName,
                Name     = nameNode,
                Date     = date,
                SaleId   = saleId,
                Price    = price,
                Url      = url,
                ImageUrl = imageUrl,
                Game     = game
            };

            return(result);
        }
        public MarketSearch Search(
            string query = "",
            int start    = 0,
            int count    = 10,
            bool searchInDescriptions = false,
            int appId = 0,
            EMarketSearchSortColumns sortColumn = EMarketSearchSortColumns.Name,
            ESort sort = ESort.Desc,
            IDictionary <string, string> custom = null)
        {
            var urlQuery = new Dictionary <string, string>
            {
                { "query", query },
                { "start", start.ToString() },
                { "count", count.ToString() },
                { "search_descriptions", (searchInDescriptions ? 1 : 0).ToString() },
                { "appid", appId.ToString() },
                { "sort_column", MarketUtils.FirstCharacterToLower(sortColumn.ToString()) },
                { "sort_dir", MarketUtils.FirstCharacterToLower(sort.ToString()) }
            };

            if (custom != null && custom.Count > 0)
            {
                urlQuery = urlQuery.Concat(custom).ToDictionary(x => x.Key, x => x.Value);
            }

            var resp = this.steam.Request(
                Urls.Market + "/search/render/",
                Method.GET,
                Urls.Market,
                urlQuery,
                true,
                proxy: this.Proxy);
            var respDes = JsonConvert.DeserializeObject <JMarketSearch>(resp.Data.Content);

            if (!respDes.Success)
            {
                throw new SteamException("Failed Search");
            }

            var marketSearch = new MarketSearch();

            if (respDes.TotalCount <= 0)
            {
                return(marketSearch);
            }

            marketSearch.TotalCount = respDes.TotalCount;

            var html = respDes.ResultsHtml;
            var doc  = new HtmlDocument();

            doc.LoadHtml(html);

            var itemNodes = doc.DocumentNode.SelectNodes("//a[@class='market_listing_row_link']");

            if (itemNodes == null || itemNodes.Count <= 0)
            {
                return(marketSearch);
            }

            var tempIndex = 0;

            foreach (var item in itemNodes)
            {
                tempIndex++;

                var nameNode = item.SelectSingleNode(".//span[@class='market_listing_item_name']");
                if (nameNode == null)
                {
                    throw new SteamException($"Cannot parse item name. Index [{tempIndex}]");
                }

                var name = nameNode.InnerText;

                var gameNode = item.SelectSingleNode(".//span[@class='market_listing_game_name']");
                if (gameNode == null)
                {
                    throw new SteamException($"Cannot parse game name. Index [{tempIndex}]");
                }

                var game = gameNode.InnerText;

                var imageUrlNode = item.SelectSingleNode(".//img[@class='market_listing_item_img']");

                var imageUrl = imageUrlNode?.Attributes["srcset"]?.Value;

                var urlAttr = item.Attributes["href"];
                if (urlAttr == null)
                {
                    throw new SteamException($"Cannot find item url. Item [{name}], Index [{tempIndex}]");
                }

                var url = urlAttr.Value;

                var quantityNode = item.SelectSingleNode(".//span[@class='market_listing_num_listings_qty']");
                if (quantityNode == null)
                {
                    throw new SteamException($"Cannot find quantity. Item [{name}], Index [{tempIndex}]");
                }

                var quantityParse = int.TryParse(
                    quantityNode.InnerText,
                    NumberStyles.AllowThousands,
                    CultureInfo.InvariantCulture,
                    out var quantity);

                if (!quantityParse)
                {
                    throw new SteamException($"Cannot parse quantity. Item [{name}], Index [{tempIndex}]");
                }

                var minPriceNode = item.SelectSingleNode(".//span[@class='normal_price']");
                if (minPriceNode == null)
                {
                    throw new SteamException($"Cannot find item price. Item [{name}], Index [{tempIndex}]");
                }

                var minPriceClean = minPriceNode.InnerText.Split(' ')[0];

                var minPriceParse = double.TryParse(
                    minPriceClean,
                    NumberStyles.Currency,
                    CultureInfo.GetCultureInfo("en-US"),
                    out var minPrice);
                if (!minPriceParse)
                {
                    throw new SteamException($"Cannot parse min. price. Item [{name}], Index [{tempIndex}]");
                }

                marketSearch.Items.Add(
                    new MarketSearchItem
                {
                    ImageUrl = imageUrl,
                    Name     = name,
                    Quantity = quantity,
                    Game     = game,
                    Url      = url,
                    MinPrice = minPrice,
                    HashName = MarketUtils.HashNameFromUrl(url),
                    AppId    = MarketUtils.AppIdFromUrl(url)
                });
            }

            return(marketSearch);
        }
        private void GetPendingTransactionData(
            HtmlNode item,
            int tempIndex,
            MyListings myListings,
            ETransactionType type,
            string currency)
        {
            if (item == null)
            {
                return;
            }

            var node = item.SelectSingleNode(".//span[@class='market_listing_price']");

            if (node == null)
            {
                throw new SteamException(
                          $"Cannot parse order listing price and quantity node. Item index [{tempIndex}]");
            }

            var date = Regex.Match(item.InnerText, @"Listed: (.+)?\s").Groups[1].Value.Trim();
            var game = item.SelectSingleNode("//span[@class='market_listing_game_name']")?.InnerText;

            if (type == ETransactionType.Order)
            {
                var priceAndQuantityString = node.InnerText.Replace("\r", string.Empty).Replace("\n", string.Empty)
                                             .Replace("\t", string.Empty).Replace(" ", string.Empty);
                var priceAndQuantitySplit = priceAndQuantityString.Split('@');

                double price;
                try
                {
                    var priceParse     = priceAndQuantitySplit[1].Replace(".", string.Empty);
                    var currencySymbol = SteamCurrencies.Currencies[currency];
                    double.TryParse(priceParse.Replace(currencySymbol, string.Empty), out price);
                }
                catch (Exception)
                {
                    throw new SteamException($"Cannot parse order listing price. Item index [{tempIndex}]");
                }

                var quantityParse = int.TryParse(priceAndQuantitySplit[0], out var quantity);

                if (!quantityParse)
                {
                    throw new SteamException($"Cannot parse order listing quantity. Item index [{tempIndex}]");
                }

                var orderIdMatch = Regex.Match(item.InnerHtml, "(?<=mbuyorder_)([0-9]*)(?=_name)");

                if (!orderIdMatch.Success)
                {
                    throw new SteamException($"Cannot find order listing ID. Item index [{tempIndex}]");
                }

                var orderIdParse = long.TryParse(orderIdMatch.Value, out var orderId);

                if (!orderIdParse)
                {
                    throw new SteamException($"Cannot parse order listing ID. Item index [{tempIndex}]");
                }

                var imageUrl = item.SelectSingleNode($"//img[contains(@id, 'mylisting_{orderId}_image')]")
                               .Attributes["src"].Value;

                imageUrl = Regex.Match(imageUrl, "image/(.*)/").Groups[1].Value;

                var urlNode = item.SelectSingleNode(".//a[@class='market_listing_item_name_link']");
                if (urlNode == null)
                {
                    throw new SteamException($"Cannot find order listing url. Item index [{tempIndex}]");
                }

                var url = urlNode.Attributes["href"].Value;

                var hashName = MarketUtils.HashNameFromUrl(url);
                var appId    = MarketUtils.AppIdFromUrl(url);

                var nameNode = urlNode.InnerText;

                myListings.Orders.Add(
                    new MyListingsOrdersItem
                {
                    AppId    = appId,
                    HashName = hashName,
                    Name     = nameNode,
                    Date     = date,
                    OrderId  = orderId,
                    Price    = price,
                    Quantity = quantity,
                    Url      = url,
                    ImageUrl = imageUrl,
                    Game     = game
                });
            }
            else
            {
                var priceString = node.InnerText.Replace("\r", string.Empty).Replace("\n", string.Empty)
                                  .Replace("\t", string.Empty).Replace(" ", string.Empty);
                double price;
                try
                {
                    var priceParse     = priceString.Split('(')[0];
                    var currencySymbol = SteamCurrencies.Currencies[currency];
                    double.TryParse(priceParse.Replace(currencySymbol, string.Empty), out price);
                }
                catch (Exception)
                {
                    throw new SteamException($"Cannot parse order listing price. Item index [{tempIndex}]");
                }

                var saleIdMatch = Regex.Match(item.InnerHtml, "(?<=mylisting_)([0-9]*)(?=_name)");
                if (!saleIdMatch.Success)
                {
                    throw new SteamException($"Cannot find sale listing ID. Item index [{tempIndex}]");
                }

                var saleIdParse = long.TryParse(saleIdMatch.Value, out var saleId);

                if (!saleIdParse)
                {
                    throw new SteamException($"Cannot parse sale listing ID. Item index [{tempIndex}]");
                }

                var imageUrl = item.SelectSingleNode($"//img[contains(@id, 'mylisting_{saleId}_image')]")
                               .Attributes["src"].Value.Replace("38fx38f", string.Empty).Replace(
                    "https://steamcommunity-a.akamaihd.net/economy/image/",
                    string.Empty);

                var urlNode = item.SelectSingleNode(".//a[@class='market_listing_item_name_link']");
                if (urlNode == null)
                {
                    throw new SteamException($"Cannot find sale listing url. Item index [{tempIndex}]");
                }

                var url = urlNode.Attributes["href"].Value;

                var hashName = MarketUtils.HashNameFromUrl(url);
                var appId    = MarketUtils.AppIdFromUrl(url);

                var nameNode = urlNode.InnerText;

                var result = new MyListingsSalesItem
                {
                    AppId    = appId,
                    HashName = hashName,
                    Name     = nameNode,
                    Date     = date,
                    SaleId   = saleId,
                    Price    = price,
                    Url      = url,
                    ImageUrl = imageUrl,
                    Game     = game
                };

                var isConfirmation = item.InnerHtml.Contains("CancelMarketListingConfirmation");

                if (isConfirmation == false)
                {
                    myListings.Sales.Add(result);
                }
                else
                {
                    myListings.ConfirmationSales.Add(result);
                }
            }
        }