pythonだと検索ページの上位はだいたいオウム返しのコードが多いですね・・・
https://qiita.com/shima-218/items/643406e5a8c0ed3b2176
を参考に、クラスで状態管理してみるのはどうでしょうか。
(ほぼ単純に書き換えているだけなので、dataclassesなどを使ってもっとすっきりさせることはできると思います)
(あと、実機テストできていないのでどこかでエラーが出るかもしれません。input/printで置き換えて状態が正常に動くところまでしか検証できてません。あくまでイメージということで)
状態遷移図みたいなもの
from linebot import ...略
class Status:
def __init__(self):
self.context = "0"
self.daytype = ""
def get_context(self):
return self.context
def set_context(self, context):
self.context = context
def get_daytype(self):
return self.daytype
def set_daytype(self, daytype):
self.daytype = daytype
class MySession:
_status_map = dict()
def register(user_id):
if MySession._get_status(user_id) is None:
MySession._put_status(user_id, Status())
def reset(user_id):
MySession._put_status(user_id, Status())
def _get_status(user_id):
return MySession._status_map.get(user_id)
def _put_status(user_id, status: Status):
MySession._status_map[user_id]= status
def read_context(user_id):
return MySession._status_map.get(user_id).get_context()
def read_daytype(user_id):
return MySession._status_map.get(user_id).get_daytype()
def update_context(user_id, context):
new_status = MySession._status_map.get(user_id)
new_status.set_context(context)
MySession._status_map[user_id] = new_status
def update_daytype(user_id, daytype):
new_status = MySession._status_map.get(user_id)
new_status.set_daytype(daytype)
MySession._status_map[user_id] = new_status
(略)
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event: MessageEvent):
text = event.message.text
user_id = event.source.user_id
MySession.register(user_id)
if ((MySession.read_context(user_id) == "1" or
MySession.read_context(user_id) == "2" ) and
text == "キャンセル"):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage("最初からやり直します。"),
)
# 現在のstatusを消して新規statusで初期化。
MySession.reset(user_id)
if MySession.read_context(user_id) == "0":
if text == "ノジマログイン":
line_bot_api.reply_message(
event.reply_token,
TextSendMessage("出勤ですか?公休ですか?"),
)
MySession.update_context(user_id, "1")
else:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage("ログインするには、「ノジマログイン」と入力してください。"),
)
elif MySession.read_context(user_id) == "1":
if text == "公休":
MySession.update_daytype(user_id, "公休")
# ------------------
pass # 公休をweb上で登録する処理
# ------------------
line_bot_api.reply_message(
event.reply_token,
TextSendMessage("登録が完了しました。"),
)
MySession.update_context(user_id, "0")
elif text == "出勤":
MySession.update_context(user_id, "2")
MySession.update_daytype(user_id, "出勤")
line_bot_api.reply_message(
event.reply_token,
TextSendMessage("本日の所感を入力してください。"),
)
else:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage("「公休」か「出勤」いずれかを入力してください。"),
)
elif MySession.read_context(user_id) == "2":
if text == "":
line_bot_api.reply_message(
event.reply_token,
TextSendMessage("何か文字を入力してください。"),
)
else:
# ------------------
pass # 受け取った所感をweb上に登録する処理(text)
# ------------------
line_bot_api.reply_message(
event.reply_token,
TextSendMessage("登録が完了しました。"),
)
MySession.update_context(user_id, "0")
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/06 12:51
退会済みユーザー
2021/04/06 12:57 編集