/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services">The <see cref="IServiceCollection"/> specifies the contract for a collection of service descriptors.</param> /// <seealso cref="IStatePropertyAccessor{T}"/> /// <seealso cref="https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection"/> /// <seealso cref="https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0"/> public void ConfigureServices(IServiceCollection services) { services.AddBot <ChatBotBot>(options => { var secretKey = Configuration.GetSection("botFileSecret")?.Value; // Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection. var botConfig = BotConfiguration.Load(@".\ChatBot.bot", secretKey); services.AddSingleton(sp => botConfig); // Retrieve current endpoint. var service = botConfig.Services.Where(s => s.Type == "endpoint" && s.Name == "development").FirstOrDefault(); if (!(service is EndpointService endpointService)) { throw new InvalidOperationException($"The .bot file does not contain a development endpoint."); } options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword); // Catches any errors that occur during a conversation turn and logs them. options.OnTurnError = async(context, exception) => { await context.SendActivityAsync("Sorry, it looks like something went wrong."); }; }); IStorage dataStore = new MemoryStorage(); var conversationState = new ConversationState(dataStore); var userState = new UserState(dataStore); services.AddSingleton <ChatDialogBotAccessors>(sp => { // Create the custom state accessor. // State accessors enable other components to read and write individual properties of state. var accessors = new ChatDialogBotAccessors(conversationState, userState) { DialogStateAccessor = conversationState.CreateProperty <DialogState>("DialogState"), UserProfileAccessor = userState.CreateProperty <IcMProfile>("UserProfile"), }; return(accessors); }); }
/// <summary> /// Initializes a new instance of the <see cref="ComplexDialogBot"/> class. /// </summary> /// <param name="accessors">A class containing <see cref="IStatePropertyAccessor{T}"/> used to manage state.</param> public ChatBotBot(ChatDialogBotAccessors accessors) { _accessors = accessors ?? throw new ArgumentNullException(nameof(accessors)); // Create a dialog set for the bot. It requires a DialogState accessor, with which // to retrieve the dialog state from the turn context. _dialogs = new DialogSet(accessors.DialogStateAccessor); // Add the prompts we need to the dialog set. _dialogs .Add(new ChoicePrompt(IcMTypePrompt)) .Add(new ChoicePrompt(IcMSeverityPrompt)) .Add(new ChoicePrompt(IcMQueuePrompt)); // Add the dialogs we need to the dialog set. _dialogs.Add(new WaterfallDialog(TopLevelDialog) .AddStep(IcMTypeStepAsync) .AddStep(IcMSeverityStepAsync) .AddStep(IcMQueueTypeAsync) .AddStep(AcknowledgementStepAsync)); }