85 lines
3.3 KiB
Python
85 lines
3.3 KiB
Python
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=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=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()}") |