示例#1
0
        public MainDialog(BotAccessor accessor, ILuisRouterService luisRouterService, IQnAMakerService qnaMakerService) : base(nameof(MainDialog))
        {
            this.accessor          = accessor ?? throw new ArgumentNullException(nameof(accessor));
            this.luisRouterService = luisRouterService ?? throw new ArgumentNullException(nameof(luisRouterService));
            this.qnaMakerService   = qnaMakerService ?? throw new ArgumentNullException(nameof(qnaMakerService));

            AddDialog(new WaterfallDialog(nameof(MainDialog), new WaterfallStep[]
            {
                LaunchLuisQnADialog,
                EndMainDialog
            }));

            AddDialog(new LuisQnADialog(accessor, luisRouterService, qnaMakerService));
        }
示例#2
0
        public BotAppBot(BotAccessor accessor, ILuisRouterService luisRouterService, IQnAMakerService qnaMakerService, IActiveDirectoryService activeDirectoryService, ConversationState conversationState, UserState userState, ILogger <BotAppBot> logger)
        {
            this.accessor               = accessor;
            this.conversationState      = conversationState;
            this.userState              = userState;
            this.logger                 = logger;
            this.luisRouterService      = luisRouterService;
            this.qnaMakerService        = qnaMakerService;
            this.activeDirectoryService = activeDirectoryService;

            this.dialogs = new DialogSet(accessor.ConversationDialogState);
            this.dialogs.Add(new MainDialog(accessor, luisRouterService, qnaMakerService));
            this.dialogs.Add(new LuisQnADialog(accessor, luisRouterService, qnaMakerService));
        }
        public LuisQnADialog(BotAccessor accessor, ILuisRouterService luisRouterService, IQnAMakerService qnaMakerService) : base(nameof(LuisQnADialog))
        {
            this.accessor          = accessor ?? throw new ArgumentNullException(nameof(accessor));
            this.luisRouterService = luisRouterService ?? throw new ArgumentNullException(nameof(luisRouterService));
            this.qnaMakerService   = qnaMakerService ?? throw new ArgumentNullException(nameof(qnaMakerService));

            AddDialog(new WaterfallDialog(nameof(LuisQnADialog), new WaterfallStep[]
            {
                AskQuestionDialog,
                ProcessQuestionDialog,
                ProcessIfExampleIsRequiredDialog,
                EndDialog
            }));

            AddDialog(new TextPrompt("QuestionValidator", QuestionValidator));
            AddDialog(new ChoicePrompt("AskForExampleValidator", AskForExampleValidator)
            {
                Style = ListStyle.List
            });
        }
