1212from app .models .settings import RunMethod , Telegram
1313from app .settings import telegram_settings
1414from app .utils .logger import get_logger
15+ from app .nats import is_nats_enabled
1516
1617from .handlers import include_routers
1718from .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
162173async 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
166177async def shutdown_telegram_bot ():
0 commit comments