【问题标题】:Discord.py Give role to user - 'User' object has no attribute 'guild'Discord.py 为用户赋予角色-“用户”对象没有属性“公会”
【发布时间】:2021-03-05 16:13:51
【问题描述】:

所以我正在尝试编写一个机器人,它为用户提供一个角色,以便他们可以看到他们的禁令信息。除了实际赋予用户所说的角色之外,一切都在工作。我在这些论坛、reddit 和文档中发现了相互矛盾的建议 - 但似乎没有一个解决方案有效。

这是我的代码:

role = await message.guild.create_role(name=ban_str)
category = discord.utils.get(message.guild.categories, name="Tickets")
overwrites = {
    message.guild.me: discord.PermissionOverwrite(read_messages=True),
    message.guild.default_role: discord.PermissionOverwrite(read_messages=False),
    role: discord.PermissionOverwrite(read_messages=True, send_messages=False)
}
channel = await message.guild.create_text_channel(banstr, category=category, overwrites=overwrites)
user = client.get_user(int(user_id))
await discord.Member.add_roles(user, role, reason="[Ban Ticket] Added user to ticket " + banstr)

我得到了错误:

AttributeError: 'User' object has no attribute 'guild'

我尝试将“用户”设为成员对象,将 user = client.get_user(int(user_id)) 替换为 user = message.guild.get_member(int(user_id)),但随后出现错误:

AttributeError: 'NoneType' object has no attribute '_state'

如果有人能看到我在这里做错了什么,非常感谢任何帮助!

【问题讨论】:

    标签: python discord.py


    【解决方案1】:

    使用message.guild.get_member()

    User 没有设置公会,因为用户只是一个人,你的 id 是什么?你的头像是什么等等。 Member 是附属于它的公会。

    【讨论】:

    • 你好!感谢您的回复,当我使用 user = message.guild.get_member(int(user_id)) 而不是 client.get_user() 时,我收到错误 AttributeError: 'NoneType' object has no attribute '_state'。如何从用户 ID 创建成员对象?
    • @Ethan 你启用了members 意图吗?
    【解决方案2】:

    试试user = await client.fetch_user(int(user_id))

    【讨论】:

      【解决方案3】:

      你可以这样试试:

      intents = discord.Intents.all()
      intents.members = True
      # Firstly you have to enable all intents in you bot application in the developer portal
      # Secondly you should read what's there standing as description and maybe configure it for this
      
      client = discord.Client(intents=intents)
      ...
      
      role = await message.guild.create_role(name=ban_str)
      category = discord.utils.get(message.guild.categories, name="Tickets")
      overwrites = {
          message.guild.me: discord.PermissionOverwrite(read_messages=True),
          message.guild.default_role: discord.PermissionOverwrite(read_messages=False),
          role: discord.PermissionOverwrite(read_messages=True, send_messages=False)
      }
      channel = await message.guild.create_text_channel(banstr, category=category, overwrites=overwrites)
      user = client.get_user(int(user_id))
      await user.add_roles(role, reason="[Ban Ticket] Added user to ticket " + banstr)
      

      如果您仍然从.get_user() 获得NoneType,请尝试:

      intents = discord.Intents.all()
      intents.members = True
      # Firstly you have to enable all intents in you bot application in the developer portal
      # Secondly you should read what's there standing as description and maybe configure it for this
      
      client = discord.Client(intents=intents)
      ...
      
      role = await message.guild.create_role(name=ban_str)
      category = discord.utils.get(message.guild.categories, name="Tickets")
      overwrites = {
          message.guild.me: discord.PermissionOverwrite(read_messages=True),
          message.guild.default_role: discord.PermissionOverwrite(read_messages=False),
          role: discord.PermissionOverwrite(read_messages=True, send_messages=False)
      }
      channel = await message.guild.create_text_channel(banstr, category=category, overwrites=overwrites)
      user = client.fetch_user(int(user_id))
      # ^ This is an API Function which you shouldn't use but in such cases you have to
      await user.add_roles(role, reason="[Ban Ticket] Added user to ticket " + banstr)
      

      【讨论】:

        猜你喜欢
        • 2021-01-29
        • 1970-01-01
        • 2019-02-12
        • 2018-10-10
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        • 2019-12-05
        相关资源
        最近更新 更多