@tiledesk/tiledesk-whatsapp-connector 0.1.47 → 0.1.49

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/index.js CHANGED
@@ -49,6 +49,7 @@ let APPS_API_URL = null;
49
49
  let REDIS_HOST = null;
50
50
  let REDIS_PORT = null;
51
51
  let REDIS_PASSWORD = null;
52
+ let BASE_FILE_URL = null;
52
53
 
53
54
  // Handlebars register helpers
54
55
  handlebars.registerHelper('isEqual', (a, b) => {
@@ -434,7 +435,7 @@ router.get('/direct/tiledesk', async (req, res) => {
434
435
  text: "Ciao, benvenuto sull'ambiente di sviluppo di Tiledesk! Questo messaggio serve ad aprire una nuova conversazione. Ha funzionato?"
435
436
  }
436
437
  */
437
-
438
+
438
439
  let tiledeskChannelMessage = {
439
440
  text: "Sample text",
440
441
  attributes: {
@@ -448,7 +449,7 @@ router.get('/direct/tiledesk', async (req, res) => {
448
449
  }
449
450
  }
450
451
  const tlr = new TiledeskWhatsappTranslator();
451
- const twClient = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL });
452
+ const twClient = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL, API_URL: API_URL, BASE_FILE_URL: BASE_FILE_URL });
452
453
 
453
454
  let whatsappJsonMessage = await tlr.toWhatsapp(tiledeskChannelMessage, whatsapp_receiver);
454
455
  winston.verbose("(wab) whatsappJsonMessage", whatsappJsonMessage)
@@ -457,15 +458,92 @@ router.get('/direct/tiledesk', async (req, res) => {
457
458
  winston.verbose("(wab) Message sent to WhatsApp! " + response.status + " " + response.statusText);
458
459
  }).catch((err) => {
459
460
  winston.error("(wab) error send message: ", err);
460
- return res.status(400).send({success: false, error: err});
461
+ return res.status(400).send({ success: false, error: err });
461
462
  })
462
463
 
463
464
  res.status(200).send("Message sent");
465
+
466
+ })
467
+
468
+ router.post('/tiledesk/broadcast', async (req, res) => {
469
+
470
+ winston.verbose("(wab) Message received from Tiledesk (Broadcast)");
471
+
472
+ let tiledeskChannelMessage = req.body.payload;
473
+ winston.verbose("(wab) tiledeskChannelMessage: ", tiledeskChannelMessage)
474
+ let project_id = req.body.payload.id_project;
475
+
476
+ let CONTENT_KEY = "whatsapp-" + project_id;
477
+ let settings = await db.get(CONTENT_KEY);
478
+
479
+ if (!settings) {
480
+ return res.status(400).send({ success: false, error: "WhatsApp is not installed for the project_id: " + project_id});
481
+ }
482
+
483
+ let receiver_list = req.body.receiver_list;
484
+ console.log("receiver_list: ", receiver_list);
485
+
486
+ let phone_number_id = req.body.phone_number_id;
487
+ console.log("phone_number_id: ", phone_number_id);
488
+
489
+ if (!tiledeskChannelMessage.attributes.attachment.template) {
490
+ return res.status(400).send({ success: false, error: "Message must contain a template."})
491
+ }
492
+
493
+ const tlr = new TiledeskWhatsappTranslator();
494
+ const twClient = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL, API_URL: API_URL, BASE_FILE_URL: BASE_FILE_URL });
495
+
496
+ let messages_sent = 0;
497
+ let errors = [];
498
+ let error_count = 0;
499
+
500
+ if (receiver_list) {
501
+ let i = 0;
502
+ async function execute(whatsapp_receiver) {
503
+
504
+ let customTiledeskJsonMessage = await tlr.sanitizeTiledeskMessage(tiledeskChannelMessage, whatsapp_receiver)
505
+ winston.info("customTiledeskJsonMessage: ", customTiledeskJsonMessage)
506
+
507
+ let whatsappJsonMessage = await tlr.toWhatsapp(customTiledeskJsonMessage, whatsapp_receiver.phone_number);
508
+ winston.verbose("(wab) message created for receiver: " + whatsapp_receiver.phone_number);
509
+ winston.verbose("(wab) whatsappJsonMessage", whatsappJsonMessage);
510
+ console.log("(wab) whatsappJsonMessage", JSON.stringify(whatsappJsonMessage, null, 2));
511
+
512
+ //winston.debug("(wab) End of list")
513
+ //return res.sendStatus(200);
514
+
515
+ await twClient.sendMessage(phone_number_id, whatsappJsonMessage).then((response) => {
516
+ winston.verbose("(wab) Message sent to WhatsApp! " + response.status + " " + response.statusText);
517
+ messages_sent += 1;
518
+ i += 1;
519
+ if (i < receiver_list.length) {
520
+ execute(receiver_list[i])
521
+ } else {
522
+ return res.status(200).send({ success: true, message: "Broadcast terminated", messages_sent: messages_sent, errors: errors});
523
+ winston.debug("(wab) End of list")
524
+ }
525
+ }).catch((err) => {
526
+ winston.error("(wab) error send message: " + err.response.data.error.message);
527
+ errors.push({receiver: whatsapp_receiver.phone_number,error: err.response.data.error.message});
528
+ i += 1;
529
+ if (i < receiver_list.length) {
530
+ execute(receiver_list[i])
531
+ } else {
532
+ winston.debug("(wab) End of list")
533
+ console.log("errors: ", JSON.stringify(errors, null, 2))
534
+ return res.status(200).send({ success: true, message: "Broadcast terminated", messages_sent: messages_sent, errors: errors});
535
+ }
536
+ })
537
+ }
538
+ execute(receiver_list[0]);
539
+ }
540
+
541
+
464
542
 
465
543
  })
466
544
 
467
545
  router.post('/tiledesk', async (req, res) => {
468
-
546
+
469
547
  winston.verbose("(wab) Message received from Tiledesk")
470
548
 
471
549
  var tiledeskChannelMessage = req.body.payload;
@@ -552,7 +630,7 @@ router.post('/tiledesk', async (req, res) => {
552
630
  const messageHandler = new MessageHandler({ tiledeskChannelMessage: tiledeskChannelMessage });
553
631
  const tlr = new TiledeskWhatsappTranslator();
554
632
 
555
-
633
+
556
634
  if (commands) {
557
635
  let i = 0;
558
636
  async function execute(command) {
@@ -565,7 +643,7 @@ router.post('/tiledesk', async (req, res) => {
565
643
  winston.verbose("(wab) whatsappJsonMessage", whatsappJsonMessage)
566
644
 
567
645
  if (whatsappJsonMessage) {
568
- const twClient = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL });
646
+ const twClient = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL, API_URL: API_URL, BASE_FILE_URL: BASE_FILE_URL });
569
647
  twClient.sendMessage(phone_number_id, whatsappJsonMessage).then((response) => {
570
648
  winston.verbose("(wab) Message sent to WhatsApp! " + response.status + " " + response.statusText);
571
649
  i += 1;
@@ -604,17 +682,17 @@ router.post('/tiledesk', async (req, res) => {
604
682
  winston.verbose("(wab) whatsappJsonMessage", whatsappJsonMessage)
605
683
 
606
684
  if (whatsappJsonMessage) {
607
- const twClient = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL });
685
+ const twClient = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL, API_URL: API_URL, BASE_FILE_URL: BASE_FILE_URL });
608
686
 
609
687
  twClient.sendMessage(phone_number_id, whatsappJsonMessage).then((response) => {
610
688
  winston.verbose("(wab) Message sent to WhatsApp! " + response.status + " " + response.statusText);
611
689
  }).catch((err) => {
612
- res.status(400).send({success: false, error: "il template non esiste"});
690
+ res.status(400).send({ success: false, error: "il template non esiste" });
613
691
  winston.error("(wab) error send message: ", err);
614
692
  })
615
693
 
616
694
  } else {
617
- res.status(400).send({success: false, error: "il template non esiste"});
695
+ res.status(400).send({ success: false, error: "il template non esiste" });
618
696
  winston.error("(wab) Whatsapp Json Message is undefined!")
619
697
  }
620
698
 
@@ -705,7 +783,7 @@ router.post("/webhook/:project_id", async (req, res) => {
705
783
 
706
784
  else if ((whatsappChannelMessage.type == 'image') || (whatsappChannelMessage.type == 'video') || (whatsappChannelMessage.type == 'document') || (whatsappChannelMessage.type == 'audio')) {
707
785
  let media;
708
- const util = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL })
786
+ const util = new TiledeskWhatsapp({ token: settings.wab_token, GRAPH_URL: GRAPH_URL, API_URL: API_URL, BASE_FILE_URL: BASE_FILE_URL })
709
787
 
710
788
  if (whatsappChannelMessage.type == 'image') {
711
789
  media = whatsappChannelMessage.image;
@@ -942,7 +1020,7 @@ router.get("/templates/:project_id", async (req, res) => {
942
1020
  let tm = new TemplateManager({ token: settings.wab_token, business_account_id: settings.business_account_id, GRAPH_URL: GRAPH_URL })
943
1021
  let templates = await tm.getTemplates();
944
1022
 
945
-
1023
+
946
1024
 
947
1025
  readHTMLFile('/templates.html', (err, html) => {
948
1026
  var template = handlebars.compile(html);
@@ -972,17 +1050,22 @@ router.get("/ext/templates/:project_id", async (req, res) => {
972
1050
  let settings = await db.get(CONTENT_KEY);
973
1051
 
974
1052
  if (settings) {
975
- let tm = new TemplateManager({ token: settings.wab_token, business_account_id: settings.business_account_id, GRAPH_URL: GRAPH_URL })
976
- let templates = await tm.getTemplates();
977
1053
 
978
- if (templates) {
979
- res.status(200).send(templates.data);
1054
+ if (settings.business_account_id) {
1055
+ let tm = new TemplateManager({ token: settings.wab_token, business_account_id: settings.business_account_id, GRAPH_URL: GRAPH_URL })
1056
+ let templates = await tm.getTemplates();
1057
+ if (templates) {
1058
+ res.status(200).send(templates.data);
1059
+ } else {
1060
+ res.status(500).send({ success: false, code: '02', message: "A problem occurred while getting templates from WhatsApp" })
1061
+ }
1062
+
980
1063
  } else {
981
- res.status(500).send({ success: false, code: '02', message: "a problem occurred while getting templates from whatsapp" })
1064
+ res.status(500).send({ success: false, code: '03', message: "Missing parameter 'WhatsApp Business Account ID'. Please update your app."})
982
1065
  }
983
1066
 
984
1067
  } else {
985
- res.status(400).send({ success: false, code: '01', message: "whatsapp not installed for the project_id " + project_id })
1068
+ res.status(400).send({ success: false, code: '01', message: "WhatsApp not installed for the project_id " + project_id })
986
1069
  }
987
1070
 
988
1071
  })
@@ -1007,6 +1090,14 @@ async function startApp(settings, callback) {
1007
1090
  winston.info("(wab) API_URL: " + API_URL);
1008
1091
  }
1009
1092
 
1093
+ if (!settings.BASE_FILE_URL) {
1094
+ winston.error("(wab) BASE_FILE_URL is mandatory. Exit...");
1095
+ return callback('Missing parameter: BASE_FILE_URL');
1096
+ } else {
1097
+ BASE_FILE_URL = settings.BASE_FILE_URL;
1098
+ winston.info("(wab) BASE_FILE_URL: " + BASE_FILE_URL);
1099
+ }
1100
+
1010
1101
  if (!settings.BASE_URL) {
1011
1102
  winston.error("(wab) BASE_URL is mandatory. Exit...");
1012
1103
  return callback('Missing parameter: BASE_URL');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tiledesk/tiledesk-whatsapp-connector",
3
- "version": "0.1.47",
3
+ "version": "0.1.49",
4
4
  "description": "Tiledesk Whatsapp connector",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -213,12 +213,21 @@
213
213
 
214
214
  <p style="font-size: 18px;"><b>What's new?</b></p>
215
215
 
216
+ <div style="width: 100%; display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 15px;">
217
+ <div>
218
+ <p style="margin-bottom: 0px">Added support for WhatsApp voice messages</p>
219
+ <p style="margin-bottom: 0px">Bug fixes and minor improvements</p>
220
+ <!--<p>Bug fixes and performance improvements</p>-->
221
+ </div>
222
+ <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.49</b></p>
223
+ </div>
224
+
216
225
  <div style="width: 100%; display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 15px;">
217
226
  <div>
218
227
  <p style="margin-bottom: 0px">Added support for WhatsApp templates</p>
219
228
  <!--<p>Bug fixes and performance improvements</p>-->
220
229
  </div>
221
- <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.46</b></p>
230
+ <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.48</b></p>
222
231
  </div>
223
232
 
224
233
  <div style="width: 100%; display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 15px;">
@@ -28,8 +28,6 @@ class TemplateManager {
28
28
  }
29
29
 
30
30
  async getTemplates() {
31
- // business account id: 110354305066769
32
- // business phone number id: 104777398965560
33
31
  return await axios({
34
32
  url: this.graph_url + this.business_account_id + "/message_templates?access_token=" + this.token,
35
33
  headers: {
@@ -31,9 +31,20 @@ class TiledeskWhatsapp {
31
31
  if (!config.GRAPH_URL) {
32
32
  throw new Error('config.GRAPH_URL is mandatory');
33
33
  }
34
+
35
+ if (!config.API_URL) {
36
+ throw new Error('config.API_URL is mandatory');
37
+ }
38
+
39
+ if (!config.BASE_FILE_URL) {
40
+ throw new Error('config.BASE_FILE_URL is mandatory')
41
+ }
42
+
34
43
  // this.media = config.channelMedia;
35
44
  this.token = config.token;
36
45
  this.GRAPH_URL = config.GRAPH_URL
46
+ this.api_url = config.API_URL;
47
+ this.base_file_url = config.BASE_FILE_URL;
37
48
 
38
49
  this.log = false;
39
50
  if (config.log) {
@@ -115,7 +126,8 @@ class TiledeskWhatsapp {
115
126
  }
116
127
 
117
128
  async uploadMedia(path, type) {
118
- let url = "https://tiledesk-server-pre.herokuapp.com/" + type + "/public";
129
+ let url = this.base_file_url + "/" + type + "/public/";
130
+ console.log("upload media url: ", url);
119
131
  winston.debug("(wab) [TiledeskWhatsapp] Uploading file...");
120
132
 
121
133
  const form = new FormData();
@@ -131,11 +143,14 @@ class TiledeskWhatsapp {
131
143
  return await axios.post(url, form, request_config).then((response) => {
132
144
 
133
145
  winston.debug("(wab) [TiledeskWhatsapp] upload response: ", response.data);
146
+ console.log("\n\nresponse.data: ", response.data)
134
147
  if (type == "images") {
135
- let image_url = "https://tiledesk-server-pre.herokuapp.com/images/?path=" + response.data.filename;
148
+ //let image_url = "https://tiledesk-server-pre.herokuapp.com/images/?path=" + response.data.filename;
149
+ let image_url = this.base_file_url + "/images/?path=" + response.data.filename;
136
150
  return image_url;
137
151
  } else {
138
- let file_url = "https://tiledesk-server-pre.herokuapp.com/files/download?path=" + response.data.filename;
152
+ //let file_url = "https://tiledesk-server-pre.herokuapp.com/files/download?path=" + response.data.filename;
153
+ let file_url = this.base_file_url + "/files/download?path=" + response.data.filename;
139
154
  return file_url;
140
155
  }
141
156
 
@@ -286,12 +286,35 @@ const path = require('path');
286
286
  }
287
287
  components.push(component);
288
288
  }
289
+ if (template.params && template.params.buttons) {
290
+
291
+ let component = {
292
+ type: "button",
293
+ sub_type: "url",
294
+ index: "0",
295
+ parameters: template.params.buttons
296
+ }
297
+ components.push(component);
298
+
299
+ /*
300
+ template.params.buttons.forEach((button) => {
301
+ let component = button;
302
+ components.push(component);
303
+ })
304
+
305
+ let component = {
306
+ type: "button",
307
+ sub_type: "url",
308
+ parmeters: template.params.buttons
309
+ }
310
+ */
311
+ }
289
312
 
290
313
  if (components.length > 0) {
291
314
  whatsapp_message.template.components = components;
292
315
  }
293
316
 
294
- winston.info("(wab) [Translator] whatsapp_message: ", whatsapp_message);
317
+ winston.verbose("(wab) [Translator] whatsapp_message: ", whatsapp_message);
295
318
  return whatsapp_message;
296
319
 
297
320
  }
@@ -462,7 +485,7 @@ const path = require('path');
462
485
  }*/
463
486
 
464
487
  var tiledeskMessage = {
465
- text: "[Download audio](" + media_url + ")",
488
+ text: "",
466
489
  senderFullname: from,
467
490
  channel: { name: TiledeskWhatsappTranslator.CHANNEL_NAME },
468
491
  type: "file",
@@ -475,6 +498,53 @@ const path = require('path');
475
498
  return tiledeskMessage;
476
499
  }
477
500
  }
501
+
502
+
503
+ async sanitizeTiledeskMessage(tiledeskJsonMessage, rcv_option) {
504
+ console.log("tiledeskJsonMessage: ", JSON.stringify(tiledeskJsonMessage, null, 2))
505
+ //console.log("rcv_option: ", rcv_option)
506
+ console.log("Sanitizing...")
507
+
508
+ if (!tiledeskJsonMessage.attributes.attachment.template.params) {
509
+ return tiledeskJsonMessage;
510
+ }
511
+
512
+ let header_params = tiledeskJsonMessage.attributes.attachment.template.params.header;
513
+ if (header_params) {
514
+ header_params.forEach((param, i) => {
515
+ if (param.type === "text") {
516
+ param.text = rcv_option.header_params[i];
517
+ }
518
+ if (param.type === "image") {
519
+ param.image = {
520
+ link: rcv_option.header_params[i]
521
+ }
522
+ }
523
+ })
524
+ }
525
+
526
+ let body_params = tiledeskJsonMessage.attributes.attachment.template.params.body;
527
+ if (body_params) {
528
+ body_params.forEach((param, i) => {
529
+ param.text = rcv_option.body_params[i];
530
+ })
531
+ }
532
+
533
+ let buttons_params = tiledeskJsonMessage.attributes.attachment.template.params.buttons;
534
+ if (buttons_params) {
535
+ /*
536
+ buttons_params.forEach((button, i) => {
537
+ button.parameters[0].text = rcv_option.buttons_params[i];
538
+ })
539
+ */
540
+ buttons_params.forEach((param, i) => {
541
+ param.text = rcv_option.buttons_params[i];
542
+ })
543
+ }
544
+
545
+ console.log("tiledeskJsonMessage: ", JSON.stringify(tiledeskJsonMessage, null, 2))
546
+ return tiledeskJsonMessage;
547
+ }
478
548
  /*
479
549
  *************************************
480
550
  ********* WHATSAPP BUSINESS *********
Binary file
Binary file
Binary file
Binary file
Binary file