public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList)
        {
            var(phrase, translation) = word.GetExamplesThatLoadedAndFits().GetRandomItemOrNull();
            if (phrase == null)
            {
                return(QuestionResult.Impossible);
            }
            var(enPhrase, ruPhrase) = phrase.Deconstruct();

            var allWordsWithPhraseOfSimilarTranslate = examList
                                                       .SelectMany(e => e.Examples)
                                                       .Where(p => p.TranslatedPhrase.AreEqualIgnoreCase(ruPhrase))
                                                       .Select(e => e.OriginWord)
                                                       .ToList();

            var enReplaced = enPhrase.Replace(phrase.OriginWord, "\\.\\.\\.");

            if (enReplaced == enPhrase)
            {
                return(QuestionResult.Impossible);
            }

            await chat.SendMarkdownMessageAsync(
                QuestionMarkups.TranslatesAsTemplate(
                    ruPhrase,
                    chat.Texts.translatesAs,
                    enReplaced,
                    chat.Texts.EnterMissingWord + ":"));

            var enter = await chat.WaitNonEmptyUserTextInputAsync();

            if (enter.IsRussian())
            {
                await chat.SendMessageAsync(chat.Texts.EnglishInputExpected);

                return(QuestionResult.RetryThisQuestion);
            }

            var(closestWord, comparation) = allWordsWithPhraseOfSimilarTranslate.GetClosestTo(enter.Trim());
            if (comparation == StringsCompareResult.Equal)
            {
                return(QuestionResult.Passed(chat.Texts));
            }
            if (enter.Contains(word.Word, StringComparison.InvariantCultureIgnoreCase) && enPhrase.Contains(enter))
            {
                //if user enters whole world (as it is in phrase) - it is ok
                return(QuestionResult.Passed(chat.Texts));
            }

            if (comparation == StringsCompareResult.SmallMistakes)
            {
                await chat.SendMessageAsync(chat.Texts.TypoAlmostRight);

                return(QuestionResult.RetryThisQuestion);
            }

            return(QuestionResult.Failed(
                       $"{chat.Texts.FailedOriginExampleWasMarkdown}\r\n*\"{phrase.OriginPhrase}\"*",
                       chat.Texts));
        }
        public async Task <QuestionResult> Pass(
            ChatRoom chat, UserWordModel word,
            UserWordModel[] examList)
        {
            var(phrase, translation) = word.GetExamplesThatLoadedAndFits().GetRandomItemOrNull();
            if (phrase == null)
            {
                return(QuestionResult.Impossible);
            }
            var(enPhrase, ruPhrase) = phrase.Deconstruct();
            var replacedRuPhrase = ruPhrase.Replace(phrase.TranslatedWord, "\\.\\.\\.");

            if (replacedRuPhrase == ruPhrase)
            {
                return(QuestionResult.Impossible);
            }

            await chat.SendMarkdownMessageAsync(
                QuestionMarkups.TranslatesAsTemplate(
                    enPhrase,
                    chat.Texts.translatesAs,
                    replacedRuPhrase,
                    chat.Texts.EnterMissingWord + ":"));

            var enter = await chat.WaitNonEmptyUserTextInputAsync();

            if (!enter.IsRussian())
            {
                await chat.SendMessageAsync(chat.Texts.RussianInputExpected);

                return(QuestionResult.RetryThisQuestion);
            }

            var comparation = translation.Word.CheckCloseness(enter.Trim());

            if (comparation == StringsCompareResult.Equal)
            {
                return(QuestionResult.Passed(chat.Texts));
            }

            //if user enters whole word in phrase- it is ok!
            if (enter.Contains(translation.Word, StringComparison.InvariantCultureIgnoreCase) &&
                phrase.OriginPhrase.Contains(enter, StringComparison.InvariantCultureIgnoreCase))
            {
                return(QuestionResult.Passed(chat.Texts));
            }

            if (comparation == StringsCompareResult.SmallMistakes)
            {
                await chat.SendMessageAsync(chat.Texts.RetryAlmostRightWithTypo);

                return(QuestionResult.RetryThisQuestion);
            }


            return(QuestionResult.Failed($"{chat.Texts.FailedOriginExampleWas2} *\"{phrase.TranslatedPhrase}\"*",
                                         chat.Texts));
        }
Exemplo n.º 3
0
        public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word,
                                                UserWordModel[] examList)
        {
            if (!word.Examples.Any())
            {
                return(QuestionResult.Impossible);
            }

            var phrase = word.GetRandomExample();

            var replaced = phrase.OriginPhrase.Replace(phrase.OriginWord, "\\.\\.\\.");

            if (replaced == phrase.OriginPhrase)
            {
                return(QuestionResult.Impossible);
            }

            var variants = examList
                           .Where(p => !p.Examples.Select(e => e.TranslatedPhrase)
                                  .Any(t => t.AreEqualIgnoreCase(phrase.TranslatedPhrase)))
                           .Select(e => e.Word)
                           .Shuffle()
                           .Take(5)
                           .Append(phrase.OriginWord)
                           .Shuffle()
                           .ToArray();

            var _ = await chat.SendMarkdownMessageAsync(
                QuestionMarkups.TranslatesAsTemplate(
                    phrase.TranslatedPhrase,
                    chat.Texts.translatesAs,
                    replaced,
                    chat.Texts.ChooseMissingWord + ":")
                , InlineButtons.CreateVariants(variants));

            var choice = await chat.TryWaitInlineIntKeyboardInput();

            if (choice == null)
            {
                return(QuestionResult.RetryThisQuestion);
            }

            if (variants[choice.Value].AreEqualIgnoreCase(word.Word))
            {
                return(QuestionResult.Passed(chat.Texts.Passed1Markdown,
                                             chat.Texts));
            }

            return(QuestionResult.Failed($"{chat.Texts.OriginWas}:\r\n*\"{phrase.OriginPhrase}\"*",
                                         chat.Texts));
        }
        public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word,
                                                UserWordModel[] examList)
        {
            var translation = examList.SelectMany(e => e.TextTranslations)
                              .Where(e => word.RuTranslations.All(t => t.Word != e))
                              .Shuffle()
                              .Take(1)
                              .Union(word.TextTranslations)
                              .ToList()
                              .GetRandomItemOrNull();

            var msg = QuestionMarkups.TranslatesAsTemplate(
                word.Word,
                chat.Texts.translatesAs,
                translation,
                chat.Texts.IsItRightTranslation);

            await chat.SendMarkdownMessageAsync(msg,
                                                new[] {
                new[] {
                    new InlineKeyboardButton {
                        CallbackData = "1",
                        Text         = chat.Texts.YesButton
                    },
                    new InlineKeyboardButton {
                        CallbackData = "0",
                        Text         = chat.Texts.NoButton
                    }
                }
            });

            var choice = await chat.WaitInlineIntKeyboardInput();

            if (
                choice == 1 && word.TextTranslations.Contains(translation) ||
                choice == 0 && !word.TextTranslations.Contains(translation)
                )
            {
                return(QuestionResult.Passed(chat.Texts));
            }
            else
            {
                return(QuestionResult.Failed(
                           $"{chat.Texts.Mistaken}\\.\r\n\"{word.Word}\" {chat.Texts.translatesAs} " +
                           $"*\"{word.TextTranslations.FirstOrDefault()}\"* ",
                           chat.Texts));
            }
        }