Discord.py 狙击命令

Wil*_*ell 3 python discord discord.py

我试图发出一个命令,让机器人“狙击”最后删除的消息。这是我当前的代码:


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

Run Code Online (Sandbox Code Playgroud)

await message.channel.send("Theres nothing to snipe.")部分工作得很好,但其余部分则无法工作。有人可以帮忙吗?

Thö*_*rni 6

好吧,你的on_message_delete()功能不起作用。

首先,您的变量snipe_message_authorsnipe_message_content属于类型None,但方法removeappend是类型的一部分list,因此您必须声明列表

snipe_message_content = []
snipe_message_author = []
Run Code Online (Sandbox Code Playgroud)

为了让他们能够工作。

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

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
Run Code Online (Sandbox Code Playgroud)

另外,不要将 60 转换为字符串。time.sleep两者asyncio.sleep都需要一个 ininteger才能工作(旁注:如果您希望 60 是一个字符串,只需写"60"在引号中)。

最后,要注意以下情况:如果一条消息x被删除,但50秒后,一条新消息y被删除,snipe_message_authorsnipe_message_content会被分配给新消息y。但10秒后,message执行的函数会将和x的值设置为None。snipe_message_authorsnipe_message_content

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

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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢sm,它有效!感谢您向我解释一切,而不仅仅是给我代码。它帮助我更多地理解这一点。 (2认同)