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));
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        public async Task <ExamResult> Pass(ChatIO chatIo, UsersWordsService service, UserWordModel word,
                                            UserWordModel[] examList)
        {
            var variants = examList.Randomize().SelectMany(e => e.GetTranslations()).ToArray();

            var msg = $"=====>   {word.Word}    <=====\r\n" +
                      $"Choose the translation";
            await chatIo.SendMessageAsync(msg, InlineButtons.CreateVariants(variants));

            var choice = await chatIo.TryWaitInlineIntKeyboardInput();

            if (choice == null)
            {
                return(ExamResult.Retry);
            }

            if (word.GetTranslations().Contains(variants[choice.Value]))
            {
                await service.RegisterSuccess(word);

                return(ExamResult.Passed);
            }

            await service.RegisterFailure(word);

            return(ExamResult.Failed);
        }
        public async Task <QuestionResult> Pass(ChatRoom chat, UserWordModel word, UserWordModel[] examList)
        {
            var originTranslation = word.RuTranslations.GetRandomItemOrNull();

            if (string.IsNullOrWhiteSpace(originTranslation.Transcription) || originTranslation.Transcription != "")
            {
                return(QuestionResult.Impossible);
            }

            var variants = examList.Where(e => e.RuTranslations.All(t => t.Transcription != originTranslation.Transcription))
                           .SelectMany(e => e.TextTranslations)
                           .Take(5)
                           .Append(originTranslation.Word)
                           .Shuffle()
                           .ToList();


            var msg = QuestionMarkups.TranscriptionTemplate(originTranslation.Transcription, chat.Texts.ChooseWhichWordHasThisTranscription);
            await chat.SendMarkdownMessageAsync(msg, InlineButtons.CreateVariants(variants));

            var choice = await chat.TryWaitInlineIntKeyboardInput();

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

            if (word.TextTranslations.Contains(variants[choice.Value]))
            {
                return(QuestionResult.Passed(chat.Texts));
            }
            return(QuestionResult.Failed(chat.Texts));
        }
Esempio n. 5
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));
        }
Esempio n. 6
0
 public Task Execute(string argument, ChatRoom chat) =>
 chat.SendMarkdownMessageAsync(
     StatsRenderer.GetStatsText(_settings, chat).EscapeForMarkdown(),
     new[] {
     new[] {
         InlineButtons.MainMenu($"{Emojis.MainMenu} {chat.Texts.MainMenuButton}"),
         InlineButtons.Exam($"{chat.Texts.LearnButton} {Emojis.Learning}"),
     },
     new[] { InlineButtons.Translation($"{chat.Texts.TranslateButton} {Emojis.Translate}") },
     new[] {
         InlineButtons.WellLearnedWords(
             $"{chat.Texts.ShowWellKnownWords} ({chat.User.CountOf((int)WordLeaningGlobalSettings.LearnedWordMinScore, 10)}) {Emojis.SoftMark}")
     }
 });
Esempio n. 7
0
        public async Task <ExamResult> Pass(
            ChatIO chatIo,
            UsersWordsService service,
            UserWordModel word,
            UserWordModel[] examList)
        {
            if (!word.HasAnyPhrases)
            {
                return(ExamResult.Impossible);
            }

            var targetPhrase = word.GetRandomExample();

            var otherExamples = examList
                                .SelectMany(e => e.Phrases)
                                .Where(p => p != targetPhrase)
                                .Take(8).ToArray();

            if (!otherExamples.Any())
            {
                return(ExamResult.Impossible);
            }

            var variants = otherExamples
                           .Append(targetPhrase)
                           .Randomize()
                           .Select(e => e.TranslatedPhrase)
                           .ToArray();

            var msg = $"=====>   {targetPhrase.OriginPhrase}    <=====\r\n" +
                      $"Choose the translation";
            await chatIo.SendMessageAsync(msg, InlineButtons.CreateVariants(variants));

            var choice = await chatIo.TryWaitInlineIntKeyboardInput();

            if (choice == null)
            {
                return(ExamResult.Retry);
            }

            if (variants[choice.Value] == targetPhrase.TranslatedPhrase)
            {
                await service.RegisterSuccess(word);

                return(ExamResult.Passed);
            }
            await service.RegisterFailure(word);

            return(ExamResult.Failed);
        }
        private IEnumerable <InlineKeyboardButton[]> CreateButtons()
        {
            var buttons = _translations.Select((t, i) => new[] { AddWordHelper.CreateButtonFor(t, _areSelected[i]) });

            if (_isLastMessageInTheChat)
            {
                buttons = buttons
                          .Append(new[]
                {
                    InlineButtons.MainMenu($"{Emojis.MainMenu} {Chat.Texts.MainMenuButton}"),
                    InlineButtons.Translation($"{Chat.Texts.ContinueTranslateButton} {Emojis.Translate}")
                });
            }
            return(buttons);
        }
