Discord.py 狙击命令

2022-01-15 00:00:00 python discord discord.py-rewrite

问题描述

我试图在机器人狙击"的地方发出命令.最后删除的消息.这是我当前的代码:

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

await message.channel.send("Theres nothing to snip.") 部分可以正常工作,但其余部分无法正常工作.有人可以帮忙吗?

the await message.channel.send("Theres nothing to snipe.") part works perfectly fine, but the rest wont work. Can anyone help?


解决方案

你的 on_message_delete() 函数只是不工作.

Well your on_message_delete() function is just not working.

我会将您的变量缩短为 smc (snipe_message_content) 和 sma (snipe_message_author).

I'll shorten your variables as smc (snipe_message_content) and sma (snipe_message_author).

首先,你的变量 smasmc 的类型是 None,但是方法 removeappendlist 类型的一部分,所以你必须声明列表

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 = []

为了让他们工作.

不过,无论如何您都不必这样做.只需给您当前的变量一个新值:

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

此外,您不应将 60 转换为字符串.time.sleepasyncio.sleep 都需要一个 integer 才能工作.(顺便说一句,如果你想让 60 成为一个字符串,只需将 60" 写成带引号.

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.

另外,请注意以下情况:如果一条消息被删除,但在新消息被删除 50 秒后,smasmc 将分配给新消息.但是 10 秒后,之前消息执行的函数会将 smasmc 的值设置为 None.

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.

因此,在 await asyncio.sleep(60) 之后检查您的消息是否仍然与之前相同:

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

相关文章