daily_digest/Services/TelegramBotSender.cs
2025-04-12 00:27:03 +07:00

84 lines
4.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using DailyDigestWorker.Configuration; // Для BotConfiguration
using Microsoft.Extensions.Options; // Для IOptions
using Telegram.Bot; // Для ITelegramBotClient
using Telegram.Bot.Types.Enums; // Для ParseMode
namespace DailyDigestWorker.Services
{
public class TelegramBotSender : ITelegramBotSender // Реализуем интерфейс
{
private readonly ILogger<TelegramBotSender> _logger;
private readonly ITelegramBotClient _botClient;
private readonly BotConfiguration _botConfig;
private readonly long? _targetChatId; // Храним распарсенный ID
// Внедряем зависимости
public TelegramBotSender(
ILogger<TelegramBotSender> logger,
ITelegramBotClient botClient, // Внедряем клиент бота
IOptions<BotConfiguration> botOptions) // Внедряем настройки
{
_logger = logger;
_botClient = botClient;
_botConfig = botOptions.Value; // Сохраняем настройки
// Пытаемся распарсить TargetChatId один раз в конструкторе
if (!string.IsNullOrWhiteSpace(_botConfig.TargetChatId) &&
long.TryParse(_botConfig.TargetChatId, out long parsedId))
{
_targetChatId = parsedId;
_logger.LogInformation("TelegramBotSender настроен для отправки в чат ID: {ChatId}", _targetChatId);
}
else
{
_targetChatId = null; // Не удалось распарсить или не задан
_logger.LogWarning("TargetChatId не сконфигурирован или некорректен в настройках. Отправка сообщений будет невозможна.");
}
}
public async Task<bool> SendMessageAsync(string messageText, ParseMode parseMode, CancellationToken cancellationToken)
{
if (!_targetChatId.HasValue)
{
_logger.LogWarning("Попытка отправить сообщение, но TargetChatId не настроен.");
return false;
}
if (string.IsNullOrWhiteSpace(messageText))
{
_logger.LogWarning("Попытка отправить пустое сообщение.");
return false;
}
try
{
_logger.LogInformation("Отправка сообщения в чат {ChatId}...", _targetChatId.Value);
await _botClient.SendMessage(
chatId: _targetChatId.Value,
text: messageText,
parseMode: parseMode,
linkPreviewOptions: new Telegram.Bot.Types.LinkPreviewOptions { IsDisabled = true }, // <-- ИСПОЛЬЗОВАТЬ ЭТО
cancellationToken: cancellationToken);
_logger.LogInformation("Сообщение успешно отправлено (инициировано).");
return true;
}
catch (OperationCanceledException)
{
_logger.LogInformation("Отправка сообщения отменена.");
return false;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при отправке сообщения в Telegram чат {ChatId}", _targetChatId.Value);
return false;
}
}
public async Task<bool> SendErrorMessageAsync(string errorMessage, CancellationToken cancellationToken)
{
// Используем тот же метод отправки, но без специфичного ParseMode (или можно указать None/Default)
// Можно добавить префикс к сообщению об ошибке
string fullMessage = $"⚠️ **Ошибка при создании дайджеста:**\n{errorMessage}";
return await SendMessageAsync(fullMessage, ParseMode.Markdown, cancellationToken); // Используем Markdown для выделения
}
}
}