using TeleWave.Domain.Notifications; namespace TeleWave.Application.Common.Interfaces; /// Кнопка инлайн-клавиатуры: подпись и что вернётся в callback. public sealed record TelegramButton(string Text, string CallbackData); /// Обновление от Telegram — только то, что нам нужно от его модели. public sealed record TelegramUpdate( long UpdateId, long? ChatId, string? Text, string? From, /// Идентификатор нажатия: на него надо ответить, иначе кнопка «крутится» у зрителя. string? CallbackId, string? CallbackData, long? CallbackMessageId ); /// Кто мы для Telegram — ответ getMe, по нему проверяется токен. public sealed record TelegramBotInfo(long Id, string Username); /// /// Порт к Bot API. Держим ровно те вызовы, что нужны боту расписания: узнать себя, получить /// обновления, ответить сообщением с кнопками и переключить вебхук. /// /// Настройки (токен, прокси) реализация читает сама на каждый вызов: админ меняет их в рантайме, /// и держать клиента, собранного на старте, значило бы требовать перезапуск контейнера. /// public interface ITelegramApi { Task GetMeAsync( TelegramSettings settings, CancellationToken cancellationToken ); Task> GetUpdatesAsync( TelegramSettings settings, long offset, CancellationToken cancellationToken ); Task SendMessageAsync( TelegramSettings settings, long chatId, string text, IReadOnlyList>? keyboard, CancellationToken cancellationToken ); /// Переписывает уже отправленное сообщение — так меню подписок обновляется на месте. Task EditMessageAsync( TelegramSettings settings, long chatId, long messageId, string text, IReadOnlyList>? keyboard, CancellationToken cancellationToken ); /// Гасит «часики» на нажатой кнопке; текст — всплывающая подсказка. Task AnswerCallbackAsync( TelegramSettings settings, string callbackId, string? text, CancellationToken cancellationToken ); /// /// Разбирает тело вебхука в то же обновление, что приходит опросом: разговор с ботом один, /// и знать про две модели ему незачем. null — тело не разобралось. /// Task ReadUpdateAsync(Stream body, CancellationToken cancellationToken); Task SetWebhookAsync(TelegramSettings settings, CancellationToken cancellationToken); Task DeleteWebhookAsync(TelegramSettings settings, CancellationToken cancellationToken); }