Microsoft Bot Framework v3.0 からはじめる BOT 開発: 〇ブウェイ 注文受付 BOT をもっと丁寧に - FormFlow(2)

#もう少し丁寧なコミュニケーションを行う "〇ブウェイ 注文受付 BOT" (改良版)
前回は、選択肢による質問(複数)を行う定型プロセス ("〇ブウェイ注文受付 BOT"とします) の一番単純な形を FormFlow クラスで作成しました。今回は、FormFlow の基本機能を使って、もう少し丁寧な応答を行う BOT に作りこみます。
>[Microsoft Bot Framework v3.0 からはじめる BOT 開発: 〇ブウェイがBOTで注文を受付したら - FormFlow(1)](http://qiita.com/annie/items/57cd415889d7619e6fd6)

##下準備
[FormFlow を使った、定型リスト質問を行う BOT 動作の開発](http://qiita.com/annie/items/57cd415889d7619e6fd6#formflow-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E5%AE%9A%E5%9E%8B%E3%83%AA%E3%82%B9%E3%83%88%E8%B3%AA%E5%95%8F%E3%82%92%E8%A1%8C%E3%81%86-bot-%E5%8B%95%E4%BD%9C%E3%81%AE%E9%96%8B%E7%99%BA) で作成した SandwichBot (〇ブウェイ注文受付 BOT) をベースとして改良していきます。

![SandwichBot (〇ブウェイ注文受付 BOT) の単純形](https://msdnshared.blob.core.windows.net/media/2016/08/bluesky_20160810_03-e1470741887785.png)

##選択を聞くメッセージの変更
"～を選択してください" という文言は、Bot Frameworkで用意されている標準メッセージです。これをもう少し注文に合うメッセージに変更します。
該当する質問項目の上に Prompt を用いてメッセージを入力しておくだけです。{?} には項目名、{||} は選択肢が入ります。

```MessagesController.cs
[Serializable]
public class SandwichOrder
{
    [Prompt("{&}をひとつお選びください{||}")]
    public SandwichOptions? サンドイッチの種類;
    :
    [Prompt("{&}(複数選択もOK)をお選びください{||}")]
    public List<ToppingsOptions> 追加するオプション;
    :
```

または TemplateAttibute を用いてメッセージを入力します。上記と出力結果は同じです。

```MessagesController.cs
[Serializable]
public class SandwichOrder
{
    [Template(TemplateUsage.EnumSelectOne, "{&}をひとつお選びください{||}")]
    public SandwichOptions? サンドイッチの種類;
    :
    [Template(TemplateUsage.EnumSelectMany, "{&}(複数選択もOK)をお選びください{||}")]
    public List<ToppingsOptions> 追加するオプション;
    :
```

##確認ダイアログの追加
IFormBuilder.Message でメッセージを出力し、IFormBuilder.Field を用いて1項目ずつ出力します。IFormBuilder.Confirm を使うと選択内容の確認(と再選択)のダイアログを追加できます。 

```MessagesController.cs
[Serializable]
public class SandwichOrder
{
    :
    public static IForm<SandwichOrder> BuildForm()
    {
        return new FormBuilder<SandwichOrder>()
            //.Message("こんにちは! 野菜の○ブウェイです。ご注文をどうぞ!")
            //.Build();

            .Message("こんにちは! 野菜の○ブウェイです。ご注文を承ります！")
            .Field(nameof(サンドイッチの種類))
            .Field(nameof(サイズ))
            .Field(nameof(パンの種類))
            .Field(nameof(追加するオプション))
            .Field(nameof(抜きたい野菜))
            .Field(nameof(増やしたい野菜))
            .Field(nameof(ソース))
            .Confirm("注文はこちらでよろしいでしょうか？ (宜しければ 1:はい, 変更する場合は 2:いいえ を送信してください) ----- {サンドイッチの種類}、{サイズ}サイズ＆{パンの種類} (追加オプション:{追加するオプション}、野菜抜き:{抜きたい野菜}、野菜増量:{増やしたい野菜}、{ソース}ソース)")
            .Message("ご注文完了です。")
            .Build();
    }
}
```

##Emulator による動作確認
以上の内容で動作確認を行います。
> Bot Framework Channel Emulator による動作確認方法はこちらをご覧ください。
> [Microsoft Bot Framework v3.0 からはじめる BOT 開発: Botアプリケーションのローカル実行とエミュレーターによるアクセス](http://qiita.com/annie/items/edc26c0ee9603e84a2e4#bot%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%AE%9F%E8%A1%8C%E3%81%A8%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9)

7つの質問項目が提示され、それに回答していくフローは [前回](http://qiita.com/annie/items/57cd415889d7619e6fd6) と同じです。
![](https://msdnshared.blob.core.windows.net/media/2016/08/bluesky_20160817_01-e1471329868362.png)

今回は、確認ダイアログが表示されるので、選択した内容で確定する場合は「はい」を、再選択する場合は「いいえ」を入力します。(Locale:ja-jp の場合)
> ダイアログや Locale についてはこちらをご確認ください。
> [Microsoft Bot Framework v3.0 からはじめる BOT 開発: Yes/No ダイアログを表示する - Dialog(2)](http://qiita.com/annie/items/d5a3bde93944cedb268c)

![IFormBuilder.Confirm による確認ダイアログ](https://msdnshared.blob.core.windows.net/media/2016/08/bluesky_20160817_02-e1471329914814.png)

確認ダイアログで [いいえ] を選択すると、変更したい項目を選択して変更できます。
![IFormBuilder.Confirm による確認ダイアログ(いいえを選択した場合)](https://msdnshared.blob.core.windows.net/media/2016/08/bluesky_20160817_03-e1471329933598.png)

#[参考]サンプルアプリを公開しました
ここまでの手順で作成したアプリを [サンプルとして公開しました(GitHub)](https://github.com/a-n-n-i-e/BotFramework-SandwichBot/)。