LoginSignup
3
2

More than 5 years have passed since last update.

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

Posted at

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();
}

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2