private async Task Trivia_ProcessAnswer()

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);
            }
        }