// Handles routing to additional dialogs logic. private async Task <DialogTurnResult> RouteStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var a = stepContext.Context.Activity; var state = await _stateAccessor.GetAsync(stepContext.Context, () => new SkillState(), cancellationToken); state.Clear(); if (a.Type == ActivityTypes.Message && !string.IsNullOrEmpty(a.Text)) { var skillResult = stepContext.Context.TurnState.Get <MusicSkillLuis>(StateProperties.MusicLuisResultKey); var intent = skillResult?.TopIntent().intent; // switch on general intents switch (intent) { case MusicSkillLuis.Intent.PlayMusic: { return(await stepContext.BeginDialogAsync(_playMusicDialog.Id, cancellationToken : cancellationToken)); } case MusicSkillLuis.Intent.Exclude: { state.ControlActionName = ControlActions.Exclude; return(await stepContext.BeginDialogAsync(_controlSettingsDialog.Id, cancellationToken : cancellationToken)); } case MusicSkillLuis.Intent.Pause: { state.ControlActionName = ControlActions.Pause; return(await stepContext.BeginDialogAsync(_controlSettingsDialog.Id, cancellationToken : cancellationToken)); } case MusicSkillLuis.Intent.Shuffle: { state.ControlActionName = ControlActions.Shuffle; return(await stepContext.BeginDialogAsync(_controlSettingsDialog.Id, cancellationToken : cancellationToken)); } case MusicSkillLuis.Intent.AdjustVolume: { state.ControlActionName = ControlActions.AdjustVolume; return(await stepContext.BeginDialogAsync(_controlSettingsDialog.Id, cancellationToken : cancellationToken)); } case MusicSkillLuis.Intent.None: { // No intent was identified, send confused message await stepContext.Context.SendActivityAsync(_templateManager.GenerateActivityForLocale(SharedResponses.DidntUnderstandMessage), cancellationToken); break; } case MusicSkillLuis.Intent.AnswerMusicQuestion: default: { // intent was identified but not yet implemented await stepContext.Context.SendActivityAsync(_templateManager.GenerateActivityForLocale(MainResponses.FeatureNotAvailable), cancellationToken); break; } } } else if (a.Type == ActivityTypes.Event) { var ev = a.AsEventActivity(); switch (ev.Name) { case TokenEvents.TokenResponseEventName: { // Auth dialog completion var result = await stepContext.ContinueDialogAsync(cancellationToken); // If the dialog completed when we sent the token, end the skill conversation if (result.Status != DialogTurnStatus.Waiting) { var response = stepContext.Context.Activity.CreateReply(); response.Type = ActivityTypes.EndOfConversation; await stepContext.Context.SendActivityAsync(response, cancellationToken); } break; } case Events.PlayMusic: { state.IsAction = true; SearchInfo actionData = null; if (ev.Value is JObject info) { actionData = info.ToObject <SearchInfo>(); actionData.DigestState(state); } return(await stepContext.BeginDialogAsync(_playMusicDialog.Id, cancellationToken : cancellationToken)); } default: { await stepContext.Context.SendActivityAsync(new Activity(type : ActivityTypes.Trace, text : $"Unknown Event '{ev.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)); }