1
votes

discord.py

Why I am using this:

I am trying to get my bot to detect a bot's embed message (to get the in-game currency of a player) using

await client.wait_for

Problem

However, it somehow does not detect the embeds sent by the bot. It still acknowledges it as long as it has plain text sent together with the embed or it sends the plain text on its own. The

@client.event
async def on_message(message):

code will still work if the bot has sent embeds with or without the text.

Possible causes:

1. ❌Already tested and proven not the cause❌ That my bot cannot read messages from bots

2. Possible: That my bot is slower that the bot I am testing with, so once my bot detects a message sent by a user for the bot to react, the bot has already responded with another message, so the bot is still waiting for a non-existent message. I have not found a viable, not time-consuming way to test this

3. Possible: {this question}

Others

All help will be appreciated! Please also point out any errors in my code here and whether I am using the right code to detect embeds and/or messages by bots. I would also appreciate alternative ways of doing my code.

Code

A portion of my current code is:

        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))

Please ignore the indentations. It was fresh copypasta from my code. I modified it from the API https://discordpy.readthedocs.io/en/latest/migrating.html#waiting-for-events

output: Looks like taco-shack is down which is the output of an asyncio timeout error

P.S. This is my first question after creating my stack overflow account, I realised that there were already so many articles that I could refer to. So I kept searching, but I could only not find the solution to this question. Please ignore my poor formatting!

Edit:

in response to my comments, I shall make it more clear

I have amended my above code because of Eric's help. He commented something that led me to improve my code ;)

Thanks

In response to Patrick's comment (thanks a lot for directing me to the https://stackoverflow.com/help/minimal-reproducible-examrple help page, really appreciate it ;)), here are a few steps you can go to reproduce the code.

Steps to reproduce the problem

Step 1: Go to the Discord developer portal and create 2 bots, one for sending the embed and the other for this testing thing (one if you have a random bot that can send embeds

Step 2: Invite the bot(s) to your server

Step 3: Code the first bot to send an embed once you sent a message inside any channel maybe a simple embed like the one in How can I send an embed via my Discord bot, w/python? and also maybe an else added to it and that else sends some plain text. Remember to use client.run()!

Step 4 Code the second bot like this:

@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')

Step 5: Run the two bots!

More questions:

I don't seem to understand whats the use of using message.embeds. I am trying to wait for a message to be sent under the on.message to continue the thread after someone types .balance to see the value of their account so that the bot can get the information. However, it does not recognise a message was sent by the bot

Legality/ethicality

The idea of making this bot came because Carl could not send the message ID.

This part is to see how much money the user has left along with whether the person has successfully sent the donation so that false donations do not clutter the channel

This bot is not meant to be a self bot.

and should not be thought as one.

** If and when you find out that this is not legal, please give a 'no' answer or comment that it is not legal (I prefer the latter) **

2
Have you tried using msg.embeds ?MrSpaar
stackoverflow.com/questions/62601894/… This post has your answer. Have a beautiful daySofi
No. It does not seem to have answered my queries.Ansel Lee
However, I am trying to use await client.wait_for() as it was supposed to continue a thread from the previous commandAnsel Lee
@client.event async def on_message(message): do detect embedsAnsel Lee

2 Answers

1
votes

I can't reproduce this. Here's what I'm doing

@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)

I only have the one bot, so maybe that's the problem, but by running !comm and then !send_embed, the bot will detect its own embed-only message from wait_for. One thing I do in this code is to compare objects by id instead of by simple equality.

1
votes

I edited my on_message to detect the response the second it hears the message. Thanks for all your help :) It was the 2nd thing I ruled out