Esempio n. 9
0
        public async Task <ExamResult> Pass(ChatIO chatIo, UsersWordsService service, UserWordModel word, UserWordModel[] examList)
        {
            if (!word.Phrases.Any())
            {
                return(ExamResult.Impossible);
            }

            var phrase = word.GetRandomExample();

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

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

            var sb = new StringBuilder();

            sb.AppendLine($"\"{phrase.TranslatedPhrase}\"");
            sb.AppendLine();
            sb.AppendLine($" translated as ");
            sb.AppendLine();
            sb.AppendLine($"\"{replaced}\"");
            sb.AppendLine($"Choose missing word...");

            var variants = examList.Randomize().Select(e => e.Word).ToArray();
            var _        = chatIo.SendMessageAsync(sb.ToString(), InlineButtons.CreateVariants(variants));

            var choice = await chatIo.TryWaitInlineIntKeyboardInput();

            if (choice == null)
            {
                return(ExamResult.Retry);
            }

            if (variants[choice.Value] == word.Word)
            {
                await service.RegisterSuccess(word);

                return(ExamResult.Passed);
            }

            await chatIo.SendMessageAsync($"Origin was: \"{phrase.OriginPhrase}\"");

            await service.RegisterFailure(word);

            return(ExamResult.Failed);
        }
Esempio n. 10
0
 private InlineKeyboardButton[][] GetWordKeyboard() =>
 new[] {
     new[] {
         new InlineKeyboardButton {
             CallbackData = selectLearningSetData,
             Text         = $"{Emojis.HeavyPlus} {Chat.Texts.SelectWordInLearningSet}"
         }
     },
     new[] {
         new InlineKeyboardButton {
             CallbackData = moveNextData,
             Text         = $"{Emojis.SoftNext}  {Chat.Texts.Skip}"
         },
     },
     new[] {
         InlineButtons.MainMenu($"{Emojis.MainMenu} {Chat.Texts.MainMenuButton}"),
     }
 };
Esempio n. 11
0
        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));
        }
Esempio n. 12
0
        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));
        }
Esempio n. 13
0
        public async Task <ExamResult> Pass(Chat chat, NewWordsService service, PairModel word, PairModel[] examList)
        {
            var variants = examList.Randomize().Select(e => e.Translation).ToArray();

            var msg = $"=====>   {word.OriginWord}    <=====\r\nChoose the translation";
            await chat.SendMessage(msg, InlineButtons.CreateVariants(variants));

            var choice = await chat.TryWaitInlineIntKeyboardInput();

            if (choice == null)
            {
                return(ExamResult.Retry);
            }

            if (variants[choice.Value] == word.Translation)
            {
                service.RegistrateSuccess(word);
                return(ExamResult.Passed);
            }
            service.RegistrateFailure(word);
            return(ExamResult.Failed);
        }
