1

MS Bot Framework を使用するボットが、facebookemulatorチャネルの両方で無限ループでユーザーにメッセージを送信するのにスタックしています。

IDialog私のボットには、メニューのような「ルート」がIDialogあり、ユーザーの選択に応じて他のいくつかの を呼び出します。子ダイアログは次のように呼び出されます。

        ...
        else if (response.Text == MainOptions[2])
        {
            await context.Forward(new InfoCounterDialog(), ChildDialogComplete, 
                                  response, CancellationToken.None);
        }
        ...
  • responseIMessageActivityユーザーが送信したものです。
  • ChildDialogCompleteメインメニューを再度構築し、次の行で終了するメソッドです。

.

await context.PostAsync(restartPrompt);
context.Wait(MainScreenSelectionReceived);

この 1 つの非常に短いダイアログを除いて、すべてのダイアログは正常に機能します。これにより、無限ループが発生します。Web アプリを停止するまで、ボットはこのメッセージを何度も送信し続けます。

namespace XXXX
{
[Serializable]
public class InfoCounterDialog : IDialog
{
    public async Task StartAsync(IDialogContext context)
    {
        var hourNow = DateTime.Now.Hour;
        var openNow = "";
        if (hourNow >= 7)
        {
            openNow = "It is open now and will close at midnight.";
        }
        else
        {
            openNow = "It is closed now and will open at 7:00";
        }
        var card = HeroCardUtils.CardWithImageAndMiscButtons(
            "Our information counter can help!",
            "It's located in Shop 081, Level 3 in Building 2. " + openNow,
            "http://www.[image URL here].jpg",
            new[] { "More Details" },
            new[] { ActionTypes.OpenUrl },
            new[] { "[webpage URL here]" }
            );
        await BotUtils.SendCardToChat(context, card);
        context.Done(this);
    }
}

}

あなたが何をしているのか疑問に思っているならSendCardToChat

    public async static Task SendCardToChat(IDialogContext context, HeroCard card)
    {
        var activity = context.MakeMessage();
        activity.Attachments = HeroCardUtils.CardToAttachments(card);
        await context.PostAsync(activity);
    }

要点をまとめると:

  • を使用して別のダイアログからダイアログを起動していますcontext.Forward()
  • ダイアログは、ユーザーにメッセージを表示し、ユーザーからの追加の入力なしですぐに終了することになっています
  • 代わりに、「私たちのインフォメーション カウンターがお手伝いします!」を送信し続けます。メッセージ無限。

私の最善の推測は、子ダイアログが何らかの形でユーザーの最初のメッセージを会話に返し、それが同じダイアログを何度もトリガーすることです。しかし、これは起こるべきではありません。子供は、私が作成IDialogした以外の会話に何も送信してはなりません。HeroCard

または、私が間違った方向を見ているのかもしれません。Bot Framework は、IDialog何かを実行してすぐにcontext.Wait()?なしで終了する s をサポートしていません。

4

1 に答える 1