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