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();
}
本来はフレームワーク側で対応したいところです。