MS Bot Framework を使用するボットが、facebook
とemulator
チャネルの両方で無限ループでユーザーにメッセージを送信するのにスタックしています。
IDialog
私のボットには、メニューのような「ルート」がIDialog
あり、ユーザーの選択に応じて他のいくつかの を呼び出します。子ダイアログは次のように呼び出されます。
...
else if (response.Text == MainOptions[2])
{
await context.Forward(new InfoCounterDialog(), ChildDialogComplete,
response, CancellationToken.None);
}
...
response
IMessageActivity
ユーザーが送信したものです。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 をサポートしていません。