using BotPages.Core;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;
using static System.Net.Mime.MediaTypeNames;
namespace BotPages.Telegram
{
///
/// Адаптер клиента для Telegram Bot API.
///
public sealed class TelegramClientAdapter : IChatClient
{
private readonly ITelegramBotClient _bot;
///
/// Создаёт адаптер на основе ITelegramBotClient.
///
public TelegramClientAdapter(ITelegramBotClient bot) => _bot = bot;
///
/// Отправляет текстовое сообщение с опциональной клавиатурой.
///
public Task SendTextAsync(long chatId, PageMessage message, IEnumerable? actions, CancellationToken ct)
{
ReplyMarkup? replyMarkup = null;
if (actions is { })
{
var inlineGroups = actions
.Where(a => a.Placement == ActionPlacement.Inline)
.GroupBy(a => a.Row)
.OrderBy(g => g.Key)
.Select(g => g.Select(a => InlineKeyboardButton.WithCallbackData(a.Label, a.Value)).ToArray())
.ToArray();
var replyGroups = actions
.Where(a => a.Placement == ActionPlacement.Reply)
.GroupBy(a => a.Row)
.OrderBy(g => g.Key)
.Select(g => g.Select(a => new KeyboardButton(a.Label)).ToArray())
.ToArray();
if (inlineGroups.Any())
replyMarkup = new InlineKeyboardMarkup(inlineGroups);
else if (replyGroups.Any())
replyMarkup = new ReplyKeyboardMarkup(replyGroups) { ResizeKeyboard = true };
}
var parseMode = message.Format switch
{
MessageFormat.Markdown => ParseMode.MarkdownV2,
MessageFormat.Html => ParseMode.Html,
_ => ParseMode.None,
};
return _bot.SendMessage(new ChatId(chatId),
message.Text,
parseMode: parseMode,
replyMarkup: replyMarkup,
disableNotification: message.IsSilent,
cancellationToken: ct
);
}
///
/// Отправляет файлы как документы (по одному или пачкой).
///
public async Task SendFilesAsync(long chatId, IEnumerable files, CancellationToken ct)
{
foreach (var f in files)
{
if (f.Content is not null)
{
var input = new InputFileStream(f.Content, f.Name);
await _bot.SendDocument(chatId, input, cancellationToken: ct);
}
else
{
// Если контент не загружен, и есть FileId — отправляем по Id
await _bot.SendDocument(chatId, new InputFileId(f.Id), cancellationToken: ct);
}
}
}
}
}