in blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/TriviaDialog.cs [215:364]
private async Task Trivia_ProcessAnswer(IDialogContext context, IMessageActivity message, LuisResult luis)
{
if (ExpectedAnswer == null)
{
await Responses.Send_Error_NextQuestion(context, message);
await Trivia_AskQuestion(context, message, true);
}
var providedAnswer = message.Text;
// If no answer was provided, see if the user ran out of time
if (providedAnswer == null)
{
var appEntitiesJson =
(from entity in message.Entities
where entity.Type.NormalizedEquals("AppEntities")
select entity).FirstOrDefault();
if (appEntitiesJson != null)
{
var appEntities = appEntitiesJson.GetAs<AppEntities>();
if (appEntities.Type.NormalizedEquals("AppEntities") && appEntities.MessageType == MessageType.OutOfTime)
{
if (!TimedOutLastTime)
{
TimedOutLastTime = true;
await Responses.Send_OutOfTime_First(context, message);
await Responses.Send_TryEasierQuestion(context, message);
await Trivia_AskQuestion(context, message, true);
return;
}
else
{
await Responses.Send_OutOfTime_X(context, message);
CurrentState = BotState.WaitingForReengagement;
return;
}
}
}
}
TimedOutLastTime = false;
// User referred to answer indirectly (by position), and we asked for confirmation
if (ConfirmingAnswer)
{
var tentativeAnswer = ChosenAnswer;
ChosenAnswer = null;
ConfirmingAnswer = false;
if (luis.Intents.Max().Intent.NormalizedEquals("Agree"))
{
providedAnswer = tentativeAnswer;
}
else
{
await Trivia_AskQuestion(context, message, false);
return;
}
}
// Try comparing the answer provided
// No answer provided, just ignore the message
if (providedAnswer == null || providedAnswer.Length == 0)
{
return;
}
// Exact match
if (providedAnswer.NormalizedEquals(ExpectedAnswer))
{
await Responses.Send_CorrectAnswer(context, message, ExpectedAnswer);
await Trivia_NextQuestion(context, message, luis);
return;
}
// If it matches any answer now, it must be wrong
foreach (var option in AnswerOptions)
{
if (option.NormalizedEquals(providedAnswer))
{
await Responses.Send_IncorrectAnswer(context, message, ExpectedAnswer);
await Trivia_NextQuestion(context, message, luis);
return;
}
}
// Ordinal answer
if (luis.Intents.Max().Intent.NormalizedEquals("Select") && luis.Entities.Count > 0)
{
var selections =
from entity in luis.Entities
where entity.Type.NormalizedEquals("selection")
select entity.Entity;
if (selections.Count() > 0)
{
var selection = ResolveOrdinalReference(selections.First()) - 1;
if (selection >= 0 && selection < AnswerOptions.Count)
{
ChosenAnswer = AnswerOptions[selection];
ConfirmingAnswer = true;
await Responses.Send_ConfirmAnswer(context, message, ChosenAnswer);
return;
}
}
}
// Didn't match any option, see if it's an intent we can handle
var intent = luis.Intents.Max()?.Intent;
if (intent?.NormalizedEquals("Help") == true)
{
await Responses.Send_Help_Trivia(context, message, AnswerOptions);
}
else if (intent?.NormalizedEquals("SwitchCategory") == true)
{
await State_SwitchCategory(context, message, luis);
}
else if (intent?.NormalizedEquals("StartMode") == true)
{
await Responses.Send_LightningModeStart(context, message);
await Trivia_AskQuestion(context, message, false);
}
else if (intent?.NormalizedEquals("StopMode") == true)
{
await Responses.Send_LightningModeEnd(context, message);
await Trivia_AskQuestion(context, message, false);
}
else if (intent?.NormalizedEquals("Play") == true)
{
await ProcessLuis_Play(context, message, luis);
await Trivia_AskQuestion(context, message, false);
}
else
{
await Responses.Send_DidNotUnderstand(context, message);
await Responses.Send_WhichOne(context, message, AnswerOptions);
}
}