我正在编写一个机器人,它会给一个人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'
我认为它是列表中的,应该是一个参数,但我仍然相当新,无法解决这个问题。
答案 0 :(得分:1)
以下是add_role()
文档的摘录:
此功能是 coroutine 。给出指定的
Member
个数Role
'第您必须具有使用此功能的适当权限。该 之后才会直接修改Member
对象 收到相应的WebSocket
事件。参数:
member
(Member
) - 赋予角色的成员。*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()
的工作方式几乎相同,删除角色,而不是添加。
这意味着你也可以在一个命令中删除多个角色:
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)