我正在嘗試創建一個向用戶提問的bot。在發佈時,機器人會詢問用戶會選擇哪個選項:回調FormDialog的定義次數
- 開始測驗(他將不得不選擇測驗的主題和難度);
- 查看他在最後一次測驗中得分;
- 重置分數。
測驗的內容是在XML文件中。我已經在結構中存儲了相關的問題和答案。
的FormBuilder是:
[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與確定用戶採取何種選擇開關。如果用戶選擇啓動測驗的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框架模擬器發送500內部服務器錯誤。
這就是爲什麼我試圖回憶「測試」 FormBuilder,它是由蒙山一個簡單的消息和三個選擇,看看我是否可以用一個for循環召回FormDialog。 這裏是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就會顯示一次,但我看到了循環執行。但是,testDialog變量爲空。
所以,你知道我怎麼能繼續記錯我FormBuilder會對機器人框架模擬器10個問題?
非常感謝!