private async Task <DialogTurnResult> ResponsePhraseDialog(WaterfallStepContext step, CancellationToken cancellationToken = default(CancellationToken))
        {
            var phrase = (string)step.Result;
            var code   = await TranslatorHelper.GetDesiredLanguageAsync(phrase);

            step.ActiveDialog.State["language"] = code;

            var response = "Remember, you can use the command {{00}} in case you want to start again the bot";
            var message  = await TranslatorHelper.TranslateSentenceAsync(response, "en", step.ActiveDialog.State["language"].ToString());

            message = message.Replace("{{00}}", "/start");
            await step.Context.SendActivityAsync($"{message}");

            return(await step.NextAsync());
        }
        private async Task <DialogTurnResult> EndMainDialog(WaterfallStepContext step, CancellationToken cancellationToken = default(CancellationToken))
        {
            string userLanguage = await accessors.LanguagePreference.GetAsync(step.Context, () => { return(string.Empty); });

            if (string.IsNullOrEmpty(userLanguage))
            {
                throw new System.Exception("there was an issue reading the language preference");
            }

            var response = $"Hey, thanks for using this bot, now you will be redirect to use LUIS to perform intelligent interactions";
            var message  = await TranslatorHelper.TranslateSentenceAsync(response, "en", userLanguage);

            await step.Context.SendActivityAsync($"{message}");

            //ending dialog
            await step.EndDialogAsync(step.ActiveDialog.State);

            return(Dialog.EndOfTurn);
        }
        public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (turnContext == null)
            {
                throw new ArgumentNullException(nameof(turnContext));
            }

            var dialogContext = await dialogs.CreateContextAsync(turnContext, cancellationToken);

            switch (turnContext.Activity.Type)
            {
            case ActivityTypes.ConversationUpdate:
                if (turnContext.Activity.MembersAdded.FirstOrDefault()?.Id == turnContext.Activity.Recipient.Id)
                {
                    await dialogContext.BeginDialogAsync("MainDialog", null, cancellationToken);
                }
                break;

            case ActivityTypes.Message:
                var results = await dialogContext.ContinueDialogAsync(cancellationToken);

                var text = turnContext.Activity.Text;
                if (text == "/start")
                {
                    await accessors.IsReadyForLUISPreference.DeleteAsync(turnContext);

                    await accessors.LanguagePreference.DeleteAsync(turnContext);

                    await dialogContext.EndDialogAsync();

                    await dialogContext.BeginDialogAsync("MainDialog", null, cancellationToken);
                }
                else
                {
                    if (!dialogContext.Context.Responded)
                    {
                        bool isReady = await accessors.IsReadyForLUISPreference.GetAsync(turnContext, () => { return(false); });

                        if (!isReady)
                        {
                            await dialogContext.BeginDialogAsync("MainDialog", null, cancellationToken);
                        }
                        else
                        {
                            string userLanguage = await accessors.LanguagePreference.GetAsync(turnContext, () => { return(string.Empty); });

                            turnContext.Activity.Text = await TranslatorHelper.TranslateSentenceAsync(turnContext.Activity.Text, userLanguage, "en");

                            await turnContext.SendActivityAsync($"Sending to LUIS -> {turnContext.Activity.Text}");

                            // LUIS
                            var recognizerResult = await accessors.LuisServices[Settings.LuisName01].RecognizeAsync(turnContext, cancellationToken);
                            var topIntent        = recognizerResult?.GetTopScoringIntent();
                            if (topIntent != null && topIntent.HasValue && topIntent.Value.intent != "None")
                            {
                                await ProcessIntentAsync(turnContext, topIntent.Value.intent, topIntent.Value.score, cancellationToken);
                            }
                            else
                            {
                                var response = @"No LUIS intents were found.";
                                var message  = await TranslatorHelper.TranslateSentenceAsync(response, "en", userLanguage);

                                await turnContext.SendActivityAsync(message);
                            }
                        }
                    }
                }

                break;
            }
        }