mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-12 10:11:52 +00:00
Optimize events propagation by routers
This commit is contained in:
parent
7449c89b04
commit
82f89b9c1d
2 changed files with 68 additions and 14 deletions
|
|
@ -146,8 +146,6 @@ class Router:
|
||||||
:param kwargs:
|
:param kwargs:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
kwargs.update(event_update=update, event_router=self)
|
|
||||||
|
|
||||||
chat: Optional[Chat] = None
|
chat: Optional[Chat] = None
|
||||||
from_user: Optional[User] = None
|
from_user: Optional[User] = None
|
||||||
|
|
||||||
|
|
@ -196,21 +194,75 @@ class Router:
|
||||||
update_type = "poll"
|
update_type = "poll"
|
||||||
event = update.poll
|
event = update.poll
|
||||||
else:
|
else:
|
||||||
|
warnings.warn(
|
||||||
|
"Detected unknown update type.\n"
|
||||||
|
"Seems like Telegram Bot API was updated and you have "
|
||||||
|
"installed not latest version of aiogram framework",
|
||||||
|
RuntimeWarning,
|
||||||
|
)
|
||||||
raise SkipHandler
|
raise SkipHandler
|
||||||
|
|
||||||
observer = self.observers[update_type]
|
return await self.listen_update(
|
||||||
|
update_type=update_type,
|
||||||
|
update=update,
|
||||||
|
event=event,
|
||||||
|
from_user=from_user,
|
||||||
|
chat=chat,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
|
||||||
|
async def listen_update(
|
||||||
|
self,
|
||||||
|
update_type: str,
|
||||||
|
update: Update,
|
||||||
|
event: TelegramObject,
|
||||||
|
from_user: Optional[User] = None,
|
||||||
|
chat: Optional[Chat] = None,
|
||||||
|
**kwargs: Any,
|
||||||
|
) -> Any:
|
||||||
|
"""
|
||||||
|
Listen update by current and child routers
|
||||||
|
|
||||||
|
:param update_type:
|
||||||
|
:param update:
|
||||||
|
:param event:
|
||||||
|
:param from_user:
|
||||||
|
:param chat:
|
||||||
|
:param kwargs:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
user_token = None
|
||||||
if from_user:
|
if from_user:
|
||||||
User.set_current(from_user)
|
user_token = User.set_current(from_user)
|
||||||
|
chat_token = None
|
||||||
if chat:
|
if chat:
|
||||||
Chat.set_current(chat)
|
chat_token = Chat.set_current(chat)
|
||||||
|
|
||||||
|
kwargs.update(event_update=update, event_router=self)
|
||||||
|
observer = self.observers[update_type]
|
||||||
|
try:
|
||||||
async for result in observer.trigger(event, update=update, **kwargs):
|
async for result in observer.trigger(event, update=update, **kwargs):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
for router in self.sub_routers:
|
for router in self.sub_routers:
|
||||||
async for result in router.update_handler.trigger(update, **kwargs):
|
try:
|
||||||
return result
|
return await router.listen_update(
|
||||||
|
update_type=update_type,
|
||||||
|
update=update,
|
||||||
|
event=event,
|
||||||
|
from_user=from_user,
|
||||||
|
chat=chat,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
except SkipHandler:
|
||||||
|
continue
|
||||||
|
|
||||||
raise SkipHandler
|
raise SkipHandler
|
||||||
|
finally:
|
||||||
|
if user_token:
|
||||||
|
User.reset_current(user_token)
|
||||||
|
if chat_token:
|
||||||
|
Chat.reset_current(chat_token)
|
||||||
|
|
||||||
async def emit_startup(self, *args: Any, **kwargs: Any) -> None:
|
async def emit_startup(self, *args: Any, **kwargs: Any) -> None:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -337,8 +337,10 @@ class TestRouter:
|
||||||
async def test_nested_router_listen_update(self):
|
async def test_nested_router_listen_update(self):
|
||||||
router1 = Router()
|
router1 = Router()
|
||||||
router2 = Router()
|
router2 = Router()
|
||||||
|
router3 = Router()
|
||||||
router1.include_router(router2)
|
router1.include_router(router2)
|
||||||
observer = router2.message_handler
|
router1.include_router(router3)
|
||||||
|
observer = router3.message_handler
|
||||||
|
|
||||||
@observer()
|
@observer()
|
||||||
async def my_handler(event: Message, **kwargs: Any):
|
async def my_handler(event: Message, **kwargs: Any):
|
||||||
|
|
@ -359,7 +361,7 @@ class TestRouter:
|
||||||
result = await router1._listen_update(update, test="PASS")
|
result = await router1._listen_update(update, test="PASS")
|
||||||
assert isinstance(result, dict)
|
assert isinstance(result, dict)
|
||||||
assert result["event_update"] == update
|
assert result["event_update"] == update
|
||||||
assert result["event_router"] == router2
|
assert result["event_router"] == router3
|
||||||
assert result["test"] == "PASS"
|
assert result["test"] == "PASS"
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue