Discord.py 如何做出角色反应?

时间:2021-03-15 12:39:23

标签: python discord discord.py

我的情况如下:我在 Discord 服务器上有一条消息,其中有一个反应表情符号,我希望对那个表情符号做出反应的用户获得一个角色。

然而,当用户对表情符号做出反应时,它似乎并没有产生任何效果,我一直在尝试不同的东西,但始终没有达到预期的效果。

我的代码是:

@commands.Cog.listener()
    async def on_reaction_add(self,reaction):
        role = discord.utils.get(reaction.message.channel.guild.roles, id=820934815217221671)
        if reaction.message_id == 820972326878969866:
            if reaction.emoji == "✅":
                reaction.author.add_roles(role)

但是没有任何反应,我也尝试使用 on_raw_reaction_add 和有效载荷参数,但这会出错: 类型错误:on_raw_reaction_add() 需要 1 个位置参数,但给出了 2 个

我的逻辑有什么问题?我一直在查看不同的例子,但无法得出结论。

1 个答案:

答案 0 :(得分:0)

根据 Łukasz Kwieciński 的评论,这是一个可能的答案。 您需要事件的其他“值”。它不是 reaction,而是 payload,请参阅文档:on_raw_reaction_add

然后你还必须首先定义一个频道或至少是正确的消息 ID,你这样做:

@commands.Cog.listener()
async def on_raw_reaction_add(self, payload): # added payload
    guild = self.bot.get_guild(payload.guild_id)
    member = get(guild.members, id=payload.user_id)
    # channel and message IDs should be integer:
    if payload.channel_id == ChannelID and payload.message_id == messageID:

接下来您需要包含 payload.emoji 并将其粘贴为典型格式,例如:

if str(payload.emoji) == "YourEmoji": # Make sure it is a string
    role = get(payload.member.guild.roles, name='NameOfTheRole') # ID is also possible

如果角色存在,我们当然必须添加它,我们这样做:

if role is not None:
    await payload.member.add_roles(role)

当然,因为这只是一个例子,还有一些东西需要内置,但这将是事件的近似外壳。

有关更多信息,请参阅文档中的以下内容:RawReactionActionEvent