Рефактор для получения обновлений
This commit is contained in:
parent
fd048e8544
commit
29d3d7c042
@ -1,5 +1,7 @@
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from ...utils.updates import enrich_event
|
||||||
|
|
||||||
from ...enums.update import UpdateType
|
from ...enums.update import UpdateType
|
||||||
from ...types.updates.bot_added import BotAdded
|
from ...types.updates.bot_added import BotAdded
|
||||||
from ...types.updates.bot_removed import BotRemoved
|
from ...types.updates.bot_removed import BotRemoved
|
||||||
@ -15,122 +17,44 @@ from ...types.updates.user_removed import UserRemoved
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from ...bot import Bot
|
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'):
|
async def get_update_model(event: dict, bot: 'Bot'):
|
||||||
event_object = None
|
update_type = event['update_type']
|
||||||
|
model_cls = UPDATE_MODEL_MAPPING.get(update_type)
|
||||||
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)
|
|
||||||
|
|
||||||
case UpdateType.CHAT_TITLE_CHANGED:
|
if not model_cls:
|
||||||
event_object = ChatTitleChanged(**event)
|
raise ValueError(f'Unknown update type: {update_type}')
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
event_object.from_user = event_object.user
|
event_object = await enrich_event(
|
||||||
|
event_object=model_cls(**event),
|
||||||
if hasattr(event_object, 'bot'):
|
bot=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
|
|
||||||
|
|
||||||
return event_object
|
return event_object
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def process_update_request(events: dict, bot: 'Bot'):
|
async def process_update_request(events: dict, bot: 'Bot'):
|
||||||
events = [event for event in events['updates']]
|
return [
|
||||||
|
await get_update_model(event, bot)
|
||||||
objects = []
|
for event in events['updates']
|
||||||
|
]
|
||||||
for event in events:
|
|
||||||
|
|
||||||
objects.append(
|
|
||||||
await get_update_model(
|
|
||||||
bot=bot,
|
|
||||||
event=event
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return objects
|
|
||||||
|
|
||||||
|
|
||||||
async def process_update_webhook(event_json: dict, bot: 'Bot'):
|
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