public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList) { var originTranslation = word.RuTranslations.ToList().GetRandomItemOrNull(); var variants = examList.SelectMany(e => e.TextTranslations) .Where(e => !word.TextTranslations.Contains(e)) .Distinct() .Shuffle() .Take(5) .Append(originTranslation.Word) .Shuffle() .ToList(); var msg = QuestionMarkups.TranslateTemplate(word.Word, chat.Texts.ChooseTheTranslation); await chat.SendMarkdownMessageAsync(msg, InlineButtons.CreateVariants(variants)); var choice = await chat.TryWaitInlineIntKeyboardInput(); if (choice == null) { return(QuestionResult.RetryThisQuestion); } var selected = variants[choice.Value]; return(word.TextTranslations.Any(t => t.AreEqualIgnoreCase(selected)) ? QuestionResult.Passed(chat.Texts) : QuestionResult.Failed(chat.Texts)); }
public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList) { var translations = string.Join(", ", word.TextTranslations.Shuffle().Take(3)); var variants = examList .Where(e => e.AllTranslationsAsSingleString != word.AllTranslationsAsSingleString) .Select(e => string.Join(", ", e.TextTranslations.Shuffle().Take(3))) .Shuffle() .Take(5) .Append(translations) .ToList(); var msg = QuestionMarkups.TranslateTemplate(word.Word, chat.Texts.ChooseTheTranslation); await chat.SendMarkdownMessageAsync(msg, InlineButtons.CreateVariants(variants)); var choice = await chat.TryWaitInlineIntKeyboardInput(); if (choice == null) { return(QuestionResult.RetryThisQuestion); } var answer = variants[choice.Value].Split(",") .Select(e => e.Trim()).ToList(); return(!answer.Except(word.TextTranslations).Any() ? QuestionResult.Passed(chat.Texts) : QuestionResult.Failed(chat.Texts)); }
public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList) { var msg = QuestionMarkups.TranslateTemplate(word.AllTranslationsAsSingleString, chat.Texts.DoYouKnowTranslationMarkdown); var id = Rand.Next(); await chat.SendMarkdownMessageAsync(msg, new InlineKeyboardButton() { CallbackData = id.ToString(), Text = chat.Texts.ShowTheTranslationButton }); while (true) { var update = await chat.WaitUserInputAsync(); if (update.CallbackQuery?.Data == id.ToString()) { break; } var input = update.Message?.Text; if (!string.IsNullOrWhiteSpace(input)) { if (word.Word.AreEqualIgnoreCase(input)) { return(QuestionResult.Passed(chat.Texts)); } await chat.SendMessageAsync(chat.Texts.ItIsNotRightTryAgain); } } await chat.SendMarkdownMessageAsync($"_{chat.Texts.TranslationIs} _\r\n" + $"*\"{word.Word}\"*\r\n\r\n" + $"{chat.Texts.DidYouGuess}", new[] { new[] { new InlineKeyboardButton { CallbackData = "1", Text = chat.Texts.YesButton }, new InlineKeyboardButton { CallbackData = "0", Text = chat.Texts.NoButton } } } ); var choice = await chat.WaitInlineIntKeyboardInput(); return(choice == 1 ? QuestionResult.Passed( chat.Texts.PassedOpenIHopeYouWereHonestMarkdown, chat.Texts.PassedHideousWell2) : QuestionResult.Failed( chat.Texts.FailedOpenButYouWereHonestMarkdown, chat.Texts.FailedHideousHonestyIsGoldMarkdown)); }
public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList) { if (!word.Examples.Any()) { return(QuestionResult.Impossible); } var targetPhrase = word.GetRandomExample(); var other = examList.SelectMany(e => e.Examples) .Where(p => !string.IsNullOrWhiteSpace(p?.OriginPhrase) && p.TranslatedPhrase != targetPhrase.TranslatedPhrase) .Shuffle() .Take(5) .ToArray(); if (!other.Any()) { return(QuestionResult.Impossible); } var variants = other .Append(targetPhrase) .Shuffle() .Select(e => e.OriginPhrase) .ToArray(); var msg = QuestionMarkups.TranslateTemplate(targetPhrase.TranslatedPhrase, chat.Texts.ChooseTheTranslation); await chat.SendMarkdownMessageAsync(msg, variants.Select((v, i) => new InlineKeyboardButton { CallbackData = i.ToString(), Text = v }).ToArray()); var choice = await chat.TryWaitInlineIntKeyboardInput(); if (choice == null) { return(QuestionResult.RetryThisQuestion); } return(variants[choice.Value].AreEqualIgnoreCase(targetPhrase.OriginPhrase) ? QuestionResult.Passed(chat.Texts) : QuestionResult.Failed(chat.Texts)); }
public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList) { if (!word.HasAnyExamples) { return(QuestionResult.Impossible); } var targetPhrase = word.GetRandomExample(); var otherExamples = examList .SelectMany(e => e.Examples) .Where(p => !p.TranslatedPhrase.AreEqualIgnoreCase(targetPhrase.TranslatedPhrase)) .Shuffle() .Take(5) .ToArray(); if (!otherExamples.Any()) { return(QuestionResult.Impossible); } var variants = otherExamples .Append(targetPhrase) .Select(e => e.TranslatedPhrase) .Shuffle() .ToArray(); var msg = QuestionMarkups.TranslateTemplate(targetPhrase.OriginPhrase, chat.Texts.ChooseTheTranslation); await chat.SendMarkdownMessageAsync(msg, InlineButtons.CreateVariants(variants)); var choice = await chat.TryWaitInlineIntKeyboardInput(); if (choice == null) { return(QuestionResult.RetryThisQuestion); } return(variants[choice.Value].AreEqualIgnoreCase(targetPhrase.TranslatedPhrase) ? QuestionResult.Passed(chat.Texts) : QuestionResult.Failed(chat.Texts)); }
public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList) { var originalTranslation = word.RuTranslations.GetRandomItemOrNull(); if (originalTranslation == null || !originalTranslation.HasTranscription) { return(QuestionResult.Impossible); } var variants = examList .SelectMany(e => e.RuTranslations) .Select(e => e.Transcription) .Where(e => word.RuTranslations.All(t => t.Transcription != e)) .Distinct() .Shuffle() .Take(5) .Append(originalTranslation.Transcription) .Where(w => w != null) .Shuffle() .ToList(); if (variants.Count <= 1) { return(QuestionResult.Impossible); } var msg = QuestionMarkups.TranslateTemplate(word.Word, chat.Texts.ChooseTheTranscription); await chat.SendMarkdownMessageAsync(msg, InlineButtons.CreateVariants(variants)); var choice = await chat.TryWaitInlineIntKeyboardInput(); if (choice == null) { return(QuestionResult.RetryThisQuestion); } return(word.RuTranslations.Any(t => t.Transcription == variants[choice.Value]) ? QuestionResult.Passed(chat.Texts) : QuestionResult.Failed(chat.Texts)); }
public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList) { var variants = examList.Where(e => e.AllTranslationsAsSingleString != word.AllTranslationsAsSingleString) .Select(e => e.Word) .Take(5) .Append(word.Word) .Shuffle() .ToArray(); var msg = QuestionMarkups.TranslateTemplate(word.AllTranslationsAsSingleString, chat.Texts.ChooseTheTranslation); await chat.SendMarkdownMessageAsync(msg, InlineButtons.CreateVariants(variants)); var choice = await chat.TryWaitInlineIntKeyboardInput(); if (choice == null) { return(QuestionResult.RetryThisQuestion); } return(variants[choice.Value].AreEqualIgnoreCase(word.Word) ? QuestionResult.Passed(chat.Texts) : QuestionResult.Failed(chat.Texts)); }
public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList) { var translations = word.TextTranslations.ToArray(); var minCount = translations.Min(t => t.Count(c => c == ' ')); if (minCount > 0 && word.AbsoluteScore < minCount * WordLeaningGlobalSettings.FamiliarWordMinScore) { return(QuestionResult.Impossible); } await chat.SendMarkdownMessageAsync(QuestionMarkups.TranslateTemplate(word.Word, chat.Texts.WriteTheTranslationMarkdown)); var entry = await chat.WaitUserTextInputAsync(); if (string.IsNullOrEmpty(entry)) { return(QuestionResult.RetryThisQuestion); } if (!entry.IsRussian()) { await chat.SendMessageAsync(chat.Texts.RussianInputExpected); return(QuestionResult.RetryThisQuestion); } var(text, comparation) = translations.GetClosestTo(entry.Trim()); switch (comparation) { case StringsCompareResult.Equal: return(QuestionResult.Passed(chat.Texts)); case StringsCompareResult.SmallMistakes: await chat.SendMarkdownMessageAsync(chat.Texts.YouHaveATypoLetsTryAgainMarkdown(text)); return(QuestionResult.RetryThisQuestion); case StringsCompareResult.BigMistakes: return(QuestionResult.Failed(chat.Texts.FailedMistakenMarkdown(text), chat.Texts)); } var allMeaningsOfWord = await _localDictionaryService.GetAllTranslationWords(word.Word); var(otherMeaning, otherComparation) = allMeaningsOfWord.GetClosestTo(entry); if (otherComparation == StringsCompareResult.Equal) { await chat.SendMarkdownMessageAsync( $"{chat.Texts.OutOfScopeTranslationMarkdown}: " + $"*{word.AllTranslationsAsSingleString}*"); return(QuestionResult.RetryThisQuestion); } if (otherComparation == StringsCompareResult.SmallMistakes) { await chat.SendMarkdownMessageAsync( chat.Texts.OutOfScopeWithCandidateMarkdown(otherMeaning) + ": " + "*\"" + word.AllTranslationsAsSingleString + "\"*"); return(QuestionResult.RetryThisQuestion); } return(QuestionResult.Failed( chat.Texts.FailedTranslationWasMarkdown + $"\r\n*\"{word.AllTranslationsAsSingleString}\"*", chat.Texts)); }
public static async Task <QuestionResult> PassRuWriteQuestion( ChatRoom chat, UserWordModel word, string ruTranslationCaption, LocalDictionaryService localDictionaryService) { var wordsInPhraseCount = word.Word.Count(c => c == ' '); if (wordsInPhraseCount > 0 && word.AbsoluteScore < wordsInPhraseCount * WordLeaningGlobalSettings.FamiliarWordMinScore) { return(QuestionResult.Impossible); } await chat.SendMarkdownMessageAsync( QuestionMarkups.TranslateTemplate(ruTranslationCaption, chat.Texts.WriteTheTranslationMarkdown)); var enUserEntry = await chat.WaitUserTextInputAsync(); if (string.IsNullOrEmpty(enUserEntry)) { return(QuestionResult.RetryThisQuestion); } if (enUserEntry.IsRussian()) { await chat.SendMessageAsync(chat.Texts.EnglishInputExpected); return(QuestionResult.RetryThisQuestion); } var comparation = word.Word.CheckCloseness(enUserEntry); if (comparation == StringsCompareResult.Equal) { return(QuestionResult.Passed(chat.Texts)); } if (comparation == StringsCompareResult.SmallMistakes) { await chat.SendMarkdownMessageAsync(chat.Texts.YouHaveATypoLetsTryAgainMarkdown(word.Word)); return(QuestionResult.RetryThisQuestion); } if (comparation == StringsCompareResult.BigMistakes) { return(QuestionResult.Failed(chat.Texts.FailedMistakenMarkdown(word.Word), chat.Texts.Mistaken)); } // ## Other translation case ## // example: // Coefficient - коэффициент // Rate - коэффициент // Question is about 'коэффициент' (Coefficient) // User answers 'Rate' // Search for 'Rate' translations var otherRuTranslationsOfUserInput = await localDictionaryService.GetAllTranslationWords(enUserEntry.ToLower()); // if otherRuTranslationsOfUserInput contains 'коэффициент' or something like it // then retry question var russianTranslations = word.TextTranslations; if (russianTranslations.Any( t1 => otherRuTranslationsOfUserInput.Any(t1.AreEqualIgnoreSmallMistakes))) { //translation is correct, but for other word await chat.SendMessageAsync( $"{chat.Texts.CorrectTranslationButQuestionWasAbout} \"{word.Word}\" - *{word.AllTranslationsAsSingleString}*'\r\n" + chat.Texts.LetsTryAgain); return(QuestionResult.RetryThisQuestion); } var translates = string.Join(",", otherRuTranslationsOfUserInput); string failedMessage = ""; if (!string.IsNullOrWhiteSpace(translates)) { failedMessage = $"{enUserEntry} {chat.Texts.translatesAs} {translates}\r\n"; } failedMessage += $"{chat.Texts.RightTranslationWas}: *\"{word.Word}\"*"; return(QuestionResult.Failed( failedMessage, chat.Texts)); }