discord.py remove_roles 不起作用

Posted

技术标签:

【中文标题】discord.py remove_roles 不起作用【英文标题】:discord.py remove_roles isn't working 【发布时间】:2018-10-04 18:59:35 【问题描述】:

我有一个用于 Fortnite KD 排名自动权限的机器人。它的工作原理是;

如果用户有 1+ KD 机器人将分配用户“青铜”perm。

如果用户有 1.5+ KD 机器人将分配用户“Gümüş”perm。

如果用户有 2+ KD 机器人将分配用户“Altın”perm。

它就像一个魅力。但。 Bot 在下一个 perm 排名时必须删除旧角色。所以我的意思是,如果用户对“Altın”烫发进行排名。旧烫发“Gümüş”必须删除,但remove.roles 不起作用。

下面是这些行的一堆代码:

    for list in LISTE:
        roles = discord.utils.get(message.server.roles, name=list)
        await client.remove_roles(message.author, role)
    await client.add_roles(message.author, role)
elif ratio >= BRONZE_B and ratio <= BRONZE_E:
    role = discord.utils.get(message.server.roles, name=LISTE[2])

    embed=discord.Embed(color=0xcd8032)
    embed.add_field(name="Oyuncu", value=username, inline=True)
    embed.add_field(name="KD", value=str(ratio), inline=True)
    embed.add_field(name="Lig", value=LISTE[2], inline=True)
    await client.send_message(message.channel, embed = embed)

    embed2=discord.Embed(color=0x727272)
    embed2.add_field(name="Sonraki Lig", value=LISTE[3], inline=True)
    embed2.add_field(name="Hedef KD", value=str(SILVER_B), inline=True)
    embed2.set_footer(text="Lig verileriniz Fortnite KD değerlerinize göre güncellendi.")
    await client.send_message(message.channel, embed = embed2)

    for list in LISTE:
        roles = discord.utils.get(message.server.roles, name=list)
        await client.remove_roles(message.author, role)
    await client.add_roles(message.author, role)
elif ratio >= SILVER_B and ratio <= SILVER_E:
    role = discord.utils.get(message.server.roles, name=LISTE[3])

    embed=discord.Embed(color=0x727272)
    embed.add_field(name="Oyuncu", value=username, inline=True)
    embed.add_field(name="KD", value=str(ratio), inline=True)
    embed.add_field(name="Lig", value=LISTE[3], inline=True)
    await client.send_message(message.channel, embed = embed)

    embed2=discord.Embed(color=0xcfb223)
    embed2.add_field(name="Sonraki Lig", value=LISTE[4], inline=True)
    embed2.add_field(name="Hedef KD", value=str(GOLD_B), inline=True)
    embed2.set_footer(text="Lig verileriniz Fortnite KD değerlerinize göre güncellendi.")
    await client.send_message(message.channel, embed = embed2)

如果我使用 replace_roles 而不是 remove_roles 它似乎可以工作,但这次它会删除所有角色并将其替换为更高级别的权限。

我的意思是,当我使用 replace_roles 时,如果主持人使用我的机器人命令 /derece 检查他的等级,机器人会承担他的所有角色并给予他更高的 KD 等级权限。

我希望它像这样工作;

如果用户有 1+ KD 机器人将分配用户“青铜”perm。

如果用户排名高达 1.5+ KD,则删除 Bronz 烫发并给予 Silver 烫发

如果用户排名达到 2+ KD,则删除 Silver perm 并给出 Gold perm

谢谢。

【问题讨论】:

【参考方案1】:

同时执行 remove_roles 和 add_roles 不起作用。相反,您需要使用 replace_roles。要让 replace_roles 像这样工作,您首先需要从用户那里获取所有角色,然后遍历该列表并删除您不想要的角色并添加您想要的角色,然后使用该列表调用 replace_roles。这样它就不会删除您未指定的旧角色。

【讨论】:

此处的文档:discordpy.readthedocs.io/en/latest/…。关于remove_rolesadd_roles 不能一起工作,是不是因为它们都依赖于接收Websocket 事件?【参考方案2】:

就像其他用户提到的那样,replace_roles 的工作原理是删除所有角色,然后添加您想要的角色。

我的解决方法是简单地将较高角色添加到用户,同时保留较低角色。您可以在服务器设置中更改角色的顺序/权限,以便更高的角色优先,因此每个用户都有正确的角色颜色。

【讨论】:

以上是关于discord.py remove_roles 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Discord Bot 不播放声音 - Discord.py

关闭 Discord 机器人连接而不终止命令行 (discord.py)

discord.py和discord.py的区别[voice]

FFmpeg 不工作(discord.py)

执行 client.run() 时 Discord.py 不工作

Discord.py 机器人不响应自定义表情符号