# tg-publisher Specification ## Purpose Публикация отобранных новостей через Bot API в тематические Telegram-каналы. Дополняется автораспространением своего контента (fan-out) по нескольким направлениям. ## Requirements ### Requirement: Автораспространение (fan-out) Подтверждение СВОЕГО поста (is_own=1) MUST публиковать карточку во ВСЕ тематические каналы @dedinit_vesti___bot, соответствующие выбранным направлениям (по умолчанию — все направления классификации поста). Каждая карточка MUST содержать атрибуцию «Дед в АйТи» (@dedinit) и ссылку на оригинал t.me/dedinit/. #### 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 хранятся по направлению