private async Task<InlineKeyboardMarkup> PrepareKeyboardAsync(Identified<Tobacco> tobacco)
        {
            const byte defaultCount = 5;
            var buttons = new List<IEnumerable<InlineKeyboardButton>>();
            var dbUser = UserContextProvider.DatabaseUser;
            var orderId = await cacheProvider
                .UserLevel<CurrentOrder>()
                .GetAsync();
            if (orderId.HasValue)
            {
                var orderSomeGramsFormat = await TranslationsResolver
                    .ResolveAsync(TelegramTranslationKeys.OrderSomeGrams);
                var innerButtons = new List<InlineKeyboardButton>();
                for (var i = defaultCount; i < defaultCount * 4 + 1; i *= 2)
                {
                    innerButtons.Add(new InlineKeyboardButton
                    {
                        Text = string.Format(orderSomeGramsFormat, i),
                        CallbackData =
                            $"/{nameof(AddToOrderCommand).ExtractCommandName()} {orderId} {nameof(Tobacco)} {tobacco.Index} {i}"
                    });
                }

                buttons.Add(innerButtons);
            }

            if (dbUser.State > TelegramUserStates.Default)
            {
                var (key, command) = tobacco.Entity.Photos.Any()
                    ? (TelegramTranslationKeys.DeletePhotos, nameof(DeleteTobaccoPhotosCommand))
                    : (TelegramTranslationKeys.SetPhotos, nameof(AskForTobaccoPhotosCommand));
                var (deleteTranslation, secondTranslation) = await TranslationsResolver
                    .ResolveAsync(
                        TelegramTranslationKeys.Delete,
                        key
                    );
                buttons.AddRange(new[]
                {
                    new[]
                    {
                        new InlineKeyboardButton
                        {
                            Text = deleteTranslation,
                            CallbackData = $"/{nameof(DeleteTobaccoCommand).ExtractCommandName()} {tobacco.Index}"
                        }
                    },
                    new[]
                    {
                        new InlineKeyboardButton
                        {
                            Text = secondTranslation,
                            CallbackData =
                                $"/{command.ExtractCommandName()} {tobacco.Entity.Id}"
                        }
                    }
                });
            }

            return new InlineKeyboardMarkup(buttons);
        }
Beispiel #2
0
        protected override async Task <InlineKeyboardButton[]> ProcessAsync()
        {
            var(statusCache, currentOrderCache) =
                (cacheProvider.UserLevel <UserTemporaryStatus>(),
                 cacheProvider.UserLevel <CurrentOrder>());
            await statusCache.SetAsync(UserTemporaryStatus.InOrder);

            var cachedOrderId = await currentOrderCache.GetAsync();

            if (cachedOrderId.HasValue)
            {
                return new[]
                       {
                           new InlineKeyboardButton
                           {
                               Text         = await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.ViewCurrentOrder),
                               CallbackData = $"/{nameof(GetOrderCommand).ExtractCommandName()} {cachedOrderId}"
                                              //todo
                           }
                       }
            }
            ;
            var order = new Order();

            hookrRepository.Context.Orders.Add(order);
            await hookrRepository.SaveChangesAsync();

            await currentOrderCache.SetAsync(order.Id);

            return(Array.Empty <InlineKeyboardButton>());
        }
 protected override async Task <Message> SendResponseAsync(ICurrentTelegramUserClient client, Tobacco[] response)
 => await client
 .SendTextMessageAsync(response.Any()
                       ?response
                       .AggregateListString("/{0} {1} - {2}",
                                            x => x.Name,
                                            x => x.Price)
                       : await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.NoTobaccos));
