Dialogflowのeventを使ってみる。

# はじめに
Dialogflowでは、ユーザーのテキスト入力（キーボード or 音声）に対してintentが反応する仕組みですが、テキスト入力の代わりにeventを発生させて、それに反応するintentを作ることができます。ただ、使い方がわかりにくい（情報が少ない）ので、わかる限りで整理してみました。

今回は、あるIntentが呼び出されたら、それがEventを発生させて、別のIntentが呼び出される、という単純な処理を行います。

# IntentでのEventの設定。

最初に、Eventが発生した時に **呼び出される側** の設定です。公式の解説は[こちら](https://dialogflow.com/docs/events)です。Intentの設定でEventsのところにEventの名前（ここではGood morning）を入れるだけです。

![09FBA513-6C5A-4853-BB1F-C0B579755A76.png](https://qiita-image-store.s3.amazonaws.com/0/58503/47e57e74-a903-0cf9-9388-469bba4cc049.png)

こちらのIntentでは、「おはよう」と言うと「おはようございます。今日も良い一日を。」とText Responseを返すようにしました。

![6A600ACF-FD6A-4282-BD59-68C277A00ABA.png](https://qiita-image-store.s3.amazonaws.com/0/58503/3cd5036d-3e54-87fd-29ed-63d758abf747.png)


# Fulfillmentの設定。

今度は、イベントを起こす側の設定です。そのためには、Fulfillmentを設定します。これはWebhookを用いて、intentが呼び出されたことをサーバーへ伝えて、そちらで何らかの処理を行って、結果を受け取ります。公式の解説は[こちら](https://dialogflow.com/docs/fulfillment)や[こちら](https://developers.google.com/actions/dialogflow/fulfillment)をご覧ください。

Fulfillmentは、左のメニューのFullfilmentから設定できます。

![46B90F2A-89A6-4AB4-971D-9005E20C3BC7.png](https://qiita-image-store.s3.amazonaws.com/0/58503/932c735d-230e-eecb-a0f1-739d17ebf557.png)

今回は、簡単なテスト用にInline Editorを使うので、下のスライダーを押して Enabled にしてください。

![EC017E68-CA40-4C91-A965-D0EAD53A6443.png](https://qiita-image-store.s3.amazonaws.com/0/58503/46289d98-e50c-cdd6-d66d-52f020ee10f7.png)

これで、index.js 内のスクリプトを編集できるようになります。すでにサンプルコードが書いてありますが、長くて読むのが大変なので、公式の[こちら](https://dialogflow.com/docs/getting-started/basic-fulfillment-conversation)にあるシンプルなコードを基にして作ってみました。

```js:index.js
'use strict';

const functions = require('firebase-functions'); 

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    response.setHeader("Content-Type", "application/json");
    response.send(
     JSON.stringify({
        "followupEvent": {
           "name": "GoodMorning"
        }
     })
    );
   }
);
```
リクエストに対してJSONを返すだけのスクリプトです。スクリプトにはfulfillmentでeventを発生させるには、上記の通り JSON内にfollowupEventパラメータを設定する必要があります（詳しくは[公式ページ](https://dialogflow.com/docs/events)の下の方を参照）。これを設定すると、speech, displayText, dataフィールドは無視されるの注意してください。

コードを入力したら、右下のDeployボタンを押せば、実行可能になります。

#Eventを呼び出すIntentの設定

イベントを呼び出す側のIntentを作りましょう。「あいさつはじめ」と入れると呼び出されます。

![B242E046-7656-42D2-8B7C-B4D766D1943A.png](https://qiita-image-store.s3.amazonaws.com/0/58503/2e7cfd7c-274f-2ba9-6974-fe073af6014f.png)

今までと違って、Intent設定画面の下に、Fulfillmentに関する設定が出てきます。ここで、Use webhookを有効にしてください。

![7C7639E9-1DD9-478F-91D4-ABFAC626DB22.png](https://qiita-image-store.s3.amazonaws.com/0/58503/8c2c67da-97e1-259c-34b9-8e00f44c17bf.png)

**注意：webhookを有効にするのは、呼び出す側だけです。呼び出される側には不要です。**

#やってみる

画面右のシミュレータでテストしましょう。”try it now”のところに「あいさつはじめ」と入れると、Eventが起きて、あさのあいさつのIntentが実行されます。

![453F6D9C-5D29-470B-9A40-A8A1F3FDA81A.png](https://qiita-image-store.s3.amazonaws.com/0/58503/6406648a-fd7d-0796-cf30-09ccf835a7ae.png)

下のSHOW JSONボタンを押すと、何が起きたかがわかります。

![43248657-D092-424A-83B6-5F4B990048E2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/58503/0807c427-a507-5cc8-dc45-c08b4c6166e9.jpeg)

![E27C0B5E-D472-4723-AB99-29A11B08F143.jpeg](https://qiita-image-store.s3.amazonaws.com/0/58503/880cacec-6bf6-e34f-205d-1eec5f3ccdfa.jpeg)

ここで重要なのはmetadataのExectionSequenceで、これを追っていくと、何がEventを発生させて、その結果何のIntentが起こったのかがわかります。

#おわりに
とりあえず、もっともシンプルな形でEventを発生させられました。ただし、現状では何のFulfillmentでも必ずGoodMorningイベントが発生してしまうので、修正が必要になります。それについてはまた今後。