//search cuisine and search food private async Task OnSingleAddressConfirmation(IDialogContext context, IAwaitable <bool> result) { bool confirm = await result; SearchMealRequest searchMealRequest = context.UserData.GetValue <SearchMealRequest>("searchMealRequest"); if (confirm) { await context.PostAsync("Great thank you for confirming your location."); IEnumerable <MealSearchResultV2> searchedMeals = await GetMealSearchResults(searchMealRequest); if (searchedMeals != null && searchedMeals.Any()) { await context.PostAsync($"I found {searchedMeals.Count()} meals near you:"); IMessageActivity resultMessage = GenerateCarousel(context, searchedMeals); await context.PostAsync(resultMessage); } else { await context.PostAsync($"Sorry, I couldn't find any meals in {searchMealRequest.Location}. You can increase searching distance by researching: 'find {searchMealRequest.Cuisine} within 30 miles'"); } context.Wait(MessageReceived); } else { PromptNewDetailedAddress(context, searchMealRequest, OnSecondAddressTask); } }
private async Task FoodByPrice(IDialogContext context, LuisResult result) { SearchMealRequest searchMealRequest = await GetFoodByPriceRequest(context, result); string welcomeMessage = $"Give me a second while I look for '{searchMealRequest.MealName} in {searchMealRequest.Location} for under ${searchMealRequest.Price}."; await context.PostAsync(welcomeMessage); //checking location searchMealRequest.AddressesArray = _externalService.GetAddressesArray(searchMealRequest.Location); if (searchMealRequest.AddressesArray != null || searchMealRequest.AddressesArray.Length > 0) { if (searchMealRequest.AddressesArray.Length == 1) { PromptForAddressConfirmation(context, searchMealRequest, FoodByPriceAddressConfirmation); } else { HandleMultiAddress(context, searchMealRequest, OnMultiAddressTask); } } else { HandleNoMatchedAddress(context, searchMealRequest, OnSecondAddressTask); } }
private async Task <IEnumerable <MealSearchResultV2> > GetMealSearchResults(SearchMealRequest searchMealRequest) { double lat = 0; double lng = 0; _externalService.GeocodeLocation(searchMealRequest, out lat, out lng); IEnumerable <MealSearchResultV2> searchedMeals = null; if (searchMealRequest.MealName != null) { searchMealRequest.Meals = _externalService.SearchMealsList(lat, lng, 20); searchedMeals = searchMealRequest.Meals.Where(meals => meals.Title.Contains(searchMealRequest.MealName)); } else if (searchMealRequest.Cuisine != null) { searchMealRequest.Meals = _externalService.SearchMealsByCuisineList(lat, lng, 20, searchMealRequest.CuisineId); searchedMeals = searchMealRequest.Meals; } return(searchedMeals); }
private async Task <SearchMealRequest> GetSearchFoodRequest(IDialogContext context, LuisResult result) { SearchMealRequest searchMealRequest = new SearchMealRequest(); EntityRecommendation foodEntityRecommendation = null; EntityRecommendation cityEntityRecommendation = null; if (result.TryFindEntity(EntityFood, out foodEntityRecommendation) && result.TryFindEntity(EntityLocation, out cityEntityRecommendation)) { searchMealRequest.MealName = foodEntityRecommendation.Entity; searchMealRequest.Location = cityEntityRecommendation.Entity; string message = $"Hey! Give me second while I search for {searchMealRequest.MealName}. But first, let's confirm the location you provided me."; await context.PostAsync(message); } else { var errorMessage = $"Ooops! Something went your. Can you please try again. Type 'help' assistance and search tips."; await context.PostAsync(errorMessage); context.Wait(MessageReceived); } //GoogleLocationService locationService = new GoogleLocationService(GoogleApiKey); searchMealRequest.AddressesArray = _externalService.GetAddressesArray(searchMealRequest.Location); return(searchMealRequest); }
private async Task CuisineByPriceAddressConfirmation(IDialogContext context, IAwaitable <bool> result) { bool confirm = await result; SearchMealRequest searchMealRequest = context.UserData.GetValue <SearchMealRequest>("searchMealRequest"); if (confirm) { searchMealRequest.Location = searchMealRequest.AddressesArray[0]; await context.PostAsync("Great thank you for confirming your address."); GoogleLocationService locationService = new GoogleLocationService(GoogleApiKey); MapPoint point = locationService.GetLatLongFromAddress(searchMealRequest.Location); double lat = point.Latitude; double lng = point.Longitude; searchMealRequest.Meals = _externalService.SearchMealsByCuisineList(lat, lng, 100, searchMealRequest.CuisineId); //capture mathsign lessthan or greaer than 1:02am IEnumerable <MealSearchResultV2> searchedMeals = searchMealRequest.Meals.Where(meal => meal.Price <= searchMealRequest.Price); if (searchedMeals != null && searchedMeals.Count() > 0) { await context.PostAsync($"I found {searchedMeals.Count()} {searchMealRequest.Cuisine} meals near you:"); } else { var noMealsMessage = $"I couldn't find {searchMealRequest.Cuisine} food near {searchMealRequest.Location}. Try searching for another cuisine."; await context.PostAsync(noMealsMessage); //option to research cuisine since 0 came back } IMessageActivity resultMessage = GenerateCarousel(context, searchedMeals); await context.PostAsync(resultMessage); context.Wait(MessageReceived); } else { string zipCodeRequest = $"Okay, please provide me a more detailed location with a zip code so I can pin point your location."; //context.UserData.SetValue("cuisineByPrice", cuisineByPrice); context.UserData.Replace("cuisineByPrice", searchMealRequest); PromptDialog.PromptString zipCodePrompt = new PromptDialog.PromptString(zipCodeRequest, "Retry", 3); //search food context.Call(zipCodePrompt, OnSecondAddressTask); } }
private async Task <SearchMealRequest> GetCuisineByPriceRequest(IDialogContext context, LuisResult result) { SearchMealRequest cuisineByPrice = new SearchMealRequest(); EntityRecommendation cuisineEntityRecommendation = null; EntityRecommendation locationEntityRecommendation = null; EntityRecommendation priceEntityRecommendation = null; if (result.TryFindEntity(EntityLocation, out locationEntityRecommendation)) { cuisineByPrice.Location = locationEntityRecommendation.Entity; } else { string locationError = $"Ooops! Something went your. Can you please try again. I didn't catch a location. Type 'help' assistance and search tips."; await context.PostAsync(locationError); context.Wait(MessageReceived); } if (result.TryFindEntity(EntityCuisine, out cuisineEntityRecommendation)) { cuisineByPrice.Cuisine = cuisineEntityRecommendation.Entity; } else { string cuisineError = $"Ooops! Something went wrong. Can you please try again. I didn't catch a cuisine. Type 'help' assistance and search tips."; await context.PostAsync(cuisineError); context.Wait(MessageReceived); } if (result.TryFindEntity(EntityCurrency, out priceEntityRecommendation)) { decimal price = 0; //Double.TryParse(priceEntityRecommendation.Entity, out price); Decimal.TryParse(priceEntityRecommendation.Resolution["value"].ToString(), out price); cuisineByPrice.Price = price; } return(cuisineByPrice); }
private void ResponsedToAddresses(IDialogContext context, SearchMealRequest searchMealRequest) { if (searchMealRequest.AddressesArray.Length == 1) { string confirmMessage = $"I found '{searchMealRequest.AddressesArray[0]}'. Is the location you want me search in?"; //context.UserData.SetValue("searchMealRequest", searchMealRequest); context.UserData.Replace("searchMealRequest", searchMealRequest); PromptDialog.Confirm(context, MealNameAddressConfirmation, confirmMessage, "Sorry, I didn't get that!", 3, PromptStyle.Keyboard); } else { HandleMultiAddress(context, searchMealRequest, OnMultiAddressTask); } }
private static SearchMealRequest GetSearchCuisineRequest(LuisResult result) { SearchMealRequest searchMealRequest = new SearchMealRequest(); EntityRecommendation cuisineEntityRecommendation = null; EntityRecommendation cityEntityRecommendation = null; if (result.TryFindEntity(EntityLocation, out cityEntityRecommendation)) { searchMealRequest.Location = cityEntityRecommendation.Entity; } if (result.TryFindEntity(EntityCuisine, out cuisineEntityRecommendation)) { searchMealRequest.Cuisine = cuisineEntityRecommendation.Entity; } return(searchMealRequest); }
private async Task OnSecondAddressTask(IDialogContext context, IAwaitable <string> result) { SearchMealRequest searchMealRequest = context.UserData.GetValue <SearchMealRequest>("searchMealRequest"); searchMealRequest.Location = await result; searchMealRequest.AddressesArray = _externalService.GetAddressesArray(searchMealRequest.Location); if (searchMealRequest.AddressesArray != null) { if (searchMealRequest.AddressesArray.Length == 1) { searchMealRequest.Location = searchMealRequest.AddressesArray[0]; PromptForAddressConfirmation(context, searchMealRequest, OnSingleAddressConfirmation); } else { HandleMultiAddress(context, searchMealRequest, OnMultiAddressTask); } } }
public async Task SearchFood(IDialogContext context, LuisResult result) { //var apiKey = WebConfigurationManager.AppSettings["BingMapsApiKey"]; //var options = LocationOptions.UseNativeControl | LocationOptions.ReverseGeocode; //var requiredFields = LocationRequiredFields.StreetAddress | LocationRequiredFields.Locality | // LocationRequiredFields.Region | LocationRequiredFields.Country | // LocationRequiredFields.PostalCode; //var prompt = "Where should I ship your order?"; //LocationResourceManager lrm = new LocationResourceManager(); ////location ////LocationCardBuilder card = new LocationCardBuilder(bingApiKey, lrm); //LocationDialog locationDialog = new LocationDialog(apiKey, "emulator", prompt, options, requiredFields); //context.Call(locationDialog, this.ResumeAfterLocationDialogAsync); SearchMealRequest searchMealRequest = await GetSearchFoodRequest(context, result); if (searchMealRequest.AddressesArray != null) { if (searchMealRequest.AddressesArray.Length == 1) { PromptForAddressConfirmation(context, searchMealRequest, MealNameAddressConfirmation); } else { HandleMultiAddress(context, searchMealRequest, OnMultiAddressTask); } } else { HandleNoMatchedAddress(context, searchMealRequest, OnSecondAddressTask); } }
public async Task SearchCuisines(IDialogContext context, LuisResult result) { string message = $"Welcome to the Cuisine finder! Give me a second as I analyze your cusine search: '{result.Query}'..."; await context.PostAsync(message); SearchMealRequest searchMealRequest = GetSearchCuisineRequest(result); Dictionary <string, int> cuisineDict = _externalService.CuisineDictionary(); if (!cuisineDict.ContainsKey(searchMealRequest.Cuisine)) { await HandleUnkownCuisine(context, searchMealRequest, cuisineDict, OnEnterOtherCuisine); } else { searchMealRequest.CuisineId = cuisineDict[searchMealRequest.Cuisine]; searchMealRequest.AddressesArray = _externalService.GetAddressesArray(searchMealRequest.Location); if (searchMealRequest.AddressesArray != null) { if (searchMealRequest.AddressesArray.Length == 1) { PromptForAddressConfirmation(context, searchMealRequest, OnSingleAddressConfirmation); } else { HandleMultiAddress(context, searchMealRequest, OnMultiAddressTask); } } else { HandleNoMatchedAddress(context, searchMealRequest, OnSecondAddressTask); } } }
private async Task OnMultiAddressTask(IDialogContext context, IAwaitable <string> result) { SearchMealRequest searchMealRequest = context.UserData.GetValue <SearchMealRequest>("searchMealRequest"); searchMealRequest.Location = await result; if (searchMealRequest.Location != "None") { await context.PostAsync("Great thank you for confirming your location."); double lat = 0; double lng = 0; _externalService.GeocodeLocation(searchMealRequest, out lat, out lng); if (searchMealRequest.MealName != null) { searchMealRequest.Meals = _externalService.SearchMealsList(lat, lng, 20); } else if (searchMealRequest.Cuisine != null) { searchMealRequest.Meals = _externalService.SearchMealsByCuisineList(lat, lng, 20, searchMealRequest.CuisineId); } await context.PostAsync($"I found {searchMealRequest.Meals.Count()} meals near you:"); IMessageActivity resultMessage = GenerateCarousel(context, searchMealRequest.Meals); await context.PostAsync(resultMessage); context.Wait(MessageReceived); } else { PromptNewDetailedAddress(context, searchMealRequest, OnSecondAddressTask); } }
private async Task CuisinesByPrice(IDialogContext context, LuisResult result) { SearchMealRequest searchMealRequest = await GetCuisineByPriceRequest(context, result); string welcomeMessage = $"Give me a second while I look for {searchMealRequest.Cuisine} in {searchMealRequest.Location} for under ${searchMealRequest.Price}."; await context.PostAsync(welcomeMessage); Dictionary <string, int> cuisineDict = _externalService.CuisineDictionary(); if (!cuisineDict.ContainsKey(searchMealRequest.Cuisine)) { await HandleUnkownCuisine(context, searchMealRequest, cuisineDict, OnEnterOtherCuisine); } searchMealRequest.CuisineId = cuisineDict[searchMealRequest.Cuisine]; searchMealRequest.AddressesArray = _externalService.GetAddressesArray(searchMealRequest.Location); if (searchMealRequest.AddressesArray != null || searchMealRequest.AddressesArray.Count() > 0) { if (searchMealRequest.AddressesArray.Count() == 1) { searchMealRequest.Location = searchMealRequest.AddressesArray[0]; PromptForAddressConfirmation(context, searchMealRequest, CuisineByPriceAddressConfirmation); } else { HandleMultiAddress(context, searchMealRequest, OnMultiAddressTask); } } else { HandleNoMatchedAddress(context, searchMealRequest, OnSecondAddressTask); } }
//search cuisines private async Task OnEnterOtherCuisine(IDialogContext context, IAwaitable <string> result) { SearchMealRequest searchMealRequest = context.UserData.GetValue <SearchMealRequest>("searchMealRequest"); searchMealRequest.Cuisine = await result; await context.PostAsync($"Great you chose: {searchMealRequest.Cuisine}. Let me search that for you."); Dictionary <string, int> cuisineDict = _externalService.CuisineDictionary(); searchMealRequest.CuisineId = cuisineDict[searchMealRequest.Cuisine]; searchMealRequest.AddressesArray = _externalService.GetAddressesArray(searchMealRequest.Location); if (searchMealRequest.AddressesArray != null) { if (searchMealRequest.AddressesArray.Length == 1) { PromptForAddressConfirmation(context, searchMealRequest, OnSingleAddressConfirmation); } else { HandleMultiAddress(context, searchMealRequest, OnMultiAddressTask); } } }