Skip to content

Commit 1631135

Browse files
committed
fix: reject telegram bot with long polling on multi worker
1 parent e14c8ca commit 1631135

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

app/telegram/__init__.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from app.models.settings import RunMethod, Telegram
1313
from app.settings import telegram_settings
1414
from app.utils.logger import get_logger
15+
from app.nats import is_nats_enabled
1516

1617
from .handlers import include_routers
1718
from .middlewares import setup_middlewares
@@ -49,7 +50,7 @@ def _settings_key_from_model(settings: Telegram | None) -> tuple | None:
4950
settings.webhook_secret,
5051
)
5152

52-
async def sync_from_settings(self, force: bool = False):
53+
async def sync_from_settings(self, force: bool = False, is_initiator: bool = False):
5354
settings: Telegram = await telegram_settings()
5455
async with self._lock:
5556
if self._stop_requested:
@@ -62,7 +63,7 @@ async def sync_from_settings(self, force: bool = False):
6263
await self._shutdown_locked()
6364

6465
if settings and settings.enable:
65-
await self._start_locked(settings)
66+
await self._start_locked(settings, is_initiator=is_initiator)
6667

6768
self._settings_key = new_key
6869

@@ -71,7 +72,14 @@ async def shutdown(self):
7172
self._stop_requested = True
7273
await self._shutdown_locked()
7374

74-
async def _start_locked(self, settings: Telegram):
75+
async def _start_locked(self, settings: Telegram, is_initiator: bool = False):
76+
if settings.method == RunMethod.LONGPOLLING and is_nats_enabled():
77+
logger.warning(
78+
"Long polling is not supported in multi-worker mode, skipping bot start. "
79+
"Please use webhook method or disable NATS and set UVICORN_WORKERS=1."
80+
)
81+
return
82+
7583
logger.info("Telegram bot starting")
7684
session = AiohttpSession(proxy=settings.proxy_url)
7785
self._bot = Bot(token=settings.token, session=session, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
@@ -90,16 +98,19 @@ async def _start_locked(self, settings: Telegram):
9098
if settings.method == RunMethod.LONGPOLLING:
9199
self._polling_task = asyncio.create_task(self._dp.start_polling(self._bot, handle_signals=False))
92100
else:
93-
# register webhook
101+
# register webhook (only the initiator worker calls set_webhook to avoid rate limits)
94102
webhook_address = f"{settings.webhook_url}/api/tghook"
95103
logger.info(webhook_address)
96-
await self._bot.set_webhook(
97-
webhook_address,
98-
secret_token=settings.webhook_secret,
99-
allowed_updates=["message", "callback_query", "inline_query"],
100-
drop_pending_updates=True,
101-
)
102-
logger.info("Telegram bot started successfully.")
104+
if is_initiator:
105+
await self._bot.set_webhook(
106+
webhook_address,
107+
secret_token=settings.webhook_secret,
108+
allowed_updates=["message", "callback_query", "inline_query"],
109+
drop_pending_updates=True,
110+
)
111+
logger.info("Telegram bot started successfully.")
112+
else:
113+
logger.info("Telegram bot dispatcher ready (webhook set by initiator worker).")
103114
except (
104115
TelegramNetworkError,
105116
ProxyConnectionError,
@@ -160,7 +171,7 @@ def get_dispatcher():
160171

161172

162173
async def startup_telegram_bot():
163-
await telegram_bot_manager.sync_from_settings(force=True)
174+
await telegram_bot_manager.sync_from_settings(force=True, is_initiator=True)
164175

165176

166177
async def shutdown_telegram_bot():

0 commit comments

Comments
 (0)