-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
158 lines (136 loc) · 6.04 KB
/
index.js
File metadata and controls
158 lines (136 loc) · 6.04 KB
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
const dotenv = require('dotenv');
const path = require('path');
const restify = require('restify');
const appInsights = require('applicationinsights');
const BotConnector = require('botframework-connector');
const restifyBodyParser = require('restify-plugins').bodyParser;
const axios = require('axios');
// Import required bot services.
// See https://aka.ms/bot-services to learn more about the different parts of a bot.
const { BotFrameworkAdapter, MemoryStorage, ConversationState, UserState, CardFactory } = require('botbuilder');
// This bot's main dialog.
const { EVABOT } = require('./evabot');
const AlertNotifyCard = require('./resources/adaptiveCards/alert-notify-card.json');
const AllNotifyCard = require('./resources/adaptiveCards/all-notify-card.json');
// Import required bot configuration.
const ENV_FILE = path.join(__dirname, '.env');
dotenv.config({ path: ENV_FILE });
const memoryStorage = new MemoryStorage();
appInsights.setup(`${process.env.InstrumentationKey}`).start();
const conversationState = new ConversationState(memoryStorage);
const userState = new UserState(memoryStorage);
// Create HTTP server
const server = restify.createServer();
server.use(restifyBodyParser());
server.listen(process.env.port || process.env.PORT || 3978, () => {
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"');
});
// Create adapter.
// See https://aka.ms/about-bot-adapter to learn more about how bots work.
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
await context.sendActivity('The bot encountered an error or bug.');
await context.sendActivity('To continue to run this bot, please fix the bot source code.');
};
// Set the onTurnError for the singleton BotFrameworkAdapter.
adapter.onTurnError = onTurnErrorHandler;
let conversationReferences = [];
const getAllUsers = async () => {
BotConnector.MicrosoftAppCredentials.trustServiceUrl('https://slack.botframework.com/');
try {
const response = await axios.get(`${process.env.ApiUrl}/api/v1/user/all`);
const { data: { data } } = response;
conversationReferences = data;
} catch (error) {
conversationReferences = [];
}
};
// Create the main dialog.
const evaBot = new EVABOT(conversationState, userState, getAllUsers);
// Listen for incoming requests.
server.post('/api/messages', (req, res) => {
adapter.processActivity(req, res, async (context) => {
// Route to main dialog.
await evaBot.run(context);
});
});
// Listen for incoming notifications and send proactive messages to users.
server.post('/api/notify/all', async (req, res) => {
const { title, description, type, baseURL } = req.body;
let cardJson = JSON.parse(JSON.stringify(AllNotifyCard));
cardJson.body[0].columns[0].items[0].text = `**${title}**`;
cardJson.body[0].columns[0].items[1].text = `**${type}**`;
cardJson.body[0].columns[0].items[2].text = `_${description}_`;
cardJson.body[0].columns[1].items[0].url = `${process.env.AppUrl}/images/Eva.png`;
cardJson.actions[0].url = `${process.env.AppUrl}/${type}`;
const adaptiveCard = CardFactory.adaptiveCard(cardJson);
let promises = conversationReferences.map(async profile => {
const { meta } = profile;
await adapter.continueConversation(meta, async turnContext => {
await turnContext.sendActivity({
text: '',
attachments: [adaptiveCard]
});
});
});
try {
let data = await Promise.all(promises);
await res.send('success');
await res.status(200);
await res.end();
} catch (error) {
await res.send('error');
await res.status(404);
await res.end();
}
});
server.post('/api/notify/:conversationID', async (req, res) => {
const { conversationID } = req.params;
const { trigger_value, diagnostic_url, metric, condition, value, name, trigger_date } = req.body;
const conversationReference = await conversationReferences.find(o => o.id == conversationID);
if (conversationReference.id) {
const { meta } = conversationReference;
await adapter.continueConversation(meta, async turnContext => {
let cardJson = JSON.parse(JSON.stringify(AlertNotifyCard));
cardJson.body[0].columns[0].items[0].text = `_Alert Name_ : **${name}**`;
cardJson.body[0].columns[0].items[1].text = `_Metrics_ : **${metric}**`;
cardJson.body[0].columns[0].items[2].text = `_Condition_ : **${condition} ${value}**`;
cardJson.body[0].columns[0].items[3].text = `**${trigger_value}**`;
cardJson.body[0].columns[0].items[4].text = `_${trigger_date}_`;
cardJson.actions[0].url = `${process.env.AppUrl}/help`;
const adaptiveCard = CardFactory.adaptiveCard(cardJson);
await turnContext.sendActivity({
text: '',
attachments: [adaptiveCard]
});
});
await res.send('success');
await res.status(200);
await res.end();
} else {
await res.send('id not found in bot data');
await res.status(404);
await res.end();
}
});
getAllUsers();