daily_digest/Services/TelegramBotSender.cs

84 lines
4.3 KiB
C#
Raw Normal View History

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 для выделения
}
}
}