Files
vesti/openspec/changes/archive/2026-09-16-own-content-hub/specs/tg-publisher/spec.md
T

3.1 KiB
Raw Blame History

Purpose

Публикация отобранных новостей через Bot API в тематические Telegram-каналы. Дополняется автораспространением своего контента (fan-out) по нескольким направлениям.

ADDED Requirements

Requirement: Автораспространение (fan-out)

Подтверждение СВОЕГО поста (is_own=1) MUST публиковать карточку во ВСЕ тематические каналы @dedinit_vesti___bot, соответствующие выбранным направлениям (по умолчанию — все направления классификации поста). Каждая карточка MUST содержать атрибуцию «Дед в АйТи» (@dedinit) и ссылку на оригинал t.me/dedinit/<post_id>.

Scenario: Мульти-публикация

  • WHEN подтверждается свой пост с направлениями [linux, ai]
  • THEN карточка отправляется в @dedinit_vesti_linux_ru_bot и @dedinit_vesti_ai_ru_bot; обе содержат ссылку на оригинал

Scenario: Чужой пост — без fan-out

  • WHEN подтверждается внешний пост (is_own=0)
  • THEN публикуется только в канал своего направления, без атрибуции автора

Requirement: Публикация по списку направлений

Публикатор MUST поддерживать publish_multi(directions) — публикацию карточки по списку направлений, возвращающую map {direction: message_id}. При пустом списке направлений MUST публиковать в направление по умолчанию (direction поста).

Scenario: Список направлений рассылки

  • WHEN publish_multi вызывается с directions=[linux, ai]
  • THEN возвращается {linux: message_id1, ai: message_id2}; каждая публикация записывается в published с distributed_dirs

Scenario: Пустой список направлений

  • WHEN publish_multi вызывается без directions
  • THEN публикация идёт в канал направления поста (direction по умолчанию), без fan-out

Requirement: Метрики по каждому направлению

Для опубликованных карточек MUST собираться views через Bot API по каждому направлению (каждому message_id), чтобы веб показывал эффективность рассылки по лентам.

Scenario: Метрики fan-out

  • WHEN пост разослан в [linux, ai] и каналы набирают просмотры
  • THEN get_views вызывается для каждого message_id; views хранятся по направлению