我有一个异步函数,它需要一个字符串用户和一个字符串消息 当用户键入 start 时,它会提出一个问题并休眠并等待答案,但我在处理其他消息时遇到问题,因为它卡在 if 语句中并且不检查任何其他内容,它总是完成第一个 if 语句。我希望能够在用户键入开始后检查和比较即将到来的消息是否也与答案匹配
question = ''
answer = ''
async def on_message(self, user, message):
if message == 'start':
(gets question/answer)
question = question
answer = answer
(ask question)
time.sleep(10)
if no one has answered
(prints times up and displays answer)
(resets question/answer)
question = ''
answer = ''
if message == answer
(says congrats and awards user points)
(resets question/answer)
question = ''
answer = ''
我希望在提出问题后处理多个输入
为了能够在提出问题后处理多个输入,您需要使用状态机。状态机是一种模型,表示您的程序可能处于的不同状态以及这些状态之间的转换。在您的情况下,您可以将不同的状态表示为“等待开始”、“等待回答”和“超时”。
以下是如何在代码中实现状态机的示例:
class MyBot:
def __init__(self):
self.state = 'waiting_for_start'
self.question = ''
self.answer = ''
async def on_message(self, user, message):
if self.state == 'waiting_for_start':
if message == 'start':
# gets question/answer
self.question = 'What is the capital of France?'
self.answer = 'Paris'
# ask question
await self.send_message(self.question)
self.state = 'waiting_for_answer'
asyncio.create_task(self.timeout())
elif self.state == 'waiting_for_answer':
if message == self.answer:
# says congrats and awards user points
await self.send_message(f'Congratulations {user}! You have earned 10 points.')
self.reset()
else:
# continue waiting for answer
pass
async def timeout(self):
await asyncio.sleep(10)
if self.state == 'waiting_for_answer':
# prints times up and displays answer
await self.send_message(f'Time\'s up! The answer was {self.answer}.')
self.reset()
def reset(self):
# resets question/answer
self.question = ''
self.answer = ''
self.state = 'waiting_for_start'
在此实现中,MyBot 类具有状态属性,用于跟踪状态机的当前状态。在“waiting_for_start”状态下,机器人等待用户发送“开始”消息。收到“开始”消息后,机器人会设置问题和答案属性并将问题发送给用户。然后它将状态更改为“waiting_for_answer”并使用 asyncio.create_task(self.timeout()) 启动超时协程。
在'waiting_for_answer'状态下,机器人等待用户发送正确答案。如果用户发送正确答案,机器人会发送祝贺信息并奖励用户积分。然后它调用 reset() 方法来重置状态机。如果用户发送错误答案,机器人会继续等待答案。
timeout()协程在状态机进入'waiting_for_answer'状态时启动。它等待 10 秒,然后检查状态是否仍为“waiting_for_answer”。如果是,机器人将发送一条包含正确答案的消息并调用 reset() 方法来重置状态机。
通过此实现,机器人可以在提出问题后处理多个输入,因为它会继续等待正确答案,直到收到正确答案或超时。