private async Task AfterLessonFinished(IDialogContext context, IAwaitable <string> result)
        {
            // TODO: inject dependency
            var badgeRepository = new Gamification.BadgeRepository();
            var updatedProfile  = GetUserGamerProfile(context);
            var user            = context.GetUserData();

            updatedProfile.Points += _pointsPerLesson;
            var newBadges = badgeRepository.GetEligibleBadges(updatedProfile, _userPointsBeforeLessonPlan);

            updatedProfile.Badges.AddRange(newBadges);

            if (newBadges != null && newBadges.Any())
            {
                var tasks = newBadges.Select(async badge =>
                {
                    AdaptiveCard adaptiveCard = new AdaptiveCard()
                    {
                        Body = new List <CardElement>()
                        {
                            new Image()
                            {
                                Size = ImageSize.Medium,
                                Url  = "https://www.kastatic.org/images/badges/meteorite/thumbs-up-512x512.png"
                            },
                            new TextBlock()
                            {
                                Text = await MessageTranslator.TranslateTextAsync($"You unlocked {badge}", user?.NativeLanguageIsoCode),
                                Size = TextSize.Large,
                                Wrap = true
                            }
                        }
                    };

                    Attachment attachment = new Attachment()
                    {
                        ContentType = AdaptiveCard.ContentType,
                        Content     = adaptiveCard
                    };

                    var reply = context.MakeMessage();
                    reply.Attachments.Add(attachment);

                    await context.PostAsync(reply, CancellationToken.None);
                });

                await Task.WhenAll(tasks);
            }

            // The current lesson finished. Plug in Analytics.
            var finalMessage = await result;
            await context.PostAsync(finalMessage);

            // Refactor
            var updatedUserData = context.GetUserData();

            updatedUserData.GamerProfile = updatedProfile;
            context.UpdateUserData(updatedUserData);
            context.Done(string.Empty);
        }
        private async Task AskToStartLessonPlan(IDialogContext context)
        {
            var possibleResponses = new List <string>()
            {
                BotPersonality.GetStartLessonPlanQuestion(),
                BotPersonality.BotResponseToGibberish
            };

            IReadOnlyCollection <string> translatedResponses;
            string language;

            if (context.UserData.TryGetValue(Constants.Shared.UserLanguageCodeKey, out language) && language != MessageTranslator.DEFAULT_LANGUAGE)
            {
                translatedResponses = await MessageTranslator.TranslateTextAsync(possibleResponses, language);
            }
            else
            {
                translatedResponses = possibleResponses;
            }

            PromptDialog.Confirm(
                context,
                TryStartLessonPlan,
                translatedResponses.ElementAtOrDefault(0) ?? string.Empty,
                translatedResponses.ElementAtOrDefault(1) ?? string.Empty);
        }
        public async Task StartAsync(IDialogContext context)
        {
            var _oldGamerProfile = GetUserGamerProfile(context);

            _userPointsBeforeLessonPlan = _oldGamerProfile.Points;
            var    user             = context.GetUserData();
            string friendlyUserName = user?.UserName;

            ICollection <string> lessonTitle = new List <string>();

            // get up to 5 lessons
            int i = 0;

            foreach (Lesson lesson in LessonPlanModule.LessonPlan.Lessons)
            {
                if (i >= 7)
                {
                    break;
                }

                //var lessonInNativaLanguage = await MessageTranslator.TranslateTextAsync(lesson.LessonTitle, user?.NativeLanguageIsoCode);
                lessonTitle.Add(lesson.LessonTitle);
                i++;
            }

            var questionInNativeLanguage = await MessageTranslator.TranslateTextAsync($"Which lesson would you like to start?", user?.NativeLanguageIsoCode);

            PromptDialog.Choice(
                context,
                this.AfterLessonSelected,
                lessonTitle,
                $"{questionInNativeLanguage}",
                Shared.DoNotUnderstand,
                attempts: Shared.MaxPromptAttempts);
        }
        public static async Task PostTranslatedAsync(this IDialogContext context, string message, bool sendTyping = true, int delay = 0)
        {
            if (sendTyping)
            {
                if (delay == 0)
                {
                    //generate random delay from 1 second to 4 seconds...
                    delay = rnd.Next(1, 4) * 1000;
                }

                await PostTypingAsync(context, delay);
            }

            string language;

            if (context.UserData.TryGetValue(Constants.Shared.UserLanguageCodeKey, out language) && language != MessageTranslator.DEFAULT_LANGUAGE)
            {
                var translatedMessage = await MessageTranslator.TranslateTextAsync(message, language);

                await context.PostAsync(translatedMessage);

                return;
            }
            else
            {
                await context.PostAsync(message);

                return;
            }
        }
Example #5
0
        private async Task UserNameReceivedInNativeLanguageAsync(IDialogContext context, IAwaitable <IMessageActivity> result)
        {
            IMessageActivity userText          = await result;
            string           userTextInEnglish = await MessageTranslator.TranslateTextAsync(userText.Text);

            userText.Text = userTextInEnglish;
            await context.Forward(_chitChatDialog, this.AfterChitChatComplete, userText, CancellationToken.None);
        }
