from aiogram import Router, F from aiogram.filters import Command from aiogram.types import Message, InputMediaPhoto, InputMedia, BufferedInputFile, InlineKeyboardButton, CallbackQuery, \ InlineKeyboardMarkup from repos.dao import DAO router = Router() @router.message(Command("assets")) async def assets_command(msg: Message, dao: DAO): assets = await dao.assets.get_assets(limit=10, offset=0) media_group = [] keyboard = [] for index, asset in enumerate(assets): if asset.tg_photo_file_id: media_group.append(InputMediaPhoto(media=asset.tg_photo_file_id)) elif asset.tg_doc_file_id: asset_full_info = await dao.assets.get_asset(asset.id) media_group.append(InputMediaPhoto(media=BufferedInputFile(asset_full_info.data, asset_full_info.name))) else: continue keyboard.append(InlineKeyboardButton(text=F"{index + 1}", callback_data=f"asset_doc_{asset.id}")) mg = await msg.answer_media_group(media_group, reply_markup=InlineKeyboardMarkup(inline_keyboard=[keyboard])) await msg.answer("Для запроса документов выбери фото и на кнопку ниже:", reply_markup=InlineKeyboardMarkup(inline_keyboard=[keyboard])) for media_index, media in enumerate(mg): if assets[media_index].tg_photo_file_id is None: assets[media_index].tg_photo_file_id = media.photo[-1].file_id await dao.assets.update_asset(assets[media_index].id, assets[media_index]) @router.callback_query(F.data.startswith("asset_doc_")) async def assets_callback_query(call: CallbackQuery, dao: DAO): await call.answer() assets_id = call.data.split("asset_doc_")[-1] asset = await dao.assets.get_asset(assets_id, with_data=False) if asset.tg_doc_file_id: await call.message.answer_document(asset.tg_doc_file_id) else: asset_full_info = await dao.assets.get_asset(assets_id) doc = await call.message.answer_document(BufferedInputFile(asset_full_info.data, asset_full_info.name)) asset_full_info.tg_doc_file_id = doc.document.file_id await dao.assets.update_asset(assets_id, asset_full_info)