我正在创建一个 clearall 命令来清除该频道中的所有消息,我希望它有一个是和否选项,但我对 wait_for 不是很熟悉。任何人都可以将其合并到 clearall 命令代码中吗?
@client.command
@commands.has_guild_permissions(administrator=True)
async def clearall(ctx):
await ctx.channel.purge(limit=99999999)
await ctx.send("All messages cleared.")
答案 0 :(得分:1)
为了使用 wait_for
,您必须传递 3 个参数。第一个参数是 event
。根据 API 参考:
第二个参数是 check
函数。再次根据 API 参考:
最后一个参数是 timeout
。
asyncio.TimeoutError
之前等待的秒数。因此,要等待 yes
或 no
响应,您可以:
@client.command()
@commands.has_guild_permissions(administrator=True)
async def clearall(ctx):
await ctx.send('Do you want to remove messages?')
try:
await client.wait_for('message', check=lambda m: m.content.lower()=='yes' and m.author==ctx.author, timeout=60.0)
except asyncio.TimeoutError:
await ctx.send('Timeout error')
await ctx.channel.purge(limit=99999999)
await ctx.send("All messages cleared.")
使用此代码,如果您键入 yes
,它将清除所有消息。如果您输入的不是 yes
,则不会执行任何操作。
如果您希望它在输入不是 yes
时执行某些操作,例如取消,您也可以这样做。
@client.command()
@commands.has_guild_permissions(administrator=True)
async def clearall(ctx):
await ctx.send('Do you want to remove messages?(yes/no)')
try:
respond = await client.wait_for('message', timeout=60.0)
except asyncio.TimeoutError:
await ctx.send('Timeout error')
if respond.content.lower() == 'yes' and respond.author==ctx.author:
await ctx.send('done')
await ctx.send("All messages cleared.")
else:
await ctx.send('canceled')
因此,如果您输入 yes
以外的其他内容,它将取消删除过程。
答案 1 :(得分:0)
试试这个:
@client.command()
async def clearall(ctx):
await ctx.send('Would you like to clear all messages in this channel?')
def check(m):
return m.channel == ctx.channel and m.author == ctx.author
try:
message = await client.wait_for('message', timeout=5.0, check=check)
except asyncio.TimeoutError:
await ctx.send('Input not received in time')
else:
if 'yes' in message.content.lower():
await ctx.channel.purge(limit=99999999)
else:
return
timeout=5.0
用于限制命令等待下一条消息的时间 - 在本例中为 5 秒。您可以将其修改为您自己的时间值。在此示例中,如果用户在 5 秒内没有响应,则机器人将打印出 Input not received in time
。