BotFramework で条件によって FormFlow を実行する方法

  • 3
    Like
  • 0
    Comment
More than 1 year has passed since last update.

BotFramework の公式ドキュメント FormFlow の例 は FormFlow のみの Bot ですが、作成する Bot はそう単純なものばかりではありません。
私の場合は Unix のコマンドのイメージで、特定のコマンドのみ FormFlow を実行する挙動を実現したかったのですが、思ったより手間取ったので備忘録としてコード例を置いておきます。

public async Task<Message> Post([FromBody]Message message)
{
    if (message.Text == "command" ||
        message.GetBotPerUserInConversationData<bool>(COMMAND_TAG))
    {
        message.SetBotPerUserInConversationData(COMMAND_TAG, true);
        return await Conversation.SendAsync(message, MakeDialog);
    }
    else
        return message.CreateReplyMessage("hi");
}

private IDialog<State> MakeDialog()
{
    return Chain.From(() => FormDialog.FromForm(BuildForm))
        .Do(async (context, task) =>
        {
            try
            {
                await task;
            }
            catch (FormCanceledException<State>)
            {
context.PerUserInConversationData.SetValue<bool>(COMMAND_TAG, false);
                await context.PostAsync("command is canceled");
            }
        });
}

private IForm<State> BuildForm()
{
    return new FormBuilder<State>()
            .Message("start command")
            .OnCompletionAsync(async (context, state) => {
context.PerUserInConversationData.SetValue<bool>(COMMAND_TAG, false);
                await context.PostAsync("command is completed");
            })
            .Build();
}

本来はフレームワーク側で対応したいところです。