Discord react_add 在私信频道中不起作用

Posted

技术标签:

【中文标题】Discord react_add 在私信频道中不起作用【英文标题】:Discord reaction_add doesn't work in Direct Message channel 【发布时间】:2021-05-01 19:13:53 【问题描述】:

我已经解决这个问题好几天了,这是最后一根稻草。

Reaction_add 仅在我在服务器“常规”频道中执行 !on_message 时才有效,如果我直接向机器人发送消息,它不会做任何事情。不过,有趣的是,如果我先直接向机器人发送消息,然后在服务器通用频道中输入 !on_message,机器人会在通用频道和直接消息中做出反应。

TimeoutError 之后,我在直接消息中不受欢迎。

这是代码,直接来自 discord.py 文档,我使用 Bot 作为 Client

@bot.command(pass_context=True)
async def on_message(ctx):
    channel = ctx.channel
    await ctx.send('Send me that ???? reaction, mate')

    def check(reaction, user):
        return user == ctx.author and str(reaction.emoji) == '????'

    try:
        reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=check)
    except asyncio.TimeoutError:
        await channel.send('????')
    else:
        await channel.send('????')

有趣的是wait_for(message, ...) 消息在任何地方都能正常工作。

尝试添加此内容,但仍然没有成功。

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

bot = commands.Bot(command_prefix=PREFIX, description=DESCRIPTION, intents=intents)

【问题讨论】:

您启用了哪些意图?你启用intents.dm_reactions了吗? 我没有启用任何。刚开始玩这个库。我需要在全球范围内声明它们吗? 不,你的做法很好 【参考方案1】:

这是因为on_message 是一个机器人事件,这意味着它不需要作为命令调用,您可以使用() 调用该命令,但在您的情况下,您尝试将该命令用作事件。

这是一个事件

@bot.event
async def on_message(message):
    channel = message.channel
    await message.channel.send('Send me that ? reaction, mate')

    def check(reaction, user):
        return user == message.author and str(reaction.emoji) == '?'

    try:
        reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=check)
    except asyncio.TimeoutError:
        await message.channel.send('?')
    else:
        await message.channel.send('?')

这是一个命令,一个命令需要一个函数调用,在这种情况下,它是你的前缀+拇指!thumbs希望这两个帮助。

@bot.command()
async def thumbs(ctx):
    channel = ctx.channel
    await ctx.send('Send me that ? reaction, mate')

    def check(reaction, user):
        return user == ctx.author and str(reaction.emoji) == '?'

    try:
        reaction, user = await bot.wait_for('reaction_add', timeout=60.0, check=check)
    except asyncio.TimeoutError:
        await ctx.send('?')
    else:
        await ctx.send('?')

【讨论】:

不,如果我重命名函数,也会发生同样的事情。 除了意图问题,@Cohen 关于@bot.event@bot.command 是正确的。您不想将on_message 装饰为命令,因为这样您将无法处理消息事件。【参考方案2】:

我添加了intents = discord.Intents.all(),这似乎可以解决问题,尽管它效率不高,因为我可能不需要所有特权意图。

对问题的输入会有所帮助。

【讨论】:

仔细查看this section of the docs。默认情况下,所有意图都启用除了特权意图。这里相关的是Intents.members许多与会员相关的功能需要此意图才能正常工作,并且是最近引起许多混乱和问题的原因。

以上是关于Discord react_add 在私信频道中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

discord.py 1.7.2 - 如何私信用户

Discord bot无法在13.1.0中加入语音频道[重复]

私信私信,欢迎新用户加入服务器

如何从 discord.py 中的文本通道获取所有消息的数组?

使用 Discord.js 从频道获取频道类别

Discord.js 删除频道