かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Bot Framework で全てのダイアログが終わったタイミングで処理がしたい

ダイアログの BeginDialogAsyncEndDialogAsync をオーバーライドすると、ダイアログの最初と最後に処理をさしこめるっぽい。

でも、ダイアログの外側(Botクラス)からダイアログの状態を見て全てのダイアログが終わったタイミングで何かメッセージを送りたいといった場合は DialogState の DialogStack に現在のダイアログの状態が入ってるみたいなので、そこがからっぽだとダイアログの処理が綺麗に終わったということで、Bot クラスの OnMessageActivityAsync に以下のような処理を書くと Bot クラス側でダイアログがつつがなく全部終わった後に何かすることが出来そうです。

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    // Run the Dialog with the new message Activity.
    var accessor = ConversationState.CreateProperty<DialogState>(nameof(DialogState));
    await Dialog.RunAsync(turnContext, accessor, cancellationToken);
    var state = await accessor.GetAsync(turnContext);
    if (!state.DialogStack.Any())
    {
        // ダイアログが全部終わってるときの処理
    }
}

正攻法が他にあったら教えて。