Example #6
0
        private async Task AfterChoosingLanguageSwitch(IDialogContext context, IAwaitable <object> result)
        {
            var response = await result as string;

            if (response == null)
            {
                await this.StartAsync(context);

                return;
            }

            try
            {
                UserData userData           = _userDataRepository.GetUserData(context.Activity.From.Id);
                var      translatedResponse = await MessageTranslator.TranslateTextAsync(response);

                if (translatedResponse.Equals(Shared.Yes, StringComparison.InvariantCultureIgnoreCase))
                {
                    string translatedSelfIntroduction =
                        await MessageTranslator.TranslateTextAsync(BotPersonality.BotSelfIntroduction,
                                                                   userData.NativeLanguageIsoCode);

                    var introductionResponseTask       = context.PostTranslatedAsync($"{translatedSelfIntroduction}");
                    var translatedUserNameQuestionTask =
                        MessageTranslator.TranslateTextAsync(BotPersonality.UserNameQuestion,
                                                             userData.NativeLanguageIsoCode);
                    await Task.WhenAll(introductionResponseTask, translatedUserNameQuestionTask);

                    await context.PostTranslatedAsync(translatedUserNameQuestionTask.Result);

                    context.Wait(this.UserNameReceivedInNativeLanguageAsync);
                }
                else
                {
                    context.UserData.SetValue(Constants.Shared.UserLanguageCodeKey, MessageTranslator.DEFAULT_LANGUAGE);
                    await context.PostTranslatedAsync($"{BotPersonality.UserNameQuestion}");

                    context.Wait(this.UserNameReceivedAsync);
                }
            }
            catch (TooManyAttemptsException)
            {
                UserData userData = _userDataRepository.GetUserData(context.Activity.From.Id);

                string translatedTooManyAttemptMessage = await MessageTranslator.TranslateTextAsync(Shared.TooManyAttemptMessage, userData.NativeLanguageIsoCode);

                await Task.WhenAll(context.PostTranslatedAsync($"{translatedTooManyAttemptMessage}"),
                                   this.StartAsync(context));
            }
        }
        private async Task AfterChoosingLanguageSwitch(IDialogContext context, IAwaitable <object> result)
        {
            var response = await result as string;

            if (response == null)
            {
                await this.StartAsync(context);

                return;
            }

            try
            {
                var      detectedLanguage   = context.UserData.GetValue <string>(Constants.Shared.UserLanguageCodeKey);
                UserData userData           = context.GetUserData();
                var      translatedResponse = await MessageTranslator.TranslateTextAsync(response);

                if (translatedResponse.Equals(Shared.Yes, StringComparison.InvariantCultureIgnoreCase))
                {
                    userData.NativeLanguageIsoCode = detectedLanguage;
                    var englishName = CultureInfo.GetCultureInfo(userData.NativeLanguageIsoCode).EnglishName;

                    string translatedSelfIntroduction =
                        await MessageTranslator.TranslateTextAsync(string.Format(BotPersonality.BotLanguageIntroduction, englishName), userData.NativeLanguageIsoCode);

                    var introductionResponseTask       = context.PostTranslatedAsync($"{translatedSelfIntroduction}");
                    var translatedUserNameQuestionTask =
                        MessageTranslator.TranslateTextAsync(BotPersonality.UserNameQuestion,
                                                             userData.NativeLanguageIsoCode);
                    await Task.WhenAll(introductionResponseTask, translatedUserNameQuestionTask);

                    await context.PostTranslatedAsync(translatedUserNameQuestionTask.Result);

                    context.UpdateUserData(userData);
                    await EngageWithUser(context);
                }
            }
            catch (TooManyAttemptsException)
            {
                UserData userData = context.GetUserData();

                string translatedTooManyAttemptMessage = await MessageTranslator.TranslateTextAsync(Shared.TooManyAttemptMessage, userData.NativeLanguageIsoCode);

                await Task.WhenAll(context.PostTranslatedAsync($"{translatedTooManyAttemptMessage}"),
                                   this.StartAsync(context));
            }
        }
