Hubotのscriptを作成してみる

June 27, 2016

ようやく、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]]