From 29d3d7c0426d09e870c03a4813b5b9394626e5e3 Mon Sep 17 00:00:00 2001 From: Denis Date: Fri, 25 Jul 2025 00:53:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- maxapi/methods/types/getted_updates.py | 136 ++++++------------------- maxapi/utils/updates.py | 63 ++++++++++++ 2 files changed, 93 insertions(+), 106 deletions(-) create mode 100644 maxapi/utils/updates.py diff --git a/maxapi/methods/types/getted_updates.py b/maxapi/methods/types/getted_updates.py index 7fa8550..fa40ac0 100644 --- a/maxapi/methods/types/getted_updates.py +++ b/maxapi/methods/types/getted_updates.py @@ -1,5 +1,7 @@ from typing import TYPE_CHECKING +from ...utils.updates import enrich_event + from ...enums.update import UpdateType from ...types.updates.bot_added import BotAdded from ...types.updates.bot_removed import BotRemoved @@ -15,122 +17,44 @@ from ...types.updates.user_removed import UserRemoved if TYPE_CHECKING: from ...bot import Bot + + +UPDATE_MODEL_MAPPING = { + UpdateType.BOT_ADDED: BotAdded, + UpdateType.BOT_REMOVED: BotRemoved, + UpdateType.BOT_STARTED: BotStarted, + UpdateType.CHAT_TITLE_CHANGED: ChatTitleChanged, + UpdateType.MESSAGE_CALLBACK: MessageCallback, + UpdateType.MESSAGE_CHAT_CREATED: MessageChatCreated, + UpdateType.MESSAGE_CREATED: MessageCreated, + UpdateType.MESSAGE_EDITED: MessageEdited, + UpdateType.MESSAGE_REMOVED: MessageRemoved, + UpdateType.USER_ADDED: UserAdded, + UpdateType.USER_REMOVED: UserRemoved, +} async def get_update_model(event: dict, bot: 'Bot'): - event_object = None - - match event['update_type']: - - case UpdateType.BOT_ADDED: - event_object = BotAdded(**event) - - case UpdateType.BOT_REMOVED: - event_object = BotRemoved(**event) - - case UpdateType.BOT_STARTED: - event_object = BotStarted(**event) + update_type = event['update_type'] + model_cls = UPDATE_MODEL_MAPPING.get(update_type) - case UpdateType.CHAT_TITLE_CHANGED: - event_object = ChatTitleChanged(**event) - - case UpdateType.MESSAGE_CALLBACK: - event_object = MessageCallback(**event) - - event_object.chat = await bot.get_chat_by_id(event_object.message.recipient.chat_id) \ - if bot.auto_requests else None - - event_object.from_user = event_object.callback.user - - case UpdateType.MESSAGE_CHAT_CREATED: - event_object = MessageChatCreated(**event) - event_object.chat = event_object.chat - - case UpdateType.MESSAGE_CREATED: - event_object = MessageCreated(**event) - - event_object.chat = await bot.get_chat_by_id(event_object.message.recipient.chat_id) \ - if bot.auto_requests else None - - event_object.from_user = event_object.message.sender - - case UpdateType.MESSAGE_EDITED: - event_object = MessageEdited(**event) - - event_object.chat = await bot.get_chat_by_id(event_object.message.recipient.chat_id) \ - if bot.auto_requests else None - - event_object.from_user = event_object.message.sender - - case UpdateType.MESSAGE_REMOVED: - event_object = MessageRemoved(**event) - - event_object.chat = await bot.get_chat_by_id(event_object.chat_id) \ - if bot.auto_requests else None - - event_object.from_user = await bot.get_chat_member( - chat_id=event_object.chat_id, - user_id=event_object.user_id - ) if bot.auto_requests else None - - case UpdateType.USER_ADDED: - event_object = UserAdded(**event) - - event_object.chat = await bot.get_chat_by_id(event_object.chat_id) \ - if bot.auto_requests else None - - event_object.from_user = event_object.user - - case UpdateType.USER_REMOVED: - event_object = UserRemoved(**event) - - event_object.chat = await bot.get_chat_by_id(event_object.chat_id) \ - if bot.auto_requests else None - - event_object.from_user = await bot.get_chat_member( - chat_id=event_object.chat_id, - user_id=event_object.admin_id - ) if event_object.admin_id and \ - bot.auto_requests else None - - if event['update_type'] in (UpdateType.BOT_ADDED, - UpdateType.BOT_REMOVED, - UpdateType.BOT_STARTED, - UpdateType.CHAT_TITLE_CHANGED): - - event_object.chat = await bot.get_chat_by_id(event_object.chat_id) \ - if bot.auto_requests else None + if not model_cls: + raise ValueError(f'Unknown update type: {update_type}') - event_object.from_user = event_object.user - - if hasattr(event_object, 'bot'): - event_object.bot = bot - - if hasattr(event_object, 'message'): - event_object.message.bot = bot - - for attachment in event_object.message.body.attachments: - if hasattr(attachment, 'bot'): - attachment.bot = bot + event_object = await enrich_event( + event_object=model_cls(**event), + bot=bot + ) return event_object + async def process_update_request(events: dict, bot: 'Bot'): - events = [event for event in events['updates']] - - objects = [] - - for event in events: - - objects.append( - await get_update_model( - bot=bot, - event=event - ) - ) - - return objects + return [ + await get_update_model(event, bot) + for event in events['updates'] + ] async def process_update_webhook(event_json: dict, bot: 'Bot'): diff --git a/maxapi/utils/updates.py b/maxapi/utils/updates.py new file mode 100644 index 0000000..f8e75e6 --- /dev/null +++ b/maxapi/utils/updates.py @@ -0,0 +1,63 @@ +from __future__ import annotations +from typing import TYPE_CHECKING, Any + +from ..types.updates.bot_added import BotAdded +from ..types.updates.bot_removed import BotRemoved +from ..types.updates.bot_started import BotStarted +from ..types.updates.chat_title_changed import ChatTitleChanged +from ..types.updates.message_callback import MessageCallback +from ..types.updates.message_created import MessageCreated +from ..types.updates.message_edited import MessageEdited +from ..types.updates.message_removed import MessageRemoved +from ..types.updates.user_added import UserAdded +from ..types.updates.user_removed import UserRemoved + +if TYPE_CHECKING: + from ..bot import Bot + + + +async def enrich_event(event_object: Any, bot: Bot) -> Any: + if not bot.auto_requests: + return event_object + + if hasattr(event_object, 'chat_id'): + event_object.chat = await bot.get_chat_by_id(event_object.chat_id) + + if isinstance(event_object, (MessageCreated, MessageEdited, MessageCallback)): + event_object.chat = await bot.get_chat_by_id(event_object.message.recipient.chat_id) + event_object.from_user = getattr(event_object.message, 'sender', None) + + elif isinstance(event_object, MessageRemoved): + event_object.chat = await bot.get_chat_by_id(event_object.chat_id) + event_object.from_user = await bot.get_chat_member( + chat_id=event_object.chat_id, + user_id=event_object.user_id + ) + + elif isinstance(event_object, UserRemoved): + event_object.chat = await bot.get_chat_by_id(event_object.chat_id) + if event_object.admin_id: + event_object.from_user = await bot.get_chat_member( + chat_id=event_object.chat_id, + user_id=event_object.admin_id + ) + + elif isinstance(event_object, UserAdded): + event_object.chat = await bot.get_chat_by_id(event_object.chat_id) + event_object.from_user = event_object.user + + elif isinstance(event_object, (BotAdded, BotRemoved, BotStarted, ChatTitleChanged)): + event_object.chat = await bot.get_chat_by_id(event_object.chat_id) + event_object.from_user = event_object.user + + if hasattr(event_object, 'message'): + event_object.message.bot = bot + for att in event_object.message.body.attachments: + if hasattr(att, 'bot'): + att.bot = bot + + if hasattr(event_object, 'bot'): + event_object.bot = bot + + return event_object \ No newline at end of file