Задача: Добавление внешнего источника сообщений (собственный чат на сайте) в сервис Telegram-демона #1

Open
opened 2025-09-01 08:01:49 +00:00 by elita · 2 comments
Owner

Задача: Добавление внешнего источника сообщений (собственный чат на сайте) в сервис Telegram-демона

1. Цель

Расширить текущий сервис приёма/отправки сообщений (TelegramBot + RabbitMQ) так, чтобы он принимал входящие сообщения не только из Telegram, но и из веб-чата на сайте. Также нужно подготовить демонстрационную страницу и библиотеку для фронтенда, позволяющую легко интегрировать чат.


2. Бэкенд

  1. Новый источник сообщений

    • Создать сущность WebChat (аналогично ExternalBot) в базе через Prisma.

      • Поля: id, name, secretKey, createdAt, updatedAt.
    • Для каждого WebChat поднимать очереди:

      • InMessageWebChat{name}
      • OutMessageWebChat{name}
      • SessionQueueWebChat{name}
    • Логика работы очередей аналогична Telegram-ботам:

      • InMessage — принимает сообщения от сайта → отправляет их в handleIncomingMessage.
      • OutMessage — из демона наружу (ответы в веб-чат через WebSocket / SSE).
      • SessionQueue — управление блокировкой/разблокировкой сессий.
  2. Обработка сообщений

    • Дополнить main() так, чтобы при запуске:

      • Поднимались все доступные WebChat из базы.
      • Для каждого создавался «виртуальный бот» без Telegram API, но с теми же методами processUpdatehandleIncomingMessage(ctx).
    • В ctx для веб-чата пробрасывать:

      • update — объект сообщения с сайта (JSON).
      • ext — объект WebChat.
      • bot — заглушка (без _request).
      • prisma, allBots.
  3. Отправка ответов в веб-чат

    • Реализовать channel.consume(OutMessageWebChat…) и передавать сообщения в веб-клиент через WebSocket (или SSE).
    • Формат унифицированный: { userId, text, buttons?, files? }.

3. Фронтенд (демонстрационная страница)

  1. Демо-страница

    • Простая SPA (React или Vue) с полем ввода, историей чата и WebSocket-подключением.

    • UI: блок сообщений (слева — от бота, справа — от пользователя).

    • Сообщения сохраняются в localStorage (при обновлении страницы история подтягивается).

    • При отправке сообщения:

      • Генерируется объект { userId, text }.
      • Отправляется через WebSocket → RabbitMQ InMessageWebChat.
    • При получении ответа:

      • Добавляется в историю и в localStorage.
  2. Библиотека для интеграции

    • Вынести чат в npm-пакет или модуль (например, @vidi/webchat-client).

    • Возможности:

      • Лёгкое подключение к любому сайту (<WebChat clientKey="..." />).
      • Управление WebSocket-подключением.
      • Локальное хранение истории (localStorage).
      • Кастомизация UI (тема, цвета, шрифты).
    • Предусмотреть события (onMessage, onConnect, onDisconnect).

  3. Уникальный userId

    • На фронте:

      • При первом заходе генерировать UUIDv4.
      • Сохранять в localStorage.
    • Дополнительно:

      • При соединении отправлять вместе с IP-адресом (IP берётся на бэкенде).
      • Бэкенд хранит userId + ipHash (sha256(IP + secretKey)).
      • При следующих запросах проверять совпадение userId и хэша IP → защита от подмены.

4. Требования по безопасности

  • Все запросы из фронта должны содержать secretKey чата (как заголовок или параметр WebSocket).

  • Проверка на сервере:

    • Валидный secretKey.
    • Совпадение userId + ipHash.
  • Логику подмены обрабатывать: при несоответствии создавать новую сессию.


5. Результат

  • Бэкенд: поддержка WebChat как внешнего источника наряду с Telegram.
  • Демо-страница: работающий веб-чат с хранением истории в localStorage.
  • Фронтенд-библиотека: модуль для лёгкой интеграции чата на любом сайте.
  • Защита: уникальный userId, связка с IP, secretKey для чата.

### Задача: Добавление внешнего источника сообщений (собственный чат на сайте) в сервис Telegram-демона #### 1. Цель Расширить текущий сервис приёма/отправки сообщений (TelegramBot + RabbitMQ) так, чтобы он принимал входящие сообщения не только из Telegram, но и из **веб-чата на сайте**. Также нужно подготовить демонстрационную страницу и библиотеку для фронтенда, позволяющую легко интегрировать чат. --- #### 2. Бэкенд 1. **Новый источник сообщений** * Создать сущность `WebChat` (аналогично `ExternalBot`) в базе через Prisma. * Поля: `id`, `name`, `secretKey`, `createdAt`, `updatedAt`. * Для каждого `WebChat` поднимать очереди: * `InMessageWebChat{name}` * `OutMessageWebChat{name}` * `SessionQueueWebChat{name}` * Логика работы очередей аналогична Telegram-ботам: * `InMessage` — принимает сообщения от сайта → отправляет их в `handleIncomingMessage`. * `OutMessage` — из демона наружу (ответы в веб-чат через WebSocket / SSE). * `SessionQueue` — управление блокировкой/разблокировкой сессий. 2. **Обработка сообщений** * Дополнить `main()` так, чтобы при запуске: * Поднимались все доступные `WebChat` из базы. * Для каждого создавался «виртуальный бот» без Telegram API, но с теми же методами `processUpdate` → `handleIncomingMessage(ctx)`. * В `ctx` для веб-чата пробрасывать: * `update` — объект сообщения с сайта (JSON). * `ext` — объект `WebChat`. * `bot` — заглушка (без `_request`). * `prisma`, `allBots`. 3. **Отправка ответов в веб-чат** * Реализовать `channel.consume(OutMessageWebChat…)` и передавать сообщения в веб-клиент через WebSocket (или SSE). * Формат унифицированный: `{ userId, text, buttons?, files? }`. --- #### 3. Фронтенд (демонстрационная страница) 1. **Демо-страница** * Простая SPA (React или Vue) с полем ввода, историей чата и WebSocket-подключением. * UI: блок сообщений (слева — от бота, справа — от пользователя). * Сообщения сохраняются в **localStorage** (при обновлении страницы история подтягивается). * При отправке сообщения: * Генерируется объект `{ userId, text }`. * Отправляется через WebSocket → RabbitMQ `InMessageWebChat`. * При получении ответа: * Добавляется в историю и в `localStorage`. 2. **Библиотека для интеграции** * Вынести чат в npm-пакет или модуль (например, `@vidi/webchat-client`). * Возможности: * Лёгкое подключение к любому сайту (`<WebChat clientKey="..." />`). * Управление WebSocket-подключением. * Локальное хранение истории (localStorage). * Кастомизация UI (тема, цвета, шрифты). * Предусмотреть события (`onMessage`, `onConnect`, `onDisconnect`). 3. **Уникальный userId** * На фронте: * При первом заходе генерировать UUIDv4. * Сохранять в `localStorage`. * Дополнительно: * При соединении отправлять вместе с IP-адресом (IP берётся на бэкенде). * Бэкенд хранит `userId + ipHash` (sha256(IP + secretKey)). * При следующих запросах проверять совпадение `userId` и хэша IP → защита от подмены. --- #### 4. Требования по безопасности * Все запросы из фронта должны содержать `secretKey` чата (как заголовок или параметр WebSocket). * Проверка на сервере: * Валидный `secretKey`. * Совпадение `userId + ipHash`. * Логику подмены обрабатывать: при несоответствии создавать новую сессию. --- #### 5. Результат * **Бэкенд**: поддержка WebChat как внешнего источника наряду с Telegram. * **Демо-страница**: работающий веб-чат с хранением истории в localStorage. * **Фронтенд-библиотека**: модуль для лёгкой интеграции чата на любом сайте. * **Защита**: уникальный userId, связка с IP, secretKey для чата. ---
oleghasanov999 was assigned by elita 2025-09-01 08:07:06 +00:00
Author
Owner

@kinsalex - оценил задачу на 2 дня. изображение
@mleontev - оценил задачу на 2дня. изображение

Срок на задачу 2 дня.

@kinsalex - оценил задачу на 2 дня. ![изображение](/attachments/09779ad7-7424-4aad-8ab0-0f6bb1753883) @mleontev - оценил задачу на 2дня. ![изображение](/attachments/29e65a9d-eeaf-4eff-9332-1697cce75aa4) Срок на задачу 2 дня.
Author
Owner

@oleghasanov999 для тебя выделено на реализацию этой задачи 24 рабочих часа.

@oleghasanov999 для тебя выделено на реализацию этой задачи 24 рабочих часа.
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Public/TgRouting#1
No description provided.