discord.py botReact

egdjgwm8  于 2021-08-25  发布在  Java
关注(0)|答案(3)|浏览(376)

我有一个discord.py bot,我想编写它来执行以下操作:
当用户键入命令时,bot应向用户发送dm
然后,它应该添加对此消息的React(竖起大拇指和竖起大拇指)
最后,它应该等待用户对其中一种React作出React。
现在,基于文档和以前的项目,我提出了添加React的功能:

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中时,它会执行一些特殊的操作。首先,它根本检测不到用户的React。当我在check函数中放入print语句时,它告诉我它解析了一个React,而这个React就是机器人自身的React,拇指朝下。当我对消息做出React时,从未调用过check函数。
我看到其他一些解决方案使用cog侦听器来检查所有添加的React,并使用全局消息列表。然而,这对我的机器人不起作用,因为它所做的一切都在一个命令中。此外,它会占用大量内存。这就是为什么我要和他一起去 client.wait_for 取而代之的是方法。
使用时有问题吗 client.wait_for 在dms中?我应该使用cog侦听器吗?还是我的代码有问题?感谢您的帮助。提前谢谢!
编辑:启用意图:无(我是否需要检查dmReact的意图?)
编辑2:添加了默认意图,仍然是相同的问题
编辑3:我如何使用 get_reacts 功能:

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

vwoqyblh1#

解决方案

为了从用户接收dm中的React事件,您需要启用 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_React和React不包括在默认意图中
事实并非如此。因为只有存在和成员被移除,所以所有其他成员都在其中。
现在,事实证明,即使 dm_reactions , reactions ,及 dm_messages 对了,你还需要 members 在…上这就是解决方案中发生的情况。
正如op所指出的,它确实会起作用 discord.Intents.all() 因为,在这种情况下 member 意图已启用。

gcmastyq

gcmastyq2#

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

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

g6baxovj3#

再加上ukasz的答案,我尝试了一些实验,发现使用 discord.Intents.all() 成功了,但没有成功 discord.Intents.default() . 这让我觉得也许 dm_reactionsreactions 未包含在默认意图中,但是否包含在所有意图中?对于这方面的任何澄清,我仍然非常感激,因为我几个月前才开始学习discord.py。

相关问题