简体   繁体   English

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

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

I'm coding a bot that will give a person 2 roles, one called 'Playing' and the other dependant on their current game. 我正在编写一个机器人,该机器人将赋予一个人2个角色,一个被称为“扮演”,另一个则取决于他们当前的游戏。 Right now, I can't figure out to add multiple roles at once. 现在,我不知道一次添加多个角色。 I'm using Minecraft as an example in this case. 在这种情况下,我以Minecraft为例。 Here's the related code: 以下是相关代码:

    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")

And here's my error: AttributeError: 'list' object as no attribute 'id' 这是我的错误: AttributeError: 'list' object as no attribute 'id'

I get that it's for the list and should be an argument, but i'm still fairly new and can't figure this out. 我知道它是用于列表的,应该是一个参数,但是我还很新,无法弄清楚。

The following is an excerpt of add_role() 's documentation: 以下是add_role()文档的摘录:

add_roles(member, *roles)

This function is a coroutine . 这个功能是协程 Gives the specified Member a number of Role 's. 为指定的Member提供多个Role 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. 之后,直到收到相应的WebSocket事件,才直接修改Member对象。 Parameters: 参数:

  • member ( Member ) – The member to give roles to. memberMember )–要赋予角色的成员。
  • *roles – An argument list of Role s to give the member *roles –赋予成员的Role的参数列表

The documentation itself is a bit misleading, since it mentions the word, list . 文档本身有点误导,因为它提到了list一词。 In fact, the * means that this parameter will take all of the leftover arguments and stores them into a list. 实际上, *表示此参数将采用所有剩余的参数并将它们存储在列表中。

Therefore, your add_roles command needs to be changed to: 因此,您的add_roles命令需要更改为:

await client.add_roles(memberafter, mcrole, playing)

Or if you wanted to keep the roles in a list, just add an asterisk ( * ): 或者,如果您想将角色保留在列表中,只需添加一个星号( * ):

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

Side note, like add_roles() , remove_roles() works almost the same, it removes role instead of adding them. 旁注,就像add_roles()remove_roles()工作原理几乎相同,它删除角色而不是添加它们。

remove_roles(member, *roles)

Meaning that you can do remove multiple roles in one command as well: 这意味着您也可以在一个命令中删除多个角色:

await client.remove_roles(memberafter, mcrole, playing)

Your full code snippet should look like this: 您的完整代码段应如下所示:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM