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"); }