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