in templates/typescript/generator-bot-virtualassistant/generators/app/templates/sample-assistant/src/dialogs/mainDialog.ts [239:345]
private async interruptDialog(innerDc: DialogContext): Promise<boolean> {
let interrupted = false;
const activity: Activity = innerDc.context.activity;
const userProfile: IUserProfileState = await this.userProfileState.get(innerDc.context, { name: '' });
const dialog: Dialog | undefined = innerDc.activeDialog !== undefined ? innerDc.findDialog(innerDc.activeDialog.id) : undefined;
if (activity.type === ActivityTypes.Message && activity.text !== undefined && activity.text.trim().length > 0) {
// Check if the active dialog is a skill for conditional interruption.
const isSkill: boolean = dialog instanceof SkillDialog;
// Get Dispatch LUIS result from turn state.
const dispatchResult: RecognizerResult = innerDc.context.turnState.get(StateProperties.DispatchResult);
const dispatchIntent: string = LuisRecognizer.topIntent(dispatchResult);
// Check if we need to switch skills.
if(dialog !== undefined){
if (isSkill && this.isSkillIntent(dispatchIntent) && dispatchIntent !== dialog.id && dispatchResult.intents[dispatchIntent].score > 0.9) {
const identifiedSkill: IEnhancedBotFrameworkSkill | undefined = this.skillsConfig.skills.get(dispatchIntent);
if (identifiedSkill !== undefined) {
const prompt: Partial<Activity> = this.templateManager.generateActivityForLocale('SkillSwitchPrompt', innerDc.context.activity.locale, { skill: identifiedSkill.name });
await innerDc.beginDialog(this.switchSkillDialog.id, new SwitchSkillDialogOptions(prompt as Activity, identifiedSkill));
interrupted = true;
} else {
throw new Error(`${ dispatchIntent } is not in the skills configuration`);
}
}
}
if (dispatchIntent === 'l_general') {
// Get connected LUIS result from turn state.
const generalResult: RecognizerResult = innerDc.context.turnState.get(StateProperties.GeneralResult);
const generalIntent: string = LuisRecognizer.topIntent(generalResult);
if (generalResult.intents[generalIntent].score > 0.5) {
switch(generalIntent) {
case 'Cancel': {
await innerDc.context.sendActivity(this.templateManager.generateActivityForLocale('CancelledMessage', innerDc.context.activity.locale, userProfile));
await innerDc.cancelAllDialogs();
await innerDc.beginDialog(this.initialDialogId);
interrupted = true;
break;
}
case 'Escalate': {
await innerDc.context.sendActivity(this.templateManager.generateActivityForLocale('EscalateMessage', innerDc.context.activity.locale, userProfile));
await innerDc.repromptDialog();
interrupted = true;
break;
}
case 'Help': {
if (!isSkill) {
// If current dialog is a skill, allow it to handle its own help intent.
await innerDc.context.sendActivity(this.templateManager.generateActivityForLocale('HelpCard', innerDc.context.activity.locale, userProfile));
await innerDc.repromptDialog();
interrupted = true;
}
break;
}
case 'Logout': {
// Log user out of all accounts.
await this.logUserOut(innerDc);
await innerDc.context.sendActivity(this.templateManager.generateActivityForLocale('LogoutMessage', innerDc.context.activity.locale, userProfile));
await innerDc.cancelAllDialogs();
await innerDc.beginDialog(this.initialDialogId);
interrupted = true;
break;
}
case 'Repeat': {
// Sends the activities since the last user message again.
const previousResponse: Partial<Activity>[] = await this.previousResponseAccesor.get(innerDc.context, []);
previousResponse.forEach(async (response: Partial<Activity>): Promise<void> => {
// Reset id of original activity so it can be processed by the channel.
response.id = '';
await innerDc.context.sendActivity(response);
});
interrupted = true;
break;
}
case 'StartOver': {
await innerDc.context.sendActivity(this.templateManager.generateActivityForLocale('StartOverMessage', innerDc.context.activity.locale, userProfile));
// Cancel all dialogs on the stack.
await innerDc.cancelAllDialogs();
await innerDc.beginDialog(this.initialDialogId);
interrupted = true;
break;
}
case 'Stop': {
// Use this intent to send an event to your device that can turn off the microphone in speech scenarios.
break;
}
}
}
}
}
return interrupted;
}