Discord.py 计算对消息的反应

Posted

技术标签:

【中文标题】Discord.py 计算对消息的反应【英文标题】:Discord.py count reactions on a message 【发布时间】:2020-03-03 04:35:13 【问题描述】:

我正在做一个机器人不和谐,我希望我的机器人在删除他之前计算对消息的反应次数

@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

【问题讨论】:

您是要查找该反应已使用 4 次、总共 4 个反应还是 4 个唯一反应? 5 个反应“????” 【参考方案1】:

您需要使用有效负载中的 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()

【讨论】:

不工作 :/ i.imgur.com/8J0nrQC.png 我没有错误 试试emoji=payload.emoji.name。如果做不到这一点,请尝试打印message.reactions 中的所有reaction.emoji,我们可以看到发生了什么。 我怎样才能做同样的事情,但使用自定义表情? 在这种情况下,payload.emoji.name 将是自定义表情符号的名称。见the documentation of PartialEmoji【参考方案2】:

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

Patrick Haugh 的 answer 适用于原生表情符号,但我想添加一个额外的答案来解释为自定义表情符号获取 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 将导致它返回None,因为它无法匹配emoji 属性中的kirby

如果没有找到与传递的属性匹配的内容,则 None 是 返回。1

解决方案

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

现在get() 实用程序将能够匹配并返回包含您要使用的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.')

【讨论】:

以上是关于Discord.py 计算对消息的反应的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py 帮助命令(对编辑消息做出反应)

如何获取对 discord.py 中的消息做出反应的成员列表?

如何在没有 id 的 discord.py 中添加对消息的反应

discord.py :: 我怎样才能让我的机器人对它自己的消息做出反应?

向消息添加反应。 Discord.py 重写

在 discord.py 中发送其他人看不到的回复