示例#4
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Reading settings
            Settings.MicrosoftAppId       = Configuration.GetSection("ApplicationSettings:MicrosoftAppId")?.Value;
            Settings.MicrosoftAppPassword = Configuration.GetSection("ApplicationSettings:MicrosoftAppPassword")?.Value;
            Settings.BotConversationStorageConnectionString = Configuration.GetSection("ApplicationSettings:BotConversationStorageConnectionString")?.Value;
            Settings.BotConversationStorageKey                    = Configuration.GetSection("ApplicationSettings:BotConversationStorageKey")?.Value;
            Settings.BotConversationStorageDatabaseId             = Configuration.GetSection("ApplicationSettings:BotConversationStorageDatabaseId")?.Value;
            Settings.BotConversationStorageUserCollection         = Configuration.GetSection("ApplicationSettings:BotConversationStorageUserCollection")?.Value;
            Settings.BotConversationStorageConversationCollection = Configuration.GetSection("ApplicationSettings:BotConversationStorageConversationCollection")?.Value;
            Settings.KeyVaultEncryptionKey   = Configuration.GetSection("ApplicationSettings:KeyVaultEncryptionKey")?.Value;
            Settings.KeyVaultApplicationCode = Configuration.GetSection("ApplicationSettings:KeyVaultApplicationCode")?.Value;

            // Adding CosmosDB user storage
            CosmosDbStorage userstorage = new CosmosDbStorage(new CosmosDbStorageOptions
            {
                AuthKey          = Settings.BotConversationStorageKey,
                CollectionId     = Settings.BotConversationStorageUserCollection,
                CosmosDBEndpoint = new Uri(Settings.BotConversationStorageConnectionString),
                DatabaseId       = Settings.BotConversationStorageDatabaseId,
            });

            var userState = new UserState(userstorage);

            services.AddSingleton(userState);

            // Adding CosmosDB conversation storage
            CosmosDbStorage conversationstorage = new CosmosDbStorage(new CosmosDbStorageOptions
            {
                AuthKey          = Settings.BotConversationStorageKey,
                CollectionId     = Settings.BotConversationStorageConversationCollection,
                CosmosDBEndpoint = new Uri(Settings.BotConversationStorageConnectionString),
                DatabaseId       = Settings.BotConversationStorageDatabaseId,
            });

            var conversationState = new ConversationState(conversationstorage);

            services.AddSingleton(conversationState);

            // Adding Consul hosted service
            using (ConsulService consulService = new ConsulService(EnvironmentName, ContentRootPath))
            {
                consulService.Initialize(services, Configuration);
            }

            // Adding MVC compatibility
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            // Adding the credential provider to be used with the Bot Framework Adapter
            services.AddSingleton <ICredentialProvider, ConfigurationCredentialProvider>();

            // Adding the channel provider to be used with the Bot Framework Adapter
            services.AddSingleton <IChannelProvider, ConfigurationChannelProvider>();

            // Adding the Bot Framework Adapter with error handling enabled
            services.AddSingleton <IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();

            // Adding middlewares
            services.AddSingleton(new AutoSaveStateMiddleware(userState, conversationState));
            services.AddSingleton(new ShowTypingMiddleware());

            // Adding telemetry
            ConfigureTelemetry(services);

            // Adding HttpClient and HttpClientHandler
            var handler = new HttpClientHandler();

            handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
            var httpClient = new HttpClient(handler);

            // Adding LUIS Router service
            services.AddSingleton <ILuisRouterService>(sp => { return(new LuisRouterService(httpClient, EnvironmentName, ContentRootPath, userState, sp.GetRequiredService <IBotTelemetryClient>())); });

            // Adding QnAMaker Router service
            services.AddSingleton <IQnAMakerService>(sp => { return(new QnAMakerService(httpClient, EnvironmentName, ContentRootPath, sp.GetRequiredService <IBotTelemetryClient>())); });

            // Adding WebChat service
            services.AddSingleton <IWebChatService>(sp => { return(new WebChatService(httpClient, EnvironmentName, ContentRootPath)); });

            // Adding KeyVault service
            services.AddSingleton <IKeyVaultService>(sp => { return(new KeyVaultService(EnvironmentName, ContentRootPath)); });

            KeyVaultService keyVaultService = new KeyVaultService(EnvironmentName, ContentRootPath);

            EncryptionKey   = keyVaultService.GetVaultKeyAsync(Settings.KeyVaultEncryptionKey).Result;
            ApplicationCode = keyVaultService.GetVaultKeyAsync(Settings.KeyVaultApplicationCode).Result;

            // Adding Active Directory service
            services.AddSingleton <IActiveDirectoryService>(sp => { return(new ActiveDirectoryService(EnvironmentName, ContentRootPath)); });

            // Adding accessor
            services.AddSingleton(sp =>
            {
                // We need to grab the conversationState we added on the options in the previous step
                var options = sp.GetRequiredService <IOptions <BotFrameworkOptions> >().Value;
                if (options == null)
                {
                    throw new InvalidOperationException("BotFrameworkOptions must be configured prior to setting up the State Accessors");
                }

                // Create the custom state accessor.
                // State accessor enable other components to read and write individual properties of state.
                var accessor = new BotAccessor(loggerFactory, conversationState, userState)
                {
                    ConversationDialogState   = conversationState.CreateProperty <DialogState>("DialogState"),
                    AskForExamplePreference   = conversationState.CreateProperty <bool>("AskForExamplePreference"),
                    IsAuthenticatedPreference = userState.CreateProperty <bool>("IsAuthenticatedPreference")
                };

                return(accessor);
            });

            // Adding the bot as a transient. In this case the ASP Controller is expecting an IBot
            services.AddTransient <IBot, BotAppBot>();
        }