Пример #1
0
        protected override async Task RouteAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
        {
            var state = await _stateAccessor.GetAsync(dc.Context, () => new EmailSkillState());

            // get current activity locale
            var locale       = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
            var localeConfig = _skillConfig.LocaleConfigurations[locale];

            // If dispatch result is general luis model
            localeConfig.LuisServices.TryGetValue("email", out var luisService);

            if (luisService == null)
            {
                throw new Exception("The specified LUIS Model could not be found in your Bot Services configuration.");
            }
            else
            {
                var result = await luisService.RecognizeAsync <Email>(dc.Context, CancellationToken.None);

                var intent           = result?.TopIntent().intent;
                var generalTopIntent = state.GeneralLuisResult?.TopIntent().intent;

                var skillOptions = new EmailSkillDialogOptions
                {
                    SkillMode   = _skillMode,
                    SubFlowMode = false
                };

                // switch on general intents
                switch (intent)
                {
                case Email.Intent.SendEmail:
                {
                    await dc.BeginDialogAsync(nameof(SendEmailDialog), skillOptions);

                    break;
                }

                case Email.Intent.Forward:
                {
                    await dc.BeginDialogAsync(nameof(ForwardEmailDialog), skillOptions);

                    break;
                }

                case Email.Intent.Reply:
                {
                    await dc.BeginDialogAsync(nameof(ReplyEmailDialog), skillOptions);

                    break;
                }

                case Email.Intent.SearchMessages:
                case Email.Intent.CheckMessages:
                case Email.Intent.ReadAloud:
                case Email.Intent.QueryLastText:
                {
                    await dc.BeginDialogAsync(nameof(ShowEmailDialog), skillOptions);

                    break;
                }

                case Email.Intent.Delete:
                {
                    await dc.BeginDialogAsync(nameof(DeleteEmailDialog), skillOptions);

                    break;
                }

                case Email.Intent.None:
                {
                    if (generalTopIntent == General.Intent.Next || generalTopIntent == General.Intent.Previous)
                    {
                        await dc.BeginDialogAsync(nameof(ShowEmailDialog), skillOptions);
                    }
                    else
                    {
                        await dc.Context.SendActivityAsync(dc.Context.Activity.CreateReply(EmailSharedResponses.DidntUnderstandMessage));

                        if (_skillMode)
                        {
                            await CompleteAsync(dc);
                        }
                    }

                    break;
                }

                default:
                {
                    await dc.Context.SendActivityAsync(dc.Context.Activity.CreateReply(EmailMainResponses.FeatureNotAvailable));

                    if (_skillMode)
                    {
                        await CompleteAsync(dc);
                    }

                    break;
                }
                }
            }
        }
        // Runs when the dialog stack is empty, and a new message activity comes in.
        protected override async Task OnMessageActivityAsync(DialogContext innerDc, CancellationToken cancellationToken = default)
        {
            var activity = innerDc.Context.Activity.AsMessageActivity();

            if (!string.IsNullOrEmpty(activity.Text))
            {
                // Get current cognitive models for the current locale.
                var localeConfig = _services.GetCognitiveModels();

                // Populate state from activity as required.
                await PopulateStateFromActivity(innerDc.Context);

                // Get skill LUIS model from configuration.
                localeConfig.LuisServices.TryGetValue("Email", out var luisService);

                if (luisService != null)
                {
                    var result = innerDc.Context.TurnState.Get <EmailLuis>(StateProperties.EmailLuisResult);
                    var intent = result?.TopIntent().intent;

                    var generalResult = innerDc.Context.TurnState.Get <General>(StateProperties.GeneralLuisResult);
                    var generalIntent = generalResult?.TopIntent().intent;

                    var skillOptions = new EmailSkillDialogOptions
                    {
                        SubFlowMode = false
                    };

                    switch (intent)
                    {
                    case EmailLuis.Intent.SendEmail:
                    {
                        await innerDc.BeginDialogAsync(nameof(SendEmailDialog), skillOptions);

                        break;
                    }

                    case EmailLuis.Intent.Forward:
                    {
                        await innerDc.BeginDialogAsync(nameof(ForwardEmailDialog), skillOptions);

                        break;
                    }

                    case EmailLuis.Intent.Reply:
                    {
                        await innerDc.BeginDialogAsync(nameof(ReplyEmailDialog), skillOptions);

                        break;
                    }

                    case EmailLuis.Intent.SearchMessages:
                    case EmailLuis.Intent.CheckMessages:
                    case EmailLuis.Intent.ReadAloud:
                    case EmailLuis.Intent.QueryLastText:
                    {
                        await innerDc.BeginDialogAsync(nameof(ShowEmailDialog), skillOptions);

                        break;
                    }

                    case EmailLuis.Intent.Delete:
                    {
                        await innerDc.BeginDialogAsync(nameof(DeleteEmailDialog), skillOptions);

                        break;
                    }

                    case EmailLuis.Intent.ShowNext:
                    case EmailLuis.Intent.ShowPrevious:
                    case EmailLuis.Intent.None:
                    {
                        if (intent == EmailLuis.Intent.ShowNext ||
                            intent == EmailLuis.Intent.ShowPrevious ||
                            generalIntent == General.Intent.ShowNext ||
                            generalIntent == General.Intent.ShowPrevious)
                        {
                            await innerDc.BeginDialogAsync(nameof(ShowEmailDialog), skillOptions);
                        }
                        else
                        {
                            await innerDc.Context.SendActivityAsync(_responseManager.GetResponse(EmailSharedResponses.DidntUnderstandMessage));
                        }

                        break;
                    }

                    default:
                    {
                        await innerDc.Context.SendActivityAsync(_responseManager.GetResponse(EmailMainResponses.FeatureNotAvailable));

                        break;
                    }
                    }
                }
                else
                {
                    throw new Exception("The specified LUIS Model could not be found in your Bot Services configuration.");
                }
            }
        }
