@tiledesk/tiledesk-tybot-connector 0.1.43 → 0.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/TiledeskExpression.js +10 -3
- package/index.js +11 -11
- package/models/TiledeskChatbot.js +71 -54
- package/models/TiledeskChatbotUtil.js +1 -1
- package/package.json +2 -2
- package/test/conversation-form-test.js +84 -23
- package/test/expression_evaluator_test.js +161 -0
- package/tiledeskChatbotPlugs/DirectivesChatbotPlug.js +5 -5
- package/tiledeskChatbotPlugs/MessagePipeline.js +2 -2
- package/tiledeskChatbotPlugs/WebhookChatbotPlug.js +5 -4
- package/tiledeskChatbotPlugs/directives/DirAssign.js +13 -6
- package/tiledeskChatbotPlugs/directives/DirCondition.js +1 -1
- package/tiledeskChatbotPlugs/directives/DirIntent.js +1 -0
- package/tiledeskChatbotPlugs/directives/DirLockIntent.js +70 -12
- package/tiledeskChatbotPlugs/directives/DirUnlockIntent.js +29 -9
- package/test/condition_evaluator_test.js +0 -151
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
available on:
|
|
6
6
|
▶️ https://www.npmjs.com/package/@tiledesk/tiledesk-tybot-connector
|
|
7
7
|
|
|
8
|
+
### 0.1.45
|
|
9
|
+
- DirLockIntent added varibleName parameter
|
|
10
|
+
|
|
11
|
+
### 0.1.44
|
|
12
|
+
- Variables to webhook
|
|
13
|
+
|
|
8
14
|
### 0.1.43
|
|
9
15
|
- added context variable chatbot.addParameter("_tdRequestId", requestId);
|
|
10
16
|
- completed TiledeskIntentsMachine.js
|
package/TiledeskExpression.js
CHANGED
|
@@ -38,7 +38,7 @@ class TiledeskExpression {
|
|
|
38
38
|
// console.log("Original expression:", _expression);
|
|
39
39
|
let expression = String(_expression).replace(/\$/g, "$data.");
|
|
40
40
|
// console.log("Evaluating expression:", expression);
|
|
41
|
-
// console.log("With variables:", variables);
|
|
41
|
+
// console.log("With variables:", JSON.stringify(variables));
|
|
42
42
|
const result = new TiledeskExpression().evaluate(expression, variables);
|
|
43
43
|
// console.log("Expression result:", result);
|
|
44
44
|
return result;
|
|
@@ -46,9 +46,16 @@ class TiledeskExpression {
|
|
|
46
46
|
|
|
47
47
|
// private
|
|
48
48
|
evaluate(expression, context) {
|
|
49
|
-
let fn
|
|
49
|
+
let fn;
|
|
50
|
+
let res
|
|
51
|
+
try {
|
|
52
|
+
fn = Function(`let $data = this;return (${expression})`);
|
|
53
|
+
res = fn.bind(context)()
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error("Error:", err.message, "evaluating expression: '" + expression + "'");
|
|
57
|
+
}
|
|
50
58
|
// let fn = Function(`let $data = this;console.log('data', $data);return (${conditionExpression})`);
|
|
51
|
-
let res = fn.bind(context)()
|
|
52
59
|
return res;
|
|
53
60
|
}
|
|
54
61
|
|
package/index.js
CHANGED
|
@@ -46,7 +46,7 @@ const { DirSendEmail } = require('./tiledeskChatbotPlugs/directives/DirSendEmail
|
|
|
46
46
|
const { Directives } = require('./tiledeskChatbotPlugs/directives/Directives.js');
|
|
47
47
|
//let Faq = require('./models/faq');
|
|
48
48
|
//let Faq_kb = require('./models/faq_kb');
|
|
49
|
-
let connection;
|
|
49
|
+
// let connection;
|
|
50
50
|
let APIURL = null;
|
|
51
51
|
let staticBots;
|
|
52
52
|
|
|
@@ -156,15 +156,17 @@ router.post('/ext/:botid', async (req, res) => {
|
|
|
156
156
|
if (message.request && message.request.location && message.request.location.city) {
|
|
157
157
|
await chatbot.addParameter("_tdCity", message.request.location.city);
|
|
158
158
|
}
|
|
159
|
-
|
|
159
|
+
if (message.text) {
|
|
160
|
+
await chatbot.addParameter("_tdUserText", message.text);
|
|
161
|
+
}
|
|
160
162
|
if (requestSourcePage) {
|
|
161
|
-
await chatbot.addParameter("
|
|
163
|
+
await chatbot.addParameter("_tdRequestSourcePage", sourcePage);
|
|
162
164
|
}
|
|
163
165
|
if (requestLanguage) {
|
|
164
|
-
await chatbot.addParameter("
|
|
166
|
+
await chatbot.addParameter("_tdRequestLanguage", language);
|
|
165
167
|
}
|
|
166
168
|
if (requestUserAgent) {
|
|
167
|
-
await chatbot.addParameter("
|
|
169
|
+
await chatbot.addParameter("_tdRequestUserAgent", userAgent);
|
|
168
170
|
}
|
|
169
171
|
let reply = await chatbot.replyToMessage(message);
|
|
170
172
|
if (!reply) {
|
|
@@ -280,7 +282,7 @@ router.post('/ext/:projectId/requests/:requestId/messages', async (req, res) =>
|
|
|
280
282
|
if (log) {console.log("request_key:", request_key);}
|
|
281
283
|
if (tdcache) {
|
|
282
284
|
request = await tdcache.getJSON(request_key)
|
|
283
|
-
if (log) {console.log("Request from cache:", request);}
|
|
285
|
+
if (log) {console.log("Request from cache:", JSON.stringify(request));}
|
|
284
286
|
if (!request) {
|
|
285
287
|
if (log) {console.log("!Request from cache", requestId);}
|
|
286
288
|
try {
|
|
@@ -310,10 +312,7 @@ router.post('/ext/:projectId/requests/:requestId/messages', async (req, res) =>
|
|
|
310
312
|
id_project: projectId
|
|
311
313
|
}
|
|
312
314
|
}
|
|
313
|
-
|
|
314
|
-
if (log) {console.log("request::", request);}
|
|
315
|
-
}
|
|
316
|
-
if (log) {console.log("request....", request);}
|
|
315
|
+
// if (log) {console.log("request....", JSON.stringify(request));}
|
|
317
316
|
let directivesPlug = new DirectivesChatbotPlug({supportRequest: request, TILEDESK_API_ENDPOINT: APIURL, TILEBOT_ENDPOINT:process.env.TYBOT_ENDPOINT, token: token, log: log, HELP_CENTER_API_ENDPOINT: process.env.HELP_CENTER_API_ENDPOINT, cache: tdcache});
|
|
318
317
|
// PIPELINE-EXT
|
|
319
318
|
// if (log) {console.log("answer to process:", JSON.stringify(answer));}
|
|
@@ -452,7 +451,8 @@ async function startApp(settings, completionCallback) {
|
|
|
452
451
|
|
|
453
452
|
if (!staticBots) {
|
|
454
453
|
console.log("(Tilebot) Connecting to mongodb...");
|
|
455
|
-
connection =
|
|
454
|
+
// connection =
|
|
455
|
+
mongoose.connect(settings.MONGODB_URI, { "useNewUrlParser": true, "autoIndex": false }, async (err) => {
|
|
456
456
|
if (err) {
|
|
457
457
|
console.error('(Tilebot) Failed to connect to MongoDB on ' + settings.MONGODB_URI + " ", err);
|
|
458
458
|
//process.exit(1); // add => exitOnFail: true
|
|
@@ -7,6 +7,8 @@ const { WebhookChatbotPlug } = require('../tiledeskChatbotPlugs/WebhookChatbotPl
|
|
|
7
7
|
const { TiledeskClient } = require('@tiledesk/tiledesk-client');
|
|
8
8
|
const { IntentForm } = require('./IntentForm.js');
|
|
9
9
|
const { TiledeskChatbotUtil } = require('./TiledeskChatbotUtil.js');
|
|
10
|
+
const { DirLockIntent } = require('../tiledeskChatbotPlugs/directives/DirLockIntent');
|
|
11
|
+
const { DirUnlockIntent } = require('../tiledeskChatbotPlugs/directives/DirUnlockIntent');
|
|
10
12
|
|
|
11
13
|
class TiledeskChatbot {
|
|
12
14
|
|
|
@@ -59,32 +61,40 @@ class TiledeskChatbot {
|
|
|
59
61
|
console.log("replyToMessage() > lead found:", JSON.stringify(lead));
|
|
60
62
|
}
|
|
61
63
|
|
|
62
|
-
// Checking locked intent
|
|
63
|
-
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
reply
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
64
|
+
// Checking locked intent (for non-internal intents)
|
|
65
|
+
// internal intents always "skip" the locked intent
|
|
66
|
+
// if (message.text.startsWith("/") && message.sender != "_tdinternal") {
|
|
67
|
+
const locked_intent = await this.currentLockedIntent(this.requestId);
|
|
68
|
+
if (this.log) {console.log("got locked intent", locked_intent)}
|
|
69
|
+
if (locked_intent) {
|
|
70
|
+
const tdclient = new TiledeskClient({
|
|
71
|
+
projectId: this.projectId,
|
|
72
|
+
token: this.token,
|
|
73
|
+
APIURL: this.APIURL,
|
|
74
|
+
APIKEY: this.APIKEY,
|
|
75
|
+
log: false
|
|
76
|
+
});
|
|
77
|
+
// it only gets the locked_intent
|
|
78
|
+
const faq = await this.botsDataSource.getByIntentDisplayName(this.botId, locked_intent);
|
|
79
|
+
if (this.log) {console.log("locked intent. got faqs", faq)}
|
|
80
|
+
let reply;
|
|
81
|
+
if (faq) {
|
|
82
|
+
reply = await this.execIntent(faq, message, lead);//, bot);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
reply = {
|
|
86
|
+
"text": "An error occurred while getting locked intent:'" + locked_intent
|
|
87
|
+
}
|
|
83
88
|
}
|
|
89
|
+
resolve(reply);
|
|
90
|
+
return;
|
|
84
91
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
92
|
+
// }
|
|
93
|
+
// else if (message.text.startsWith("/")) {
|
|
94
|
+
// if (this.log) {
|
|
95
|
+
// console.log("Internal intent". message.text, "skips locked intent check");
|
|
96
|
+
// }
|
|
97
|
+
// }
|
|
88
98
|
|
|
89
99
|
let explicit_intent_name = null;
|
|
90
100
|
// Explicit intent invocation
|
|
@@ -225,7 +235,7 @@ class TiledeskChatbot {
|
|
|
225
235
|
async execIntent(faq, message, lead) {//, bot) {
|
|
226
236
|
let answerObj = faq; // faqs[0];
|
|
227
237
|
const botId = this.botId;
|
|
228
|
-
let sender = 'bot_' + botId;
|
|
238
|
+
// let sender = 'bot_' + botId;
|
|
229
239
|
//var answerObj;
|
|
230
240
|
//answerObj.score = 100; // exact search has max score
|
|
231
241
|
if (this.log) {
|
|
@@ -253,30 +263,30 @@ class TiledeskChatbot {
|
|
|
253
263
|
|
|
254
264
|
let intent_name = answerObj.intent_display_name
|
|
255
265
|
// THE FORM
|
|
256
|
-
if (intent_name === "test_form_intent") {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
266
|
+
// if (intent_name === "test_form_intent") {
|
|
267
|
+
// answerObj.form = {
|
|
268
|
+
// "cancelCommands": ['reset', 'cancel'],
|
|
269
|
+
// "cancelReply": "Ok canceled!",
|
|
270
|
+
// "fields": [
|
|
271
|
+
// {
|
|
272
|
+
// "name": "userFullname",
|
|
273
|
+
// "type": "text",
|
|
274
|
+
// "label": "What is your name?\n* Andrea\n* Marco\n* Mirco\n* Luca Leo"
|
|
275
|
+
// },{
|
|
276
|
+
// "name": "companyName",
|
|
277
|
+
// "type": "text",
|
|
278
|
+
// "label": "Thank you ${userFullname}! What is your Company name?\n* Tiledesk\n* Frontiere21"
|
|
279
|
+
// },
|
|
280
|
+
// {
|
|
281
|
+
// "name": "userEmail",
|
|
282
|
+
// "type": "text",
|
|
283
|
+
// "regex": "/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$/",
|
|
284
|
+
// "label": "Hi ${userFullname} from ${companyName}\n\nJust one last question\n\nYour email 🙂\n* andrea@libero.it\n* andrea@tiledesk.com",
|
|
285
|
+
// "errorLabel": "${userFullname} this email address is invalid\n\nCan you insert a correct email address?"
|
|
286
|
+
// }
|
|
287
|
+
// ]
|
|
288
|
+
// };
|
|
289
|
+
// }
|
|
280
290
|
let intent_form = answerObj.form;
|
|
281
291
|
if (this.log) {
|
|
282
292
|
console.log("IntentForm.isValidForm(intent_form)", IntentForm.isValidForm(intent_form));
|
|
@@ -398,7 +408,6 @@ class TiledeskChatbot {
|
|
|
398
408
|
if (this.log) {console.log("We must clientUpdateUserFullname with:", clientUpdateUserFullname)};
|
|
399
409
|
static_bot_answer.attributes.updateUserFullname = clientUpdateUserFullname;
|
|
400
410
|
}
|
|
401
|
-
// console.log("...static_bot_answer ready:", JSON.stringify(static_bot_answer));
|
|
402
411
|
// exec webhook
|
|
403
412
|
const bot_answer = await this.execWebhook(static_bot_answer, message, this.bot, context, this.token);
|
|
404
413
|
if (this.log) {console.log("bot_answer ready:", JSON.stringify(bot_answer));}
|
|
@@ -406,7 +415,8 @@ class TiledeskChatbot {
|
|
|
406
415
|
}
|
|
407
416
|
|
|
408
417
|
async lockIntent(requestId, intent_name) {
|
|
409
|
-
await this.tdcache.set("tilebot:requests:" + requestId + ":locked", intent_name);
|
|
418
|
+
// await this.tdcache.set("tilebot:requests:" + requestId + ":locked", intent_name);
|
|
419
|
+
await DirLockIntent.lockIntent(this.tdcache, requestId, intent_name);
|
|
410
420
|
}
|
|
411
421
|
|
|
412
422
|
async currentLockedIntent(requestId) {
|
|
@@ -419,7 +429,8 @@ class TiledeskChatbot {
|
|
|
419
429
|
}
|
|
420
430
|
|
|
421
431
|
async unlockIntent(requestId) {
|
|
422
|
-
await this.tdcache
|
|
432
|
+
await DirUnlockIntent.unlockIntent(this.tdcache, requestId);
|
|
433
|
+
// await this.tdcache.del("tilebot:requests:" + requestId + ":locked");
|
|
423
434
|
}
|
|
424
435
|
|
|
425
436
|
async addParameter(parameter_name, parameter_value) {
|
|
@@ -458,10 +469,16 @@ class TiledeskChatbot {
|
|
|
458
469
|
return request_key;
|
|
459
470
|
}
|
|
460
471
|
|
|
461
|
-
async execWebhook(static_bot_answer,
|
|
472
|
+
async execWebhook(static_bot_answer, userMessage, bot, context) {
|
|
473
|
+
if (this.log) {console.log("static_bot_answer.attributes.webhook:", static_bot_answer.attributes.webhook);}
|
|
474
|
+
if (static_bot_answer.attributes && static_bot_answer.attributes.webhook && static_bot_answer.attributes.webhook === true) {
|
|
475
|
+
const variables = await this.allParameters();
|
|
476
|
+
context.variables = variables;
|
|
477
|
+
if (this.log) {console.log("adding variables to webhook context:", context.variables);}
|
|
478
|
+
}
|
|
462
479
|
const messagePipeline = new MessagePipeline(static_bot_answer, context);
|
|
463
480
|
const webhookurl = bot.webhook_url;
|
|
464
|
-
messagePipeline.addPlug(new WebhookChatbotPlug(
|
|
481
|
+
messagePipeline.addPlug(new WebhookChatbotPlug(userMessage.request, webhookurl, this.token, this.log));
|
|
465
482
|
//messagePipeline.addPlug(directivesPlug);
|
|
466
483
|
//messagePipeline.addPlug(new SplitsChatbotPlug(log));
|
|
467
484
|
//messagePipeline.addPlug(new MarkbotChatbotPlug(log));
|
|
@@ -17,7 +17,7 @@ class TiledeskChatbotUtil {
|
|
|
17
17
|
}
|
|
18
18
|
if (parts.length > 1) {
|
|
19
19
|
let json_string = explicit_intent_name.substring(parts[0].length);
|
|
20
|
-
|
|
20
|
+
console.log("json_string (params)", json_string);
|
|
21
21
|
try {
|
|
22
22
|
intent.parameters = JSON.parse(json_string);
|
|
23
23
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiledesk/tiledesk-tybot-connector",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.45",
|
|
4
4
|
"description": "Tiledesk Tybot connector",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@tiledesk/helpcenter-query-client": "^0.1.8",
|
|
15
15
|
"@tiledesk/tiledesk-chatbot-client": "^0.5.30",
|
|
16
|
-
"@tiledesk/tiledesk-chatbot-util": "^0.8.
|
|
16
|
+
"@tiledesk/tiledesk-chatbot-util": "^0.8.39",
|
|
17
17
|
"@tiledesk/tiledesk-client": "^0.9.5",
|
|
18
18
|
"axios": "^0.27.2",
|
|
19
19
|
"body-parser": "^1.19.0",
|
|
@@ -144,12 +144,12 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
144
144
|
});
|
|
145
145
|
|
|
146
146
|
it('/disable_input', (done) => {
|
|
147
|
-
|
|
147
|
+
console.log("/disable_input...");
|
|
148
148
|
let listener;
|
|
149
149
|
let endpointServer = express();
|
|
150
150
|
endpointServer.use(bodyParser.json());
|
|
151
151
|
endpointServer.post('/:projectId/requests/:requestId/messages', function (req, res) {
|
|
152
|
-
|
|
152
|
+
console.log("req.body....:", JSON.stringify(req.body));
|
|
153
153
|
res.send({ success: true });
|
|
154
154
|
const message = req.body;
|
|
155
155
|
|
|
@@ -194,14 +194,14 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
194
194
|
});
|
|
195
195
|
|
|
196
196
|
it('/good_form', (done) => {
|
|
197
|
-
|
|
197
|
+
console.log("/good_form...");
|
|
198
198
|
const message_id = uuidv4();
|
|
199
199
|
const reply_text = "Andrea";
|
|
200
200
|
let listener;
|
|
201
201
|
let endpointServer = express();
|
|
202
202
|
endpointServer.use(bodyParser.json());
|
|
203
203
|
endpointServer.post('/:projectId/requests/:requestId/messages', function (req, res) {
|
|
204
|
-
|
|
204
|
+
console.log("req.body22222:", JSON.stringify(req.body));
|
|
205
205
|
res.send({ success: true });
|
|
206
206
|
const message = req.body;
|
|
207
207
|
|
|
@@ -223,7 +223,7 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
223
223
|
"token": CHATBOT_TOKEN
|
|
224
224
|
}
|
|
225
225
|
sendMessageToBot(request, BOT_ID, CHATBOT_TOKEN, () => {
|
|
226
|
-
|
|
226
|
+
console.log("Message sent.", request);
|
|
227
227
|
});
|
|
228
228
|
}
|
|
229
229
|
else if (message.text === "It's a good form Andrea") {
|
|
@@ -233,13 +233,15 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
233
233
|
assert.ok(false);
|
|
234
234
|
}
|
|
235
235
|
else {
|
|
236
|
-
|
|
236
|
+
console.log("params2:", params);
|
|
237
237
|
assert(params);
|
|
238
238
|
assert(params["_tdLastMessageId"] === message_id);
|
|
239
239
|
assert(params["_tdProjectId"] === PROJECT_ID);
|
|
240
240
|
assert(params["your_fullname"] === reply_text);
|
|
241
241
|
assert(params["_tdTypeOf:your_fullname"]);
|
|
242
|
+
console.log("ok2")
|
|
242
243
|
listener.close(() => {
|
|
244
|
+
console.log("done2");
|
|
243
245
|
done();
|
|
244
246
|
});
|
|
245
247
|
}
|
|
@@ -247,7 +249,7 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
247
249
|
|
|
248
250
|
}
|
|
249
251
|
else {
|
|
250
|
-
console.error("Unexpected
|
|
252
|
+
console.error("Unexpected message2.");
|
|
251
253
|
assert.ok(false);
|
|
252
254
|
}
|
|
253
255
|
|
|
@@ -279,16 +281,16 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
279
281
|
});
|
|
280
282
|
|
|
281
283
|
it('(intent-to-intent) /move_to => /target_intent', (done) => {
|
|
282
|
-
|
|
284
|
+
console.log("(intent-to-intent) /move_to => /target_intent");
|
|
283
285
|
let listener;
|
|
284
286
|
let endpointServer = express();
|
|
285
287
|
endpointServer.use(bodyParser.json());
|
|
286
288
|
endpointServer.post('/:projectId/requests/:requestId/messages', function (req, res) {
|
|
287
289
|
res.send({ success: true });
|
|
288
290
|
const message = req.body;
|
|
289
|
-
|
|
291
|
+
console.log("received message33:", JSON.stringify(message));
|
|
290
292
|
if (message.text === "The target!") {
|
|
291
|
-
|
|
293
|
+
console.log("Got it. End.");
|
|
292
294
|
listener.close(() => {
|
|
293
295
|
done();
|
|
294
296
|
});
|
|
@@ -316,13 +318,13 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
316
318
|
}
|
|
317
319
|
// console.log("sending message:", request);
|
|
318
320
|
sendMessageToBot(request, BOT_ID, CHATBOT_TOKEN, () => {
|
|
319
|
-
|
|
321
|
+
console.log("Message sent33.");
|
|
320
322
|
});
|
|
321
323
|
});
|
|
322
324
|
});
|
|
323
325
|
|
|
324
326
|
it('/all_filled (none) => /form_to_unfill => (fill) => /all_filled (all) /form_to_unfill (bypass because filled) => /delete_fullname => all_filled (no fullname) => /form_to_unfill (verify it asks only for fullname) => all_filled (all, again)', (done) => {
|
|
325
|
-
|
|
327
|
+
console.log("/all_filled (none) =>...");
|
|
326
328
|
let request0_uuid = uuidv4();
|
|
327
329
|
let request1_uuid = uuidv4();
|
|
328
330
|
let request2_uuid = uuidv4();
|
|
@@ -339,9 +341,12 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
339
341
|
endpointServer.post('/:projectId/requests/:requestId/messages', function (req, res) {
|
|
340
342
|
res.send({ success: true });
|
|
341
343
|
const message = req.body;
|
|
342
|
-
|
|
344
|
+
console.log("received message__3:", JSON.stringify(message));
|
|
345
|
+
console.log("message.triggeredByMessageId:", message.triggeredByMessageId);
|
|
346
|
+
console.log("message.text:", message.text);
|
|
347
|
+
|
|
343
348
|
if (message.text === "You filled\nfullname: ${fullname}\nyouremail: ${youremail}" && message.triggeredByMessageId === request0_uuid) {
|
|
344
|
-
|
|
349
|
+
console.log("got #0 'You filled...' sending #1");
|
|
345
350
|
let request = {
|
|
346
351
|
"payload": {
|
|
347
352
|
"_id": request1_uuid,
|
|
@@ -363,7 +368,7 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
363
368
|
});
|
|
364
369
|
}
|
|
365
370
|
else if (message.text === "Your name?" && message.triggeredByMessageId === request1_uuid) {
|
|
366
|
-
|
|
371
|
+
console.log("got #1 sending #2");
|
|
367
372
|
let request = {
|
|
368
373
|
"payload": {
|
|
369
374
|
"_id": request2_uuid,
|
|
@@ -381,14 +386,14 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
381
386
|
"token": CHATBOT_TOKEN
|
|
382
387
|
}
|
|
383
388
|
sendMessageToBot(request, BOT_ID, CHATBOT_TOKEN, () => {
|
|
384
|
-
|
|
389
|
+
console.log("Message sent4.", request);
|
|
385
390
|
});
|
|
386
391
|
// listener.close( () => {
|
|
387
392
|
// done();
|
|
388
393
|
// });
|
|
389
394
|
}
|
|
390
395
|
else if (message.text === "Your email?" && message.triggeredByMessageId === request2_uuid) {
|
|
391
|
-
|
|
396
|
+
console.log("got #2 sending #3");
|
|
392
397
|
let request = {
|
|
393
398
|
"payload": {
|
|
394
399
|
"_id": request3_uuid,
|
|
@@ -406,14 +411,14 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
406
411
|
"token": CHATBOT_TOKEN
|
|
407
412
|
}
|
|
408
413
|
sendMessageToBot(request, BOT_ID, CHATBOT_TOKEN, () => {
|
|
409
|
-
|
|
414
|
+
console.log("Message sent5.", request);
|
|
410
415
|
});
|
|
411
416
|
// listener.close( () => {
|
|
412
417
|
// done();
|
|
413
418
|
// });
|
|
414
419
|
}
|
|
415
420
|
else if (message.text === "Thanks Andrea\nYour email test@test.it" && message.triggeredByMessageId === request3_uuid) {
|
|
416
|
-
|
|
421
|
+
console.log("got #3 sending #4");
|
|
417
422
|
let request = {
|
|
418
423
|
"payload": {
|
|
419
424
|
"_id": request4_uuid,
|
|
@@ -431,14 +436,14 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
431
436
|
"token": CHATBOT_TOKEN
|
|
432
437
|
}
|
|
433
438
|
sendMessageToBot(request, BOT_ID, CHATBOT_TOKEN, () => {
|
|
434
|
-
|
|
439
|
+
console.log("got #3 sending #4. Message sent.", request);
|
|
435
440
|
});
|
|
436
441
|
// listener.close( () => {
|
|
437
442
|
// done();
|
|
438
443
|
// });
|
|
439
444
|
}
|
|
440
445
|
else if (message.text === "You filled\nfullname: Andrea\nyouremail: test@test.it" && message.triggeredByMessageId === request4_uuid) {
|
|
441
|
-
|
|
446
|
+
console.log("got #4 sending #5");
|
|
442
447
|
let request = {
|
|
443
448
|
"payload": {
|
|
444
449
|
"_id": request5_uuid,
|
|
@@ -556,11 +561,11 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
556
561
|
"token": CHATBOT_TOKEN
|
|
557
562
|
}
|
|
558
563
|
sendMessageToBot(request, BOT_ID, CHATBOT_TOKEN, () => {
|
|
559
|
-
|
|
564
|
+
console.log("got #8 sending #9. Message sent.", request);
|
|
560
565
|
});
|
|
561
566
|
}
|
|
562
567
|
else if (message.text === "You filled\nfullname: ${fullname}\nyouremail: ${youremail}") {
|
|
563
|
-
|
|
568
|
+
console.log("got #9. End.");
|
|
564
569
|
listener.close(() => {
|
|
565
570
|
done();
|
|
566
571
|
});
|
|
@@ -736,6 +741,62 @@ describe('Conversation1 - Form filling', async () => {
|
|
|
736
741
|
});
|
|
737
742
|
});
|
|
738
743
|
|
|
744
|
+
it('/assign_params{...} with multi-line JSON', (done) => {
|
|
745
|
+
// console.log("/assign_params...");
|
|
746
|
+
let listener;
|
|
747
|
+
let endpointServer = express();
|
|
748
|
+
endpointServer.use(bodyParser.json());
|
|
749
|
+
endpointServer.post('/:projectId/requests/:requestId/messages', function (req, res) {
|
|
750
|
+
res.send({ success: true });
|
|
751
|
+
const message = req.body;
|
|
752
|
+
if (message.text) {
|
|
753
|
+
assert(message.text === "myvar: places");
|
|
754
|
+
getChatbotParameters(REQUEST_ID, (err, params) => {
|
|
755
|
+
if (err) {
|
|
756
|
+
assert.ok(false);
|
|
757
|
+
}
|
|
758
|
+
else {
|
|
759
|
+
// console.log("params /assign_params:", params);
|
|
760
|
+
assert(params);
|
|
761
|
+
assert(params["var1"] === "value1");
|
|
762
|
+
assert(params["var2"] === "value2");
|
|
763
|
+
listener.close(() => {
|
|
764
|
+
done();
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
else {
|
|
770
|
+
console.error("Unexpected message.");
|
|
771
|
+
assert.ok(false);
|
|
772
|
+
}
|
|
773
|
+
});
|
|
774
|
+
listener = endpointServer.listen(10002, '0.0.0.0', function () {
|
|
775
|
+
let request = {
|
|
776
|
+
"payload": {
|
|
777
|
+
"_id": uuidv4(),
|
|
778
|
+
"senderFullname": "guest#367e",
|
|
779
|
+
"type": "text",
|
|
780
|
+
"sender": "A-SENDER",
|
|
781
|
+
"recipient": REQUEST_ID,
|
|
782
|
+
"text": `/assign_params{
|
|
783
|
+
"var1": "value1",
|
|
784
|
+
"var2": "value2"
|
|
785
|
+
}`,
|
|
786
|
+
"id_project": PROJECT_ID,
|
|
787
|
+
"request": {
|
|
788
|
+
"request_id": REQUEST_ID,
|
|
789
|
+
"id_project": PROJECT_ID
|
|
790
|
+
}
|
|
791
|
+
},
|
|
792
|
+
"token": CHATBOT_TOKEN
|
|
793
|
+
}
|
|
794
|
+
sendMessageToBot(request, BOT_ID, CHATBOT_TOKEN, () => {
|
|
795
|
+
// console.log("Message sent.", request);
|
|
796
|
+
});
|
|
797
|
+
});
|
|
798
|
+
});
|
|
799
|
+
|
|
739
800
|
it('/if_you_live_IT (_tdCondition) TRUE', (done) => {
|
|
740
801
|
// console.log("/if_you_live_IT (TRUE)...");
|
|
741
802
|
let listener;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
var assert = require('assert');
|
|
2
|
+
const { TiledeskExpression } = require('../TiledeskExpression');
|
|
3
|
+
|
|
4
|
+
describe('Evaluate basic conditions', function() {
|
|
5
|
+
|
|
6
|
+
it('quick conditions 1 - true', async () => {
|
|
7
|
+
const condition = "$userFullname === 'Andrea'"
|
|
8
|
+
console.log("Evaluating condition:", condition);
|
|
9
|
+
let context = {userFullname: 'Andrea'};
|
|
10
|
+
console.log("With context:", context);
|
|
11
|
+
const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
12
|
+
console.log("conditionResult:", result);
|
|
13
|
+
assert(result === true);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('quick conditions 2 - empty context', async () => {
|
|
17
|
+
const condition = "$userFullname === 'Andrea'"
|
|
18
|
+
console.log("Evaluating condition:", condition);
|
|
19
|
+
context = {};
|
|
20
|
+
console.log("With context:", context);
|
|
21
|
+
const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
22
|
+
console.log("conditionResult:", result);
|
|
23
|
+
assert(result === false);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('quick conditions 3 - false', async () => {
|
|
27
|
+
const condition = "$userFullname === 'Andrea'"
|
|
28
|
+
console.log("Evaluating condition:", condition);
|
|
29
|
+
context = {userFullname: 'Andreus'};
|
|
30
|
+
console.log("With context:", context);
|
|
31
|
+
const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
32
|
+
console.log("conditionResult:", result);
|
|
33
|
+
assert(result === false);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('condition 2 - numbers and string comparison - true', async () => {
|
|
37
|
+
const condition = "$score >= $minimumScore && $topic === $testTopic";
|
|
38
|
+
console.log("Evaluating condition:", condition);
|
|
39
|
+
context = {
|
|
40
|
+
score: 10,
|
|
41
|
+
minimumScore: 5,
|
|
42
|
+
topic: "Angular",
|
|
43
|
+
testTopic: "Angular"
|
|
44
|
+
};
|
|
45
|
+
console.log("With context:", context);
|
|
46
|
+
const result = new TiledeskExpression().evaluateExpression(condition, context)
|
|
47
|
+
console.log("conditionResult2:", result);
|
|
48
|
+
assert(result === true);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('condition 3 - startsWith -> false', async () => {
|
|
52
|
+
const condition = "$site.url.startsWith($url_match)";
|
|
53
|
+
console.log("Evaluating condition:", condition);
|
|
54
|
+
context = {
|
|
55
|
+
site: {
|
|
56
|
+
url: "https://tiledesk.com/pricing"
|
|
57
|
+
},
|
|
58
|
+
url_match: "pricing"
|
|
59
|
+
};
|
|
60
|
+
const result = new TiledeskExpression().evaluateExpression(condition, context)
|
|
61
|
+
console.log("conditionResult3:", result);
|
|
62
|
+
assert(result === false);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('condition 4 - startsWith -> true', async () => {
|
|
66
|
+
const condition = "$site.url.startsWith($url_match)";
|
|
67
|
+
console.log("Evaluating condition:", condition);
|
|
68
|
+
context = {
|
|
69
|
+
site: {
|
|
70
|
+
url: "https://tiledesk.com/pricing"
|
|
71
|
+
},
|
|
72
|
+
url_match: "https:"
|
|
73
|
+
};
|
|
74
|
+
const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
75
|
+
console.log("conditionResult4:", result);
|
|
76
|
+
assert(result === true);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('condition 5 - compare string with a constant', async () => {
|
|
80
|
+
const condition = "$_tdCountry === 'IT'";
|
|
81
|
+
// console.log("Evaluating condition:", condition);
|
|
82
|
+
context = {
|
|
83
|
+
"_tdCountry": "IT"
|
|
84
|
+
};
|
|
85
|
+
const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
86
|
+
// console.log("conditionResult:", result);
|
|
87
|
+
assert(result === true);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('condition 6 - invalid expression', async () => {
|
|
91
|
+
const condition = "don't try this";
|
|
92
|
+
// console.log("Evaluating condition:", condition);
|
|
93
|
+
context = {
|
|
94
|
+
"whatever": "IT"
|
|
95
|
+
};
|
|
96
|
+
const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
97
|
+
assert(result === undefined);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('assignment 1', async () => {
|
|
101
|
+
const expression = "$protocol + $site.url";
|
|
102
|
+
console.log("Evaluating assign expression:", expression);
|
|
103
|
+
context = {
|
|
104
|
+
protocol: "https://",
|
|
105
|
+
site: {
|
|
106
|
+
url: "tiledesk.com/pricing"
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
110
|
+
console.log("expression value:", result);
|
|
111
|
+
assert(result === 'https://tiledesk.com/pricing');
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('assignment 2', async () => {
|
|
115
|
+
const expression = "$age + $added";
|
|
116
|
+
console.log("Evaluating assign expression:", expression);
|
|
117
|
+
context = {
|
|
118
|
+
age: 32,
|
|
119
|
+
added: 10
|
|
120
|
+
};
|
|
121
|
+
const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
122
|
+
console.log("expression value:", result);
|
|
123
|
+
assert(result === 42);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('assignment 3 - Number() on numbers', async () => {
|
|
127
|
+
const expression = "Number($age) + Number($added)";
|
|
128
|
+
console.log("Evaluating assign expression:", expression);
|
|
129
|
+
context = {
|
|
130
|
+
age: 33,
|
|
131
|
+
added: 10
|
|
132
|
+
};
|
|
133
|
+
const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
134
|
+
console.log("expression value:", result);
|
|
135
|
+
assert(result === 43);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('assignment 4 - Number() on strings', async () => {
|
|
139
|
+
const expression = "Number($age) + Number($added)";
|
|
140
|
+
console.log("Evaluating assign expression:", expression);
|
|
141
|
+
context = {
|
|
142
|
+
age: "34",
|
|
143
|
+
added: "10"
|
|
144
|
+
};
|
|
145
|
+
const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
146
|
+
console.log("expression value:", result);
|
|
147
|
+
assert(result === 44);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('assignment 5 - Constant int, no context', async () => {
|
|
151
|
+
const expression = 45;
|
|
152
|
+
console.log("Evaluating assign expression:", expression);
|
|
153
|
+
const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
154
|
+
console.log("expression value:", result);
|
|
155
|
+
assert(result === 45);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
@@ -118,7 +118,7 @@ class DirectivesChatbotPlug {
|
|
|
118
118
|
TILEBOT_ENDPOINT:TILEBOT_ENDPOINT,
|
|
119
119
|
departmentId: depId,
|
|
120
120
|
tdcache: tdcache,
|
|
121
|
-
log:
|
|
121
|
+
log: true
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
let curr_directive_index = -1;
|
|
@@ -270,7 +270,7 @@ class DirectivesChatbotPlug {
|
|
|
270
270
|
});
|
|
271
271
|
}
|
|
272
272
|
else if (directive_name === Directives.ASSIGN) {
|
|
273
|
-
|
|
273
|
+
console.log("...DirAssign", context.log);
|
|
274
274
|
const assign_dir = new DirAssign(context);
|
|
275
275
|
assign_dir.execute(directive, () => {
|
|
276
276
|
process(nextDirective());
|
|
@@ -404,17 +404,17 @@ class DirectivesChatbotPlug {
|
|
|
404
404
|
});
|
|
405
405
|
}
|
|
406
406
|
else if (directive_name === Directives.WAIT) {
|
|
407
|
-
new DirWait().execute(directive, () => {
|
|
407
|
+
new DirWait(context).execute(directive, () => {
|
|
408
408
|
process(nextDirective());
|
|
409
409
|
});
|
|
410
410
|
}
|
|
411
411
|
else if (directive_name === Directives.LOCK_INTENT) {
|
|
412
|
-
new DirLockIntent(
|
|
412
|
+
new DirLockIntent(context).execute(directive, () => {
|
|
413
413
|
process(nextDirective());
|
|
414
414
|
});
|
|
415
415
|
}
|
|
416
416
|
else if (directive_name === Directives.UNLOCK_INTENT) {
|
|
417
|
-
new DirUnlockIntent(
|
|
417
|
+
new DirUnlockIntent(context).execute( () => {
|
|
418
418
|
process(nextDirective());
|
|
419
419
|
});
|
|
420
420
|
}
|
|
@@ -16,12 +16,13 @@ class WebhookChatbotPlug {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
exec(pipeline) {
|
|
19
|
-
let
|
|
19
|
+
let answer = pipeline.message;
|
|
20
20
|
let context = pipeline.context;
|
|
21
|
-
if (this.log) {console.log("WEBHOOK?",
|
|
22
|
-
if (
|
|
21
|
+
if (this.log) {console.log("WEBHOOK?", answer.attributes.webhook);}
|
|
22
|
+
if (answer.attributes && answer.attributes.webhook && answer.attributes.webhook === true) {
|
|
23
23
|
if (this.log) {console.log("EXECUTING WEBHOOK URL!", this.webhookurl);}
|
|
24
|
-
this.
|
|
24
|
+
if (this.log) {console.log("EXECUTING WEBHOOK ON CONTEXT:", context);}
|
|
25
|
+
this.execWebhook(answer, context, this.webhookurl, (err, message_from_webhook) => {
|
|
25
26
|
if (this.log) {console.log("message", message_from_webhook);}
|
|
26
27
|
if (err) {
|
|
27
28
|
console.error("Error calling webhook:", this.webhookurl)
|
|
@@ -33,27 +33,30 @@ class DirAssign {
|
|
|
33
33
|
else if (directive.parameter) {
|
|
34
34
|
let params;
|
|
35
35
|
params = this.parseParams(directive.parameter);
|
|
36
|
-
|
|
36
|
+
console.log("DirAssign params:", params);
|
|
37
37
|
action = {
|
|
38
38
|
body: {
|
|
39
39
|
expression: params.expression,
|
|
40
40
|
assignTo: params.assignTo
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
+
console.log("DirAssign action:", action);
|
|
43
44
|
}
|
|
44
45
|
else {
|
|
45
46
|
callback();
|
|
46
47
|
return;
|
|
47
48
|
}
|
|
49
|
+
console.log("go DirAssign with action:", action);
|
|
48
50
|
this.go(action, () => {
|
|
49
51
|
callback();
|
|
50
52
|
});
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
async go(action, callback) {
|
|
56
|
+
console.log("DirAssign action processing:", action)
|
|
54
57
|
const expression = action.body.expression;
|
|
55
58
|
const assignTo = action.body.assignTo;
|
|
56
|
-
if (
|
|
59
|
+
if (assignTo === null || expression === null) {
|
|
57
60
|
if (this.log) {console.log("Invalid expression or assignTo parameters");}
|
|
58
61
|
callback();
|
|
59
62
|
return;
|
|
@@ -71,9 +74,9 @@ class DirAssign {
|
|
|
71
74
|
variableName = filler.fill(assignTo, variables);
|
|
72
75
|
// console.log("assign variable name (after filling):", variableName);
|
|
73
76
|
|
|
74
|
-
if (this.log) {console.log("(DirAssign) Variables:", variables);}
|
|
77
|
+
if (this.log) {console.log("(DirAssign) Variables:", JSON.stringify(variables));}
|
|
75
78
|
const value = await new TiledeskExpression().evaluateExpression(expression, variables);
|
|
76
|
-
if (this.log) {console.log("(DirAssign) executed expression:", expression, "
|
|
79
|
+
if (this.log) {console.log("(DirAssign) executed expression:", expression, "value:", value);}
|
|
77
80
|
await TiledeskChatbot.addParameterStatic(this.context.tdcache, this.context.requestId, variableName, value);
|
|
78
81
|
if (this.log) {console.log("(DirAssign) Assigned:", value, "to", variableName);}
|
|
79
82
|
callback();
|
|
@@ -94,13 +97,17 @@ class DirAssign {
|
|
|
94
97
|
// }
|
|
95
98
|
|
|
96
99
|
parseParams(directive_parameter) {
|
|
100
|
+
console.log("Parsing directive_parameter:", directive_parameter);
|
|
97
101
|
let expression = null;
|
|
98
102
|
let assignTo = null;
|
|
99
103
|
const params = ms(directive_parameter);
|
|
100
|
-
|
|
104
|
+
console.log("params dirassign:", params)
|
|
105
|
+
if (params.expression !== null) {
|
|
106
|
+
console.log("go expression:", params.expression)
|
|
101
107
|
expression = params.expression
|
|
108
|
+
console.log("got it expression:", expression)
|
|
102
109
|
}
|
|
103
|
-
if (params.assignTo) {
|
|
110
|
+
if (params.assignTo !== null) {
|
|
104
111
|
assignTo = params.assignTo;
|
|
105
112
|
}
|
|
106
113
|
return {
|
|
@@ -106,7 +106,7 @@ class DirCondition {
|
|
|
106
106
|
await TiledeskChatbot.allParametersStatic(
|
|
107
107
|
this.context.tdcache, this.context.requestId
|
|
108
108
|
);
|
|
109
|
-
if (this.log) {console.log("Variables:", variables)}
|
|
109
|
+
if (this.log) {console.log("Variables:", JSON.stringify(variables))}
|
|
110
110
|
}
|
|
111
111
|
else {
|
|
112
112
|
console.error("(DirCondition) No this.context.tdcache");
|
|
@@ -1,30 +1,88 @@
|
|
|
1
|
+
const ms = require('minimist-string');
|
|
1
2
|
|
|
2
3
|
class DirLockIntent {
|
|
3
4
|
|
|
4
|
-
constructor(
|
|
5
|
-
if (!
|
|
5
|
+
constructor(context) {
|
|
6
|
+
if (!context) {
|
|
7
|
+
throw new Error('config (TiledeskClient) object is mandatory.');
|
|
8
|
+
}
|
|
9
|
+
this.context = context;
|
|
10
|
+
if (!context.tdcache) {
|
|
6
11
|
throw new Error('tdcache (TdCache) object is mandatory.');
|
|
7
12
|
}
|
|
8
|
-
this.tdcache = tdcache;
|
|
13
|
+
this.tdcache = this.context.tdcache;
|
|
14
|
+
this.log = context.log;
|
|
9
15
|
}
|
|
10
16
|
|
|
11
|
-
async execute(directive,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
async execute(directive, callback) {
|
|
18
|
+
if (this.log) {console.log("Locking intent:", JSON.stringify(directive));}
|
|
19
|
+
let action;
|
|
20
|
+
if (directive.action) {
|
|
21
|
+
// console.log("got intent action:", JSON.stringify(directive.action));
|
|
22
|
+
action = directive.action;
|
|
23
|
+
}
|
|
24
|
+
else if (directive.parameter && directive.parameter.trim() !== "") {
|
|
25
|
+
const params = this.parseParams(directive.parameter);
|
|
26
|
+
action = {
|
|
27
|
+
body: {
|
|
28
|
+
intentName: params.intentName // directive.parameter.trim()
|
|
29
|
+
// variableName: params.variableName
|
|
30
|
+
}
|
|
31
|
+
}
|
|
17
32
|
}
|
|
18
33
|
else {
|
|
34
|
+
console.error("Incorrect directive:", directive);
|
|
19
35
|
callback();
|
|
36
|
+
return;
|
|
20
37
|
}
|
|
38
|
+
// if (directive.parameter) {
|
|
39
|
+
// let intent_name = directive.parameter.trim();
|
|
40
|
+
// await this.lockIntent(requestId, intent_name);
|
|
41
|
+
// callback();
|
|
42
|
+
// }
|
|
43
|
+
// else {
|
|
44
|
+
// callback();
|
|
45
|
+
// }
|
|
46
|
+
this.go(action, () => {
|
|
47
|
+
callback();
|
|
48
|
+
});
|
|
21
49
|
}
|
|
22
50
|
|
|
23
|
-
async
|
|
24
|
-
|
|
25
|
-
//
|
|
51
|
+
async go(action, callback) {
|
|
52
|
+
let intent_name = action.body.intentName;
|
|
53
|
+
// let variable_name = action.body.variableName;
|
|
54
|
+
await DirLockIntent.lockIntent(this.tdcache, this.context.requestId, intent_name); //, variable_name);
|
|
55
|
+
if (this.log) {console.log("Locked intent:", action.body.intentName);}
|
|
56
|
+
if (callback) {
|
|
57
|
+
callback();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static async lockIntent(tdcache, requestId, intent_name) { //}, variable_name) {
|
|
62
|
+
await tdcache.set("tilebot:requests:" + requestId + ":locked", intent_name);
|
|
63
|
+
// if (variable_name) {
|
|
64
|
+
// console.log("locking intent with variable:", variable_name);
|
|
65
|
+
// await this.tdcache.set("tilebot:requests:" + requestId + ":lockedValue", variable_name);
|
|
66
|
+
// }
|
|
67
|
+
// console.log("locked. Intent name:", intent_name, "intent variable:", variable_name);
|
|
26
68
|
}
|
|
27
69
|
|
|
70
|
+
parseParams(directive_parameter) {
|
|
71
|
+
let intentName = null;
|
|
72
|
+
let variableName = null;
|
|
73
|
+
const params = ms(directive_parameter);
|
|
74
|
+
if (params.intentName) {
|
|
75
|
+
intentName = params.intentName
|
|
76
|
+
}
|
|
77
|
+
if (params.variableName) {
|
|
78
|
+
variableName = params.variableName.replace(/[$]/g, ""); // $ sign not permitted. Silently removing if present
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
intentName: intentName,
|
|
82
|
+
variableName: variableName
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
28
86
|
}
|
|
29
87
|
|
|
30
88
|
module.exports = { DirLockIntent };
|
|
@@ -1,21 +1,41 @@
|
|
|
1
1
|
|
|
2
2
|
class DirUnlockIntent {
|
|
3
3
|
|
|
4
|
-
constructor(
|
|
5
|
-
if (!
|
|
4
|
+
constructor(context) {
|
|
5
|
+
if (!context) {
|
|
6
|
+
throw new Error('config (TiledeskClient) object is mandatory.');
|
|
7
|
+
}
|
|
8
|
+
this.context = context;
|
|
9
|
+
if (!context.tdcache) {
|
|
6
10
|
throw new Error('tdcache (TdCache) object is mandatory.');
|
|
7
11
|
}
|
|
8
|
-
this.tdcache = tdcache;
|
|
12
|
+
this.tdcache = context.tdcache;
|
|
13
|
+
this.log = context.log;
|
|
9
14
|
}
|
|
10
15
|
|
|
11
|
-
async execute(requestId, callback) {
|
|
12
|
-
console.log("
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
async execute(directive, requestId, callback) {
|
|
17
|
+
if (this.log) {console.log("Unlocking current intent");}
|
|
18
|
+
this.go(action, () => {
|
|
19
|
+
callback();
|
|
20
|
+
});
|
|
15
21
|
}
|
|
16
22
|
|
|
17
|
-
async
|
|
18
|
-
await this.
|
|
23
|
+
async go(action, callback) {
|
|
24
|
+
await DirUnlockIntent.unlockIntent(this.context.requestId);
|
|
25
|
+
if (callback) {
|
|
26
|
+
callback();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// async execute(requestId, callback) {
|
|
31
|
+
// console.log("Unocking intent");
|
|
32
|
+
// await this.unlockIntent(requestId);
|
|
33
|
+
// callback();
|
|
34
|
+
// }
|
|
35
|
+
|
|
36
|
+
static async unlockIntent(tdcache, requestId) {
|
|
37
|
+
await tdcache.del("tilebot:requests:" + requestId + ":locked");
|
|
38
|
+
// await this.tdcache.del("tilebot:requests:" + requestId + ":locked");
|
|
19
39
|
console.log("unlocked.")
|
|
20
40
|
}
|
|
21
41
|
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
var assert = require('assert');
|
|
2
|
-
const { TiledeskExpression } = require('../TiledeskExpression');
|
|
3
|
-
|
|
4
|
-
describe('Evaluate basic conditions', function() {
|
|
5
|
-
|
|
6
|
-
// it('quick conditions 1 - true', async () => {
|
|
7
|
-
// const condition = "$userFullname === 'Andrea'"
|
|
8
|
-
// console.log("Evaluating condition:", condition);
|
|
9
|
-
// let context = {userFullname: 'Andrea'};
|
|
10
|
-
// console.log("With context:", context);
|
|
11
|
-
// const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
12
|
-
// console.log("conditionResult:", result);
|
|
13
|
-
// assert(result === true);
|
|
14
|
-
// });
|
|
15
|
-
|
|
16
|
-
// it('quick conditions 2 - empty context', async () => {
|
|
17
|
-
// const condition = "$userFullname === 'Andrea'"
|
|
18
|
-
// console.log("Evaluating condition:", condition);
|
|
19
|
-
// context = {};
|
|
20
|
-
// console.log("With context:", context);
|
|
21
|
-
// const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
22
|
-
// console.log("conditionResult:", result);
|
|
23
|
-
// assert(result === false);
|
|
24
|
-
// });
|
|
25
|
-
|
|
26
|
-
// it('quick conditions 3 - false', async () => {
|
|
27
|
-
// const condition = "$userFullname === 'Andrea'"
|
|
28
|
-
// console.log("Evaluating condition:", condition);
|
|
29
|
-
// context = {userFullname: 'Andreus'};
|
|
30
|
-
// console.log("With context:", context);
|
|
31
|
-
// const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
32
|
-
// console.log("conditionResult:", result);
|
|
33
|
-
// assert(result === false);
|
|
34
|
-
// });
|
|
35
|
-
|
|
36
|
-
// it('condition 2 - numbers and string comparison - true', async () => {
|
|
37
|
-
// const condition = "$score >= $minimumScore && $topic === $testTopic";
|
|
38
|
-
// console.log("Evaluating condition:", condition);
|
|
39
|
-
// context = {
|
|
40
|
-
// score: 10,
|
|
41
|
-
// minimumScore: 5,
|
|
42
|
-
// topic: "Angular",
|
|
43
|
-
// testTopic: "Angular"
|
|
44
|
-
// };
|
|
45
|
-
// console.log("With context:", context);
|
|
46
|
-
// const result = new TiledeskExpression().evaluateExpression(condition, context)
|
|
47
|
-
// console.log("conditionResult2:", result);
|
|
48
|
-
// assert(result === true);
|
|
49
|
-
// });
|
|
50
|
-
|
|
51
|
-
// it('condition 3 - startsWith -> false', async () => {
|
|
52
|
-
// const condition = "$site.url.startsWith($url_match)";
|
|
53
|
-
// console.log("Evaluating condition:", condition);
|
|
54
|
-
// context = {
|
|
55
|
-
// site: {
|
|
56
|
-
// url: "https://tiledesk.com/pricing"
|
|
57
|
-
// },
|
|
58
|
-
// url_match: "pricing"
|
|
59
|
-
// };
|
|
60
|
-
// const result = new TiledeskExpression().evaluateExpression(condition, context)
|
|
61
|
-
// console.log("conditionResult3:", result);
|
|
62
|
-
// assert(result === false);
|
|
63
|
-
// });
|
|
64
|
-
|
|
65
|
-
// it('condition 4 - startsWith -> true', async () => {
|
|
66
|
-
// const condition = "$site.url.startsWith($url_match)";
|
|
67
|
-
// console.log("Evaluating condition:", condition);
|
|
68
|
-
// context = {
|
|
69
|
-
// site: {
|
|
70
|
-
// url: "https://tiledesk.com/pricing"
|
|
71
|
-
// },
|
|
72
|
-
// url_match: "https:"
|
|
73
|
-
// };
|
|
74
|
-
// const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
75
|
-
// console.log("conditionResult4:", result);
|
|
76
|
-
// assert(result === true);
|
|
77
|
-
// });
|
|
78
|
-
|
|
79
|
-
it('condition 5 - compare string with a constant', async () => {
|
|
80
|
-
const condition = "$_tdCountry === 'IT'";
|
|
81
|
-
// console.log("Evaluating condition:", condition);
|
|
82
|
-
context = {
|
|
83
|
-
"_tdCountry": "IT"
|
|
84
|
-
};
|
|
85
|
-
const result = new TiledeskExpression().evaluateExpression(condition, context);
|
|
86
|
-
// console.log("conditionResult:", result);
|
|
87
|
-
assert(result === true);
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// it('assignment 1', async () => {
|
|
91
|
-
// const expression = "$protocol + $site.url";
|
|
92
|
-
// console.log("Evaluating assign expression:", expression);
|
|
93
|
-
// context = {
|
|
94
|
-
// protocol: "https://",
|
|
95
|
-
// site: {
|
|
96
|
-
// url: "tiledesk.com/pricing"
|
|
97
|
-
// }
|
|
98
|
-
// };
|
|
99
|
-
// const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
100
|
-
// console.log("expression value:", result);
|
|
101
|
-
// assert(result === 'https://tiledesk.com/pricing');
|
|
102
|
-
// });
|
|
103
|
-
|
|
104
|
-
// it('assignment 2', async () => {
|
|
105
|
-
// const expression = "$age + $added";
|
|
106
|
-
// console.log("Evaluating assign expression:", expression);
|
|
107
|
-
// context = {
|
|
108
|
-
// age: 32,
|
|
109
|
-
// added: 10
|
|
110
|
-
// };
|
|
111
|
-
// const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
112
|
-
// console.log("expression value:", result);
|
|
113
|
-
// assert(result === 42);
|
|
114
|
-
// });
|
|
115
|
-
|
|
116
|
-
// it('assignment 3 - Number() on numbers', async () => {
|
|
117
|
-
// const expression = "Number($age) + Number($added)";
|
|
118
|
-
// console.log("Evaluating assign expression:", expression);
|
|
119
|
-
// context = {
|
|
120
|
-
// age: 33,
|
|
121
|
-
// added: 10
|
|
122
|
-
// };
|
|
123
|
-
// const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
124
|
-
// console.log("expression value:", result);
|
|
125
|
-
// assert(result === 43);
|
|
126
|
-
// });
|
|
127
|
-
|
|
128
|
-
// it('assignment 4 - Number() on strings', async () => {
|
|
129
|
-
// const expression = "Number($age) + Number($added)";
|
|
130
|
-
// console.log("Evaluating assign expression:", expression);
|
|
131
|
-
// context = {
|
|
132
|
-
// age: "34",
|
|
133
|
-
// added: "10"
|
|
134
|
-
// };
|
|
135
|
-
// const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
136
|
-
// console.log("expression value:", result);
|
|
137
|
-
// assert(result === 44);
|
|
138
|
-
// });
|
|
139
|
-
|
|
140
|
-
// it('assignment 5 - Constant int, no context', async () => {
|
|
141
|
-
// const expression = 45;
|
|
142
|
-
// console.log("Evaluating assign expression:", expression);
|
|
143
|
-
// const result = new TiledeskExpression().evaluateExpression(expression, context);
|
|
144
|
-
// console.log("expression value:", result);
|
|
145
|
-
// assert(result === 45);
|
|
146
|
-
// });
|
|
147
|
-
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|