public static MiddlewareData AddResponseRenderer(this MiddlewareData data, Action <MessageData.MessageDataBuilder> action)
        {
            var builder = MessageData.Builder();

            action(builder);
            return(data.AddRenderer(new ResponseMessageRenderer(builder.Build())));
        }
Example #2
0
 public IActionResult GetTime()
 {
     return(new ResponseResult(MessageData.Builder()
                               .SetText($"Сейчас: {DateTime.Now.TimeOfDay}")
                               .SetInlineKeyboardMarkup(b => b.AddRow(r => r.AddItem(new InlineKeyboardButton("Обновить")
     {
         CallbackData = "/get:time"
     })))
                               .Build()));
 }
Example #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));
        }