首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“用户”对象没有属性“add_roles”

“用户”对象没有属性“add_roles”
EN

Stack Overflow用户
提问于 2020-08-06 16:17:21
回答 2查看 3.1K关注 0票数 0

当尝试执行await member.add_roles(role) ( member是用户)时,它会给出以下错误:

代码语言:javascript
复制
'User' object has no attribute 'add_roles'

然而,当我在网上查看时,没有提到这样的错误,这意味着这个错误是不应该发生的。

如果有帮助,这是代码中发生此错误的部分:

代码语言:javascript
复制
@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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-06 16:30:57

您正在尝试向user对象添加角色,但是它们只能添加到member对象中。当一个user代表一个不和谐的用户时,一个member代表一个公会的成员。文件中有关成员的更多信息

票数 2
EN

Stack Overflow用户

发布于 2020-08-06 18:52:09

用户对象不直接与公会链接。这就是为什么它没有添加角色的功能。因为角色是公会功能的一部分。

如果我们想要修复这个问题,我们需要得到一个与公会链接的对象。在本例中,最接近的匹配是member对象。

因此,与其检索用户对象和检索成员对象,不如解决以下问题:

代码语言:javascript
复制
@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。

代码语言:javascript
复制
@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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63287803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档