forked from OfficeDev/Microsoft-Teams-Samples
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
155 lines (127 loc) · 6.35 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
144
145
146
147
148
149
150
151
152
153
154
155
// <copyright file="index.js" company="Microsoft">
// Copyright (c) Microsoft. All rights reserved.
// </copyright>
// Import required pckages
const path = require('path');
// Read botFilePath and botFileSecret from .env file.
const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });
const restify = require('restify');
const express = require('express');
const { MeetingNotficationBot } = require('./bots/meeting-notification-bot');
const { DecryptionHelper } = require("./helper/decryption-helper");
// Import required bot services.
// See https://aka.ms/bot-services to learn more about the different parts of a bot.
const { CloudAdapter,
ConversationState,
MemoryStorage,
ConfigurationServiceClientCredentialFactory,
createBotFrameworkAuthenticationFromConfiguration } = require('botbuilder');
const credentialsFactory = new ConfigurationServiceClientCredentialFactory({
MicrosoftAppId: process.env.MicrosoftAppId,
MicrosoftAppPassword: process.env.MicrosoftAppPassword,
MicrosoftAppTenantId: process.env.TenantId
});
const botFrameworkAuthentication = createBotFrameworkAuthenticationFromConfiguration(null, credentialsFactory);
// Create adapter.
// See https://aka.ms/about-bot-adapter to learn more about adapters.
const adapter = new CloudAdapter(botFrameworkAuthentication);
adapter.onTurnError = 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. See https://aka.ms/bottelemetry for telemetry
// configuration instructions.
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.');
// Clear out state
await conversationState.delete(context);
};
// Define the state store for your bot.
// See https://aka.ms/about-bot-state to learn more about using MemoryStorage.
// A bot requires a state storage system to persist the dialog and user state between messages.
const memoryStorage = new MemoryStorage();
// Create conversation and user state with in-memory storage provider.
const conversationState = new ConversationState(memoryStorage);
// Create the main dialog.
//const dialog = new MainDialog();
// Create the main dialog.
const conversationReferences = {};
// Create the bot that will handle incoming messages.
const bot = new MeetingNotficationBot(conversationReferences);
// Create HTTP server.
const server = express();
server.use(restify.plugins.queryParser());
server.use(express.json());
server.use(express.urlencoded({
extended: true
}));
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 requests.
server.post('/api/messages', async (req, res) => {
await adapter.process(req, res, (context) => bot.run(context));
});
// This method will be invoked for various meeting events.
const notification = async (req, res, next) => {
let status;
if (req.query && req.query.validationToken) {
status = 200;
res.send(req.query.validationToken);
} else {
clientStatesValid = false;
var responsePayload = await DecryptionHelper.getDecryptedContent(req.body.value);
if(responsePayload.eventType == "Microsoft.Communication.CallRosterUpdate") {
if(responsePayload['activeParticipants@delta'].length > 0 || responsePayload['activeParticipants@remove'].length > 0) {
for (const conversationReference of Object.values(conversationReferences)) {
await adapter.continueConversationAsync(process.env.MicrosoftAppId, conversationReference, async turnContext => {
if(responsePayload['activeParticipants@delta'].length > 0) {
var membersJoined = new Array();
responsePayload['activeParticipants@delta'].map((member) => {
var member = {
title: "Member name",
value: member.Identity.User.DisplayName
}
membersJoined.push(member);
})
await MeetingNotficationBot.DisplayMeetingUpdate(turnContext, "Members joined",membersJoined);
}
if(responsePayload['activeParticipants@remove'].length > 0) {
var membersLeft = new Array();
responsePayload['activeParticipants@remove'].map((member) => {
var member = {
title: "Member name",
value: member.Identity.User.DisplayName
}
membersLeft.push(member);
})
await MeetingNotficationBot.DisplayMeetingUpdate(turnContext, "Members left", membersLeft);
}
});
}
}
}
else {
var meetingIndicator = responsePayload.eventType == "Microsoft.Communication.CallStarted" ? "Meeting has been started." : "Meeting has been ended.";
for (const conversationReference of Object.values(conversationReferences)) {
await adapter.continueConversationAsync(process.env.MicrosoftAppId, conversationReference, async turnContext => {
let carddata = await MeetingNotficationBot.MeetingStartEndCard(turnContext, meetingIndicator);
});
}
}
res.status(202).send();
}
}
// Listen for incoming meeting updates.
server.post('/api/notifications', notification);