Пример #3
0
        // Handles routing to additional dialogs logic.
        private async Task <DialogTurnResult> RouteStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var activity = stepContext.Context.Activity;
            var state    = await _stateAccessor.GetAsync(stepContext.Context, () => new EmailSkillState(), cancellationToken : cancellationToken);

            state.IsAction = false;

            if (activity.Type == ActivityTypes.Message && !string.IsNullOrEmpty(activity.Text))
            {
                var result = stepContext.Context.TurnState.Get <EmailLuis>(StateProperties.EmailLuisResult);
                var intent = result?.TopIntent().intent;

                var generalResult = stepContext.Context.TurnState.Get <General>(StateProperties.GeneralLuisResult);
                var generalIntent = generalResult?.TopIntent().intent;

                var skillOptions = new EmailSkillDialogOptions
                {
                    SubFlowMode = false
                };

                switch (intent)
                {
                case EmailLuis.Intent.SendEmail:
                {
                    return(await stepContext.BeginDialogAsync(nameof(SendEmailDialog), skillOptions, cancellationToken));
                }

                case EmailLuis.Intent.Forward:
                {
                    return(await stepContext.BeginDialogAsync(nameof(ForwardEmailDialog), skillOptions, cancellationToken));
                }

                case EmailLuis.Intent.Reply:
                {
                    return(await stepContext.BeginDialogAsync(nameof(ReplyEmailDialog), skillOptions, cancellationToken));
                }

                case EmailLuis.Intent.SearchMessages:
                case EmailLuis.Intent.CheckMessages:
                case EmailLuis.Intent.ReadAloud:
                case EmailLuis.Intent.QueryLastText:
                {
                    return(await stepContext.BeginDialogAsync(nameof(ShowEmailDialog), skillOptions, cancellationToken));
                }

                case EmailLuis.Intent.Delete:
                {
                    return(await stepContext.BeginDialogAsync(nameof(DeleteEmailDialog), skillOptions, cancellationToken));
                }

                case EmailLuis.Intent.ShowNext:
                case EmailLuis.Intent.ShowPrevious:
                case EmailLuis.Intent.None:
                {
                    if (intent == EmailLuis.Intent.ShowNext ||
                        intent == EmailLuis.Intent.ShowPrevious ||
                        generalIntent == General.Intent.ShowNext ||
                        generalIntent == General.Intent.ShowPrevious)
                    {
                        return(await stepContext.BeginDialogAsync(nameof(ShowEmailDialog), skillOptions, cancellationToken));
                    }
                    else
                    {
                        await stepContext.Context.SendActivityAsync(_templateManager.GenerateActivityForLocale(EmailSharedResponses.DidntUnderstandMessage), cancellationToken);
                    }

                    break;
                }

                default:
                {
                    await stepContext.Context.SendActivityAsync(_templateManager.GenerateActivityForLocale(EmailMainResponses.FeatureNotAvailable), cancellationToken);

                    break;
                }
                }
            }
            else if (activity.Type == ActivityTypes.Event)
            {
                // Handle skill actions here
                var eventActivity = activity.AsEventActivity();

                if (!string.IsNullOrEmpty(eventActivity.Name))
                {
                    switch (eventActivity.Name)
                    {
                    // Each Action in the Manifest will have an associated Name which will be on incoming Event activities
                    case "SendEmail":
                    {
                        EmailInfo actionData = null;

                        var eventValue = activity.Value as JObject;
                        if (eventValue != null)
                        {
                            actionData = eventValue.ToObject <EmailInfo>();
                            await DigestActionInputAsync(stepContext, actionData, cancellationToken);
                        }

                        state.IsAction = true;
                        return(await stepContext.BeginDialogAsync(nameof(SendEmailDialog), new EmailSkillDialogOptions(), cancellationToken));
                    }

                    case "DeleteEmail":
                    {
                        state.IsAction = true;
                        return(await stepContext.BeginDialogAsync(nameof(DeleteEmailDialog), new EmailSkillDialogOptions(), cancellationToken));
                    }

                    case "ReplyEmail":
                    {
                        ReplyEmailInfo actionData = null;

                        var eventValue = activity.Value as JObject;
                        if (eventValue != null)
                        {
                            actionData = eventValue.ToObject <ReplyEmailInfo>();
                            await DigestActionInputAsync(stepContext, actionData, cancellationToken);
                        }

                        state.IsAction = true;
                        return(await stepContext.BeginDialogAsync(nameof(ReplyEmailDialog), new EmailSkillDialogOptions(), cancellationToken));
                    }

                    case "ForwardEmail":
                    {
                        ForwardEmailInfo actionData = null;

                        var eventValue = activity.Value as JObject;
                        if (eventValue != null)
                        {
                            actionData = eventValue.ToObject <ForwardEmailInfo>();
                            await DigestActionInputAsync(stepContext, actionData, cancellationToken);
                        }

                        state.IsAction = true;
                        return(await stepContext.BeginDialogAsync(nameof(ForwardEmailDialog), new EmailSkillDialogOptions(), cancellationToken));
                    }

                    case "EmailSummary":
                    {
                        state.IsAction = true;
                        return(await stepContext.BeginDialogAsync(nameof(ShowEmailDialog), new EmailSkillDialogOptions(), cancellationToken));
                    }

                    default:

                        // todo: move the response to lg
                        await stepContext.Context.SendActivityAsync(new Activity(type : ActivityTypes.Trace, text : $"Unknown Event '{eventActivity.Name ?? "undefined"}' was received but not processed."), cancellationToken);

                        break;
                    }
                }
            }

            // If activity was unhandled, flow should continue to next step
            return(await stepContext.NextAsync(cancellationToken : cancellationToken));
        }
