Im trying to make a command where the bot "snipes" the last deleted message. this is my current code:
snipe_message_content = None
snipe_message_author = None
@client.event
async def on_message_delete(message):
snipe_message_author.remove(None)
snipe_message_content.remove(None)
snipe_message_content.append(message.content)
snipe_message_author.append(message.author.id)
await asyncio.sleep(str(60))
snipe_message_author.remove(message.author.id)
snipe_message_content.remove(message.content)
@client.command()
async def snipe(message):
if snipe_message_content==None:
await message.channel.send("Theres nothing to snipe.")
else:
embed = discord.Embed(description=f"{snipe_message_content}")
embed.set_footer(text=f"Asked by {message.author.name}#{message.author.discriminator}", icon_url=message.author.avatar_url)
embed.set_author(name= f"<@{snipe_message_author}>")
await message.channel.send(embed=embed)
return
the await message.channel.send("Theres nothing to snipe.")
part works perfectly fine, but the rest wont work. Can anyone help?
Well your on_message_delete()
function is just not working.
I'll shorten your variables as smc
(snipe_message_content) and sma
(snipe_message_author).
First of all, your variables sma
and smc
are of the type None
, but the methods remove
and append
are part of the type list
, so you'd have to declare lists
smc = []
sma = []
in order for them to work.
Still, you wouldn't have to do this anyway. Just give your current variables a new value:
snipe_message_content = None
snipe_message_author = None
@client.event
async def on_message_delete(message):
global snipe_message_content
global snipe_message_author
# Variables outside a function have to be declared as global in order to be changed
snipe_message_content = message.content
snipe_message_author = message.author.id
await asyncio.sleep(60)
snipe_message_author = None
snipe_message_content = None
Also, you should not convert 60 to a string. time.sleep
and asyncio.sleep
both need an integer
in order to work. (And by the way, if you wanted 60 to be a string, just write "60"
with quotation marks.
Also, be careful of the following case: If a message gets deleted, but 50 seconds after a new message gets deleted, sma
and smc
would be assigned to the new message. But 10 seconds later, the function executed by the message before would set he value of sma
and smc
to None.
Therefore, after await asyncio.sleep(60)
check wether your message is still the same as before:
snipe_message_content = None
snipe_message_author = None
snipe_message_id = None
@client.event
async def on_message_delete(message):
global snipe_message_content
global snipe_message_author
global snipe_message_id
snipe_message_content = message.content
snipe_message_author = message.author.id
snipe_message_id = message.id
await asyncio.sleep(60)
if message.id == snipe_message_id:
snipe_message_author = None
snipe_message_content = None
snipe_message_id = None
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments