84 lines
4.3 KiB
C#
84 lines
4.3 KiB
C#
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 для выделения
|
||
}
|
||
}
|
||
} |