예제 #1
0
        //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);
            }
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
            }
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
                }
            }
        }
예제 #10
0
        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);
            }
        }
예제 #11
0
        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);
                }
            }
        }
예제 #12
0
        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);
            }
        }
예제 #13
0
        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);
            }
        }
예제 #14
0
        //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);
                }
            }
        }