Рефактор для получения обновлений
This commit is contained in:
parent
fd048e8544
commit
29d3d7c042
@ -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
63
maxapi/utils/updates.py
Normal 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
|
Loading…
x
Reference in New Issue
Block a user