-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathchatbot.js
135 lines (113 loc) · 3.52 KB
/
chatbot.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
require('dotenv').config();
const Vonage = require('@vonage/server-sdk');
const dialogflow = require('@google-cloud/dialogflow');
const projectId = process.env.DIALOGFLOW_PROJECT_ID;
const sessionId = Math.random().toString(36).substr(2, 9);
const languageCode = 'pt';
const express = require('express');
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(express.static('public'));
// Instantiates a session client
const sessionClient = new dialogflow.SessionsClient();
const vonage = new Vonage(
{
apiKey: process.env.VONAGE_API_KEY,
apiSecret: process.env.VONAGE_API_SECRET,
applicationId: process.env.VONAGE_APPLICATION_ID,
privateKey: process.env.VONAGE_APPLICATION_PRIVATE_KEY_PATH,
},
{
apiHost: `https://messages-sandbox.nexmo.com/`,
}
);
// Receives the user input
app.post('/inbound', function (req, res) {
let messageSentByTheUser = req.body.message.content.text;
let query = messageSentByTheUser;
let request = require('request');
let headers = {
'Content-Type': 'application/json',
Accept: 'application/json',
};
async function detectIntent(
projectId,
sessionId,
query,
contexts,
languageCode
) {
// The path to identify the agent that owns the created intent.
const sessionPath = sessionClient.projectAgentSessionPath(
projectId,
sessionId
);
// The text query request.
const request = {
session: sessionPath,
queryInput: {
text: {
text: query,
languageCode: languageCode,
},
},
};
if (contexts && contexts.length > 0) {
request.queryParams = {
contexts: contexts,
};
}
const responses = await sessionClient.detectIntent(request);
return responses[0];
}
async function executeQueries(projectId, sessionId, query, languageCode) {
let context;
let intentResponse;
try {
console.log(`Sending Query: ${query}`);
intentResponse = await detectIntent(
projectId,
sessionId,
query,
context,
languageCode
);
console.log('Detected intent');
console.log(
`Fulfillment Text: ${intentResponse.queryResult.fulfillmentText}`
);
let dataString = `{ "from": { "type": "whatsapp", "number": "${process.env.WHATSAPP_NUMBER}" }, "to": { "type": "whatsapp", "number": "${process.env.TO_NUMBER}" }, "message": { "content": { "type": "text", "text": "${intentResponse.queryResult.fulfillmentText}" } } }`;
let options = {
url: 'https://messages-sandbox.nexmo.com/v0.1/messages',
method: 'POST',
headers: headers,
body: dataString,
auth: {
user: process.env.VONAGE_API_KEY,
pass: process.env.VONAGE_API_SECRET,
},
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
}
request(options, callback);
// Use the context from this response for next queries
context = intentResponse.queryResult.outputContexts;
} catch (error) {
console.log(error);
}
}
executeQueries(projectId, sessionId, query, languageCode);
res.status(204).end();
});
// This endpoint receives information about events in the app
app.post('/status', function (req, res) {
res.status(204).end();
});
// Listens for requests
const listener = app.listen(process.env.PORT, () => {
console.log('Your app is listening on port ' + listener.address().port);
});