在discord.py中,如何使用add_roles给一个人添加多个角色?

In discord.py, How do I use add_roles to add multiple roles to one person?

我正在编写一个机器人,它会给一个人 2 个角色,一个叫做 'Playing',另一个取决于他们当前的游戏。现在,我想不出一次添加多个角色。在这种情况下,我以 Minecraft 为例。 相关代码如下:

    totestafter = str(memberafter.game)
    print(totestafter)
    totestbefore = str(memberbefore.game)
    print(totestbefore)
    playing = discord.utils.get(memberafter.server.roles, name="Playing")
    if "Minecraft" in totestafter:
      print('if2 success')
      mcrole = discord.utils.get(memberafter.server.roles, name="Minecraft")
      addroles = [mcrole, playing]
      await client.add_roles(memberafter, addroles)
    elif "Minecraft" in totestbefore:
      mcrole = discord.utils.get(memberafter.server.roles, name="Minecraft")
      await client.remove_roles(memberafter, mcrole)
      await client.remove_roles(memberafter, playing)
      print("Removal Success")

这是我的错误: AttributeError: 'list' object as no attribute 'id'

我知道这是为了列表,应该是一个论点,但我还是个新手,无法弄清楚。

以下是 add_role() 文档的节选:

add_roles(member, *roles)

This function is a coroutine. Gives the specified Member a number of Role's. You must have the proper permissions to use this function. The Member object is not directly modified afterwards until the corresponding WebSocket event is received. Parameters:

  • member (Member) – The member to give roles to.
  • *roles – An argument list of Role s to give the member

文档本身有点误导,因为它提到了 list 这个词。事实上,* 意味着这个参数将取 all of the leftover arguments 并将它们存储到列表中。

因此,您的 add_roles 命令需要更改为:

await client.add_roles(memberafter, mcrole, playing)

或者,如果您想将角色保留在列表中,只需添加一个星号 (*):

addroles = [mcrole, playing]
await client.add_roles(memberafter, *addroles)

旁注,与 add_roles()remove_roles() 的工作原理几乎相同,它 删除 角色而不是 添加 他们。

remove_roles(member, *roles)

这意味着您也可以在一个命令中删除多个角色:

await client.remove_roles(memberafter, mcrole, playing)

您的完整代码片段应如下所示:

playing = discord.utils.get(memberafter.server.roles, name="Playing")
mcrole = discord.utils.get(memberafter.server.roles, name="Minecraft")

if "Minecraft" in totestafter:     
  await client.add_roles(memberafter, mcrole, playing)
elif "Minecraft" in totestbefore:
  await client.remove_roles(memberafter, mcrole, playing)