Beispiel #4
0
        private async Task <InlineKeyboardMarkup> PrepareKeyboardAsync(Identified <Hookah> hookah)
        {
            const byte defaultCount = 1;
            var        buttons      = new List <IEnumerable <InlineKeyboardButton> >();
            var        dbUser       = UserContextProvider.DatabaseUser;
            var        orderId      = await cacheProvider
                                      .UserLevel <CurrentOrder>()
                                      .GetAsync();

            if (orderId.HasValue)
            {
                buttons.Add(new[]
                {
                    new InlineKeyboardButton
                    {
                        Text         = await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.OrderSomething),
                        CallbackData =
                            $"/{nameof(AddToOrderCommand).ExtractCommandName()} {orderId} {nameof(Hookah)} {hookah.Index} {defaultCount}"
                    }
                });
            }

            if (dbUser.State > TelegramUserStates.Default)
            {
                var(key, command) = hookah.Entity.Photos.Any()
                    ? (TelegramTranslationKeys.DeletePhotos, nameof(DeleteHookahPhotosCommand))
                    : (TelegramTranslationKeys.SetPhotos, nameof(AskForHookahPhotosCommand));

                var(deleteTranslation, secondTranslation) = await TranslationsResolver
                                                            .ResolveAsync(
                    TelegramTranslationKeys.Delete,
                    key
                    );

                buttons.AddRange(new[]
                {
                    new[]
                    {
                        new InlineKeyboardButton
                        {
                            Text         = deleteTranslation,
                            CallbackData = $"/{nameof(DeleteHookahCommand).ExtractCommandName()} {hookah.Index}"
                        }
                    },
                    new[]
                    {
                        new InlineKeyboardButton
                        {
                            Text         = secondTranslation,
                            CallbackData =
                                $"/{command.ExtractCommandName()} {hookah.Entity.Id}"
                        },
                    }
                });
            }

            return(new InlineKeyboardMarkup(buttons));
        }
Beispiel #5
0
 protected override async Task <Message> SendResponseAsync(ICurrentTelegramUserClient client)
 => await client
 .SendTextMessageAsync(await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.Welcome),
                       replyMarkup : new ReplyKeyboardMarkup
 {
     OneTimeKeyboard = true,
     ResizeKeyboard  = true,
     Keyboard        = Array.Empty <IEnumerable <KeyboardButton> >()
 });
Beispiel #6
0
        private async Task <IEnumerable <InlineKeyboardButton> > GetServiceButtonsAsync(Order order)
        {
            switch (order.State)
            {
            case OrderStates.Confirmed:
            {
                var(approveTranslated, rejectTranslated) =
                    await TranslationsResolver
                    .ResolveAsync(TelegramTranslationKeys.Approve, TelegramTranslationKeys.Reject);

                return(new[]
                    {
                        new InlineKeyboardButton
                        {
                            Text = approveTranslated,
                            CallbackData = $"/{nameof(ApproveOrderCommand).ExtractCommandName()} {order.Id}"
                        },
                        new InlineKeyboardButton
                        {
                            Text = rejectTranslated,
                            CallbackData = $"/{nameof(RejectOrderCommand).ExtractCommandName()} {order.Id}"
                        },
                    });
            }

            case OrderStates.Approved:
                return(new[]
                {
                    new InlineKeyboardButton
                    {
                        Text = await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.Process),
                        CallbackData = $"/{nameof(ProcessOrderCommand).ExtractCommandName()} {order.Id}"
                    },
                });

            case OrderStates.Processing:
                return(new[]
                {
                    new InlineKeyboardButton
                    {
                        Text = await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.Finish),
                        CallbackData = $"/{nameof(FinishOrderCommand).ExtractCommandName()} {order.Id}"
                    },
                });

            case OrderStates.Constructing:
            case OrderStates.Rejected:
            case OrderStates.Finished:
                return(Array.Empty <InlineKeyboardButton>());

            case OrderStates.Unknown:
            default:
                throw new ArgumentOutOfRangeException(nameof(order.State), order.State, null);
            }
        }
