mirror of
https://github.com/aiogram/aiogram.git
synced 2026-04-08 16:37:47 +00:00
Reworked handlers in use util
This commit is contained in:
parent
e356ede5de
commit
cf33411866
4 changed files with 32 additions and 39 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import warnings
|
import warnings
|
||||||
from typing import Any, Dict, Generator, List, Optional, Union
|
from typing import Any, Dict, Generator, List, Optional, Set, Union
|
||||||
|
|
||||||
from ..types import TelegramObject
|
from ..types import TelegramObject
|
||||||
from ..utils.imports import import_module
|
from ..utils.imports import import_module
|
||||||
|
|
@ -11,6 +11,8 @@ from .event.event import EventObserver
|
||||||
from .event.telegram import TelegramEventObserver
|
from .event.telegram import TelegramEventObserver
|
||||||
from .filters import BUILTIN_FILTERS
|
from .filters import BUILTIN_FILTERS
|
||||||
|
|
||||||
|
INTERNAL_UPDATE_TYPES = frozenset({"update", "error"})
|
||||||
|
|
||||||
|
|
||||||
class Router:
|
class Router:
|
||||||
"""
|
"""
|
||||||
|
|
@ -91,6 +93,27 @@ class Router:
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"<{self}>"
|
return f"<{self}>"
|
||||||
|
|
||||||
|
def resolve_used_update_types(self, skip_events: Optional[Set[str]] = None) -> List[str]:
|
||||||
|
"""
|
||||||
|
Resolve registered event names
|
||||||
|
|
||||||
|
Is useful for getting updates only for registered event types.
|
||||||
|
|
||||||
|
:param skip_events: skip specified event names
|
||||||
|
:return: set of registered names
|
||||||
|
"""
|
||||||
|
handlers_in_use: Set[str] = set()
|
||||||
|
if skip_events is None:
|
||||||
|
skip_events = set()
|
||||||
|
skip_events = {*skip_events, *INTERNAL_UPDATE_TYPES}
|
||||||
|
|
||||||
|
for router in self.chain_tail:
|
||||||
|
for update_name, observer in router.observers.items():
|
||||||
|
if observer.handlers and update_name not in skip_events:
|
||||||
|
handlers_in_use.add(update_name)
|
||||||
|
|
||||||
|
return list(sorted(handlers_in_use))
|
||||||
|
|
||||||
async def propagate_event(self, update_type: str, event: TelegramObject, **kwargs: Any) -> Any:
|
async def propagate_event(self, update_type: str, event: TelegramObject, **kwargs: Any) -> Any:
|
||||||
kwargs.update(event_router=self)
|
kwargs.update(event_router=self)
|
||||||
observer = self.observers[update_type]
|
observer = self.observers[update_type]
|
||||||
|
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
from itertools import chain
|
|
||||||
from typing import List, cast
|
|
||||||
|
|
||||||
from aiogram.dispatcher.dispatcher import Dispatcher
|
|
||||||
from aiogram.dispatcher.router import Router
|
|
||||||
|
|
||||||
INTERNAL_HANDLERS = [
|
|
||||||
"update",
|
|
||||||
"error",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def get_handlers_in_use(
|
|
||||||
dispatcher: Dispatcher, handlers_to_skip: List[str] = INTERNAL_HANDLERS
|
|
||||||
) -> List[str]:
|
|
||||||
handlers_in_use: List[str] = []
|
|
||||||
|
|
||||||
for router in [dispatcher.sub_routers, dispatcher]:
|
|
||||||
if isinstance(router, list):
|
|
||||||
if router:
|
|
||||||
handlers_in_use.extend(chain(*list(map(get_handlers_in_use, router))))
|
|
||||||
else:
|
|
||||||
router = cast(Router, router)
|
|
||||||
for update_name, observer in router.observers.items():
|
|
||||||
if observer.handlers and update_name not in [*handlers_to_skip, *handlers_in_use]:
|
|
||||||
handlers_in_use.append(update_name)
|
|
||||||
|
|
||||||
return handlers_in_use
|
|
||||||
|
|
@ -5,7 +5,6 @@ from aiogram.dispatcher.router import Router
|
||||||
from aiogram.types import CallbackQuery, ChatMemberUpdated, Message
|
from aiogram.types import CallbackQuery, ChatMemberUpdated, Message
|
||||||
from aiogram.types.inline_keyboard_button import InlineKeyboardButton
|
from aiogram.types.inline_keyboard_button import InlineKeyboardButton
|
||||||
from aiogram.types.inline_keyboard_markup import InlineKeyboardMarkup
|
from aiogram.types.inline_keyboard_markup import InlineKeyboardMarkup
|
||||||
from aiogram.utils.handlers_in_use import get_handlers_in_use
|
|
||||||
|
|
||||||
TOKEN = "6wo"
|
TOKEN = "6wo"
|
||||||
dp = Dispatcher()
|
dp = Dispatcher()
|
||||||
|
|
@ -33,7 +32,7 @@ async def chat_member_update(chat_member: ChatMemberUpdated, bot: Bot) -> None:
|
||||||
await bot.send_message(
|
await bot.send_message(
|
||||||
chat_member.chat.id,
|
chat_member.chat.id,
|
||||||
"Member {chat_member.from_user.id} was changed "
|
"Member {chat_member.from_user.id} was changed "
|
||||||
+ f"from {chat_member.old_chat_member.is_chat_member} to {chat_member.new_chat_member.is_chat_member}",
|
+ f"from {chat_member.old_chat_member.status} to {chat_member.new_chat_member.status}",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -64,7 +63,7 @@ async def my_chat_member_change(chat_member: ChatMemberUpdated, bot: Bot) -> Non
|
||||||
await bot.send_message(
|
await bot.send_message(
|
||||||
chat_member.chat.id,
|
chat_member.chat.id,
|
||||||
"Member was changed from "
|
"Member was changed from "
|
||||||
+ f"{chat_member.old_chat_member.is_chat_member} to {chat_member.new_chat_member.is_chat_member}",
|
+ f"{chat_member.old_chat_member.status} to {chat_member.new_chat_member.status}",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -77,7 +76,7 @@ def main() -> None:
|
||||||
dp.include_router(sub_router)
|
dp.include_router(sub_router)
|
||||||
dp.include_router(sub_sub_router)
|
dp.include_router(sub_sub_router)
|
||||||
|
|
||||||
useful_updates = get_handlers_in_use(dp)
|
useful_updates = dp.resolve_used_update_types()
|
||||||
|
|
||||||
# And the run events dispatching
|
# And the run events dispatching
|
||||||
dp.run_polling(bot, allowed_updates=useful_updates)
|
dp.run_polling(bot, allowed_updates=useful_updates)
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,6 @@ from aiogram.types import (
|
||||||
Update,
|
Update,
|
||||||
User,
|
User,
|
||||||
)
|
)
|
||||||
from aiogram.utils.handlers_in_use import get_handlers_in_use
|
|
||||||
from tests.mocked_bot import MockedBot
|
from tests.mocked_bot import MockedBot
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
@ -737,30 +736,30 @@ class TestDispatcher:
|
||||||
router21 = Router()
|
router21 = Router()
|
||||||
router21.edited_message.register(simple_edited_msg_handler)
|
router21.edited_message.register(simple_edited_msg_handler)
|
||||||
|
|
||||||
useful_updates1 = get_handlers_in_use(dispatcher)
|
useful_updates1 = dispatcher.resolve_used_update_types()
|
||||||
|
|
||||||
assert sorted(useful_updates1) == sorted(["message"])
|
assert sorted(useful_updates1) == sorted(["message"])
|
||||||
|
|
||||||
dispatcher.include_router(router1)
|
dispatcher.include_router(router1)
|
||||||
|
|
||||||
useful_updates2 = get_handlers_in_use(dispatcher)
|
useful_updates2 = dispatcher.resolve_used_update_types()
|
||||||
|
|
||||||
assert sorted(useful_updates2) == sorted(["message", "callback_query"])
|
assert sorted(useful_updates2) == sorted(["message", "callback_query"])
|
||||||
|
|
||||||
dispatcher.include_router(router2)
|
dispatcher.include_router(router2)
|
||||||
|
|
||||||
useful_updates3 = get_handlers_in_use(dispatcher)
|
useful_updates3 = dispatcher.resolve_used_update_types()
|
||||||
|
|
||||||
assert sorted(useful_updates3) == sorted(["message", "callback_query", "poll"])
|
assert sorted(useful_updates3) == sorted(["message", "callback_query", "poll"])
|
||||||
|
|
||||||
router2.include_router(router21)
|
router2.include_router(router21)
|
||||||
|
|
||||||
useful_updates4 = get_handlers_in_use(dispatcher)
|
useful_updates4 = dispatcher.resolve_used_update_types()
|
||||||
|
|
||||||
assert sorted(useful_updates4) == sorted(
|
assert sorted(useful_updates4) == sorted(
|
||||||
["message", "callback_query", "poll", "edited_message"]
|
["message", "callback_query", "poll", "edited_message"]
|
||||||
)
|
)
|
||||||
|
|
||||||
useful_updates5 = get_handlers_in_use(router2)
|
useful_updates5 = router2.resolve_used_update_types()
|
||||||
|
|
||||||
assert sorted(useful_updates5) == sorted(["poll", "edited_message"])
|
assert sorted(useful_updates5) == sorted(["poll", "edited_message"])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue