Discord.py 计算一条消息的反应

Discord.py count reactions on a message

我正在做一个 bot discord,我希望我的 bot 在删除他之前计算对消息的反应数量

@client.event
async def on_raw_reaction_add(payload):
    if payload.channel_id == 614467771866021944:
        if payload.emoji.name == "":
            # if number of reactions > 4:
            # delete the message

您需要使用有效负载中的 id 来获取消息的 Message 对象,然后检查 Message.reactions 中相应 Reactioncount 属性:

from discord.utils import get

@client.event
async def on_raw_reaction_add(payload):
    if payload.channel_id == 614467771866021944:
        if payload.emoji.name == "":
            channel = client.get_channel(payload.channel_id)
            message = await channel.fetch_message(payload.message_id)
            reaction = get(message.reactions, emoji=payload.emoji.name)
            if reaction and reaction.count > 4:
                await message.delete()

如何在 Discord.py 中获取自定义表情符号计数?

Patrick Haugh 的 适用于原生表情符号,但我想添加一个额外的答案来解释获取自定义表情符号的 count 属性,因为 Discord.py 以不同方式定义这些属性。解决方案本身很容易应用,如果您不想阅读解释,可以跳到下面的解决方案示例。

自定义表情符号反应的 emoji 属性包含一组嵌套属性,而不是原生表情符号所具有的单一值。假设有一个使用名为 kirby 的自定义表情符号的反应。如果你要打印 message.reactions,它会输出这样的东西(假设你已经适当地定义了 message):

[<Reaction emoji='' me=True count=1>, <Reaction emoji=<Emoji id=900000000123456789 name='kirby' animated=False managed=False> me=False count=1>]

第一反应有表情符号本身作为属性emoji
因此,当您调用 get(message.reactions, emoji=payload.emoji.name) 时,它只是像这样传递值:get(message.reactions, emoji='')

现在查看名为 kirby 的自定义表情符号的 emoji 属性。您将看到四个嵌套的属性作为 emoji 属性的值,而不是使用表情符号作为此处的值。属性为 idnameanimatedmanaged。您的自定义表情符号仅存在于您的服务器上。这意味着您不能像使用原生表情符号那样简单地将表情符号粘贴到机器人的代码中。

您也不能像 payload.emoji.name 那样单独传递 name 值。在 get() 实用程序中传递 emoji='kirby 将导致它成为 return None,因为它无法匹配 emoji 属性中的 kirby

If nothing is found that matches the attributes passed, then None is returned.1

解决方案

我发现的最简单的方法是删除 .name 属性并只传递 payload.emoji 作为您的值。 Discord.py 似乎更喜欢使用这种 name:id 格式的自定义表情符号。在此示例中,get() 会将 emoji 属性与嵌套值字符串 <kirby:900000000123456789>

匹配

现在 get() 实用程序将能够匹配 return 包含您要使用的 count 属性的反应。此示例假设您已经定义了 message:

  if payload.emoji.name == 'kirby':
      # payload.emoji will be defined as <kirby:900000000123456789>
      reaction = discord.utils.get(message.reactions, emoji=payload.emoji)
      # Now you can get reaction.count for the custom emoji!
      print(f'The reaction count for this custom emoji is: {reaction.count}.')