【问题标题】:Discord.py Bot Reactions in DMsDM 中的 Discord.py 机器人反应
【发布时间】:2021-06-12 03:34:36
【问题描述】:

我有一个 discord.py 机器人,我想编写代码来执行以下操作:

  1. 当用户键入命令时,机器人应向用户发送 DM
  2. 然后,它应该对此消息添加反应(竖起大拇指和竖起大拇指)
  3. 最后,它应该等待用户对其中一种反应做出反应。

现在基于文档和以前的项目,我想出了这个添加反应的功能:

async def get_reacts(user, client, message, emojis, timeout=None):
    for emoji in emojis:
        await message.add_reaction(emoji)
    try:
        def check(reaction, reactor):
            return reactor.id == user.id and reaction.emoji in emojis
        reaction, user = await client.wait_for("reaction_add", check=check, timeout=timeout)
        return reaction.emoji
    except:
        pass

此代码在服务器中运行良好,但当消息在 DM 中时,它会做一些特殊的事情。首先,它根本没有检测到用户的反应。当我在 check 函数中放置一个打印语句时,它告诉我它解析了一个反应,而那个反应是机器人本身对拇指向下的反应。当我对消息做出反应时,从未调用过检查函数。

我看到其他一些解决方案使用 Cog 侦听器来处理所有添加的反应,并使用全局消息列表。但是,这对我的机器人不起作用,因为它所做的一切都在一个命令中。此外,它会占用大量内存。这就是我改用client.wait_for 方法的原因。

在 DM 中使用 client.wait_for 有问题吗?我应该改用 Cog 监听器吗?还是我的代码有问题?任何帮助表示赞赏。提前致谢!

编辑: Intents enabled:无(我需要一个 Intent 来检查 DM 反应吗?)

编辑 2: 添加了默认意图,仍然是同样的问题

编辑 3: 我如何使用get_reacts 函数:

msg = await context.author.send("Message")
reaction = await get_reacts(context.author, self.client, msg, ["????", "????"])

【问题讨论】:

  • 您启用了哪些意图?您能否也将其添加到问题中
  • @ŁukaszKwieciński 我编辑了问题

标签: python discord discord.py


【解决方案1】:

是的,您需要意图。 dm_reactionsreactions(没有它们就不应该工作)。对您来说最简单的方法就是启用默认意图

intents = discord.Intents.default()
client = commands.Bot(..., intents=intents)

【讨论】:

  • 我这样做了...但没有任何变化。它仍然无法识别我的反应,只能识别机器人用拇指向下的反应。
  • 那么检查函数有问题
  • 你知道是什么问题吗?
  • 不,你没有完全展示你如何使用get_reacts func
【解决方案2】:

除了 Łukasz 的回答,我尝试了一些实验,发现使用 discord.Intents.all() 有效,但不是 discord.Intents.default()。这让我觉得可能dm_reactionsreactions 不包含在默认意图中,但 包含在所有意图中?任何对此的澄清仍然值得赞赏,因为我几个月前才开始学习 discord.py。

【讨论】:

    【解决方案3】:

    解决方案

    要在 DM 中接收来自用户的反应事件,您需要启用 members 意图。

    所以您唯一需要做的就是创建默认意图,然后将 members 值设置为 True :

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

    解释

    Op 要求澄清,所以在这里。

    如果您查看discord.Intents.default() 代码:

    @classmethod
    def default(cls):
        self = cls.all()
        self.presences = False
        self.members = False
        return self
    

    你可以看到它做了两件事:

    • 为所有内容生成意图(使用其自己的 discord.Intents.all())
    • 从这些意图中,删除对应于presencemembers 的意图

    所以 op 的假设:

    这让我觉得可能 dm_reactions 和反应不包括在默认意图中

    不正确。因为只删除了出席和成员,所以其他的都在里面。

    现在,即使 dm_reactionsreactionsdm_messages 开启,您仍然需要开启 members。这就是解决方案中发生的情况。

    正如 OP 所指出的,它确实适用于 discord.Intents.all(),因为在这种情况下,member 意图已启用。

    【讨论】:

    • 哇,这解释了很多。谢谢!
    猜你喜欢
    • 2021-11-14
    • 2023-03-31
    • 2021-04-30
    • 2019-06-01
    • 2020-11-16
    • 2018-05-10
    • 2019-04-20
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多