1 回答

TA貢獻1966條經驗 獲得超4個贊
我計劃conversation
在該庫的未來版本中刪除該方法,因為正如您所看到的,很快就會遇到很大的限制,因為將基于回調的事件方法與命令式對話風格混合起來很困難。我建議您改用FSM 風格的對話。您應該能夠輕松地調整該答案的代碼以“等待數字”:
from enum import Enum, auto
class State(Enum):
? ? WAIT_DIGITS = auto()
conversation_state = {}
@client.on(events.NewMessage)
async def handler(event):
? ? who = event.sender_id
? ? state = conversation_state.get(who)
? ??
? ? if state is None:
? ? ? ? await event.respond('Please send digits!')
? ? ? ? conversation_state[who] = State.WAIT_DIGITS
? ? elif state == State.WAIT_DIGITS:
? ? ? ? if event.text.isdigit():
? ? ? ? ? ? digits = event.text
? ? ? ? ? ? await event.respond(f'Thanks for your digits! {digits}')
? ? ? ? ? ? del conversation_state[who]
? ? ? ? else:
? ? ? ? ? ? await event.respond('Please only send digits, not letters')
您可以輕松地為此添加更多抽象(根據狀態為其他函數構建自己的裝飾器,或者只是將每個狀態的代碼分離到另一個函數,使用它們的返回值作為下一個狀態等)。
添加回答
舉報