Exemple #1
0
        public async Task ExecuteAsync(List <string>?args = null)
        {
            VerifyParameters(args);
            VerifyConfiguration();
            ConsoleService.SetVersionInWindowTitle();
            ConsoleService.ClearConsole();
            LearningModeOperator    modeOperator        = GetLearningModeOperator();
            IEnumerable <Question?> questionsEnumerable = modeOperator.GetQuestions(
                randomizeEachIteration: true,
                pieceSize: Mode == ModeEnum.Full ? GetPieceSize() : -1
                );

            foreach (Question?question in questionsEnumerable)
            {
                if (question == null || modeOperator.CurrentQuestionInfo == null)
                {
                    break;
                }
                if (Mode == ModeEnum.Spelling &&
                    !await PronunciationAudioExists(modeOperator.CurrentQuestionInfo.Entry.Words))
                {
                    modeOperator.UpdateAnswersRegister(AppSettings.Learning?.NumOfOpenQuestions ?? 0);
                    continue;
                }
                PlayPronunciationAudio(
                    modeOperator.CurrentQuestionInfo.Entry.Words,
                    WhenEnum.BeforeAnswer,
                    modeOperator.CurrentQuestionInfo.AnswerType
                    );
                ConsoleService.PresentQuestion(
                    Mode,
                    question,
                    new ResultStatus(
                        modeOperator.GetResult(QuestionTypeEnum.Closed),
                        modeOperator.GetNumberOfQuestions(QuestionTypeEnum.Closed)
                        ),
                    new ResultStatus(
                        modeOperator.GetResult(QuestionTypeEnum.Open),
                        modeOperator.GetNumberOfQuestions(QuestionTypeEnum.Open)
                        ),
                    new ResultStatus(
                        modeOperator.GetCurrentQuestionResult(),
                        modeOperator.GetNumberOfCurrentQuestions()
                        )
                    );
                string       answer          = ConsoleService.ReadAnswer();
                AnswerResult?answerResult    = modeOperator.VerifyAnswer(answer);
                bool         isAnswerCorrect = answerResult?.Result ?? false;
                string       givenAnswer     = answerResult?.GivenAnswers == null
                    ? answer
                    : string.Join(", ", answerResult.GivenAnswers);
                string correctAnswer = string.Join(", ", answerResult?.CorrectAnswers ?? new List <string>());
                ConsoleService.PresentResult(
                    Mode,
                    question,
                    new ResultStatus(
                        modeOperator.GetResult(QuestionTypeEnum.Closed),
                        modeOperator.GetNumberOfQuestions(QuestionTypeEnum.Closed)
                        ),
                    new ResultStatus(
                        modeOperator.GetResult(QuestionTypeEnum.Open),
                        modeOperator.GetNumberOfQuestions(QuestionTypeEnum.Open)
                        ),
                    new ResultStatus(
                        modeOperator.GetCurrentQuestionResult(),
                        modeOperator.GetNumberOfCurrentQuestions()
                        ),
                    answer,
                    isAnswerCorrect,
                    correctAnswer,
                    modeOperator.CurrentQuestionInfo.Entry.ToString(Words.Models.EntryPartEnum.Translations)
                    );
                PlayPronunciationAudio(
                    modeOperator.CurrentQuestionInfo.Entry.Words,
                    WhenEnum.AfterAnswer,
                    modeOperator.CurrentQuestionInfo.AnswerType
                    );
                CommandEnum command = ConsoleService.HandleCommand();
                if (command == CommandEnum.Close)
                {
                    break;
                }
                else if (command == CommandEnum.Restart)
                {
                    await ExecuteAsync(args);

                    return;
                }
                else if (command == CommandEnum.Override && !isAnswerCorrect)
                {
                    modeOperator.OverridePreviousMistake();
                }
                await LearningHistoryService.SaveRecordToDbAsync(
                    modeOperator.CurrentQuestionInfo.Entry.SetPath.Namespace,
                    modeOperator.CurrentQuestionInfo.Entry.SetPath.Name,
                    Mode.ToString().ToLower(),
                    question.Content,
                    modeOperator.CurrentQuestionInfo.QuestionType.ToString().ToLower(),
                    givenAnswer,
                    correctAnswer,
                    isAnswerCorrect
                    );

                WriteLog(
                    isAnswerCorrect,
                    question.Content,
                    correctAnswer,
                    new ResultStatus(
                        modeOperator.GetResult(QuestionTypeEnum.Closed),
                        modeOperator.GetNumberOfQuestions(QuestionTypeEnum.Closed)
                        ),
                    new ResultStatus(
                        modeOperator.GetResult(QuestionTypeEnum.Open),
                        modeOperator.GetNumberOfQuestions(QuestionTypeEnum.Open)
                        ),
                    modeOperator.AnswersRegister
                    );
                if (ShouldResetMode(isAnswerCorrect, command))
                {
                    await ExecuteAsync(args);

                    return;
                }
            }

            ConsoleService.ShowSummary();
        }