ようやく、Hubotでmbedロボットを喋らせる環境が整いましたので、次はいよいよボットの作成に着手しました。やりたいことは、
- 何か喋りかけたらそれに応じた応答をする
- ある時刻になったら勝手にボットが喋る
- 対話(2回以上の往復)をする
です。最初のは簡単で、robot.respondやrobot.hearを使うだけです。2番目はCronJobを使います。これも特に難しくはないです。最後の対話については、状態を覚えさせる必要があるのですが、今回はECMAScript6で導入されたジェネレータを使用してみました。
下記が上記の3パターンを実装したscriptです。quizDialogが対話をコントロールするジェネレーターです。例えば、クイズ、と話しかけると、問題を出してくれて、それに正解すると正解、間違っていたら違います、と言った後答えを教えてくれます。ジェネレータは呼び出すたびに前に値を返したところから再開するので、状態(ローカル変数)も勝手に復元してくれるので、非常に強力な仕組みだと思います。
{CronJob} = require('cron')
module.exports = (robot) ->
envelope = room: "myhouse"
quizDialog = (category) ->
answer = yield 'kairaitowanani'
if /.*操り人形.*/.test answer
mes = 'seikaidesu'
else
mes = 'chigaimasu.seikaiwaayaturiningyodesu'
delete robot.dialog
yield mes
registerAlarm = (hour, min, text, motion) ->
cron = new CronJob "0 #{min} #{hour} * * *", () ->
robot.send envelope, JSON.stringify({text,motion})
cron.start()
dsend = (msg, text, motion) ->
msg.send JSON.stringify({text,motion})
drespond = (reg, text, motion) ->
robot.respond reg, (msg) ->
if !robot.dialog?
dsend msg, text, motion
# アラーム設定
registerAlarm 6, 30, "kaishaniokureruyo.", [[2,0],[0,15],[2,63]]
# 単純な応答
drespond /.*こんにちは.*/, "konnitiwa",[[1,0],[0,30],[1,63]]
drespond /こんばんは/, "konbanwa",[[1,0],[0,30],[1,63]]
drespond /おはよう/, "ohayougozaimasu",[[1,0],[0,30],[1,63]]
drespond /話題/, "mo\'-/suguse\'nnkyodane.",[[1,0],[0,30],[1,63]]
# クイズの開始
robot.respond /.*クイズ.*/, (msg) ->
if !robot.dialog?
robot.dialog = quizDialog "一般"
# 対話の進行
robot.respond /(.*)/, (msg) ->
if robot.dialog
dsend msg, robot.dialog.next(msg.match[1]).value, [[1,30],[0,10],[1,20]]