def get_time_string(seconds):
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
days, hours = divmod(hours, 24)
time_parts = []
if days > 0:
time_parts.append(f"{days} {'день' if days == 1 else 'дня' if 2 <= days <= 4 else 'дней'}")
if hours > 0:
time_parts.append(f"{hours} {'час' if hours == 1 else 'часа' if 2 <= hours <= 4 else 'часов'}")
if minutes > 0:
time_parts.append(f"{minutes} {'минута' if minutes == 1 else 'минуты' if 2 <= minutes <= 4 else 'минут'}")
if seconds > 0:
time_parts.append(f"{seconds} {'секунда' if seconds == 1 else 'секунды' if 2 <= seconds <= 4 else 'секунд'}")
return " ".join(time_parts)
def parse_time(time_str):
time_pattern = re.compile(r'(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?')
match = time_pattern.fullmatch(time_str)
if not match:
return None
days = int(match.group(1)) if match.group(1) else 0
hours = int(match.group(2)) if match.group(2) else 0
minutes = int(match.group(3)) if match.group(3) else 0
return timedelta(days=days, hours=hours, minutes=minutes)
@bot.command(name="mute", default_command_permissions=discord.Permissions(mute_members=True))
async def mute(ctx, member: discord.Member = None, время: str = None, *, причина: str = None):
if member is None:
if ctx.message.reference:
reply_message = await ctx.fetch_message(ctx.message.reference.message_id)
member = reply_message.author
member = ctx.guild.get_member(member.id)
if member is None:
await ctx.reply("Не удалось найти пользователя.")
return
else:
await ctx.reply("Пожалуйста, укажите пользователя")
return
mute_role = discord.utils.get(ctx.guild.roles, name="Muted")
if mute_role is None:
perms = discord.Permissions(send_messages=False, connect=False, add_reactions=False)
mute_role = await ctx.guild.create_role(name="Muted", permissions=perms)
parsed_time = parse_time(время) if время else None
try:
if parsed_time:
seconds = parsed_time.total_seconds()
until_time = datetime.utcnow() + parsed_time
await member.timeout(until=until_time)
time_string = get_time_string(int(seconds))
else:
await member.add_roles(mute_role)
time_string = "Навсегда"
embed = discord.Embed(title="", color=0x2ECC71,
description=f":white_check_mark: Участник {member.mention} замьючен на "
f"{time_string}!",)
embed.add_field(name="Модератор", value=ctx.author.mention, inline=True)
embed.add_field(name="Причина", value=причина or "Не указана", inline=False)
await ctx.reply(embed=embed)
except discord.Forbidden:
await ctx.reply("У меня нет прав, чтобы замьютить этого пользователя.")
except Exception as e:
adm = await bot.fetch_user(admin)
if adm:
await adm.send(f"Произошла ошибка:\n{e}\nСервер: {ctx.guild.name}\nПользователь: {ctx.author.mention} | "
f"`{ctx.author.id}`\nКоманда: mute")
Подскажите пожалуйста, почему не работает команда в ответ на сообщение пользователей?