【问题标题】:await client.wait_for does not detect embeds without plain text discord.py [solved]await client.wait_for 不检测没有纯文本 discord.py 的嵌入 [已解决]
【发布时间】:2020-11-10 09:32:00
【问题描述】:

discord.py

我为什么使用这个:

我正在尝试让我的机器人使用

检测机器人的嵌入消息(以获取玩家的游戏内货币)

等待客户端.wait_for

问题

但是,它不知何故无法检测到机器人发送的嵌入。只要它与嵌入一起发送纯文本或它自己发送纯文本,它仍然会承认它。

@client.event
async def on_message(message):

如果机器人发送了带有或不带有文本的嵌入,代码仍然可以工作。

可能的原因:

1. ❌已经测试并证明不是原因❌我的机器人无法读取来自机器人的消息

2. 可能:我的机器人比我正在测试的机器人慢,所以一旦我的机器人检测到用户发送的消息让机器人做出反应,机器人已经回复了另一条消息,所以机器人仍在等待不存在的消息。 我还没有找到一种可行的、不费时的方法来测试这个

3. 可能:{这个问题}

其他

所有帮助将不胜感激!还请在此处指出我的代码中的任何错误,以及我是否使用正确的代码来检测机器人的嵌入和/或消息。我也很欣赏编写代码的其他方法。

代码

我当前代码的一部分是:

        def pred(m):
            return m.author == client.get_user(490707751832649738)
        try:
            msg = await client.wait_for('message', check=pred, timeout=10.0)
        except asyncio.TimeoutError:
            await message.channel.send('Looks like Taco-shack is down :/')
        else:
            await message.channel.send('You said {0.content}, {0.author}.'.format(msg))

请忽略缩进。这是我的代码中的新鲜copypasta。我从 API https://discordpy.readthedocs.io/en/latest/migrating.html#waiting-for-events修改它

输出: Looks like taco-shack is down 这是 asyncio 超时错误

的输出

附:这是我创建堆栈溢出帐户后的第一个问题,我意识到已经有很多文章可以参考。所以我一直在寻找,但我只是找不到这个问题的解决方案。请忽略我糟糕的格式!

编辑:

针对我的cmets,我会说得更清楚

在 Eric 的帮助下,我修改了上面的代码。他评论了一些让我改进代码的东西;)

谢谢

针对 Patrick 的评论(非常感谢您将我引导至 https://stackoverflow.com/help/minimal-reproducible-examrple 帮助页面,非常感谢;)),您可以通过以下几个步骤来重现代码。

重现问题的步骤

步骤1: 转到 Discord 开发者门户并创建 2 个机器人,一个用于发送嵌入,另一个用于测试(如果您有一个可以发送嵌入的随机机器人

步骤2: 邀请机器人到您的服务器

步骤3: 一旦您在任何频道中发送消息,就可以编写第一个机器人来发送嵌入,这可能是一个简单的嵌入,例如 How can I send an embed via my Discord bot, w/python? 中的那个,也可能是添加到它的 else 并且 else 发送一些纯文本。 记得使用client.run()

步骤4 像这样编写第二个机器人:

@client.event
async def on_message(message):
        def pred(m):
            return m.author == client.get_user(490707751832649738)
        try:
            msg = await client.wait_for('message', check=pred, timeout=10.0)
        except asyncio.TimeoutError:
            await message.channel.send('Looks like Taco-shack is down :/')
        else:
            await message.channel.send('You said {0.content}, {0.author}.'.format(msg))
client.run('token')

步骤5: 运行这两个机器人!

更多问题:

我似乎不明白使用 message.embeds 有什么用。我正在尝试等待在 on.message 下发送消息以在有人键入 .balance 以查看其帐户的值之后继续线程,以便机器人可以获取信息。但是,它无法识别 bot 发送的消息

合法性/道德性

产生这个机器人的想法是因为 Carl 无法发送消息 ID。

这部分是看用户还剩下多少钱,以及该人是否成功发送捐款,以免虚假捐款造成频道混乱

这个机器人是一个自我机器人。

不应被视为一体。

** 如果您发现这不合法,请给出“否”回答或评论它不合法(我更喜欢后者)**

【问题讨论】:

  • 你试过msg.embeds吗?
  • stackoverflow.com/questions/62601894/… 这篇文章有你的答案。祝你有美好的一天
  • 没有。它似乎没有回答我的问题。
  • 但是,我正在尝试使用 await client.wait_for(),因为它应该从上一个命令继续执行线程
  • @client.event async def on_message(message): 检测嵌入

标签: python discord.py


【解决方案1】:

我编辑了我的 on_message 以在它听到消息的第二秒检测响应。感谢您的所有帮助:) 这是我排除的第二件事

【讨论】:

    【解决方案2】:

    我无法重现这个。这就是我正在做的事情

    @bot.event
    async def on_message(message):
        if message.author.id == bot.user.id:
            print(message.content)
            print(message.embeds)
        await bot.process_commands(message)
    
    @bot.command()
    async def comm(ctx):
        msg = await bot.wait_for('message', check=lambda m: m.author.id == bot.user.id)
        await ctx.send(f"{msg.content} {msg.embeds}")
    
    @bot.command()
    async def send_content(ctx):
        await ctx.send("content1")
    
    @bot.command()
    async def send_embed(ctx):
        embed = Embed(title="Title1")
        await ctx.send(embed=embed)
    
    @bot.command()
    async def send_both(ctx):
        embed = Embed(title="Title2")
        await ctx.send("content2", embed=embed)
    

    我只有一个机器人,所以也许这就是问题所在,但是通过运行 !comm 然后运行 ​​!send_embed,机器人将检测到来自 wait_for 的自己的仅嵌入消息。我在这段代码中做的一件事是通过 id 而不是简单的相等来比较对象。

    【讨论】:

    • 我正在使用客户端
    猜你喜欢
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2021-12-07
    • 2011-07-25
    • 2014-07-08
    • 2021-05-07
    • 2015-01-18
    相关资源
    最近更新 更多