discord.py mute命令不添加角色

2024-09-30 10:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

async def mute(ctx, user: discord.User,time,*,reason):
    if user:
        await ctx.message.delete()
        if discord.utils.get(ctx.guild.roles, name="mute"):
            role = discord.utils.get(ctx.guild.roles, name="mute")

            addroles = []

            for i in user.roles:
                try:
                    await user.remove_roles(i)
                    addroles.append(i.id)
                except:
                    print(f"Can't remove the role {i}")
            await user.add_roles(role)
            
            cmd_used("mute",ctx.author,ctx.message.content)
            embed=discord.Embed(title=f"""{bot.user.name}""",colour=maincolor)
            embed.add_field(name=f"""`{ctx.author}` muted you from `{user.guild.name}`""",value=f"""time: {time}s, reason: {reason}""",inline=True)
            await user.send(embed=embed)

            await asyncio.sleep(int(time))
            await user.remove_roles(role)
            print(addroles)
            await user.add_roles(addroles)

#errors: AttributeError: 'list' object has no attribute 'id'

基本上,我的mute命令实际上不起作用,因为它使它们静音,并且不返回它们以前的角色。 我需要一些帮助


Tags: nameaddtimeembedawaitremoverolereason
1条回答
网友
1楼 · 发布于 2024-09-30 10:28:56

addroles在本例中是用户在执行命令之前拥有的角色ID的列表。但是^{}将角色作为参数,而不是角色ID列表


您可以将实际的角色对象保存在addroles中,迭代该列表并分配它们

async def mute(ctx, user: discord.User,time,*,reason):
    if user:
        await ctx.message.delete()
        if discord.utils.get(ctx.guild.roles, name="mute"):
            role = discord.utils.get(ctx.guild.roles, name="mute")

            addroles = []

            for i in user.roles:
                try:
                    await user.remove_roles(i)
                    addroles.append(i)
                except:
                    print(f"Can't remove the role {i}")
            await user.add_roles(role)
            
            cmd_used("mute",ctx.author,ctx.message.content)
            embed=discord.Embed(title=f"""{bot.user.name}""",colour=maincolor)
            embed.add_field(name=f"""`{ctx.author}` muted you from `{user.guild.name}`""",value=f"""time: {time}s, reason: {reason}""",inline=True)
            await user.send(embed=embed)

            await asyncio.sleep(int(time))
            await user.remove_roles(role)
            print(addroles)

            for role in addroles:
                await user.add_roles(role)

或者更好的方法是使用^{},因为它只向Discord API发送一个请求

例如,您可以使用命令删除用户的所有角色

await user.edit(roles = [])

正如您所看到的,这是更有效的,应该是首选的解决方案

async def mute(ctx, user: discord.User,time,*,reason):
    if user:
        await ctx.message.delete()
        if discord.utils.get(ctx.guild.roles, name="mute"):
            role = discord.utils.get(ctx.guild.roles, name="mute")

            addroles = user.roles

            await user.edit(roles = [role]) # remove all roles and only give the user the mute-role
            
            cmd_used("mute",ctx.author,ctx.message.content)
            embed=discord.Embed(title=f"""{bot.user.name}""",colour=maincolor)
            embed.add_field(name=f"""`{ctx.author}` muted you from `{user.guild.name}`""",value=f"""time: {time}s, reason: {reason}""",inline=True)
            await user.send(embed=embed)

            await asyncio.sleep(int(time))
            await user.edit(roles = addroles) # gives old roles back, overwrites the mute role

相关问题 更多 >

    热门问题