Exemple #1
0
        public async Task PriceCheck([Remainder] string itemName)
        {
            await Context.Message.DeleteAsync();

            try
            {
                var request          = new PriceCheckRequest(itemName);
                var priceCheckResult = await _grandExchangeService.PriceCheckAsync(request);
                await ReplyAsync(priceCheckResult);
            }
            catch (Exception ex)
            {
                var userMessage = $"Sorry {Context.Message.Author.Username}, I could not find the price of item {itemName}";
                await HandleErrorAsync(userMessage, ex);
            }
        }
        public async Task <PriceCheckResult> PriceCheckAsync(PriceCheckRequest request)
        {
            var result = new PriceCheckResult()
            {
                Amount = request.Amount
            };

            var item = _cache.Find((i) => i.Name.Equals(request.ItemName, StringComparison.OrdinalIgnoreCase));

            if (item != null)
            {
                result.ExactMatch = await _itemDb.GetItemDetailAsync(item.Id);

                if (request.Amount.HasValue)
                {
                    result.ExactPrice = await RetrieveExactPrice(item);
                }
                return(result);
            }

            item = _cache.Find((i) => i.Name.StartsWith(request.ItemName, StringComparison.OrdinalIgnoreCase));
            if (item != null)
            {
                result.CloseMatch = await _itemDb.GetItemDetailAsync(item.Id);

                if (request.Amount.HasValue)
                {
                    result.ExactPrice = await RetrieveExactPrice(item);
                }
                return(result);
            }

            item = _cache.Find((i) => i.Name.Contains(request.ItemName, StringComparison.OrdinalIgnoreCase));
            if (item != null)
            {
                result.CloseMatch = await _itemDb.GetItemDetailAsync(item.Id);

                if (request.Amount.HasValue)
                {
                    result.ExactPrice = await RetrieveExactPrice(item);
                }
                return(result);
            }

            // In case of multiple words, try to find a match which contains all these words (indifferent order)
            var words = request.ItemName.Split(' ').Select(i => i.Trim()).ToList();

            if (words.Count > 1)
            {
                item = _cache.Find((i) => i.Name.Split(' ').Intersect(words, StringComparer.OrdinalIgnoreCase).Count() == words.Count);
                if (item != null)
                {
                    result.CloseMatch = await _itemDb.GetItemDetailAsync(item.Id);

                    if (request.Amount.HasValue)
                    {
                        result.ExactPrice = await RetrieveExactPrice(item);
                    }
                    return(result);
                }
            }

            throw new Exception($"Item {request.ItemName} not found in cache");
        }