Ejemplo n.º 1
0
        /// <summary>
        /// receive and handle input on click of feedback dialog
        /// </summary>
        /// <param name="step"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <DialogTurnResult> MessageReceivedAsync(WaterfallStepContext step, CancellationToken cancellationToken = default(CancellationToken))
        {
            var question = (string)step.Result;

            step.ActiveDialog.State["question"] = question;
            string searchedText = step.Context.Activity.Text;

            // for storing data into telemetry.
            string lastSearchedText = await accessors.LastSearchPreference.GetAsync(step.Context, () => { return(string.Empty); });

            string lastAnswerText = await accessors.LastAnswerPreference.GetAsync(step.Context, () => { return(string.Empty); });

            int negative_flag = 0;

            if (searchedText.Contains(QNABotSettings.positivefeedback) || searchedText.Contains(QNABotSettings.negativefeedback))
            {
                try
                {
                    if (searchedText.Contains(QNABotSettings.positivefeedback))
                    {
                        TrackEvents.TrackEvent(lastSearchedText, lastAnswerText, "Yes");
                        await step.Context.SendActivityAsync(QNABotSettings.positivemsg);
                    }

                    else if (searchedText.Contains(QNABotSettings.negativefeedback) && lastSearchedText != "")
                    {
                        TrackEvents.TrackEvent(lastSearchedText, lastAnswerText, "No");

                        var feedback = step.Context.Activity.CreateReply(QNABotSettings.accurateanswer);
                        step.Context.Activity.Text = lastSearchedText;
                        var recognizerNegResult = await accessors.LuisServices[Settings.LuisName01].RecognizeAsync(step.Context, cancellationToken);
                        negative_flag = 1;
                        await CarouselDialog.CarouselAfterNegativeFeedback(feedback, recognizerNegResult, accessors, step, negative_flag, cancellationToken); // Carousel Dialog

                        await _userState.DeleteAsync(step.Context, cancellationToken);

                        negative_flag = 0;
                    }
                    else
                    {
                        TrackEvents.TrackEvent(lastSearchedText, lastAnswerText, "No");
                        await NoneOfAboveDialog.NoneofTheAbove(step);//No Answer Dialog
                    }
                }

                catch
                {
                    throw;
                }
            }
            return(await step.EndDialogAsync());
        }
Ejemplo n.º 2
0
        /// <summary>
        /// based on question returning answer from luis n qna.
        /// </summary>
        /// <param name="step"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        private async Task <DialogTurnResult> ProcessQuestionDialog(WaterfallStepContext step, CancellationToken cancellationToken = default(CancellationToken))
        {
            var question = (string)step.Result;

            step.ActiveDialog.State["question"] = question;
            string lastEvent    = string.Empty;
            string searchedText = step.Context.Activity.Text;


            // for storing data into telemetry.
            string lastSearchedText = await accessors.LastSearchPreference.GetAsync(step.Context, () => { return(string.Empty); });

            string lastAnswerText = await accessors.LastAnswerPreference.GetAsync(step.Context, () => { return(string.Empty); });


            if (step.Context.Activity.Text != null && isValidJson(step.Context.Activity.Text))
            {
                var cButton = JsonConvert.DeserializeObject <CardButton>(step.Context.Activity.Text);
                lastEvent = "postback";
                step.Context.Activity.Text = cButton.value;
            }

            var recognizerResult = await accessors.LuisServices[Settings.LuisName01].RecognizeAsync(step.Context, cancellationToken);

            var topIntent = recognizerResult?.GetTopScoringIntent();

            var msg = step.Context.Activity.CreateReply(QNABotSettings.accurateanswer);

            if (lastEvent.ToString() == "postback")
            {
                //TrackEvents.TrackConversation(searchedText, lastAnswerText, "Carousel Direct Answer");
                await DirectAnswerDialog.directAnswerCarousel(lastEvent, accessors, step, cancellationToken); //Direct Answer Dialog
            }
            else if ((recognizerResult != null && recognizerResult.Text.Contains(QNABotSettings.noneoftheabove)) || (topIntent != null && topIntent.Value.intent == "None"))
            {
                TrackEvents.TrackConversation(lastSearchedText, lastAnswerText, "None Intent Prompt", topIntent.Value.score.ToString(), from: step.Context.Activity.From);
                await NoneOfAboveDialog.NoneofTheAbove(step);
            }

            else if (recognizerResult != null && (recognizerResult.Text.Contains(QNABotSettings.howtoask) || recognizerResult.Text.Contains(QNABotSettings.howtocontacthr)))
            {
                TrackEvents.TrackConversation(lastSearchedText, lastAnswerText, "How To Ask/How to Contact Prompt", topIntent.Value.score.ToString(), from: step.Context.Activity.From);
                await ChoiceMenuDialog.ChoiceMenu(recognizerResult.Text, step);
            }
            else
            {
                double score = 0.0;
                if (topIntent != null && topIntent.HasValue)
                {
                    score = topIntent.Value.score;
                    score = score * 100;

                    // Direct answer if its button click event of carousel dialog.
                    //if (lastEvent.ToString() == "postback")
                    //{
                    //    //    //TrackEvents.TrackConversation(searchedText, lastAnswerText, "Carousel Direct Answer");
                    //    //    await DirectAnswerDialog.directAnswer(lastEvent, accessors, topIntent.Value.intent, step, cancellationToken); //Direct Answer Dialog
                    //}

                    if (lastEvent.ToString() != "postback")
                    {
                        var confidenceScore = ThresholdHandler.ConfidenceScoreIdentification(score);

                        switch (confidenceScore)
                        {
                        case (int)ConfidenceScoreEnum.high:
                            if (topIntent.Value.intent != "None")
                            {
                                await DirectAnswerDialog.directAnswer(lastEvent, accessors, topIntent.Value.intent, step, cancellationToken);     //Direct Answer Dialog
                            }
                            break;

                        default:
                            TrackEvents.TrackConversation(searchedText, lastAnswerText = "Carousel Options", "Carousel Prompt", confidenceScore.ToString(), topIntent.Value.intent, from: step.Context.Activity.From);
                            await CarouselDialog.Carousel(msg, recognizerResult, accessors, step, cancellationToken);         //Carousel Dialog

                            break;


                            //case (int)ConfidenceScoreEnum.mid:
                            //    TrackEvents.TrackConversation(searchedText, lastAnswerText = "Carousel Options", "Carousel Prompt", confidenceScore.ToString(), topIntent.Value.intent);
                            //    await CarouselDialog.Carousel(msg, recognizerResult, accessors, step, cancellationToken); //Carousel Dialog
                            //    break;

                            //default:
                            //    TrackEvents.TrackConversation(searchedText, lastAnswerText, "None of the Above Answer", confidenceScore.ToString(), topIntent.Value.intent);
                            //    await NoneOfAboveDialog.NoneofTheAbove(step);//No Answer Dialog
                            //    break;
                        }
                    }
                }
            }
            return(await step.NextAsync());
        }
Ejemplo n.º 3
0
 private async Task <DialogTurnResult> ShowHeroCardOption(WaterfallStepContext stepContext, CancellationToken cancellationToken)
 {
     //MOSTRAR HERO CARD
     return(await CarouselDialog.ShowOptions(stepContext, cancellationToken));
 }