예제 #1
0
        public async Task <MiddlewareData> InvokeAsync(MiddlewareData data, IMiddlewaresChain chain)
        {
            var chatId    = _contextManager.GetChatId(data);
            var messageId = _contextManager.GetMessageId(data);

            var chatContext = await _storage.LoadChatContext(chatId);

            var messageContext = Enumerable.Empty <KeyValuePair <string, object> >();

            if (_contextManager.HasMessageContext(data))
            {
                messageContext = await _storage.LoadMessageContext(chatId, messageId);
            }

            var newData = data.UpdateFeatures(f => f.AddExclusive <ChatContextFeature>(new ChatContextFeature(chatContext))
                                              .AddExclusive <MessageContextFeature>(new MessageContextFeature(messageId, messageContext)));
            var resultData = await chain.NextAsync(newData);

            var newChatContext = resultData.Features.RequireOne <ChatContextFeature>();
            await _storage.SaveChatContext(chatId, newChatContext.Items);

            var newMessageContext = resultData.Features.RequireOne <MessageContextFeature>();

            foreach (var id in newMessageContext.MessageIds)
            {
                await _storage.SaveMessageContext(chatId, id, newMessageContext.Items);
            }

            return(resultData);
        }
예제 #2
0
        public async Task <MiddlewareData> InvokeAsync(MiddlewareData data, IMiddlewaresChain chain)
        {
            var commandInfo = await _commandParser.ParseAsync(data);

            var newData = data.UpdateFeatures(f => f.Add <CommandFeature>(new CommandFeature(commandInfo)));

            return(await chain.NextAsync(newData));
        }
예제 #3
0
        public async Task <MiddlewareData> InvokeAsync(MiddlewareData data, IMiddlewaresChain chain)
        {
            var userPreferences = data.Features.GetOne <UserPreferencesFeature>()
                                  .Map(f => f.UserPreferences)
                                  .OrElse(DefaultUserPreferences.Instance);

            var routingData     = ParseRoutingData(data);
            var prevRoutingData = await LoadSavedRoutingData(data);

            if (prevRoutingData != null)
            {
                routingData = JoinRoutingData(prevRoutingData, routingData);
            }

            var dataWithContext = data.UpdateFeatures(f => f.ReplaceExclusive <SessionFeature>(
                                                          e => e.SetRoutingData(prevRoutingData)
                                                          )
                                                      );

            _logger.LogDebug($"Try find route for {routingData.Path} ({routingData.UserCommand})");

            var match  = _router.FindRoute(routingData);
            var chatId = dataWithContext.Features.RequireOne <UpdateInfoFeature>().GetAnyMessage().Chat.Id;

            if (!match.IsMatched)
            {
                await _sessionStorage.ClearRoutingDataAsync(chatId);

                var message = _localizationManager.Localize(
                    userPreferences: userPreferences,
                    key: LocalizationKeys.UnknownCommand,
                    parameters: new { text = routingData.UserCommand }
                    );
                return(dataWithContext.AddResponseRenderer(message));
            }

            if (!match.IsCompleted)
            {
                await _sessionStorage.SaveRoutingDataAsync(chatId, routingData);

                var responseMessage = MessageData.Builder()
                                      .SetText(_localizationManager.Localize(userPreferences, LocalizationKeys.SelectOneForCompletion))
                                      .SetInlineKeyboardMarkup(bldr => BuildResponseMarkup(bldr, match.UncompletedRoutes))
                                      .Build();

                return(dataWithContext.AddResponseRenderer(responseMessage));
            }
            await _sessionStorage.ClearRoutingDataAsync(chatId);

            var route         = match.CompletedRoute;
            var feature       = new RouterFeature(route.Route, routingData, route.Fields);
            var dataWithRoute = dataWithContext.UpdateFeatures(f => f.AddExclusive <RouterFeature>(feature));

            return(await chain.NextAsync(dataWithRoute));
        }
예제 #4
0
        public async Task <MiddlewareData> InvokeAsync(MiddlewareData data, IMiddlewaresChain chain)
        {
            var principal = new CombinablePrincipal();

            foreach (var authenticationHandler in _authenticationHandlers)
            {
                var identity = await authenticationHandler.HandleAuthenticationAsync(data, principal);

                principal = identity.Map(principal.AddIdentity).OrElse(principal);
            }

            var newData = data.UpdateFeatures(f => f.AddExclusive <AuthenticationFeature>(new AuthenticationFeature(principal)));

            return(await chain.NextAsync(newData));
        }
예제 #5
0
        public async Task <MiddlewareData> InvokeAsync(MiddlewareData data, IMiddlewaresChain chain)
        {
            var message = data.Features.RequireOne <UpdateInfoFeature>().GetAnyMessage();
            var context = await _sessionStorage.LoadMessageContextAsync(message.Chat.Id, message.Id) ??
                          MessageContext.Builder().Build();

            var feature = new SessionFeature(context);

            var output = await chain.NextAsync(data.UpdateFeatures(f => f.AddExclusive <SessionFeature>(feature)));

            var outputContext = output.Features.RequireOne <SessionFeature>().Context;

            await _sessionStorage.SaveMessageContextAsync(message.Chat.Id, message.Id, outputContext);

            foreach (var sentMessageId in outputContext.SentMessageIds)
            {
                await _sessionStorage.SaveMessageContextAsync(message.Chat.Id, sentMessageId, outputContext);
            }

            return(output);
        }
예제 #6
0
 public static MiddlewareData AddRenderMessageFeature(this MiddlewareData middlewareData, BaseOutMessage message)
 {
     return(middlewareData.UpdateFeatures(f => f.Add <RenderMessageFeature>(new RenderMessageFeature(message))));
 }