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."); } } }
// 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)); }
// 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()); }