@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 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
@@ -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 = Function(`let $data = this;return (${expression})`);
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("requestSourcePage", sourcePage);
163
+ await chatbot.addParameter("_tdRequestSourcePage", sourcePage);
162
164
  }
163
165
  if (requestLanguage) {
164
- await chatbot.addParameter("requestLanguage", language);
166
+ await chatbot.addParameter("_tdRequestLanguage", language);
165
167
  }
166
168
  if (requestUserAgent) {
167
- await chatbot.addParameter("requestUserAgent", userAgent);
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
- else {
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 = mongoose.connect(settings.MONGODB_URI, { "useNewUrlParser": true, "autoIndex": false }, async (err) => {
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
- const locked_intent = await this.currentLockedIntent(this.requestId);
64
- if (this.log) {console.log("got locked intent", locked_intent)}
65
- if (locked_intent) {
66
- const tdclient = new TiledeskClient({
67
- projectId: this.projectId,
68
- token: this.token,
69
- APIURL: this.APIURL,
70
- APIKEY: this.APIKEY,
71
- log: false
72
- });
73
- // it only gets the locked_intent
74
- const faq = await this.botsDataSource.getByIntentDisplayName(this.botId, locked_intent);
75
- if (this.log) {console.log("locked intent. got faqs", faq)}
76
- let reply;
77
- if (faq) {
78
- reply = await this.execIntent(faq, message, lead);//, bot);
79
- }
80
- else {
81
- reply = {
82
- "text": "An error occurred while getting locked intent:'" + locked_intent
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
- resolve(reply);
86
- return;
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
- answerObj.form = {
258
- "cancelCommands": ['reset', 'cancel'],
259
- "cancelReply": "Ok canceled!",
260
- "fields": [
261
- {
262
- "name": "userFullname",
263
- "type": "text",
264
- "label": "What is your name?\n* Andrea\n* Marco\n* Mirco\n* Luca Leo"
265
- },{
266
- "name": "companyName",
267
- "type": "text",
268
- "label": "Thank you ${userFullname}! What is your Company name?\n* Tiledesk\n* Frontiere21"
269
- },
270
- {
271
- "name": "userEmail",
272
- "type": "text",
273
- "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])?)+$/",
274
- "label": "Hi ${userFullname} from ${companyName}\n\nJust one last question\n\nYour email 🙂\n* andrea@libero.it\n* andrea@tiledesk.com",
275
- "errorLabel": "${userFullname} this email address is invalid\n\nCan you insert a correct email address?"
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.del("tilebot:requests:" + requestId + ":locked");
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, message, bot, context) {
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(message.request, webhookurl, this.token));
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
- // console.log("json_string (params)", json_string);
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.43",
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.38",
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
- // console.log("/disable_input...");
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
- // console.log("req.body:", JSON.stringify(req.body));
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
- // console.log("/good_form...");
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
- // console.log("req.body:", JSON.stringify(req.body));
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
- // console.log("Message sent.", request);
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
- // console.log("params:", params);
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 message.");
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
- // console.log("(intent-to-intent) /move_to => /target_intent");
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
- // console.log("received message:", JSON.stringify(message));
291
+ console.log("received message33:", JSON.stringify(message));
290
292
  if (message.text === "The target!") {
291
- // console.log("Got it. End.");
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
- // console.log("Message sent.");
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
- // console.log("/all_filled (none) =>...");
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
- // console.log("received message:", JSON.stringify(message));
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
- // console.log("got #0 'You filled...' sending #1");
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
- // console.log("got #1 sending #2");
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
- // console.log("Message sent.", request);
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
- // console.log("got #2 sending #3");
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
- // console.log("Message sent.", request);
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
- // console.log("got #3 sending #4");
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
- // console.log("got #3 sending #4. Message sent.", request);
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
- // console.log("got #4 sending #5");
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
- // console.log("got #8 sending #9. Message sent.", request);
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
- // console.log("got #9. End.");
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: false
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
- // console.log("...DirAssign");
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(tdcache).execute(directive, requestId, () => {
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(tdcache).execute(requestId, () => {
417
+ new DirUnlockIntent(context).execute( () => {
418
418
  process(nextDirective());
419
419
  });
420
420
  }
@@ -6,9 +6,9 @@ class MessagePipeline {
6
6
  *
7
7
  */
8
8
 
9
- constructor(message, context) {
9
+ constructor(answer, context) {
10
10
  this.context = context;
11
- this.message = message;
11
+ this.message = answer;
12
12
  this.plugs = [];
13
13
  this.counter = -1;
14
14
  }
@@ -16,12 +16,13 @@ class WebhookChatbotPlug {
16
16
  }
17
17
 
18
18
  exec(pipeline) {
19
- let message = pipeline.message;
19
+ let answer = pipeline.message;
20
20
  let context = pipeline.context;
21
- if (this.log) {console.log("WEBHOOK?", message.attributes.webhook);}
22
- if (message.attributes && message.attributes.webhook && message.attributes.webhook === true) {
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.execWebhook(message, context, this.webhookurl, (err, message_from_webhook) => {
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
- // console.log("params:", params);
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 (!assignTo || !expression) {
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, "result:", result);}
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
- if (params.expression) {
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");
@@ -2,6 +2,7 @@
2
2
  let axios = require('axios');
3
3
  let https = require("https");
4
4
  const { v4: uuidv4 } = require('uuid');
5
+ const ms = require('minimist-string');
5
6
 
6
7
  class DirIntent {
7
8
 
@@ -1,30 +1,88 @@
1
+ const ms = require('minimist-string');
1
2
 
2
3
  class DirLockIntent {
3
4
 
4
- constructor(tdcache) {
5
- if (!tdcache) {
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, requestId, callback) {
12
- // console.log("Locking intent");
13
- if (directive.parameter) {
14
- let intent_name = directive.parameter.trim();
15
- await this.lockIntent(requestId, intent_name);
16
- callback();
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 lockIntent(requestId, intent_name) {
24
- await this.tdcache.set("tilebot:requests:" + requestId + ":locked", intent_name);
25
- // console.log("locked.", intent_name);
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(tdcache) {
5
- if (!tdcache) {
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("Unocking intent");
13
- await this.unlockIntent(requestId);
14
- callback();
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 unlockIntent(requestId) {
18
- await this.tdcache.del("tilebot:requests:" + requestId + ":locked");
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
-