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()); }
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); }
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 })); }
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); }