From 4f382e4197087e99c257087a9a6d228700dcf94a Mon Sep 17 00:00:00 2001 From: Verum Date: Mon, 23 Feb 2026 14:37:16 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B?= =?UTF-8?q?=20/pin=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BA=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=D0=B2=20(=D0=92=20=D0=B1=D0=B5=D1=82=D0=B0!)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/handlers/commands/admins/pin_cmd.py | 77 +++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 bot/handlers/commands/admins/pin_cmd.py diff --git a/bot/handlers/commands/admins/pin_cmd.py b/bot/handlers/commands/admins/pin_cmd.py new file mode 100644 index 0000000..63e29d4 --- /dev/null +++ b/bot/handlers/commands/admins/pin_cmd.py @@ -0,0 +1,77 @@ +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)