私はユーザーに質問するボットを作成しようとしています。起動時に、ボットはどの選択肢を取るかを質問します。定義済みの回数FormDialogを呼び出す
- (彼はテーマと後にクイズの難易度を選択する必要があります);
- 彼が最後のクイズで得た得点を見てください。
- スコアをリセットします。
クイズの内容はXMLファイルに含まれています。私はすでに質問と答えを構造体に関連付けて保存しました。
[Serializable]
public class QuizQuestionsLoader
{
public QuizQuestion Question { get; set; }
public static IForm<QuizQuestionsLoader> QuestionLoaderForm(QuizQuestion question)
{
return new FormBuilder<QuizQuestionsLoader>()
.Field(new FieldReflector<QuizQuestionsLoader>(nameof(Question))
.SetType(null)
.SetDefine(async (state, field) =>
{
field
.AddDescription(state.Question.QuestionText, state.Question.QuestionText)
.AddTerms(state.Question.QuestionText, state.Question.QuestionText);
return true;
}))
.AddRemainingFields()
.Build();
}
}
だから、私は、ユーザーが取った選択決定スイッチでIDialogをした:
FormBuilderです。ユーザーがクイズを開始することを選択した場合DefaultCaseが有効になります。
new DefaultCase<QuizChoices?, IDialog<string>>((context, value) =>
{
return Chain.From(() => FormDialog.FromForm(QuizStart.QuizForm, FormOptions.PromptInStart))
.Select(c => c.category)
.ContinueWith(async (ctx, res) =>
{
CategoryOptions? category = await res;
IList<QuizQuestion> questions = QuestionsLoader.LoadQuestions(category.Value.ToString().ToLowerInvariant()).ToList();
QuizQuestion currentQuestion = questions[0];
var questionsDialogs = Chain.From(() => FormDialog.FromForm(() => { return QuizQuestionsLoader.QuestionLoaderForm(currentQuestion); })).PostToUser();
for (int i = 1; i < questions.Count(); i++)
{
currentQuestion = questions[i];
questionsDialogs.ContinueWith(async (forctx, fores) =>
{
await fores;
return Chain.From(() => FormDialog.FromForm(() => { return QuizQuestionsLoader.QuestionLoaderForm(currentQuestion); }));
}).PostToUser();
}
return Chain.Return(questionsDialogs).Unwrap();
})
.ContinueWith(async (ctx, res) =>
{
await res;
return Chain.Return("Quiz fini !");
});
})
私は、ユーザーへの10個の質問を表示したい、私は私が表示されていないため、リコールFormBuilderは、良いアイデアだと思った理由ですどのように私は別の方法でそれを行うことができます。これをビルドして実行すると、難易度の選択後、Bot Frameworkエミュレータは500の内部サーバーエラーを送信します。
私はforループを使ってFormDialogを呼び出すことができるかどうかを調べるために、単純なメッセージと3つの選択肢からなる "テスト" FormBuilderを思い出しました。 ここFormBuilderです:
public enum TestOptions
{
A, B, C
}
[Serializable]
public class Test
{
public TestOptions? choice;
public static IForm<Test> TestForm()
{
return new FormBuilder<Test>()
.Message("Test")
.Field(nameof(choice))
.Build();
}
}
そして、ここでIDialog:これにより
return Chain.From(() => FormDialog.FromForm(Test.TestForm, FormOptions.PromptInStart))
.ContinueWith(async(ctx, res) =>
{
await res;
var testDialog = Chain.From(() => FormDialog.FromForm(() => { return Test.TestForm(); })).PostToUser();
for (int i = 0; i < 2; i++)
{
testDialog.ContinueWith<Test, Test>(async (forctx, fores) =>
{
await fores;
return Chain.From(() => FormDialog.FromForm(Test.TestForm, FormOptions.PromptInStart));
});
}
return Chain.Return(testDialog);
})
は、FormDialogは一度表示されますが、私は、forループを実行していることを見ました。ただし、testDialog変数はnullです。
ボットフレームワークエミュレータで10個の質問があるようにFormBuilderを正しく呼び戻していく方法を知っていますか?
ありがとうございます!