diff --git a/README.md b/README.md index f835ed7..75d3bf0 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ python main.py | Удаление сообщений | ❌ | ❌ | | Редактирование сообщений | ❌ | ❌ | | **Медиа** | | | -| Фото | ❌ | ❌ | +| Фото | ❌ | ✅ | | Видео | ❌ | ❌ | | Геолокация | ❌ | ❌ | | Гифки | ❌ | ❌ | diff --git a/sync/vk/handlers/__init__.py b/sync/vk/handlers/__init__.py index 000b6b2..72679ce 100644 --- a/sync/vk/handlers/__init__.py +++ b/sync/vk/handlers/__init__.py @@ -1,3 +1,4 @@ +from . import photos from . import stickers from . import voices from . import messages diff --git a/sync/vk/handlers/messages.py b/sync/vk/handlers/messages.py index 2f705c7..3cee187 100644 --- a/sync/vk/handlers/messages.py +++ b/sync/vk/handlers/messages.py @@ -18,7 +18,7 @@ async def on_message(message: Message): await tg.send_message( bundle.tg_id, f"{user_info[0].first_name} {user_info[0].last_name}\n" - + "_" * 10 + + "‾" * 10 + f"\n{message.text}", parse_mode="html", ) diff --git a/sync/vk/handlers/photos.py b/sync/vk/handlers/photos.py new file mode 100644 index 0000000..1f68f65 --- /dev/null +++ b/sync/vk/handlers/photos.py @@ -0,0 +1,72 @@ +from ..core import bot +from vkbottle.user import Message +from ...db import Sessions +from ...db.models import Conversations +from sqlalchemy import select +from ...tg.core import bot as tg +from ..utils import create_vk_link +from ...utils import get_file_from_url +from vkbottle.dispatch.rules import ABCRule +from aiogram.types import InputMediaPhoto + + +class PhotoRule(ABCRule[Message]): + """ + Кастомное правило которое будет срабатывать если + будет отправлено фото + """ + + async def check(self, event: Message): + if event.attachments: + if event.attachments[0].photo: + return True + else: + return False + else: + return False + + +@bot.on.message(PhotoRule()) +async def on_photo(message: Message): + async with Sessions() as session: + bundle = await session.scalar( + select(Conversations).where(Conversations.vk_id == message.peer_id) + ) + if bundle: + user_info = await bot.api.users.get(message.from_id) + text = f"{user_info[0].first_name} {user_info[0].last_name}\n" + if message.text: + text += "‾" * 10 + text += f"\n{message.text}" + + photos = [] + for index, attachment in enumerate(message.attachments): + if attachment and attachment.photo: + photos.append( + InputMediaPhoto( + await get_file_from_url( + await get_best_quality_image(attachment.photo.sizes) + ), + parse_mode="html", + caption=text if index == 0 else None, + ) + ) + await tg.send_media_group(bundle.tg_id, photos) + + +async def get_best_quality_image(sizes: list): + max_quality = None + max_quality_url = None + + for image_info in sizes: + width = image_info.width + height = image_info.height + + if width > 0 and height > 0: + if max_quality is None or ( + width > max_quality.width and height > max_quality.height + ): + max_quality = image_info + max_quality_url = image_info.url + + return max_quality_url