Реализация модуля Telegram Bridge (WTelegramClient) #1
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Цель: Создать изолированный модуль Knot.Modules.Telegram, позволяющий пользователям подключать свои аккаунты Telegram и транслировать сообщения в систему Knot.
Создать в решении следующие проекты:
Knot.Modules.Telegram.Domain: Сущности (TelegramSession, UserConfig).
Knot.Modules.Telegram.Contracts: Публичные интерфейсы и Integration Events (например, NewTelegramMessageReceived).
Knot.Modules.Telegram.Infrastructure: Реализация WTelegramClient, работа с базой данных (EF Core) и файловым хранилищем (MinIO для сессий).
Knot.Modules.Telegram.Application: Команды (Connect, VerifyCode, SendMessage) и обработчики (Handlers).
Необходимо создать таблицу для хранения данных сессии, чтобы пользователь не проходил авторизацию при каждом перезапуске сервера.
UserId (Guid) — привязка к пользователю Knot.
SessionData (byte[]) — сериализованный поток сессии WTelegramClient.
IsActive (bool).
PhoneNumber (string).
Определить, как другие модули (например, Messaging) узнают о новых сообщениях.
C# public record TelegramMessageReceived( Guid KnotUserId, long TelegramChatId, string SenderName, string Text, DateTime CreatedAt ) : INotification; // Для MediatRСоздать менеджер сессий, который управляет жизненным циклом клиентов:
ITelegramManager: Методы LoginAsync(phone), SubmitCodeAsync(code), SendMessageAsync(...).
Реализация: В методе Login конфигурировать WTelegramClient, подписываясь на событие OnUpdate.
Поскольку Web-приложение должно постоянно «слушать» Telegram:
Создать TelegramWorker : BackgroundService.
При старте (ExecuteAsync) вычитывать из БД все активные сессии и инициализировать для каждой инстанс WTelegramClient.
Обрабатывать входящие обновления (Updates) и пробрасывать их в шину событий (MediatR/MassTransit).
Технические детали (Acceptance Criteria)
Конфигурация: api_id и api_hash должны считываться из IConfiguration (User Secrets или Environment Variables).
Потокобезопасность: Использовать ConcurrentDictionary<Guid, WTelegramClient> для хранения активных подключений в памяти сервера.
Логирование: Настроить детальный лог событий подключения (особенно ошибки FloodWait и PhoneCodeInvalid).
Интеграция с SignalR: Модуль Telegram не должен напрямую дергать хабы. Он должен кидать IntegrationEvent, на который подпишется API-слой и отправит данные клиенту в браузер.