Beispiel #7
0
        protected override async Task <Message> SendResponseAsync(ICurrentTelegramUserClient client,
                                                                  Order response)
        {
            var buttons           = new List <IEnumerable <InlineKeyboardButton> >();
            var firstLayerButtons = new List <InlineKeyboardButton>();
            var builder           = new StringBuilder();

            if (response.OrderedHookahs.Any() || response.OrderedTobaccos.Any())
            {
                builder.Append(StringifyResponse(response));
                if (response.State == OrderStates.Constructing)
                {
                    firstLayerButtons.Add(new InlineKeyboardButton
                    {
                        Text         = await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.Confirm),
                        CallbackData = $"/{nameof(ConfirmOrderCommand).ExtractCommandName()} {response.Id}"
                    });
                }
            }
            else
            {
                builder.Append("seems like there is no any data in order");
            }

            builder.Append($"\n\nStatus: *{response.State}*");

            if (response.State == OrderStates.Constructing)
            {
                firstLayerButtons.Add(new InlineKeyboardButton
                {
                    Text         = await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.Delete),
                    CallbackData = $"/{nameof(DeleteOrderCommand).ExtractCommandName()} {response.Id}"
                });
            }

            buttons.Add(firstLayerButtons);
            if (UserContextProvider.DatabaseUser.State > TelegramUserStates.Default)
            {
                buttons.Add(await GetServiceButtonsAsync(response));
            }

            return(await client
                   .SendTextMessageAsync(builder.ToString(),
                                         ParseMode.MarkdownV2,
                                         replyMarkup : new InlineKeyboardMarkup(buttons)));
        }
        private async Task ValidateOrderAsync(Order order, TelegramUser user)
        {
            if (order == null)
            {
                throw new InsufficientAccessRightsException("Order not exist or you have no access.");
            }
            if (order.IsDeleted)
            {
                throw new OrderAlreadyDeletedException(await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.OrderAlreadyDeleted));
            }

            switch (user.State)
            {
            /*case TelegramUserStates.Dev:
             *  return;*/
            case TelegramUserStates.Default when order.CreatedById != user.Id:
                throw new InsufficientAccessRightsException("Seems like you have no access :(");
            }

            await CustomOrderAsyncValidator(order, user);
        }
        protected override async Task<Message> SendResponseAsync(ICurrentTelegramUserClient client,
            Identified<Tobacco> response)
        {
            var (content, keyboard) = await (
                TranslationsResolver.ResolveAsync(TelegramTranslationKeys.GetTobaccoResult, response.Entity.Name,
                    response.Entity.Price),
                PrepareKeyboardAsync(response)
            ).CombineAsync();

            if (response.Entity.Photos.Any())
            {
                await client.SendMediaGroupAsync(
                    response.Entity.Photos
                        .Select(x => new InputMediaPhoto(new InputMedia(x.TelegramFileId)))
                );
            }

            return await client
                .SendTextMessageAsync(
                    content,
                    replyMarkup: keyboard);
        }
 protected override async Task <Message> SendResponseAsync(ICurrentTelegramUserClient client, Order response)
 => await client
 .SendTextMessageAsync(await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.OrderHasBeenFinished, response.Id));
Beispiel #11
0
 protected override Task <Message> SendResponseAsync(ICurrentTelegramUserClient client)
 => client
 .SendTextMessageAsync(() => TranslationsResolver.ResolveAsync(TelegramTranslationKeys.HookahRemoveSuccess));
 protected override async Task <Message> SendResponseAsync(ICurrentTelegramUserClient client, Order response)
 => await client.SendTextMessageAsync(
     await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.ConfirmOrderSuccess, response.Id));
Beispiel #13
0
 protected override async Task <Message> SendResponseAsync(ICurrentTelegramUserClient client)
 => await client.SendTextMessageAsync(
     await TranslationsResolver
     .ResolveAsync(TelegramTranslationKeys.AddPhotoSuccess)
     );
Beispiel #14
0
 protected override async Task <Message> SendResponseAsync(ICurrentTelegramUserClient client)
 => await client
 .SendTextMessageAsync(await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.DeleteCommandSuccess, typeof(TEntity).Name));
Beispiel #15
0
 protected override async Task <Message> SendResponseAsync(ICurrentTelegramUserClient client)
 => await client
 .SendTextMessageAsync(
     await TranslationsResolver.ResolveAsync(TelegramTranslationKeys.UserStateRegistrationSuccess,
                                             StateToSet.ToString().ToLower())
     );