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.")部分工作得很好,但其余部分则无法工作。有人可以帮忙吗?
好吧,你的on_message_delete()功能不起作用。
首先,您的变量snipe_message_author和snipe_message_content属于类型None,但方法remove和append是类型的一部分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_author并snipe_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)
| 归档时间: |
|
| 查看次数: |
10686 次 |
| 最近记录: |