Esempio n. 14
0
        public async Task Handle(Update update)
        {
            if (_pages.Count == 0)
            {
                await Chat.ConfirmCallback(update.CallbackQuery.Id);

                return;
            }

            if (update.CallbackQuery.Data == WellKnownWordsHelper.PrevData)
            {
                _pages.MovePrev();
            }
            else
            {
                _pages.MoveNext();
            }

            var msg = new StringBuilder();

            foreach (var word in _pages.Current)
            {
                msg.Append($"{Emojis.SoftMark} *{word.Word}:* {word.AllTranslationsAsSingleString}\r\n");
            }

            msg.Append(Chat.Texts.PageXofYMarkdown(_pages.Page + 1, _pages.Count));

            await Chat.EditMessageTextMarkdown(
                update.CallbackQuery.Message.MessageId,
                msg.ToString(),
                new[] {
                WellKnownWordsHelper.GetPagingKeys(),
                new[] {
                    InlineButtons.MainMenu($"{Emojis.MainMenu} {Chat.Texts.MainMenuButton}"),
                }
            });

            await Chat.ConfirmCallback(update.CallbackQuery.Id);
        }
Esempio n. 15
0
        private async Task SendExamResultToUser(
            UserWordModel[] distinctLearningWords, Dictionary <string, double> originWordsScore, int questionsPassed, int questionsCount,
            UserWordModel[] learningWords, double gamingScoreBefore)
        {
            var doneMessage = CreateLearningResultsMessage(
                distinctLearningWords,
                originWordsScore,
                questionsPassed,
                questionsCount,
                learningWords,
                gamingScoreBefore);

            await Chat.SendMarkdownMessageAsync(
                doneMessage.EscapeForMarkdown(),
                new[] {
                new[] { InlineButtons.Exam($"🔁 {Chat.Texts.OneMoreLearnButton}") },
                new[] {
                    InlineButtons.Stats(Chat.Texts),
                    InlineButtons.Translation(Chat.Texts.TranslateButton + " " + Emojis.Translate)
                }
            });
        }
Esempio n. 16
0
        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));
        }
