【问题标题】:Discord.py Reaction Roles can't remove rolesDiscord.py 反应角色无法删除角色
【发布时间】:2021-10-10 02:17:49
【问题描述】:

嘿,Reaction 角色添加有效,但我无法删除角色 每次我点击反应都会弹出这个错误:

文件“main.py”,第 165 行,on_raw_reaction_remove 等待有效载荷.member.remove_roles(角色) AttributeError: 'NoneType' 对象没有属性 'remove_roles'

我的代码:

async def on_raw_reaction_remove(payload):
    guild: discord.Guild = client.get_guild(815637550550089739)
    if payload.message_id == 872659703598047232:
        if payload.emoji.name == 'Hypixel':
            role: discord.Role = guild.get_role(872606322653286400)
            await payload.member.remove_roles(role)
    if payload.message_id == 872659703598047232:
        if payload.emoji.name == 'Skyblock':
            role: discord.Role = guild.get_role(872606320379953193)
            await payload.member.remove_roles(role)```

【问题讨论】:

    标签: python discord.py


    【解决方案1】:

    https://discordpy.readthedocs.io/en/latest/api.html#discord.RawReactionActionEvent.member
    payload.member仅在添加反应时可用,否则其值为None
    你应该使用on_raw_reaction_add

    【讨论】:

    • 还有其他方法可以删除角色吗?
    • 您拥有该用户的discord.Member 对象(并且机器人具有所需的权限),您可以从该用户中删除该角色。
    • 你能把代码发给我吗?我对 discord.py 完全陌生,不知道该怎么做 D:
    • 不确定您所说的“代码”是什么意思,但只需将 on_raw_reaction_remove 替换为 on_raw_reaction_add。另外我建议你加入官方 discord.py discord。它由 discord.py 的作者自己运行,并且很容易从有经验的用户(和我!)那里获得帮助。
    【解决方案2】:

    这背后的主要原因是payload.member在使用on_raw_reaction_remove时是None
    这其实是因为discord不发送这个数据,所以discord.py把它写成None
    来源-https://github.com/Rapptz/discord.py/issues/5871

    要解决这个问题,您需要获取相关的公会对象,然后从公会中获取成员对象。 有效载荷也没有公会对象,所以我们也必须得到它。

    on_raw_reaction_remove 的情况下,我实际上创建了成员对象并将其手动添加到有效负载上。 这样on_raw_reaction_addon_raw_reaction_remove 在我的最终处理中具有相同的有效负载。

    async def on_raw_reaction_remove(self, payload):    
      guild = self.get_guild(payload.guild_id)  #Self here is Client/Bot
      member = guild.get_member(payload.user_id)
      payload.member = member
      await reaction_role(payload, remove=True)
    

    此外,这需要特权成员的意图。要启用它,请重新登录开发人员门户并查找特权意图 > 成员意图,然后将滑块勾选为开启。

    intent = discord.Intents.default()
    intent.members = True
    

    意图需要传递给客户端,如果使用机器人扩展,则需要传递给机器人包装器。

    commands.Bot.__init__(self, <...>, intents=intent)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2021-11-06
      相关资源
      最近更新 更多