-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
143 lines (119 loc) · 6.61 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
const path = require('path');
// Note: Ensure you have a .env file and include LuisAppId, LuisAPIKey and LuisAPIHostName.
const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });
const restify = require('restify');
// Import required bot services.
// See https://aka.ms/bot-services to learn more about the different parts of a bot.
const { BotFrameworkAdapter, ConversationState, InputHints, MemoryStorage, UserState } = require('botbuilder');
const { LuisRecognizerDialog } = require('./dialogs/luisRegonizerDialog');
// This bot's main dialog.
const { DialogAndWelcomeBot } = require('./bots/dialogAndWelcomeBot');
const { MainDialog } = require('./dialogs/mainDialog');
// the bot's booking dialog
const { FeedbackDialog } = require('./dialogs/feedbackDialog');
const { StaffingDialog } = require('./dialogs/staffingDialog');
const { ContactDialog } = require('./dialogs/contactDialog');
const {
FEEDBACK_DIALOG,
STAFFING_DIALOG,
CONTACT_DIALOG, HAS_JD_DIALOG, NO_JD_DIALOG, COMMON_JD_DIALOG, SELECTED_OTHER_DIALOG, YES_TOGGLE_LIVE, OTHER_SKILLSET_DIALOG, UPLOAD_JD_DIALOG,
WRITE_JD_DIALOG
} = require('./dialogs/dialogConstants');
const { HasJDDialog } = require('./dialogs/hasJDDialog');
const { NoJDDialog } = require('./dialogs/noJDDialog');
const { CommonJDDialog } = require('./dialogs/commonJDDialog');
const { SelectedOtherDialog } = require('./dialogs/selectedOtherDialog');
const { YesToggleSpeakLive } = require('./dialogs/yesToggleSpeakLive');
const { UploadJDDialog } = require('./dialogs/uploadJDDialog');
// Timer
const Timer = require('timer-node');
const { OtherSkillset } = require('./dialogs/otherSkillsetDialog');
const { WriteJDDialog } = require('./dialogs/writeJDDialog');
// Create adapter.
// See https://aka.ms/about-bot-adapter to learn more about adapters.
const adapter = new BotFrameworkAdapter({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword
});
// Catch-all for errors.
const onTurnErrorHandler = async (context, error) => {
// This check writes out errors to console log .vs. app insights.
// NOTE: In production environment, you should consider logging this to Azure
// application insights.
console.error(`\n [onTurnError] unhandled error: ${ error }`);
// Send a trace activity, which will be displayed in Bot Framework Emulator
await context.sendTraceActivity(
'OnTurnError Trace',
`${ error }`,
'https://www.botframework.com/schemas/error',
'TurnError'
);
// Send a message to the user
let onTurnErrorMessage = 'The bot encountered an error or bug.';
await context.sendActivity(onTurnErrorMessage, onTurnErrorMessage, InputHints.ExpectingInput);
onTurnErrorMessage = 'To continue to run this bot, please fix the bot source code.';
await context.sendActivity(onTurnErrorMessage, onTurnErrorMessage, InputHints.ExpectingInput);
// Clear out state
await conversationState.delete(context);
};
// Set the onTurnError for the singleton BotFrameworkAdapter.
adapter.onTurnError = onTurnErrorHandler;
// Define a state store for your bot. See https://aka.ms/about-bot-state to learn more about using MemoryStorage.
// A bot requires a state store to persist the dialog and user state between messages.
// For local development, in-memory storage is used.
// CAUTION: The Memory Storage used here is for local bot debugging only. When the bot
// is restarted, anything stored in memory will be gone.
const memoryStorage = new MemoryStorage();
const conversationState = new ConversationState(memoryStorage);
const userState = new UserState(memoryStorage);
const timer = new Timer('sol-timer');
// If configured, pass in the FlightBookingRecognizer. (Defining it externally allows it to be mocked for tests)
const { LuisAppId, LuisAPIKey, LuisAPIHostName } = process.env;
const luisConfig = { applicationId: LuisAppId, endpointKey: LuisAPIKey, endpoint: `https://${ LuisAPIHostName }` };
const luisRecognizer = new LuisRecognizerDialog(luisConfig);
const contactDialog = new ContactDialog(CONTACT_DIALOG, timer);
const yesToggleSpeakLive = new YesToggleSpeakLive(YES_TOGGLE_LIVE, contactDialog);
const selectedOtherDialog = new SelectedOtherDialog(SELECTED_OTHER_DIALOG, contactDialog, yesToggleSpeakLive);
// Create the main dialog.
const commonJDDialog = new CommonJDDialog(COMMON_JD_DIALOG, contactDialog, selectedOtherDialog);
const uploadJDDialog = new UploadJDDialog(UPLOAD_JD_DIALOG, commonJDDialog);
const writeJDDialog = new WriteJDDialog(WRITE_JD_DIALOG, commonJDDialog);
const otherSkillsetDialog = new OtherSkillset(OTHER_SKILLSET_DIALOG, commonJDDialog);
const noJDDialog = new NoJDDialog(NO_JD_DIALOG, commonJDDialog, otherSkillsetDialog);
const feedbackDialog = new FeedbackDialog(FEEDBACK_DIALOG, contactDialog, selectedOtherDialog);
const hasJDDialog = new HasJDDialog(HAS_JD_DIALOG, contactDialog, commonJDDialog, uploadJDDialog, writeJDDialog);
const staffingDialog = new StaffingDialog(STAFFING_DIALOG, hasJDDialog, contactDialog, noJDDialog, selectedOtherDialog);
const dialog = new MainDialog(luisRecognizer, feedbackDialog, staffingDialog, contactDialog, selectedOtherDialog, timer, memoryStorage);
const bot = new DialogAndWelcomeBot(conversationState, userState, dialog);
// Timer
// Create HTTP server
const server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function() {
console.log(`\n${ server.name } listening to ${ server.url }`);
console.log('\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator');
console.log('\nTo talk to your bot, open the emulator select "Open Bot"');
});
// Listen for incoming activities and route them to your bot main dialog.
server.post('/api/messages', (req, res) => {
// Route received a request to adapter for processing
adapter.processActivity(req, res, async (turnContext) => {
// route to bot activity handler.
await bot.run(turnContext);
});
});
// Listen for Upgrade requests for Streaming.
server.on('upgrade', (req, socket, head) => {
// Create an adapter scoped to this WebSocket connection to allow storing session data.
const streamingAdapter = new BotFrameworkAdapter({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword
});
// Set onTurnError for the BotFrameworkAdapter created for each connection.
streamingAdapter.onTurnError = onTurnErrorHandler;
streamingAdapter.useWebSocket(req, socket, head, async (context) => {
// After connecting via WebSocket, run this logic for every request sent over
// the WebSocket connection.
await bot.run(context);
});
});