diff --git a/cron/scheduler.py b/cron/scheduler.py index fe004beb..0bb266d3 100644 --- a/cron/scheduler.py +++ b/cron/scheduler.py @@ -80,11 +80,16 @@ def _resolve_delivery_target(job: dict) -> Optional[dict]: } if ":" in deliver: - platform_name, chat_id = deliver.split(":", 1) + platform_name, rest = deliver.split(":", 1) + # Check for thread_id suffix (e.g. "telegram:-1003724596514:17") + if ":" in rest: + chat_id, thread_id = rest.split(":", 1) + else: + chat_id, thread_id = rest, None return { "platform": platform_name, "chat_id": chat_id, - "thread_id": None, + "thread_id": thread_id, } platform_name = deliver diff --git a/tests/cron/test_scheduler.py b/tests/cron/test_scheduler.py index 3a453ddc..2e98d64b 100644 --- a/tests/cron/test_scheduler.py +++ b/tests/cron/test_scheduler.py @@ -62,6 +62,28 @@ class TestResolveDeliveryTarget: "thread_id": "17585", } + def test_explicit_telegram_topic_target_with_thread_id(self): + """deliver: 'telegram:chat_id:thread_id' parses correctly.""" + job = { + "deliver": "telegram:-1003724596514:17", + } + assert _resolve_delivery_target(job) == { + "platform": "telegram", + "chat_id": "-1003724596514", + "thread_id": "17", + } + + def test_explicit_telegram_chat_id_without_thread_id(self): + """deliver: 'telegram:chat_id' sets thread_id to None.""" + job = { + "deliver": "telegram:-1003724596514", + } + assert _resolve_delivery_target(job) == { + "platform": "telegram", + "chat_id": "-1003724596514", + "thread_id": None, + } + def test_bare_platform_uses_matching_origin_chat(self): job = { "deliver": "telegram", diff --git a/tools/cronjob_tools.py b/tools/cronjob_tools.py index fccc25a9..62ea1bb7 100644 --- a/tools/cronjob_tools.py +++ b/tools/cronjob_tools.py @@ -370,7 +370,7 @@ Important safety rule: cron-run sessions should not recursively schedule more cr }, "deliver": { "type": "string", - "description": "Delivery target: origin, local, telegram, discord, slack, whatsapp, signal, matrix, mattermost, homeassistant, dingtalk, email, sms, or platform:chat_id" + "description": "Delivery target: origin, local, telegram, discord, slack, whatsapp, signal, matrix, mattermost, homeassistant, dingtalk, email, sms, or platform:chat_id or platform:chat_id:thread_id for Telegram topics. Examples: 'origin', 'local', 'telegram', 'telegram:-1001234567890:17585', 'discord:#engineering'" }, "model": { "type": "string",