示例#1
0
        public HNSkypeBot(UserDataAccessors accessors, ILoggerFactory loggerFactory, IUserStorage userStorage, IUserUnreadStorySender userUnreadStorySender)
        {
            if (loggerFactory == null)
            {
                throw new System.ArgumentNullException(nameof(loggerFactory));
            }

            _logger = loggerFactory.CreateLogger <HNSkypeBot>();
            _logger.LogTrace("EchoBot turn start.");
            _accessors = accessors ?? throw new ArgumentNullException(nameof(accessors));

            _userStorage           = userStorage;
            _userUnreadStorySender = userUnreadStorySender;
        }
示例#2
0
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            var builder = new ContainerBuilder();

            services.AddHttpClient();

            var endpointUrl  = Configuration.GetValue <string>("cosmosDB:endpointUrl");
            var primaryKey   = Configuration.GetValue <string>("cosmosDB:primaryKey");
            var databaseName = Configuration.GetValue <string>("cosmosDB:databaseName");

            IStorage dataStore;
            bool     isProduction = true;

#if DEBUG
            isProduction = false;
#endif

            if (isProduction)
            {
                var cosmosDbOptions = new CosmosDbStorageOptions();
                cosmosDbOptions.CosmosDBEndpoint = new Uri(endpointUrl);
                cosmosDbOptions.AuthKey          = primaryKey;
                cosmosDbOptions.DatabaseId       = databaseName;
                cosmosDbOptions.CollectionId     = databaseName;
                dataStore = new CosmosDbStorage(cosmosDbOptions);

                builder.RegisterType <CosmosDBStoryStorage>()
                .As <IStoryStorage>()
                .WithParameter("endpointUrl", endpointUrl)
                .WithParameter("primaryKey", primaryKey)
                .WithParameter("databaseName", databaseName)
                .InstancePerLifetimeScope();

                builder.RegisterType <CosmosDBUserStorage>()
                .As <IUserStorage>()
                .WithParameter("endpointUrl", endpointUrl)
                .WithParameter("primaryKey", primaryKey)
                .WithParameter("databaseName", databaseName)
                .InstancePerLifetimeScope();

                builder.RegisterType <CosmosDBUserStoryNotificationStorage>()
                .As <IUserStoryNotificationStorage>()
                .WithParameter("endpointUrl", endpointUrl)
                .WithParameter("primaryKey", primaryKey)
                .WithParameter("databaseName", databaseName)
                .InstancePerLifetimeScope();
            }
            else
            {
                dataStore = new MemoryStorage();

                builder.RegisterType <MemoryStoryStorage>()
                .As <IStoryStorage>()
                .InstancePerLifetimeScope();

                builder.RegisterType <MemoryUserStorage>()
                .As <IUserStorage>()
                .InstancePerLifetimeScope();

                builder.RegisterType <MemoryUserStoryNotificationStorage>()
                .As <IUserStoryNotificationStorage>()
                .InstancePerLifetimeScope();
            }

            var hNTopStoriesUrl = Configuration.GetValue <string>("hNTopStoriesUrl");

            builder.RegisterType <HNStoryProvider>()
            .As <IHNStoryProvider>()
            .WithParameter("hNTopStoriesUrl", hNTopStoriesUrl)
            .InstancePerLifetimeScope();

            builder.RegisterType <UserUnreadStorySender>()
            .As <IUserUnreadStorySender>()
            .InstancePerLifetimeScope();

            builder.RegisterType <StoryUpdater>()
            .As <IStoryUpdater>()
            .InstancePerLifetimeScope();

            builder.RegisterType <UserMessageSender>()
            .As <IUserMessageSender>()
            .InstancePerLifetimeScope();

            var cleanStorageCron             = Configuration.GetValue <string>("scheduler:timers:cleanStorageCron");
            var sendUnreadStoriesToUsersCron = Configuration.GetValue <string>("scheduler:timers:sendUnreadStoriesToUsersCron");
            var updateStoriesCron            = Configuration.GetValue <string>("scheduler:timers:updateStoriesCron");

            builder.RegisterType <UserStoryScheduler>()
            .As <IUserStoryScheduler>()
            .WithParameter("cleanStorageCron", cleanStorageCron)
            .WithParameter("sendUnreadStoriesToUsersCron", sendUnreadStoriesToUsersCron)
            .WithParameter("updateStoriesCron", updateStoriesCron)
            .InstancePerLifetimeScope();

            builder.RegisterType <CleanStorageJob>();
            builder.RegisterType <SendUnreadStoriesToUsersJob>();
            builder.RegisterType <UpdateStoriesJob>();

            services.AddBot <HNSkypeBot>(options =>
            {
                var secretKey   = Configuration.GetSection("botFileSecret")?.Value;
                var botFilePath = Configuration.GetSection("botFilePath")?.Value;

                var botConfig = BotConfiguration.Load(botFilePath ?? @".\BotConfiguration.bot", secretKey);
                services.AddSingleton(sp => botConfig ?? throw new InvalidOperationException($"The .bot config file could not be loaded. ({botConfig})"));

                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}'.");
                }

                options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword);

                ILogger logger      = _loggerFactory.CreateLogger <HNSkypeBot>();
                options.OnTurnError = async(context, exception) =>
                {
                    logger.LogError($"Exception caught : {exception}");
                    await context.SendActivityAsync("Sorry, it looks like something went wrong.");
                };

                var conversationState = new ConversationState(dataStore);

                options.State.Add(conversationState);
            });

            services.AddSingleton <UserDataAccessors>(sp =>
            {
                var options = sp.GetRequiredService <IOptions <BotFrameworkOptions> >().Value;
                if (options == null)
                {
                    throw new InvalidOperationException("BotFrameworkOptions must be configured prior to setting up the state accessors");
                }

                var conversationState = options.State.OfType <ConversationState>().FirstOrDefault();
                if (conversationState == null)
                {
                    throw new InvalidOperationException("ConversationState must be defined and added before adding conversation-scoped state accessors.");
                }

                var accessors = new UserDataAccessors(conversationState)
                {
                    UserData = conversationState.CreateProperty <UserData>(UserDataAccessors.UserDataName),
                };

                return(accessors);
            });

            builder.Populate(services);
            _container = builder.Build();

            return(new AutofacServiceProvider(_container));
        }