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

时间:2018-04-06 04:01:26

标签: roles discord discord.py

我正在编写一个机器人,它会给一个人2个角色,一个叫做“玩”,另一个则依赖于他们当前的游戏。现在,我无法想出一次添加多个角色。在这种情况下,我使用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'

我认为它是列表中的,应该是一个参数,但我仍然相当新,无法解决这个问题。

1 个答案:

答案 0 :(得分:1)

以下是add_role()文档的摘录:

  

add_roles(member, *roles)

     

此功能是 coroutine 。给出指定的Member个数   Role'第您必须具有使用此功能的适当权限。该   之后才会直接修改Member对象   收到相应的WebSocket事件。参数:

     
      
  • memberMember) - 赋予角色的成员。
  •   
  • *roles - 提供会员的Role s的参数列表
  •   

文档本身有点误导,因为它提到了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)