public LocationDialog( string apiKey, string prompt, BotState state, string dialogId = DefaultLocationDialogId, bool skipPrompt = false, bool useAzureMaps = true, LocationOptions options = LocationOptions.None, LocationRequiredFields requiredFields = LocationRequiredFields.None, LocationResourceManager resourceManager = null) : base(dialogId) { resourceManager = resourceManager ?? new LocationResourceManager(); if (!options.HasFlag(LocationOptions.SkipFavorites) && state == null) { throw new ArgumentNullException(nameof(state), "If LocationOptions.SkipFavorites is not used then BotState object must be " + "provided to allow for storing / retrieval of favorites"); } var favoriteLocations = state.CreateProperty <List <FavoriteLocation> >($"{nameof(LocationDialog)}.Favorites"); var favoritesManager = new FavoritesManager(favoriteLocations); IGeoSpatialService geoSpatialService; if (useAzureMaps) { geoSpatialService = new AzureMapsSpatialService(apiKey); } else { geoSpatialService = new BingGeoSpatialService(apiKey); } InitialDialogId = dialogId; AddDialog(new ChoicePrompt(PromptDialogIds.Choice)); AddDialog(new TextPrompt(PromptDialogIds.Text)); AddDialog(new ConfirmPrompt(PromptDialogIds.Confirm)); AddDialog(new WaterfallDialog(InitialDialogId, new WaterfallStep[] { async(dc, cancellationToken) => { if (options.HasFlag(LocationOptions.SkipFavorites) || !favoritesManager.GetFavorites(dc.Context).Result.Any()) { var isFacebookChannel = StringComparer.OrdinalIgnoreCase.Equals( dc.Context.Activity.ChannelId, "facebook"); if (options.HasFlag(LocationOptions.UseNativeControl) && isFacebookChannel) { return(await dc.BeginDialogAsync(DialogIds.LocationRetrieverFacebookDialog)); } return(await dc.BeginDialogAsync(DialogIds.LocationRetrieverRichDialog)); } return(await dc.BeginDialogAsync(DialogIds.HeroStartCardDialog)); }, async(dc, cancellationToken) => { var selectedLocation = (Bing.Location)dc.Result; dc.Values[StepContextKeys.SelectedLocation] = selectedLocation; if (options.HasFlag(LocationOptions.SkipFinalConfirmation)) { return(await dc.NextAsync()); } await dc.PromptAsync(PromptDialogIds.Confirm, new PromptOptions() { Prompt = new Activity { Type = ActivityTypes.Message, Text = string.Format(resourceManager.ConfirmationAsk, selectedLocation.GetFormattedAddress(resourceManager.AddressSeparator)) }, RetryPrompt = new Activity { Type = ActivityTypes.Message, Text = resourceManager.ConfirmationInvalidResponse } }); return(EndOfTurn); }, async(dc, cancellationToken) => { if (dc.Result is bool result && !result) { await dc.Context.SendActivityAsync(resourceManager.ResetPrompt); return(await dc.ReplaceDialogAsync(InitialDialogId)); } if (!options.HasFlag(LocationOptions.SkipFavorites)) { return(await dc.BeginDialogAsync(DialogIds.AddToFavoritesDialog, new AddToFavoritesDialogOptions() { Location = (Bing.Location)dc.Values[StepContextKeys.SelectedLocation] } )); } else { await dc.NextAsync(); } return(EndOfTurn); }, async(dc, cancellationToken) => { var selectedLocation = (Bing.Location)dc.Values[StepContextKeys.SelectedLocation]; return(await dc.EndDialogAsync(CreatePlace(selectedLocation))); } }));
public LocationDialog( string apiKey, string prompt, bool skipPrompt = false, bool useAzureMaps = true, LocationOptions options = LocationOptions.None, LocationRequiredFields requiredFields = LocationRequiredFields.None, LocationResourceManager resourceManager = null) : base(MainDialogId) { resourceManager = resourceManager ?? new LocationResourceManager(); var favoritesManager = new FavoritesManager(); IGeoSpatialService geoSpatialService; if (useAzureMaps) { geoSpatialService = new AzureMapsSpatialService(apiKey); } else { geoSpatialService = new BingGeoSpatialService(apiKey); } Dialogs.Add(Inputs.Choice, new ChoicePrompt(Culture.English)); Dialogs.Add(Inputs.Text, new TextPrompt()); Dialogs.Add(Inputs.Confirm, new ConfirmPrompt(Culture.English)); Dialogs.Add(MainDialogId, new WaterfallStep[] { async(dc, args, next) => { if (options.HasFlag(LocationOptions.SkipFavorites) || !favoritesManager.GetFavorites(dc.Context).Result.Any()) { var isFacebookChannel = StringComparer.OrdinalIgnoreCase.Equals( dc.Context.Activity.ChannelId, "facebook"); if (options.HasFlag(LocationOptions.UseNativeControl) && isFacebookChannel) { await dc.Begin(DialogIds.LocationRetrieverFacebookDialog); } else { await dc.Begin(DialogIds.LocationRetrieverRichDialog); } } else { await dc.Begin(DialogIds.HeroStartCardDialog); } }, async(dc, args, next) => { Bing.Location selectedLocation = (Bing.Location)args[Outputs.SelectedLocation]; dc.ActiveDialog.State[Outputs.SelectedLocation] = selectedLocation; if (options.HasFlag(LocationOptions.SkipFinalConfirmation)) { await next(); } else { await dc.Prompt(Inputs.Confirm, string.Format(resourceManager.ConfirmationAsk, selectedLocation.GetFormattedAddress(resourceManager.AddressSeparator)), new PromptOptions() { RetryPromptString = resourceManager.ConfirmationInvalidResponse }); } }, async(dc, args, next) => { if (args is ConfirmResult result && !result.Confirmation) { await dc.Context.SendActivity(resourceManager.ResetPrompt); await dc.Replace(MainDialogId); }