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); }
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)); }
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)); }
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)); }
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); }
public static MiddlewareData AddRenderMessageFeature(this MiddlewareData middlewareData, BaseOutMessage message) { return(middlewareData.UpdateFeatures(f => f.Add <RenderMessageFeature>(new RenderMessageFeature(message)))); }