Доработка гит
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
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}")
|
||||
Reference in New Issue
Block a user