【问题标题】:remove role once un react Discord.py [duplicate]在反应 Discord.py 中删除角色一次 [重复]
【发布时间】:2021-06-16 15:35:17
【问题描述】:

我的代码:

async def on_raw_reaction_remove(payload):
  guild=bot.get_guild(payload.guild_id)
  member=bot.get_user(payload.user_id)
  print(payload.emoji)
  if str(payload.emoji)== "<:DragonDragoon:832860714078961714>":
    if payload.message_id == 853930257740070933:
      if payload.channel_id == 853813716541505576:
        Role = discord.utils.get(guild.roles, name="Knights")
        await member.remove_roles(Role)

我在代码上找不到任何错误,但收到错误消息

Ignoring exception in on_raw_reaction_remove
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "main.py", line 142, in on_raw_reaction_remove
    await member.remove_roles(Role)
AttributeError: 'NoneType' object has no attribute 'remove_roles'

member=bot.get_user(payload.user_id) 行应该获取成员,但它是非类型?我敢肯定是我反应过来的,​​而且在公会里

【问题讨论】:

标签: python discord.py


【解决方案1】:

您似乎遇到了两个问题:

  1. bot.get_user() 以有效的身份返回 None。也许检查 cmets 中指出的机器人意图。这也可能是缓存问题。
  2. bot.get_user() 返回 discord.User 不是 discord.Member。您不能删除用户的角色,只能删除成员的角色。您需要改用guild.get_member(memberid)

async def on_raw_reaction_remove(payload):
    guild = bot.get_guild(payload.guild_id)
    member = guild.get_member(payload.user_id)

如果您已禁用缓存,则需要fetch 成员

async def on_raw_reaction_remove(payload):
    guild = bot.get_guild(payload.guild_id)
    member = await guild.fetch_member(payload.user_id)

【讨论】:

  • 感谢完美解决了我的问题
  • 还有怎么开启缓存,discord.User和discord.Member有什么区别?
  • 可以通过使用member_cache_flags 参数构造client object 来设置缓存设置。 discord.User 只是一个用户,与公会无关。但是discord.Member 必须——根据定义——是公会的成员。这些对象的处理方式不同,因为您可以对它们做不同的事情。查看docs 了解更多详情!
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2019-02-12
  • 2021-03-16
  • 2021-04-02
相关资源
最近更新 更多