Как проверить, является ли роль участника выше или равна роли авторов сообщений discord.py

#python #discord.py

Вопрос:

Итак, я создаю команду запрета, это код, первые 3 оператора if работают нормально, но когда дело доходит до проверки роли участников, а затем фактического запрета их, это не сработает.

 async def ban (ctx, member:discord.User=None, *, reason=None):
    channel = ctx.channel
    if member == None or member == ctx.message.author:
        embed = discord.Embed(title="Ban", description=f"Ban a member from the discord.", colour=discord.Colour.purple())
        await ctx.send(embed=embed)
        return

    if ctx.author.guild_permissions.ban_members == False:
        embed4=discord.Embed(color=discord.Colour.purple(), 
        timestamp=datetime.datetime.utcnow(), title="Missing Permissions!", description="You don't have the required permissions to use this command!")
        await ctx.send(embed=embed4)
        return

    if reason == None:
        reason = "being a jerk!"
        print("b")

    if member.top_role >= ctx.author.top_role:
        print("a")   
        embed3=discord.Embed(color=discord.Colour.purple(), 
        title="Role", description="This user is a higher or the same role as you.")
        await channel.send(embed=embed3)
        return

    else:

        await ctx.guild.ban(member, reason=reason)
        embed = discord.Embed(title="Ban", description=f" {member.mention} was banned by {ctx.author.mention}.", 
        colour=discord.Colour.purple())
        await ctx.send(embed=embed)
        message = f"You have been banned from {ctx.guild.name} for {reason}"
        await member.send(message)
 

Ответ №1:

Причина: вы получаете разногласие.Пользовательский объект вместо разлада.Участник. У первого нет атрибута «top_role», поскольку он просто ссылается на самого пользователя, вам действительно нужен последний, поскольку он ссылается на пользователя как на члена сервера и имеет атрибут, который вы ищете. Вы можете взглянуть на документацию для каждого из них.

Исправление: просто измените определение на быть discord.Member .

Правильный код:

 async def ban (ctx, member:discord.Member=None, *, reason=None):
    channel = ctx.channel
    if member == None or member == ctx.message.author:
        embed = discord.Embed(title="Ban", description=f"Ban a member from the discord.", colour=discord.Colour.purple())
        await ctx.send(embed=embed)
        return

    if ctx.author.guild_permissions.ban_members == False:
        embed4=discord.Embed(color=discord.Colour.purple(), 
        timestamp=datetime.datetime.utcnow(), title="Missing Permissions!", description="You don't have the required permissions to use this command!")
        await ctx.send(embed=embed4)
        return

    if reason == None:
        reason = "being a jerk!"
        print("b")

    if member.top_role >= ctx.author.top_role:
        print("a")   
        embed3=discord.Embed(color=discord.Colour.purple(), 
        title="Role", description="This user is a higher or the same role as you.")
        await channel.send(embed=embed3)
        return

    else:

        await ctx.guild.ban(member, reason=reason)
        embed = discord.Embed(title="Ban", description=f" {member.mention} was banned by {ctx.author.mention}.", 
        colour=discord.Colour.purple())
        await ctx.send(embed=embed)
        message = f"You have been banned from {ctx.guild.name} for {reason}"
        await member.send(message)