Esempio n. 1
0
        private static string BuildSavedPurchaseMessage(SavePurchase.Command command, float today, float averageMonth)
        {
            var builder = new StringBuilder();

            builder.AppendLine($"{Emoji.MailWithDownArrow} Сохранено");
            builder.AppendLine();

            string categoryRow = command.Category;
            var    words       = categoryRow.Split(' ');

            builder.Append(@$ "{Emoji.Shopping} *{words[0].EscapeAsMarkdownV2()}*");
            if (words.Length > 1)
            {
                builder.AppendLine($" _{string.Join(' ', words.Skip(1)).EscapeAsMarkdownV2()}_");
            }
            else
            {
                builder.AppendLine();
            }

            builder.AppendLine(@$ "{Emoji.Money} {command.Price.ToMoneyString().EscapeAsMarkdownV2()}₽");
            builder.AppendLine(@$ "{Emoji.Calendar} {command.Date.ToString(" yyyy.MM.dd ").EscapeAsMarkdownV2()}");
            builder.AppendLine();
            builder.AppendLine(@$ "{Emoji.BarChart} сегодня / среднее / %");
            var averajeEmoji = today > averageMonth ? Emoji.ChartWithDownwardsTrend : Emoji.ChartWithUpwardsTrend;
            var percents     = averageMonth == 0 ? "∞" : ((int)(today / averageMonth * 100)).ToString().EscapeAsMarkdownV2();

            builder.AppendLine(@$ "{averajeEmoji} {today.ToMoneyString().EscapeAsMarkdownV2()}₽ / {averageMonth.ToMoneyString().EscapeAsMarkdownV2()}₽ / {percents}%");

            return(builder.ToString());
        }
Esempio n. 2
0
 private static bool TryHandleFullInfo(string[] lines, Message message, out SavePurchase.Command command, out string errorMessage)
 {
     if (!TryParseCategoryFromLine(lines[0], out var category, out errorMessage))
     {
         command = default;
         return(false);
     }
     if (!TryParseDateFromLine(lines[1], message.Date.Year, out var date))
     {
         errorMessage = "Некорректный формат даты. Необходимо указать день.месяц";
         command      = default;
         return(false);
     }
     if (!TryGetPriceFromLine(lines[2], out var price, out errorMessage))
     {
         command = default;
         return(false);
     }
     command = new SavePurchase.Command(
         message.From.Id,
         category,
         price,
         date,
         message.Chat.Id);
     return(true);
 }
Esempio n. 3
0
        private async Task HandleMessage(IMediator mediator, Message message)
        {
            if (string.IsNullOrEmpty(message.Text))
            {
                await mediator.Send(new SendMessage.Command(message.Chat.Id, $"Некорректное сообщение", message.MessageId));

                return;
            }
            var isTopCommand = await mediator.Send(new HandleTopLevelCommandMessage.Command(message));

            if (isTopCommand)
            {
                return;
            }
            var  lines = message.Text.Split('\n');
            bool success;

            SavePurchase.Command command = null;
            string errorMessage;

            if (lines.Length == 2)
            {
                success = TryHandleCategoryAndPrice(lines, message, out command, out errorMessage);
            }
            else if (lines.Length == 3)
            {
                success = TryHandleFullInfo(lines, message, out command, out errorMessage);
            }
            else
            {
                success      = false;
                errorMessage = $"Некорректный формат сообщения. Необходимо вписать или три (категория, дата, сумма), или две (категория, сумма) строки.";
            }

            if (!success)
            {
                await mediator.Send(new SendMessage.Command(message.Chat.Id, errorMessage.EscapeAsMarkdownV2(), message.MessageId, ParseMode.MarkdownV2));

                return;
            }
            logger.LogDebug($"saving purchase {command}");
            var saveResult = await mediator.Send(command);

            if (saveResult)
            {
                var today = await mediator.Send(new GetAverageSpendingPerDay.Command(message.Chat.Id, DateTimeOffset.UtcNow, TimeSpan.FromDays(1)));

                var averageMonth = await mediator.Send(new GetAverageSpendingPerDay.Command(message.Chat.Id, DateTimeOffset.UtcNow.AddDays(-30), TimeSpan.FromDays(30)));

                var reportText = BuildSavedPurchaseMessage(command, today, averageMonth);
                logger.LogDebug($"Send saved purchase report: >>{reportText}<<");
                await mediator.Send(new SendMessage.Command(message.Chat.Id, reportText, message.MessageId, ParseMode.MarkdownV2));
            }
            else
            {
                await mediator.Send(new SendMessage.Command(message.Chat.Id, $"Ошибка при сохранении", message.MessageId));
            }
        }
        public async Task <ActionResult <bool> > CreatePurchase(
            [FromRoute] long chatId,
            [FromBody] SavePurchase.Command command)
        {
            var userId        = User.GetUserId();
            var userHasAccess = await mediator.Send(
                new GetUserHasAccessToChat.Command(userId, chatId));

            if (!userHasAccess)
            {
                return(Forbid());
            }

            return(await mediator.Send(command with {
                BuyerTelegramId = userId, TelegramChatId = chatId
            }));
        }
Esempio n. 5
0
 private static bool TryHandleCategoryAndPrice(string[] lines, Message message, out SavePurchase.Command command, out string errorMessage)
 {
     if (!TryParseCategoryFromLine(lines[0], out var category, out errorMessage))
     {
         command = default;
         return(false);
     }
     if (!TryGetPriceFromLine(lines[1], out var price, out errorMessage))
     {
         command = default;
         return(false);
     }
     command = new SavePurchase.Command(
         message.From.Id,
         category,
         price,
         message.Date,
         message.Chat.Id);
     return(true);
 }