# LINEのチャットbotを作る4
### <font color='red'>コード解説</font>
---
「LINEのチャットbotを作る3」の続きです. 偉い. はい, 書いていきます.
```python=
> BadMain.py
def handle_message(event):
"""
UsersのActivityによって条件分岐.
noneQuestionがデフォルト→メニューを表示.
waitQestionが質問待ち状態→次に入力されたテキストが質問になる.
"""
UserID = event.source.user_id
text = event.message.text
activity = BadPush.checkActivity(UserID)
if activity == "初期状態":
if (text =="休み")or(text =="休")or(text =="やすみ"):
BadPush.changeActivity(UserID,"休み遅刻")
BadPush.changeStatus(UserID,"休み")
line_bot_api.reply_message(event.reply_token,
[
TextSendMessage(text='お休みですね. \n理由を選択して送信して下さい. \n「家庭都合」, 「体調不良」, 「怪我」, 「その他」')
]
)
elif (text =="遅刻")or(text =="遅")or(text =="ちこく"):
BadPush.changeActivity(UserID,"休み遅刻")
BadPush.changeStatus(UserID,"遅刻")
line_bot_api.reply_message(event.reply_token,
[
TextSendMessage(text='遅刻ですね. \n到着予定時間(見込)を送信して下さい. ')
]
)
else:
line_bot_api.reply_message(event.reply_token,
[
TextSendMessage(text='申し訳ありませんその言葉は理解しかねます. \n「休み」もしくは「遅刻」と送信して下さい. ')
]
)
```
```python=
> BadPush.py
def checkActivity(UserID):
cell = worksheet.find(UserID)
activity = worksheet.cell(cell.row, 3).value
return activity
def changeActivity(UserID,activity):
cell = worksheet.find(UserID)
worksheet.update_cell(cell.row, 3, activity)
def changeStatus(UserID,ChildStatus):
cell = worksheet.find(UserID)
worksheet.update_cell(cell.row, 4, ChildStatus)
```
BadPush.pyには, 例外処理あるけどここでも書いてたら見にくくなってしまうので消してます. 必要なことだけ書いて解説していきます. まずこのプログラムで1番重要な, 変数activity. こいつがなんなのか, 状態ってところの下の値を保持します.

この状態の値を取得するために, BadPush.pyに関数checkActivityが用意されています. この関数は今連絡をしてきているユーザーのIDを取得し, どこに情報が格納されているのか探しにいきます. 格納場所を見つけたら, ユーザーの状態の値を参照します. 初期値として, ”初期状態”が入っていてBadMain.pyの12行目のif文に入っていくわけです. このプログラムは常に状態の値を参照して, 今何の項目について入力してるのかを判定します. BadMain.pyのif文に入ったところで今回の連絡が何についてなのかを判定します. 休みなのか, 遅刻なのか, それとも全く違う連絡をしてしまっているのか. 連絡の種類によってメッセージが変わります.
* 休み⏩今日の練習を休む理由を聞く
* 遅刻⏩到着予定時間を聞く
* 全く違う連絡⏩ごめんなさい休み・遅刻以外は対応していません
こんな感じで保護者の方からの連絡が何についてなのか判定して, その後のメッセージを変えてます. ここで, 休みか遅刻どちらかの連絡であった時, 関数changeActivityによって変数activityの値が”休み遅刻”に変わります. その後休みと遅刻の連絡を区別するために, 関数changeStatusによって, 休みor遅刻の下の部分に書き込んでやります.
```python=
> BadMain.py
elif activity == "休み遅刻":
ChildStat = BadPush.getStatus(UserID)
if (ChildStat =="休み"):
if (text =="家庭都合")or(text =="体調不良")or(text =="怪我")or(text =="その他"):
BadPush.changeActivity(UserID,"選手名")
BadPush.changeReason(UserID,text)
line_bot_api.reply_message(event.reply_token,
[
TextSendMessage(text='了解しました. \nお子さんの名前をフルネームで送信して下さい. ')
]
)
else:
line_bot_api.reply_message(event.reply_token,
[
TextSendMessage(text='お休みの理由を選択して送信して下さい. \n「家庭都合」, 「体調不良」, 「怪我」, 「その他」')
]
)
elif (ChildStat =="遅刻"):
BadPush.changeActivity(UserID,"選手名")
BadPush.changeReason(UserID,text)
line_bot_api.reply_message(event.reply_token,
[
TextSendMessage(text='了解しました. \nお子さんの名前をフルネームで送信して下さい. ')
]
)
```
```python=
> BadPush.py
def getStatus(UserID):
cell = worksheet.find(UserID)
ChildStatus = worksheet.cell(cell.row, 4).value
return ChildStatus
def changeReason(UserID,Reason):
cell = worksheet.find(UserID)
worksheet.update_cell(cell.row, 5, Reason)
```
初めの連絡で変数activityの値が変わったので, elifの中に入っていきます. 入ってすぐに関数getStatusが呼ばれます. これは休みor遅刻の下の部分の値を拾ってきて, その値によって今後の分岐が変わっていきます. もし連絡が休みについてだったら, 予め決めてある項目から選んでもらって送信してます. 理由がこちらで選択したものでなければ, もう一度理由を聞く質問をします. まぁこれも思いつく項目出してるだけだからいいのか悪いのか. 正しく理由が選択されていたら, 関数changeActivityによって変数activityの値が”選手名”に変わります. これは休み連絡についてなのですが, 遅刻の場合は理由の変わりに到着予定時間を聞いて, 関数changeActivityによって変数activityの値を”選手名”に変えています.

ここで, 上の画像の”家庭都合”が記入されている部分がありますよね. そこには休みなら理由, 遅刻なら到着予定時間. つまり, 保護者の方からの連絡が書き込まれます. ここに書き込みをしてくれるのは, 関数changeReasonです. これが後々必要になってくるけど今は説明しません. 最後に子供の名前を入力してもらいます.
途中だけどまた長くなってしまったので次に託します.