@tiledesk/tiledesk-whatsapp-connector 0.1.48 → 0.1.50

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) => {
@@ -125,7 +126,7 @@ router.post('/install', async (req, res) => {
125
126
  winston.debug("(wab) installation response: ", installation);
126
127
 
127
128
  res.redirect(url.format({
128
- pathname: "/detail",
129
+ pathname: BASE_URL + "/detail",
129
130
  query: {
130
131
  "project_id": project_id,
131
132
  "app_id": app_id,
@@ -153,7 +154,7 @@ router.post('/uninstall', async (req, res) => {
153
154
  winston.debug("(wab) uninstallation response: ", response);
154
155
 
155
156
  res.redirect(url.format({
156
- pathname: "/detail",
157
+ pathname: BASE_URL + "/detail",
157
158
  query: {
158
159
  "project_id": project_id,
159
160
  "app_id": app_id,
@@ -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)
@@ -462,6 +463,83 @@ router.get('/direct/tiledesk', async (req, res) => {
462
463
 
463
464
  res.status(200).send("Message sent");
464
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
+
542
+
465
543
  })
466
544
 
467
545
  router.post('/tiledesk', async (req, res) => {
@@ -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,7 +682,7 @@ 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);
@@ -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;
@@ -976,17 +1054,14 @@ router.get("/ext/templates/:project_id", async (req, res) => {
976
1054
  if (settings.business_account_id) {
977
1055
  let tm = new TemplateManager({ token: settings.wab_token, business_account_id: settings.business_account_id, GRAPH_URL: GRAPH_URL })
978
1056
  let templates = await tm.getTemplates();
979
-
980
- winston.info("(wab) ext templates: ", templates);
981
-
982
1057
  if (templates) {
983
1058
  res.status(200).send(templates.data);
984
1059
  } else {
985
1060
  res.status(500).send({ success: false, code: '02', message: "A problem occurred while getting templates from WhatsApp" })
986
1061
  }
987
-
1062
+
988
1063
  } else {
989
- res.status(500).send({ success: false, code: '03', message: "Missing parameter 'WhatsApp Business Account ID'. Please update your app."})
1064
+ res.status(500).send({ success: false, code: '03', message: "Missing parameter 'WhatsApp Business Account ID'. Please update your app." })
990
1065
  }
991
1066
 
992
1067
  } else {
@@ -1015,6 +1090,14 @@ async function startApp(settings, callback) {
1015
1090
  winston.info("(wab) API_URL: " + API_URL);
1016
1091
  }
1017
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
+
1018
1101
  if (!settings.BASE_URL) {
1019
1102
  winston.error("(wab) BASE_URL is mandatory. Exit...");
1020
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.48",
3
+ "version": "0.1.50",
4
4
  "description": "Tiledesk Whatsapp connector",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -215,27 +215,35 @@
215
215
 
216
216
  <div style="width: 100%; display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 15px;">
217
217
  <div>
218
- <p style="margin-bottom: 0px">Added support for WhatsApp templates</p>
218
+ <p style="margin-bottom: 0px">Bug fixes</p>
219
219
  <!--<p>Bug fixes and performance improvements</p>-->
220
220
  </div>
221
- <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.48</b></p>
221
+ <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.50</b></p>
222
222
  </div>
223
223
 
224
224
  <div style="width: 100%; display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 15px;">
225
225
  <div>
226
+ <p style="margin-bottom: 0px">Added support for WhatsApp voice messages</p>
226
227
  <p style="margin-bottom: 0px">Bug fixes and minor improvements</p>
227
228
  <!--<p>Bug fixes and performance improvements</p>-->
228
229
  </div>
229
- <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.45</b></p>
230
+ <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.49</b></p>
231
+ </div>
232
+
233
+ <div style="width: 100%; display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 15px;">
234
+ <div>
235
+ <p style="margin-bottom: 0px">Added support for WhatsApp templates</p>
236
+ <!--<p>Bug fixes and performance improvements</p>-->
237
+ </div>
238
+ <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.48</b></p>
230
239
  </div>
231
240
 
232
241
  <div style="width: 100%; display: flex; flex-direction: row; justify-content: space-between; margin-bottom: 15px;">
233
242
  <div>
234
- <p style="margin-bottom: 0px">Added possibility to select a department for Whatsapp conversations.</p>
235
243
  <p style="margin-bottom: 0px">Bug fixes and minor improvements</p>
236
244
  <!--<p>Bug fixes and performance improvements</p>-->
237
245
  </div>
238
- <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.34</b></p>
246
+ <p style="font-size: 12px; color: #676767; margin-bottom: 0px;">Version <b>0.1.45</b></p>
239
247
  </div>
240
248
 
241
249
  <hr style="margin-top: 50px; margin-bottom: 20px">
@@ -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