diff --git a/bot/handlers/commands/admins/all_cmd.py b/bot/handlers/commands/admins/all_cmd.py new file mode 100644 index 0000000..b7807a0 --- /dev/null +++ b/bot/handlers/commands/admins/all_cmd.py @@ -0,0 +1,81 @@ +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}")