示例#1
0
        // 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));
        }