Esempio n. 17
0
        public async Task <ExamResult> Pass(Chat chat, NewWordsService service, PairModel word, PairModel[] examList)
        {
            if (!word.Phrases.Any())
            {
                return(ExamResult.Impossible);
            }

            var targetPhrase = word.Phrases.GetRandomItem();

            var other = examList.SelectMany(e => e.Phrases)
                        .Where(p => !string.IsNullOrWhiteSpace(p?.Origin) && p != targetPhrase)
                        .Take(8);

            if (!other.Any())
            {
                return(ExamResult.Impossible);
            }

            var variants = other
                           .Append(targetPhrase)
                           .Randomize()
                           .Select(e => e.Translation)
                           .ToArray();

            var msg = $"=====>   {targetPhrase.Origin}    <=====\r\nChoose the translation";
            await chat.SendMessage(msg, InlineButtons.CreateVariants(variants));

            var choice = await chat.TryWaitInlineIntKeyboardInput();

            if (choice == null)
            {
                return(ExamResult.Retry);
            }

            if (variants[choice.Value] == targetPhrase.Translation)
            {
                service.RegistrateSuccess(word);
                return(ExamResult.Passed);
            }
            service.RegistrateFailure(word);
            return(ExamResult.Failed);



            /*
             * Console.WriteLine("=====>   " + targetPhrase.Origin + "    <=====");
             *
             * for (int i = 1; i <= variants.Length; i++)
             * {
             *  Console.WriteLine($"{i}: " + variants[i - 1]);
             * }
             *
             * Console.Write("Choose the translation: ");
             *
             * var selected = Console.ReadLine();
             * if (selected.ToLower().StartsWith("e"))
             *  return ExamResult.Exit;
             *
             * if (!int.TryParse(selected, out var selectedIndex) || selectedIndex > variants.Length ||
             *  selectedIndex < 1)
             *  return ExamResult.Retry;
             *
             * if (variants[selectedIndex - 1] == targetPhrase.Translation)
             * {
             *  service.RegistrateSuccess(word);
             *  return ExamResult.Passed;
             * }
             * service.RegistrateFailure(word);
             * return ExamResult.Failed;*/
        }
        public async Task EnterAsync()
        {
            var wellKnownWords = (await _usersWordsService.GetAllWords(Chat.User))
                                 .Where(u => u._absoluteScore >= 4)
                                 .ToArray();
            var paginationForWords = new List <List <UserWordModel> >();
            var i = 0;

            while (i < wellKnownWords.Length)
            {
                paginationForWords.Add(wellKnownWords.Skip(i).Take(10).ToList());
                i += 10;
            }

            var msg = new StringBuilder();

            msg.Append("*");

            if (!wellKnownWords.Any())
            {
                msg.Append(Chat.Texts.NoWellKnownWords);
            }
            else if (wellKnownWords.Length == 1)
            {
                msg.Append(Chat.Texts.JustOneLearnedWord);
            }
            else if (wellKnownWords.Length <= 4)
            {
                msg.Append(Chat.Texts.LearnSomeWordsMarkdown(wellKnownWords.Length));
            }
            else
            {
                msg.Append(Chat.Texts.LearnMoreWordsMarkdown(wellKnownWords.Length));
            }

            msg.Append("*\r\n\r\n");

            if (wellKnownWords.Length == 0)
            {
                return;
            }
            var msgWithWords = new StringBuilder();

            foreach (var word in paginationForWords[0])
            {
                msgWithWords.Append(
                    $"{Emojis.SoftMark} *{word.Word}:* {word.AllTranslationsAsSingleString}\r\n");
            }

            if (paginationForWords.Count > 1)
            {
                msgWithWords.Append(Chat.Texts.PageXofYMarkdown(1, paginationForWords.Count));
            }


            InlineKeyboardButton[][] buttons = null;
            if (paginationForWords.Count > 1)
            {
                _wellKnownWordsUpdateHook.SetWellKnownWords(paginationForWords);
                _wellKnownWordsUpdateHook.SetNumberOfPaginate(0);
                _wellKnownWordsUpdateHook.SetBeginningMessage(msg.ToString());

                buttons = new[] {
                    WellKnownWordsHelper.GetPagingKeys(),
                    new[] {
                        InlineButtons.MainMenu($"{Emojis.MainMenu} {Chat.Texts.MainMenuButton}")
                    }
                };
            }
            else
            {
                buttons = new[] {
                    new[] { InlineButtons.MainMenu($"{Chat.Texts.TranslateButton} {Emojis.Translate}") }
                }
            };

            await Chat.ChatIo.SendMarkdownMessageAsync(msgWithWords.ToString(), buttons);
        }
    }
Esempio n. 19
0
        private async Task <bool> EnterSingleWordAsync(User user, string?word = null)
        {
            if (word == null)
            {
                await _chatIo.SendMessageAsync("Enter english word", new InlineKeyboardButton
                {
                    CallbackData = "/start",
                    Text         = "Cancel"
                });

                while (true)
                {
                    var input = await _chatIo.WaitUserInputAsync();

                    if (input.CallbackQuery != null && input.CallbackQuery.Data == "/start")
                    {
                        throw new ProcessInterruptedWithMenuCommand("/start");
                    }

                    if (!string.IsNullOrEmpty(input.Message?.Text))
                    {
                        word = input.Message.Text;
                        break;
                    }
                }
            }

            //find word in local dictionary(if not, find it in Ya dictionary)
            var translations = await _addWordService.FindInDictionaryWithoutExamples(word);

            if (!translations.Any())
            {
                translations = await _addWordService.TranslateAndAddToDictionary(word);
            }
            if (translations?.Any() != true)
            {
                await _chatIo.SendMessageAsync("No translations found. Check the word and try again");

                return(true);
            }

            await _chatIo.SendMessageAsync($"Choose translation for '{word}'",
                                           InlineButtons.CreateVariantsWithCancel(translations.Select(t => t.RuWord)));

            await _addWordService.RegistrateTranslationRequest(user);

            while (true)
            {
                var input = await _chatIo.TryWaitInlineIntKeyboardInput();

                if (!input.HasValue)
                {
                    return(false);
                }
                if (input !.Value < 0 || input.Value >= translations.Count)
                {
                    continue;
                }

                var selected = translations[input.Value];
                await _addWordService.AddWordsToUser(user, new[] { selected });

                if (selected.Examples.Count > 0)
                {
                    await _chatIo.SendMessageAsync($"Saved. Examples: {selected.Examples.Count}");
                }
                else
                {
                    await _chatIo.SendMessageAsync($"Saved.");
                }
                return(true);
            }
        }
