如何使用启动它的相同触发器停止无限循环



所以我有类似的东西:

import discord, asyncio
client = discord.Client()
@client.event
async def on_message(message):
    if message.content.lower().startswith("!test"):
        await client.delete_message(message)
        test1 = await client.send_message(message.channel, "%s test1" % (message.author.mention))
        await asyncio.sleep(1)
        while True:
            #newtest = await client.wait_for_message()
            #if newtest.content.lower().startswith("!test"):
                #return 0
            #else:
                test2 = await client.edit_message(test1, "%s test2" % (message.author.mention))
                await asyncio.sleep(1)
                await client.edit_message(test2, "%s test1" % (message.author.mention))
                await asyncio.sleep(1)
client.run('ClientTokenHere')

它的作用是,如果某人在聊天频道中输入!test,则该脚本将删除该 !test消息,然后将消息发送到聊天中,该消息说该人的姓名后跟文本test1。然后,脚本将编辑该消息,以说test2一秒钟后,然后将编辑相同的消息说test1,然后再次到test2等。

但是,我想做到这一点,以便如果再次在同一命令中键入同一命令!test,则该脚本将立即停止为先前激活的用户而停止,并开始为发行的最新用户使用它命令。我评论的台词是我尝试实现这一目标的尝试。我该怎么做?

而不是使用asyncio.sleep(1),您应该使用

def check(message):
   return message.channel == ctx.channel and message.content.lower().startswith("!test")
try:
   await client.wait_for('message', timeout=1, check=check)
except:
   continue

这唯一的缺点是,如果发生超时,则直到循环再次运行bot不会收听命令。

您可以使用一个全局变量a设置您正在关注的用户。如果用户更改,则可以打破WALE循环并停止。

最新更新