// This step routes the user to different dialogs // In this case, there's only one other dialog, so it is more simple, // but in more complex scenarios you can go off to other dialogs in a similar public async Task <DialogTurnResult> MainMenuAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { //detect user language _language = _translator.Detect(stepContext.Context.Activity.Text); if (_language != "en") { string translated = _translator.Translate(stepContext.Context.Activity.Text, _language, "en"); stepContext.Context.Activity.Text = translated; } // Check if we are currently processing a user's search var state = await _accessors.PictureState.GetAsync(stepContext.Context); // If Regex picks up on anything, store it var recognizedIntents = stepContext.Context.TurnState.Get <IRecognizedIntents>(); // Based on the recognized intent, direct the conversation switch (recognizedIntents.TopIntent?.Name) { case "search": // switch to the search dialog return(await stepContext.BeginDialogAsync("searchDialog", null, cancellationToken)); case "share": // respond that you're sharing the photo await MainResponses.ReplyWithShareConfirmation(stepContext.Context, _translateDelegate); return(await stepContext.EndDialogAsync()); case "order": // respond that you're ordering await MainResponses.ReplyWithOrderConfirmation(stepContext.Context, _translateDelegate); return(await stepContext.EndDialogAsync()); case "help": // show help await MainResponses.ReplyWithHelp(stepContext.Context, _translateDelegate); return(await stepContext.EndDialogAsync()); default: { // Call LUIS recognizer var result = await _recognizer.RecognizeAsync(stepContext.Context, cancellationToken); // Get the top intent from the results var topIntent = result?.GetTopScoringIntent(); // Based on the intent, switch the conversation, similar concept as with Regex above switch ((topIntent != null) ? topIntent.Value.intent : null) { case null: // Add app logic when there is no result. await MainResponses.ReplyWithConfused(stepContext.Context, _translateDelegate); break; case "None": await MainResponses.ReplyWithConfused(stepContext.Context, _translateDelegate); // with each statement, we're adding the LuisScore, purely to test, so we know whether LUIS was called or not await MainResponses.ReplyWithLuisScore(stepContext.Context, topIntent.Value.intent, topIntent.Value.score); break; case "Greeting": await MainResponses.ReplyWithGreeting(stepContext.Context, _translateDelegate); await MainResponses.ReplyWithHelp(stepContext.Context, _translateDelegate); await MainResponses.ReplyWithLuisScore(stepContext.Context, topIntent.Value.intent, topIntent.Value.score); break; case "OrderPic": await MainResponses.ReplyWithOrderConfirmation(stepContext.Context, _translateDelegate); await MainResponses.ReplyWithLuisScore(stepContext.Context, topIntent.Value.intent, topIntent.Value.score); break; case "SharePic": await MainResponses.ReplyWithShareConfirmation(stepContext.Context, _translateDelegate); await MainResponses.ReplyWithLuisScore(stepContext.Context, topIntent.Value.intent, topIntent.Value.score); break; case "SearchPics": await MainResponses.ReplyWithSearchingConfirmation(stepContext.Context, _translateDelegate); await MainResponses.ReplyWithLuisScore(stepContext.Context, topIntent.Value.intent, topIntent.Value.score); break; default: await MainResponses.ReplyWithConfused(stepContext.Context, _translateDelegate); break; } return(await stepContext.EndDialogAsync()); } } }