mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-06 07:50:32 +00:00
skip if current router does not have observer for custom event (#1147)
* skip if current router does not have observer for custom event * Test custom event in router * Feature changelog file * fix style
This commit is contained in:
parent
99cf7028ec
commit
268b7e759d
4 changed files with 34 additions and 10 deletions
1
CHANGES/1147.feature
Normal file
1
CHANGES/1147.feature
Normal file
|
|
@ -0,0 +1 @@
|
|||
If router does not support custom event it does not break and passes it to included routers
|
||||
|
|
@ -49,8 +49,9 @@ class TelegramEventObserver:
|
|||
def _resolve_middlewares(self) -> List[MiddlewareType[TelegramObject]]:
|
||||
middlewares: List[MiddlewareType[TelegramObject]] = []
|
||||
for router in reversed(tuple(self.router.chain_head)):
|
||||
observer = router.observers[self.event_name]
|
||||
middlewares.extend(observer.middleware)
|
||||
observer = router.observers.get(self.event_name)
|
||||
if observer:
|
||||
middlewares.extend(observer.middleware)
|
||||
|
||||
return middlewares
|
||||
|
||||
|
|
|
|||
|
|
@ -105,27 +105,31 @@ class Router:
|
|||
|
||||
async def propagate_event(self, update_type: str, event: TelegramObject, **kwargs: Any) -> Any:
|
||||
kwargs.update(event_router=self)
|
||||
observer = self.observers[update_type]
|
||||
observer = self.observers.get(update_type)
|
||||
|
||||
async def _wrapped(telegram_event: TelegramObject, **data: Any) -> Any:
|
||||
return await self._propagate_event(
|
||||
observer=observer, update_type=update_type, event=telegram_event, **data
|
||||
)
|
||||
|
||||
return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
|
||||
if observer:
|
||||
return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
|
||||
return await _wrapped(event, **kwargs)
|
||||
|
||||
async def _propagate_event(
|
||||
self,
|
||||
observer: TelegramEventObserver,
|
||||
observer: Optional[TelegramEventObserver],
|
||||
update_type: str,
|
||||
event: TelegramObject,
|
||||
**kwargs: Any,
|
||||
) -> Any:
|
||||
response = await observer.trigger(event, **kwargs)
|
||||
if response is REJECTED:
|
||||
return UNHANDLED
|
||||
if response is not UNHANDLED:
|
||||
return response
|
||||
response = UNHANDLED
|
||||
if observer:
|
||||
response = await observer.trigger(event, **kwargs)
|
||||
if response is REJECTED:
|
||||
return UNHANDLED
|
||||
if response is not UNHANDLED:
|
||||
return response
|
||||
|
||||
for router in self.sub_routers:
|
||||
response = await router.propagate_event(update_type=update_type, event=event, **kwargs)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import pytest
|
||||
|
||||
from aiogram.dispatcher.event.bases import UNHANDLED, SkipHandler, skip
|
||||
from aiogram.dispatcher.event.telegram import TelegramEventObserver
|
||||
from aiogram.dispatcher.router import Router
|
||||
|
||||
|
||||
|
|
@ -161,3 +162,20 @@ class TestRouter:
|
|||
assert tuple(r2_1.chain_head) == (r2_1, r1)
|
||||
assert tuple(r2_2.chain_head) == (r2_2, r1)
|
||||
assert tuple(r3.chain_head) == (r3, r2_1, r1)
|
||||
|
||||
async def test_custom_evenv_nested_router(self):
|
||||
r1 = Router()
|
||||
r2 = Router()
|
||||
r3 = Router()
|
||||
r3.observers["custom-event"] = TelegramEventObserver(r3, event_name="custom-event")
|
||||
|
||||
async def handler(evt):
|
||||
return evt
|
||||
|
||||
r1.include_router(r2)
|
||||
r1.include_router(r3)
|
||||
r3.observers["custom-event"].register(handler)
|
||||
|
||||
assert await r1.propagate_event(update_type="custom-event", event=None) is None
|
||||
assert await r2.propagate_event(update_type="custom-event", event=None) is UNHANDLED
|
||||
assert await r3.propagate_event(update_type="custom-event", event=None) is None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue