from aiogram import Dispatcher, Bot from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, InputMediaPhoto, Message, CallbackQuery from aiogram.filters import Command from aiogram.exceptions import TelegramBadRequest, TelegramRetryAfter from aiogram import F from logging import getLogger from storage.message_storage import save_message from .get_post import get_url, add_tags, del_tags, get_tags_str import asyncio logger = getLogger(__name__) def get_keyboard(): keyboard = InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text="Следующее фото", callback_data="next")] ] ) return keyboard def register_handlers(dp: Dispatcher, state, bot: Bot): @dp.message(Command("rule34")) async def rule34(message: Message): msg = await message.answer_photo( photo= await get_url(), caption="Вот фото 📷", reply_markup=get_keyboard() ) # сохраняем id сообщения, если нужно save_message(msg.chat.id, msg.message_id) @dp.callback_query(F.data == "next") async def next_photo(callback: CallbackQuery): for attempt in range(3): # максимум 3 попытки try: media = InputMediaPhoto( media=await get_url(), caption=f"Новое фото 🌄 (попытка {attempt + 1})" ) await callback.message.edit_media( media=media, reply_markup=get_keyboard() ) break # успех — выходим из цикла except TelegramRetryAfter as e: # Telegram сказал подождать e.retry_after секунд logger.warning(f"Flood control: ждем {e.retry_after} сек") await asyncio.sleep(e.retry_after) continue # пробуем снова except TelegramBadRequest as e: logger.warning(f"Ошибка при загрузке фото (попытка {attempt + 1}): {e}") continue else: # если все попытки неудачные logger.error("Не удалось загрузить фото после 3 попыток") # закрываем "часики" в любом случае await callback.answer() @dp.message(Command("addteg")) async def cmd_addteg(message: Message): # Разбиваем текст после команды на теги parts = message.text.split()[1:] if not parts: await message.answer("❌ Укажи теги через пробел: /addteg tag1 tag2") return add_tags(parts) await message.answer(f"✅ Добавлены теги: {', '.join(parts)}\nТекущие: {get_tags_str()}") @dp.message(Command("delteg")) async def cmd_delteg(message: Message): parts = message.text.split()[1:] if not parts: await message.answer("❌ Укажи теги для удаления: /delteg tag1 tag2") return del_tags(parts) await message.answer(f"🗑 Удалены теги: {', '.join(parts)}\nТекущие: {get_tags_str()}")