from asyncio import create_task from aiogram import Router, F from aiogram.filters import Command from aiogram.fsm.context import FSMContext from aiogram.types import Message, CallbackQuery from bot.core.bots import BotInfo, bot from bot.filters import IsOwner from bot.templates import msg from bot.utils import status_clear from bot.utils.auto_delete import auto_delete_message from configs import COMMANDS __all__ = ("router",) CMD: str = "pin".lower() router: Router = Router(name=f"{CMD}_cmd_router") @router.message(Command(*COMMANDS[CMD], prefix=BotInfo.prefix, ignore_case=True), IsOwner()) async def pin_cmd(message: Message, state: FSMContext) -> None: """ Обработчик команды /pin для закрепления последнего сообщения или ответа. """ # Если есть reply → закрепляем его, иначе закрепляем предыдущее сообщение if message.reply_to_message: target_message_id = message.reply_to_message.message_id else: # Закрепляем предыдущее сообщение (команда - 1) target_message_id = message.message_id - 1 try: await bot.pin_chat_message( chat_id=message.chat.id, message_id=target_message_id, disable_notification=False ) # Автоудаление через 7 суток (удаляем закрепленное сообщение) create_task( auto_delete_message( chat_id=message.chat.id, message_id=target_message_id, delay=604800 ) ) await msg(update=message, text="✅ Сообщение успешно закреплено", state=state) except Exception as e: await msg(update=message, text=f"❌ Ошибка закрепления: {e}", state=state) @router.callback_query(F.data.casefold().isin(COMMANDS[CMD]), IsOwner()) async def pin_callback(callback: CallbackQuery, state: FSMContext) -> None: """ Обработчик кнопки с callback_data="pin". """ await status_clear(update=callback.message, state=state) try: await bot.pin_chat_message( chat_id=callback.message.chat.id, message_id=callback.message.message_id, disable_notification=False ) create_task( auto_delete_message( chat_id=callback.message.chat.id, message_id=callback.message.message_id, delay=604800 ) ) await callback.answer("✅ Сообщение закреплено") except Exception as e: await callback.answer(f"❌ Ошибка: {e}", show_alert=True)