from asyncio import create_task from aiogram import Router, F from aiogram.filters import Command from aiogram.types import Message from aiogram.exceptions import TelegramBadRequest from aiogram.fsm.context import FSMContext from bot.core.bots import bot, BotInfo from bot.filters import IsOwner from bot.utils import status_clear, auto_delete_message, hidden_admins_message from configs import COMMANDS from middleware.loggers import logger __all__ = ("router",) # Ключ для команды CMD: str = "all" # Инициализация роутера router: Router = Router(name=f"{CMD}_cmd_router") @router.message( F.text.lower().regexp(rf"^({'|'.join(COMMANDS[CMD])})\s?.*"), # ловим текст без префикса F.chat.type.in_({"supergroup", "group"}), IsOwner() ) @router.message( Command(*COMMANDS[CMD], prefix=BotInfo.prefix, ignore_case=True), F.chat.type.in_({"supergroup", "group"}), IsOwner() ) async def notify_all_text(message: Message, state: FSMContext) -> None: """ Обработчик команды /all, /call и текстовых эквивалентов типа "Калл Привет всем". Функционал: 1. Считывает весь текст после команды. 2. Формирует скрытое сообщение для администраторов. 3. Отправляет сообщение в чат. 4. Автоматически удаляет сообщение через неделю. 5. Пытается закрепить сообщение в чате. Args: message (Message): Объект входящего сообщения. state (FSMContext): Контекст FSM, используется для очистки состояния. """ # Очистка состояния FSM перед выполнением команды await status_clear(update=message, state=state) # Извлечение текста после команды parts: list[str] = message.text.split(" ", 1) custom_text: str = parts[1] if len(parts) > 1 else "⚡ Внимание всем!" # Формирование скрытого текста для администраторов hidden_text: str = await hidden_admins_message(message=message, text=custom_text) # Отправка сообщения в чат sent_message: Message = await message.answer(hidden_text) # Запуск асинхронной задачи по удалению сообщения через 7 дней create_task( auto_delete_message( chat_id=message.chat.id, message_id=sent_message.message_id, delay=604800 # 7 дней в секундах ) ) # Попытка закрепить сообщение и удалить "системное" сообщение о закреплении try: await bot.pin_chat_message( chat_id=message.chat.id, message_id=sent_message.message_id, disable_notification=False ) # Иногда Telegram создает дополнительное уведомление при закреплении await bot.delete_message(chat_id=message.chat.id, message_id=sent_message.message_id + 1) logger.debug(f"[ALL] Сообщение закреплено: {custom_text}") except TelegramBadRequest as e: logger.error(f"[ALL] Ошибка закрепления сообщения: {e}")