Example #8
0
        private async Task AfterChoosingLanguageSwitch(IDialogContext context, IAwaitable <object> result)
        {
            var response = await result as string;

            try
            {
                UserData userData = _userDataRepository.GetUserData(context.Activity.From.Id);

                string translatedYes = await MessageTranslator.TranslateTextAsync(Shared.Yes.ToString(), userData.NativeLanguageIsoCode);

                string translatedNo = await MessageTranslator.TranslateTextAsync(Shared.No, userData.NativeLanguageIsoCode);

                if (translatedYes.Equals(response, StringComparison.OrdinalIgnoreCase))
                {
                    string translatedSelfIntroduction =
                        await MessageTranslator.TranslateTextAsync(BotPersonality.BotSelfIntroduction,
                                                                   userData.NativeLanguageIsoCode);

                    await context.PostAsync($"{translatedSelfIntroduction}");

                    string translatedUserNameQuestion =
                        await MessageTranslator.TranslateTextAsync(BotPersonality.UserNameQuestion,
                                                                   userData.NativeLanguageIsoCode);

                    await context.PostAsync($"{translatedUserNameQuestion}");

                    context.Wait(this.UserNameReceivedInNativeLanguageAsync);
                }
                else if (translatedNo.Equals(response, StringComparison.OrdinalIgnoreCase))
                {
                    await context.PostAsync($"{BotPersonality.UserNameQuestion}");

                    context.Wait(this.UserNameReceivedAsync);
                }
            }
            catch (TooManyAttemptsException)
            {
                UserData userData = _userDataRepository.GetUserData(context.Activity.From.Id);

                string translatedTooManyAttemptMessage = await MessageTranslator.TranslateTextAsync(Shared.TooManyAttemptMessage, userData.NativeLanguageIsoCode);

                await context.PostAsync($"{translatedTooManyAttemptMessage}");

                await this.StartAsync(context);
            }
        }
        public static async Task PostTranslatedAsync(this IDialogContext context, string message)
        {
            string language;

            if (context.UserData.TryGetValue(Constants.Shared.UserLanguageCodeKey, out language) && language != MessageTranslator.DEFAULT_LANGUAGE)
            {
                var translatedMessage = await MessageTranslator.TranslateTextAsync(message, language);

                await context.PostAsync(translatedMessage);

                return;
            }
            else
            {
                await context.PostAsync(message);

                return;
            }
        }
        private async Task SwitchLanguage(IDialogContext context, UserData userData, string locale)
        {
            var detectedLanguage = context.UserData.GetValue <string>(Constants.Shared.UserLanguageCodeKey);

            CultureInfo[] allCultures     = CultureInfo.GetCultures(CultureTypes.AllCultures);
            CultureInfo   detectedCulture =
                allCultures
                .FirstOrDefault(cultureInfo => (detectedLanguage.Contains(cultureInfo.TwoLetterISOLanguageName)));

            string detectedLanguageName = CultureInfo.GetCultureInfo(MessageTranslator.DEFAULT_LANGUAGE).DisplayName;

            if (detectedCulture != null)
            {
                detectedLanguageName = detectedCulture.DisplayName;
            }

            var translationInputTextlist = new List <string>(capacity: 4);

            translationInputTextlist.AddRange(YesNoChoices);
            translationInputTextlist.AddRange(new string[] { $"Do you want to switch to {detectedLanguageName}", Shared.DoNotUnderstand });

            var translatedList = await MessageTranslator.TranslateTextAsync(translationInputTextlist, locale);

            var translatedSwitchQuestion = translatedList.ElementAt(2);
            var translatedDontUnderstand = translatedList.ElementAt(3);
            var translatedChoices        = translatedList.Take(2);

            PromptDialog.Choice(
                context,
                this.AfterChoosingLanguageSwitch,
                translatedChoices,
                translatedSwitchQuestion,
                translatedDontUnderstand,
                attempts: Shared.MaxPromptAttempts
                );
        }
Example #11
0
        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable <IMessageActivity> result)
        {
            var userText = context.Activity.From.Name;

            try
            {
                userText = (await result).Text;
            }
            catch (Exception)
            {
                // Swallow exception for the demo purpose
                // TODO log the exception
            }

            string detectedLanguageIsoCode = await MessageTranslator.IdentifyLangAsync(userText);

            var userData = _userDataRepository.GetUserData(context.Activity.From.Id);

            if (userData == null)
            {
                userData        = new UserData();
                userData.UserId = context.Activity.From.Id;
                userData.NativeLanguageIsoCode = detectedLanguageIsoCode;
            }

            _userDataRepository.UpdateUserData(userData);

            if (MessageTranslator.DEFAULT_LANGUAGE.Equals(detectedLanguageIsoCode))
            {
                await context.PostAsync(BotPersonality.UserNameQuestion);

                // detected it's english language
                context.Wait(this.UserNameReceivedAsync);
            }
            else
            {
                // detected user language

                CultureInfo[] allCultures     = CultureInfo.GetCultures(CultureTypes.AllCultures);
                CultureInfo   detectedCulture =
                    allCultures
                    .Where(cultureInfo => (detectedLanguageIsoCode.Contains(cultureInfo.TwoLetterISOLanguageName)))
                    .FirstOrDefault();

                string detectedLanguageName = CultureInfo.GetCultureInfo(MessageTranslator.DEFAULT_LANGUAGE).DisplayName;

                if (detectedCulture != null)
                {
                    detectedLanguageName = detectedCulture.DisplayName;
                }

                string translatedSwitchQuestion = await MessageTranslator.TranslateTextAsync($"Do you want to switch to {detectedLanguageName}", detectedLanguageIsoCode);

                string translatedDontUnderstand = await MessageTranslator.TranslateTextAsync(Shared.DoNotUnderstand, detectedLanguageIsoCode);

                PromptDialog.Choice(
                    context,
                    this.AfterChoosingLanguageSwitch,
                    await MessageTranslator.TranslatedChoices(YesNoChoices, detectedLanguageIsoCode),
                    translatedSwitchQuestion,
                    translatedDontUnderstand,
                    attempts: Shared.MaxAttempt
                    );
            }
        }