feat(telegram): add 'none' listener mode for bots
Introduce a third update_mode option alongside polling/webhook. 'none' disables both polling and webhook delivery — useful when another instance owns the listener or when the bot is send-only. Switching into 'none' now unschedules polling and unregisters any active webhook so Telegram stops delivering updates. New bots default to 'none' (safer when multiple bridges share a token). Existing bots upgraded from a pre-update_mode schema keep 'polling' so their behavior is unchanged.
This commit is contained in:
@@ -86,6 +86,11 @@ async def update_bot(
|
||||
bot.icon = body.icon
|
||||
# Handle mode switching
|
||||
if body.update_mode is not None and body.update_mode != bot.update_mode:
|
||||
if body.update_mode not in ("none", "polling", "webhook"):
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail=f"Invalid update_mode: {body.update_mode!r}. Must be 'none', 'polling', or 'webhook'.",
|
||||
)
|
||||
if body.update_mode == "webhook":
|
||||
# Validate and register webhook BEFORE stopping polling
|
||||
base_url = await get_setting(session, "external_url")
|
||||
@@ -108,6 +113,12 @@ async def update_bot(
|
||||
# Switching to polling: unregister webhook, start polling
|
||||
await unregister_webhook(bot.token)
|
||||
schedule_bot_polling(bot.id)
|
||||
elif body.update_mode == "none":
|
||||
# Disable listener: stop polling and clear any webhook so Telegram
|
||||
# stops delivering updates. This makes the bot send-only, which is
|
||||
# safe when another instance owns the listener.
|
||||
unschedule_bot_polling(bot.id)
|
||||
await unregister_webhook(bot.token)
|
||||
bot.update_mode = body.update_mode
|
||||
|
||||
session.add(bot)
|
||||
@@ -406,7 +417,7 @@ def _bot_response(b: TelegramBot) -> dict:
|
||||
"bot_username": b.bot_username,
|
||||
"bot_id": b.bot_id,
|
||||
"webhook_path_id": b.webhook_path_id,
|
||||
"update_mode": b.update_mode or "polling",
|
||||
"update_mode": b.update_mode or "none",
|
||||
"token_preview": f"{b.token[:8]}...{b.token[-4:]}" if len(b.token) > 12 else "***",
|
||||
"created_at": b.created_at.isoformat(),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user