Esempio n. 20
0
        async Task <bool> EnterSingleWord(string?word = null)
        {
            if (word == null)
            {
                await _chat.SendMessage("Enter english word", new InlineKeyboardButton
                {
                    CallbackData = "/exit",
                    Text         = "Cancel"
                });

                while (true)
                {
                    var input = await _chat.WaitUserInput();

                    if (input.CallbackQuery != null && input.CallbackQuery.Data == "/exit")
                    {
                        throw new ProcessInteruptedWithMenuCommand("/start");
                    }

                    if (!string.IsNullOrEmpty(input.Message.Text))
                    {
                        word = input.Message.Text;
                        break;
                    }
                }
            }

            YaDefenition[]? definitions = null;
            if (_yapiDicClient.IsOnline)
            {
                definitions = await _yapiDicClient.Translate(word);
            }

            var translations = new List <TranslationAndContext>();

            if (definitions?.Any() == true)
            {
                var variants = definitions.SelectMany(r => r.Tr);
                foreach (var yandexTranslation in variants)
                {
                    var phrases = yandexTranslation.GetPhrases(word);

                    translations.Add(new TranslationAndContext(word, yandexTranslation.Text,
                                                               yandexTranslation.Pos, phrases.ToArray()));
                }
            }
            else
            {
                var dictionaryMatch = _wordService.GetTranslations(word);
                if (dictionaryMatch != null)
                {
                    translations.AddRange(
                        dictionaryMatch.Translations.Select(t =>
                                                            new TranslationAndContext(dictionaryMatch.Origin, t, dictionaryMatch.Transcription,
                                                                                      new Phrase[0])));
                }
            }

            if (!translations.Any())
            {
                try
                {
                    var translateResponse = await _yapiTransClient.Translate(word);

                    if (string.IsNullOrWhiteSpace(translateResponse))
                    {
                        await _chat.SendMessage("No translations found. Check the word and try again");
                    }
                    else
                    {
                        translations.Add(new TranslationAndContext(word, translateResponse, null,
                                                                   new Phrase[0]));
                    }
                }
                catch (Exception)
                {
                    await _chat.SendMessage("No translations found. Check the word and try again");
                }
            }

            if (!translations.Any())
            {
                return(true);
            }

            await _chat.SendMessage($"Choose translation for '{word}'",
                                    InlineButtons.CreateVariants(translations.Select(t => t.Translation)));

            while (true)
            {
                var input = await _chat.TryWaitInlineIntKeyboardInput();

                if (!input.HasValue)
                {
                    return(false);
                }
                if (input.Value >= 0 && input.Value < translations.Count)
                {
                    var selected = translations[input.Value];
                    //var allTranslations = results.Select(t => t.Translation).ToArray();
                    var allPhrases = selected.Phrases; // results.SelectMany(t => t.Phrases).ToArray();
                    _wordService.SaveForExams(
                        word: word,
                        transcription: translations[0].Transcription,
                        translations: new[] { selected.Translation },
                        allMeanings: translations.Select(t => t.Translation.Trim().ToLower()).ToArray(),
                        phrases: allPhrases);
                    await _chat.SendMessage($"Saved. Translations: {1}, Phrases: {allPhrases.Length}");

                    return(true);
                }
            }
        }