当尝试执行await member.add_roles(role) ( member是用户)时,它会给出以下错误:
'User' object has no attribute 'add_roles'然而,当我在网上查看时,没有提到这样的错误,这意味着这个错误是不应该发生的。
如果有帮助,这是代码中发生此错误的部分:
@bot.event
async def on_raw_reaction_add(payload):
EMOJI = '✅'
guild = discord.utils.get(bot.guilds, name='The Molehill')
channel = bot.get_channel(740608959207047250)
member = await bot.fetch_user(payload.user_id)
message = await channel.fetch_message(payload.message_id)
MESSAGE = "{user.name} is now part of the Mole Workforce!"
rules_message = message=await channel.fetch_message(740891855666806866)
role = discord.utils.get(guild.roles, name="Worker Mole", id=739514340465705027)
if payload.emoji.name == EMOJI:
if message == rules_message:
await member.add_roles(role)
await bot.send(MESSAGE)发布于 2020-08-06 16:30:57
您正在尝试向user对象添加角色,但是它们只能添加到member对象中。当一个user代表一个不和谐的用户时,一个member代表一个公会的成员。文件中有关成员的更多信息
发布于 2020-08-06 18:52:09
用户对象不直接与公会链接。这就是为什么它没有添加角色的功能。因为角色是公会功能的一部分。
如果我们想要修复这个问题,我们需要得到一个与公会链接的对象。在本例中,最接近的匹配是member对象。
因此,与其检索用户对象和检索成员对象,不如解决以下问题:
@bot.event
async def on_raw_reaction_add(payload):
EMOJI = '✅'
guild = discord.utils.get(bot.guilds, name='The Molehill')
channel = bot.get_channel(740608959207047250)
member = await guild.get_member(payload.user_id)
message = await channel.fetch_message(payload.message_id)
MESSAGE = "{user.name} is now part of the Mole Workforce!"
rules_message = message=await channel.fetch_message(740891855666806866)
role = discord.utils.get(guild.roles, name="Worker Mole", id=739514340465705027)
if payload.emoji.name == EMOJI:
if message == rules_message:
await member.add_roles(role)
await bot.send(MESSAGE)但是当我们阅读有关on_raw_reaction_add的文档时。我们看到,这可以更有效,而不需要通过机器人查找。
例如,在事件文档中,您可以看到我们得到了一个有效载荷对象。有效载荷对象有以下数据(更多的只是阅读文档):
注意,我们有一个成员对象。我们可以从其中检索到以下内容:
因此,将旧代码更新到以下代码可以提高性能,因为我们不需要通过机器人来查找内容。注意:在本例中,我删除了一些多余的代码,假设您只在一个公会中运行这个机器人,因为您使用的是在其他公会中无法工作的特定ID。
@bot.event
async def on_raw_reaction_add(payload):
EMOJI = '✅'
member = payload.member
guild = member.guild
# If you want to run your bot on multiple guilds. Then the code under this comment should be updated.
channel = guild.get_channel(740608959207047250)
MESSAGE = "{user.name} is now part of the Mole Workforce!"
role = guild.get_role(739514340465705027)
if payload.emoji.name == EMOJI:
await member.add_roles(role)
await bot.send(MESSAGE)https://stackoverflow.com/questions/63287803
复制相似问题