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

时间:2017-05-30 17:00:46

标签: python python-3.x loops discord discord.py

所以我有这样的事情:

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,脚本将立即停止为之前激活它的用户,并开始执行它最近发出命令的用户。我评论出来的是我尝试实现这一目标的尝试。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您应该使用

而不是使用 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

唯一的缺点是如果超时发生,那么在循环再次运行之前,机器人不会听命令。

答案 1 :(得分:0)

您可以使用全局变量来设置您关注的用户。如果用户更改,您可以打破while循环并停止。