/// <summary> /// Initializes a new instance of the <see cref="CreateIssueDialog"/> class. /// </summary> /// <param name="botServices">Connected services used in processing.</param> /// <param name="botState">The <see cref="UserState"/> for storing properties at user-scope.</param> /// <param name="loggerFactory">The <see cref="ILoggerFactory"/> that enables logging and tracing.</param> public CreateIssueDialog(IStatePropertyAccessor<CreateIssueState> issueRequestAccessor, ILoggerFactory loggerFactory, JobService jobService, ProbotService probotService) : base(nameof(CreateIssueDialog)) { IssueRequestAccessor = issueRequestAccessor ?? throw new ArgumentNullException(nameof(issueRequestAccessor)); _jobService = jobService ?? throw new ArgumentNullException(nameof(jobService)); _probotService = probotService ?? throw new ArgumentNullException(nameof(probotService)); // Add control flow dialogs var waterfallSteps = new WaterfallStep[] { InitializeStateStepAsync, PromptForRepoNameStepAsync, PromptForIssueTitleStepAsync, PromptForIssueBodyStepAsync, DisplayRequestStateStepAsync, }; AddDialog(new WaterfallDialog(IssueDialog, waterfallSteps)); AddDialog(new TextPrompt(Prompts.RepoName)); AddDialog(new TextPrompt(Prompts.IssueTitle)); AddDialog(new TextPrompt(Prompts.IssueBody)); }
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services">Specifies the contract for a <see cref="IServiceCollection"/> of service descriptors.</param> public void ConfigureServices(IServiceCollection services) { var secretKey = Configuration.GetSection("botFileSecret")?.Value; var botFilePath = Configuration.GetSection("botFilePath")?.Value; // Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection. BotConfiguration botConfig = null; try { botConfig = BotConfiguration.Load(botFilePath ?? @".\BotConfiguration.bot", secretKey); } catch { var msg = @"Error reading bot file. Please ensure you have valid botFilePath and botFileSecret set for your environment. - You can find the botFilePath and botFileSecret in the Azure App Service application settings. - If you are running this bot locally, consider adding a appsettings.json file with botFilePath and botFileSecret. - See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration. "; throw new InvalidOperationException(msg); } services.AddSingleton(sp => botConfig ?? throw new InvalidOperationException($"The .bot config file could not be loaded. ({botConfig})")); // Add BotServices singleton. // Create the connected services from .bot file. services.AddSingleton(sp => new BotServices(botConfig)); // Retrieve current endpoint. var environment = _isProduction ? "production" : "development"; var service = botConfig.Services.Where(s => s.Type == "endpoint" && s.Name == environment).FirstOrDefault(); if (!(service is EndpointService endpointService)) { throw new InvalidOperationException($"The .bot file does not contain an endpoint with name '{environment}'."); } // Memory Storage is for local bot debugging only. When the bot // is restarted, everything stored in memory will be gone. IStorage dataStore = new MemoryStorage(); // For production bots use the Azure Blob or // Azure CosmosDB storage providers. For the Azure // based storage providers, add the Microsoft.Bot.Builder.Azure // Nuget package to your solution. That package is found at: // https://www.nuget.org/packages/Microsoft.Bot.Builder.Azure/ // Un-comment the following lines to use Azure Blob Storage // // Storage configuration name or ID from the .bot file. // const string StorageConfigurationId = "<STORAGE-NAME-OR-ID-FROM-BOT-FILE>"; // var blobConfig = botConfig.FindServiceByNameOrId(StorageConfigurationId); // if (!(blobConfig is BlobStorageService blobStorageConfig)) // { // throw new InvalidOperationException($"The .bot file does not contain an blob storage with name '{StorageConfigurationId}'."); // } // // Default container name. // const string DefaultBotContainer = "botstate"; // var storageContainer = string.IsNullOrWhiteSpace(blobStorageConfig.Container) ? DefaultBotContainer : blobStorageConfig.Container; // IStorage dataStore = new Microsoft.Bot.Builder.Azure.AzureBlobStorage(blobStorageConfig.ConnectionString, storageContainer); // Create and add conversation state. var conversationState = new ConversationState(dataStore); services.AddSingleton(conversationState); var userState = new UserState(dataStore); services.AddSingleton(userState); var channelState = new ChannelState(dataStore); services.AddSingleton(sp => channelState); var notificationService = new NotificationService(channelState); services.AddSingleton(sp => notificationService); var jobState = new JobState(dataStore); services.AddSingleton(sp => jobState); var jobService = new JobService(jobState); services.AddSingleton(sp => jobService); var probotService = new ProbotService(); services.AddSingleton(sp => probotService); services.AddSingleton(sp => endpointService); services.AddBot <BasicBot>(options => { options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword); // Catches any errors that occur during a conversation turn and logs them to currently // configured ILogger. ILogger logger = _loggerFactory.CreateLogger <BasicBot>(); options.OnTurnError = async(context, exception) => { logger.LogError($"Exception caught : {exception}"); await context.SendActivityAsync("Sorry, it looks like something went wrong."); }; }); }