Пример #4
0
        // Handles routing to additional dialogs logic.
        private async Task <DialogTurnResult> RouteStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var activity = stepContext.Context.Activity;

            if (activity.Type == ActivityTypes.Message && !string.IsNullOrEmpty(activity.Text))
            {
                var result = stepContext.Context.TurnState.Get <EmailLuis>(StateProperties.EmailLuisResult);
                var intent = result?.TopIntent().intent;

                var generalResult = stepContext.Context.TurnState.Get <General>(StateProperties.GeneralLuisResult);
                var generalIntent = generalResult?.TopIntent().intent;

                var skillOptions = new EmailSkillDialogOptions
                {
                    SubFlowMode = false
                };

                switch (intent)
                {
                case EmailLuis.Intent.SendEmail:
                {
                    return(await stepContext.BeginDialogAsync(nameof(SendEmailDialog), skillOptions));
                }

                case EmailLuis.Intent.Forward:
                {
                    return(await stepContext.BeginDialogAsync(nameof(ForwardEmailDialog), skillOptions));
                }

                case EmailLuis.Intent.Reply:
                {
                    return(await stepContext.BeginDialogAsync(nameof(ReplyEmailDialog), skillOptions));
                }

                case EmailLuis.Intent.SearchMessages:
                case EmailLuis.Intent.CheckMessages:
                case EmailLuis.Intent.ReadAloud:
                case EmailLuis.Intent.QueryLastText:
                {
                    return(await stepContext.BeginDialogAsync(nameof(ShowEmailDialog), skillOptions));
                }

                case EmailLuis.Intent.Delete:
                {
                    return(await stepContext.BeginDialogAsync(nameof(DeleteEmailDialog), skillOptions));
                }

                case EmailLuis.Intent.ShowNext:
                case EmailLuis.Intent.ShowPrevious:
                case EmailLuis.Intent.None:
                {
                    if (intent == EmailLuis.Intent.ShowNext ||
                        intent == EmailLuis.Intent.ShowPrevious ||
                        generalIntent == General.Intent.ShowNext ||
                        generalIntent == General.Intent.ShowPrevious)
                    {
                        return(await stepContext.BeginDialogAsync(nameof(ShowEmailDialog), skillOptions));
                    }
                    else
                    {
                        await stepContext.Context.SendActivityAsync(_templateEngine.GenerateActivityForLocale(EmailSharedResponses.DidntUnderstandMessage));
                    }

                    break;
                }

                default:
                {
                    await stepContext.Context.SendActivityAsync(_templateEngine.GenerateActivityForLocale(EmailMainResponses.FeatureNotAvailable));

                    break;
                }
                }
            }
            else if (activity.Type == ActivityTypes.Event)
            {
                // Handle skill actions here
            }

            // If activity was unhandled, flow should continue to next step
            return(await stepContext.NextAsync());
        }