Рефактор для получения обновлений

This commit is contained in:
Денис Семёнов 2025-07-25 00:53:35 +03:00
parent fd048e8544
commit 29d3d7c042
2 changed files with 93 additions and 106 deletions

View File

@ -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'):

63
maxapi/utils/updates.py Normal file
View File

@ -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