【问题标题】:In discord.py, How do I use add_roles to add multiple roles to one person?在 discord.py 中,如何使用 add_roles 为一个人添加多个角色?
【发布时间】:2018-09-16 00:39:57
【问题描述】:

我正在编写一个机器人,它会给一个人 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'

我知道它是针对列表的,应该是一个论据,但我还是很新,无法弄清楚。

【问题讨论】:

    标签: roles discord discord.py


    【解决方案1】:

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

    add_roles(member, *roles)

    这个函数是一个协程。给指定的Member 一些 Role 的。您必须具有适当的权限才能使用此功能。这 Member 对象之后不会直接修改,直到 收到相应的WebSocket 事件。参数:

    • member (Member) – 赋予角色的成员。
    • *roles - 给成员的 Role 参数列表

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

    您的完整代码 sn-p 应如下所示:

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2019-08-11
      • 1970-01-01
      • 2021-07-26
      • 2021-03-26
      相关资源
      最近更新 更多