from aiogram import Dispatcher, Bot from aiogram.types import Message, ChatPermissions from aiogram.filters import Command from logging import getLogger from datetime import timedelta import asyncio from utils.antispam import admin_required from models.state import BotState logger = getLogger(__name__) # Максимальное время мьюта — 4 минуты (240 секунд) MAX_MUTE_SECONDS = 4 * 60 # 240 def register_handlers(dp: Dispatcher, state: BotState, bot: Bot): @dp.message(Command("mute")) @admin_required(0) async def mute_user(message: Message): logger.info(f"Команда /mute от пользователя {message.from_user.id} в чате {message.chat.id}") if not message.reply_to_message: await message.reply("Эта команда должна использоваться в ответ на сообщение.") return command_text = message.text or "" if command_text.lower().startswith("/mute@"): command_prefix = command_text.split()[0] else: command_prefix = "/mute" args_part = command_text[len(command_prefix):].strip() args = args_part.split() if args_part else [] # Парсим время (по умолчанию 60 секунд) mute_time = int(args[0]) if args and args[0].isdigit() else 60 reason = " ".join(args[1:]) if len(args) > 1 else "Без причины" # Ограничиваем максимум 4 минутами if mute_time > MAX_MUTE_SECONDS: old_time = mute_time mute_time = MAX_MUTE_SECONDS reason += f" (время ограничено 4 минутами, было указано {old_time} сек)" user_id = message.reply_to_message.from_user.id chat_id = message.chat.id try: await bot.restrict_chat_member( chat_id=chat_id, user_id=user_id, permissions=ChatPermissions(can_send_messages=False), until_date=message.date + timedelta(seconds=mute_time) ) await message.delete() notification = await message.reply_to_message.reply( f"⛔ Вас замьютили на {mute_time} секунд.\nПричина: {reason}" ) asyncio.create_task(delete_after_delay(notification, delay=5)) except Exception as e: logger.error(f"Ошибка при муте пользователя {user_id}: {e}") await message.reply("Не удалось замьютить пользователя. Возможно, у меня недостаточно прав или пользователь — админ.") async def delete_after_delay(message: Message, delay: int = 5): await asyncio.sleep(delay) try: await message.delete() except Exception as e: logger.debug(f"Не удалось удалить уведомление о мьюте: {e}")