Files
myfirstprogram/addons/mute/handlers.py
T
2026-03-15 20:36:16 +03:00

76 lines
3.0 KiB
Python

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}")