Skip to content
This repository has been archived by the owner on Jun 30, 2022. It is now read-only.

Commit

Permalink
using resource explorer
Browse files Browse the repository at this point in the history
  • Loading branch information
lauren-mills committed Sep 27, 2019
1 parent 51c5e76 commit 3142d66
Show file tree
Hide file tree
Showing 9 changed files with 203 additions and 83 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,42 @@

using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Azure;
using Microsoft.Bot.Builder.Dialogs.Declarative.Resources;
using Microsoft.Bot.Builder.Dialogs.Declarative.Types;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Builder.LanguageGeneration;
using Microsoft.Bot.Builder.Solutions.Feedback;
using Microsoft.Bot.Builder.Solutions.Middleware;
using Microsoft.Bot.Connector.Authentication;
using Microsoft.Bot.Schema;
using Microsoft.Extensions.Configuration;
using VirtualAssistantSample.Services;

namespace VirtualAssistantSample.Adapters
{
public class DefaultAdapter : BotFrameworkHttpAdapter
{
public DefaultAdapter(
IConfiguration configuration,
BotSettings settings,
TemplateEngine templateEngine,
ConversationState conversationState,
ResourceExplorer resourceExplorer,
ICredentialProvider credentialProvider,
IBotTelemetryClient telemetryClient)
: base(credentialProvider)
{
OnTurnError = async (turnContext, exception) =>
{
var activityGenerator = turnContext.TurnState.Get<IActivityGenerator>();
await turnContext.SendActivityAsync(new Activity(type: ActivityTypes.Trace, text: $"{exception.Message}"));
await turnContext.SendActivityAsync(new Activity(type: ActivityTypes.Trace, text: $"{exception.StackTrace}"));
await turnContext.SendActivityAsync(templateEngine.EvaluateTemplate("errorMessage"));
await turnContext.SendActivityAsync(await activityGenerator.Generate(turnContext, "[errorMessage]", null));
telemetryClient.TrackException(exception);
};

TypeFactory.Configuration = configuration;
this.UseLanguageGeneration(resourceExplorer, "MainResponses.lg");

// Uncomment the following line for local development without Azure Storage
// Use(new TranscriptLoggerMiddleware(new MemoryTranscriptStore()));
Use(new TranscriptLoggerMiddleware(new AzureBlobTranscriptStore(settings.BlobStorage.ConnectionString, settings.BlobStorage.Container)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Azure;
using Microsoft.Bot.Builder.Dialogs.Declarative.Resources;
using Microsoft.Bot.Builder.Dialogs.Declarative.Types;
using Microsoft.Bot.Builder.LanguageGeneration;
using Microsoft.Bot.Builder.Solutions.Middleware;
using Microsoft.Bot.Builder.StreamingExtensions;
Expand All @@ -16,23 +18,26 @@ namespace VirtualAssistantSample.Adapters
public class DefaultWebSocketAdapter : WebSocketEnabledHttpAdapter
{
public DefaultWebSocketAdapter(
IConfiguration config,
IConfiguration configuration,
BotSettings settings,
TemplateEngine templateEngine,
ResourceExplorer resourceExplorer,
ICredentialProvider credentialProvider,
IBotTelemetryClient telemetryClient)
: base(config, credentialProvider)
: base(configuration, credentialProvider)
{
OnTurnError = async (turnContext, exception) =>
{
var activityGenerator = turnContext.TurnState.Get<IActivityGenerator>();
await turnContext.SendActivityAsync(new Activity(type: ActivityTypes.Trace, text: $"{exception.Message}"));
await turnContext.SendActivityAsync(new Activity(type: ActivityTypes.Trace, text: $"{exception.StackTrace}"));
await turnContext.SendActivityAsync(templateEngine.EvaluateTemplate("errorMessage"));
await turnContext.SendActivityAsync(await activityGenerator.Generate(turnContext, "errorMessage", null));
telemetryClient.TrackException(exception);
};

// Uncomment the following line for local development without Azure Storage
// Use(new TranscriptLoggerMiddleware(new MemoryTranscriptStore()));
TypeFactory.Configuration = configuration;
this.UseLanguageGeneration(resourceExplorer);
Use(new TranscriptLoggerMiddleware(new AzureBlobTranscriptStore(settings.BlobStorage.ConnectionString, settings.BlobStorage.Container)));
Use(new TelemetryLoggerMiddleware(telemetryClient, logPersonalInformation: true));
Use(new ShowTypingMiddleware());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,9 @@ namespace VirtualAssistantSample.Dialogs
{
public class CancelDialog : ComponentDialog
{
private TemplateEngine _templateEngine;
private ILanguageGenerator _langGenerator;
private TextActivityGenerator _activityGenerator;

public CancelDialog(
TemplateEngine templateEngine,
ILanguageGenerator langGenerator,
TextActivityGenerator activityGenerator)
public CancelDialog()
: base(nameof(CancelDialog))
{
_templateEngine = templateEngine;
_langGenerator = langGenerator;
_activityGenerator = activityGenerator;
InitialDialogId = nameof(CancelDialog);

var cancel = new WaterfallStep[]
Expand All @@ -39,13 +29,14 @@ public class CancelDialog : ComponentDialog

protected override async Task<DialogTurnResult> EndComponentAsync(DialogContext outerDc, object result, CancellationToken cancellationToken)
{
var activityGenerator = outerDc.Context.TurnState.Get<IActivityGenerator>();

var doCancel = (bool)result;

if (doCancel)
{
// If user chose to cancel
var template = _templateEngine.EvaluateTemplate("cancelConfirmedMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, outerDc.Context, _langGenerator);
var activity = await activityGenerator.Generate(outerDc.Context, "cancelConfirmedMessage", null);
await outerDc.Context.SendActivityAsync(activity);

// Cancel all in outer stack of component i.e. the stack the component belongs to
Expand All @@ -54,8 +45,7 @@ protected override async Task<DialogTurnResult> EndComponentAsync(DialogContext
else
{
// else if user chose not to cancel
var template = _templateEngine.EvaluateTemplate("cancelDeniedMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, outerDc.Context, _langGenerator);
var activity = await activityGenerator.Generate(outerDc.Context, "cancelDeniedMessage", null);
await outerDc.Context.SendActivityAsync(activity);

// End this component. Will trigger reprompt/resume on outer stack
Expand All @@ -65,8 +55,8 @@ protected override async Task<DialogTurnResult> EndComponentAsync(DialogContext

private async Task<DialogTurnResult> AskToCancel(WaterfallStepContext sc, CancellationToken cancellationToken)
{
var template = _templateEngine.EvaluateTemplate("cancelPrompt");
var activity = await _activityGenerator.CreateActivityFromText(template, null, sc.Context, _langGenerator);
var activityGenerator = sc.Context.TurnState.Get<IActivityGenerator>();
var activity = await activityGenerator.Generate(sc.Context, "cancelPrompt", null);

return await sc.PromptAsync(DialogIds.CancelPrompt, new PromptOptions()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.LanguageGeneration;
using Microsoft.Bot.Builder.LanguageGeneration.Generators;
using Microsoft.Bot.Builder.Skills;
using Microsoft.Bot.Builder.Solutions;
using Microsoft.Bot.Builder.Solutions.Dialogs;
Expand All @@ -29,18 +28,12 @@ public class MainDialog : RouterDialog
private const string TimeZone = "timezone";
private BotSettings _settings;
private BotServices _services;
private TemplateEngine _templateEngine;
private ILanguageGenerator _langGenerator;
private TextActivityGenerator _activityGenerator;
private IStatePropertyAccessor<OnboardingState> _onboardingState;
private IStatePropertyAccessor<SkillContext> _skillContextAccessor;

public MainDialog(
BotSettings settings,
BotServices services,
TemplateEngine templateEngine,
ILanguageGenerator langGenerator,
TextActivityGenerator activityGenerator,
OnboardingDialog onboardingDialog,
EscalateDialog escalateDialog,
CancelDialog cancelDialog,
Expand All @@ -51,9 +44,6 @@ public class MainDialog : RouterDialog
{
_settings = settings;
_services = services;
_templateEngine = templateEngine;
_langGenerator = langGenerator;
_activityGenerator = activityGenerator;
TelemetryClient = telemetryClient;
_onboardingState = userState.CreateProperty<OnboardingState>(nameof(OnboardingState));
_skillContextAccessor = userState.CreateProperty<SkillContext>(nameof(SkillContext));
Expand All @@ -70,24 +60,25 @@ public class MainDialog : RouterDialog

protected override async Task OnStartAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
{
var activityGenerator = dc.Context.TurnState.Get<IActivityGenerator>();
var onboardingState = await _onboardingState.GetAsync(dc.Context, () => new OnboardingState());

if (string.IsNullOrEmpty(onboardingState.Name))
{
var template = _templateEngine.EvaluateTemplate("newUserIntroCard");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[newUserIntroCard]", null);
await dc.Context.SendActivityAsync(activity);
}
else
{
var template = _templateEngine.EvaluateTemplate("returningUserIntroCard");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[returningUserIntroCard]", null);
await dc.Context.SendActivityAsync(activity);
}
}

protected override async Task RouteAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
{
var activityGenerator = dc.Context.TurnState.Get<IActivityGenerator>();

// Get cognitive models for locale
var locale = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
var cognitiveModels = _services.CognitiveModelSets[locale];
Expand Down Expand Up @@ -138,8 +129,7 @@ protected override async Task RouteAsync(DialogContext dc, CancellationToken can
default:
{
// No intent was identified, send confused message
var template = _templateEngine.EvaluateTemplate("confusedMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[confusedMessage]", null);
await dc.Context.SendActivityAsync(activity);

break;
Expand All @@ -165,8 +155,7 @@ protected override async Task RouteAsync(DialogContext dc, CancellationToken can
}
else
{
var template = _templateEngine.EvaluateTemplate("confusedMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[confusedMessage]", null);
await dc.Context.SendActivityAsync(activity);
}
}
Expand All @@ -189,8 +178,7 @@ protected override async Task RouteAsync(DialogContext dc, CancellationToken can
}
else
{
var template = _templateEngine.EvaluateTemplate("confusedMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[confusedMessage]", null);
await dc.Context.SendActivityAsync(activity);
}
}
Expand All @@ -199,8 +187,7 @@ protected override async Task RouteAsync(DialogContext dc, CancellationToken can
{
// If dispatch intent does not map to configured models, send "confused" response.
// Alternatively as a form of backup you can try QnAMaker for anything not understood by dispatch.
var template = _templateEngine.EvaluateTemplate("confusedMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[confusedMessage]", null);
await dc.Context.SendActivityAsync(activity);
}
}
Expand Down Expand Up @@ -306,9 +293,10 @@ protected override async Task OnEventAsync(DialogContext dc, CancellationToken c

protected override async Task CompleteAsync(DialogContext dc, DialogTurnResult result = null, CancellationToken cancellationToken = default(CancellationToken))
{
var activityGenerator = dc.Context.TurnState.Get<IActivityGenerator>();

// The active dialog's stack ended with a complete status
var template = _templateEngine.EvaluateTemplate("completedMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[confusedMessage]", null);
await dc.Context.SendActivityAsync(activity);

// Request feedback on the last activity.
Expand Down Expand Up @@ -362,6 +350,8 @@ protected override async Task<InterruptionAction> OnInterruptDialogAsync(DialogC

private async Task<InterruptionAction> OnCancel(DialogContext dc)
{
var activityGenerator = dc.Context.TurnState.Get<IActivityGenerator>();

if (dc.ActiveDialog != null && dc.ActiveDialog.Id != nameof(CancelDialog))
{
// Don't start restart cancel dialog
Expand All @@ -371,17 +361,17 @@ private async Task<InterruptionAction> OnCancel(DialogContext dc)
return InterruptionAction.StartedDialog;
}

var template = _templateEngine.EvaluateTemplate("cancelledMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[cancelledMessage]", null);
await dc.Context.SendActivityAsync(activity);

return InterruptionAction.StartedDialog;
}

private async Task<InterruptionAction> OnHelp(DialogContext dc)
{
var template = _templateEngine.EvaluateTemplate("helpCard");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activityGenerator = dc.Context.TurnState.Get<IActivityGenerator>();

var activity = await activityGenerator.Generate(dc.Context, "[helpCard]", null);
await dc.Context.SendActivityAsync(activity);

// Signal the conversation was interrupted and should immediately continue
Expand All @@ -390,6 +380,8 @@ private async Task<InterruptionAction> OnHelp(DialogContext dc)

private async Task<InterruptionAction> OnLogout(DialogContext dc)
{
var activityGenerator = dc.Context.TurnState.Get<IActivityGenerator>();

IUserTokenProvider tokenProvider;
var supported = dc.Context.Adapter is IUserTokenProvider;
if (!supported)
Expand All @@ -410,8 +402,7 @@ private async Task<InterruptionAction> OnLogout(DialogContext dc)
await tokenProvider.SignOutUserAsync(dc.Context, token.ConnectionName);
}

var template = _templateEngine.EvaluateTemplate("logoutMessage");
var activity = await _activityGenerator.CreateActivityFromText(template, null, dc.Context, _langGenerator);
var activity = await activityGenerator.Generate(dc.Context, "[logoutMessage]", null);
await dc.Context.SendActivityAsync(activity);

return InterruptionAction.StartedDialog;
Expand Down

0 comments on commit 3142d66

Please sign in to comment.