@tiledesk/tiledesk-tybot-connector 0.2.118 → 0.2.120
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 +9 -0
- package/models/TiledeskChatbotUtil.js +1 -1
- package/package.json +2 -2
- package/tiledeskChatbotPlugs/DirectivesChatbotPlug.js +12 -0
- package/tiledeskChatbotPlugs/directives/DirAskGPTV2.js +1 -0
- package/tiledeskChatbotPlugs/directives/DirJSONCondition.js +1 -0
- package/tiledeskChatbotPlugs/directives/DirReply.js +1 -1
- package/tiledeskChatbotPlugs/directives/DirSendWhatsapp.js +247 -0
- package/tiledeskChatbotPlugs/directives/DirSetAttributeV2.js +5 -5
- package/tiledeskChatbotPlugs/directives/Directives.js +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -17,6 +17,15 @@ available on:
|
|
|
17
17
|
- Added flowError on JSONCondition when result = null
|
|
18
18
|
- Added fix on Filler -->
|
|
19
19
|
|
|
20
|
+
# v0.2.120 -> test
|
|
21
|
+
- removed check in go() - it is already in execute() - on SetAttributeV2: if (!action) {...}
|
|
22
|
+
- merged Whatsapp Action
|
|
23
|
+
- updated "@tiledesk/tiledesk-client": "^0.10.13"
|
|
24
|
+
|
|
25
|
+
# v0.2.119 -> test
|
|
26
|
+
- fixed: addParameter("payload", message) => addParameter("payload", message.attributes.payload)
|
|
27
|
+
- JSONCondition: added in constructor => this.chatbot = context.chatbot;
|
|
28
|
+
|
|
20
29
|
# v0.2.118 -> test
|
|
21
30
|
- added payload to attributes: await chatbot.addParameter("payload", message);
|
|
22
31
|
|
|
@@ -714,7 +714,7 @@ class TiledeskChatbotUtil {
|
|
|
714
714
|
// console.log("Adding from message.attributes:", key, "->", value);
|
|
715
715
|
await chatbot.addParameter(key, value);
|
|
716
716
|
}
|
|
717
|
-
await chatbot.addParameter("payload", message);
|
|
717
|
+
await chatbot.addParameter("payload", message.attributes.payload);
|
|
718
718
|
}
|
|
719
719
|
catch(err) {
|
|
720
720
|
console.error("Error importing message payload in request variables:", err);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tiledesk/tiledesk-tybot-connector",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.120",
|
|
4
4
|
"description": "Tiledesk Tybot connector",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"@tiledesk/helpcenter-query-client": "^0.1.8",
|
|
15
15
|
"@tiledesk/tiledesk-chatbot-client": "^0.5.30",
|
|
16
16
|
"@tiledesk/tiledesk-chatbot-util": "^0.8.39",
|
|
17
|
-
"@tiledesk/tiledesk-client": "^0.10.
|
|
17
|
+
"@tiledesk/tiledesk-client": "^0.10.13",
|
|
18
18
|
"accept-language-parser": "^1.5.0",
|
|
19
19
|
"axios": "^0.27.2",
|
|
20
20
|
"body-parser": "^1.19.0",
|
|
@@ -52,6 +52,7 @@ const { DirIfOnlineAgentsV2 } = require('./directives/DirIfOnlineAgentsV2');
|
|
|
52
52
|
const { DirContactUpdate } = require('./directives/DirContactUpdate');
|
|
53
53
|
const { DirClearTranscript } = require('./directives/DirClearTranscript');
|
|
54
54
|
const { DirMoveToUnassigned } = require('./directives/DirMoveToUnassigned');
|
|
55
|
+
const { DirWhatsappStatic, DirSendWhatsapp } = require('./directives/DirSendWhatsapp');
|
|
55
56
|
|
|
56
57
|
class DirectivesChatbotPlug {
|
|
57
58
|
|
|
@@ -621,6 +622,17 @@ class DirectivesChatbotPlug {
|
|
|
621
622
|
this.process(next_dir);
|
|
622
623
|
});
|
|
623
624
|
}
|
|
625
|
+
else if (directive_name === Directives.SEND_WHATSAPP) {
|
|
626
|
+
new DirSendWhatsapp(context).execute(directive, async (stop) => {
|
|
627
|
+
if (stop == true) {
|
|
628
|
+
if (context.log) { console.log("Stoppin Actions on:", JSON.stringify(directive));}
|
|
629
|
+
this.theend();
|
|
630
|
+
} else {
|
|
631
|
+
let next_dir = await this.nextDirective(this.directives);
|
|
632
|
+
this.process(next_dir);
|
|
633
|
+
}
|
|
634
|
+
});
|
|
635
|
+
}
|
|
624
636
|
else if (directive_name === Directives.QAPLA) {
|
|
625
637
|
new DirQapla(context).execute(directive, async (stop) => {
|
|
626
638
|
if (context.log) { console.log("DirQapla stop?", stop);}
|
|
@@ -15,6 +15,7 @@ class DirAskGPTV2 {
|
|
|
15
15
|
throw new Error('context object is mandatory');
|
|
16
16
|
}
|
|
17
17
|
this.context = context;
|
|
18
|
+
this.chatbot = context.chatbot;
|
|
18
19
|
this.tdcache = this.context.tdcache;
|
|
19
20
|
this.requestId = this.context.requestId;
|
|
20
21
|
this.intentDir = new DirIntent(context);
|
|
@@ -137,7 +137,7 @@ class DirReply {
|
|
|
137
137
|
if (err) {
|
|
138
138
|
console.error("Error sending reply:", err);
|
|
139
139
|
}
|
|
140
|
-
if (this.log) {console.log("Reply message sent", cleanMessage);}
|
|
140
|
+
if (this.log) {console.log("Reply message sent:", JSON.stringify(cleanMessage));}
|
|
141
141
|
const delay = TiledeskChatbotUtil.totalMessageWait(cleanMessage);
|
|
142
142
|
// console.log("got total delay:", delay)
|
|
143
143
|
if (delay > 0 && delay <= 30000) { // prevent long delays
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
const axios = require("axios").default;
|
|
2
|
+
const { TiledeskChatbot } = require('../../models/TiledeskChatbot');
|
|
3
|
+
const { Filler } = require("../Filler");
|
|
4
|
+
const { DirIntent } = require("./DirIntent");
|
|
5
|
+
|
|
6
|
+
let whatsapp_api_url;
|
|
7
|
+
|
|
8
|
+
class DirSendWhatsapp {
|
|
9
|
+
|
|
10
|
+
constructor(context) {
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error('context object is mandatory');
|
|
13
|
+
}
|
|
14
|
+
this.context = context;
|
|
15
|
+
this.chatbot = context.chatbot;
|
|
16
|
+
this.tdcache = this.context.tdcache;
|
|
17
|
+
this.requestId = this.context.requestId;
|
|
18
|
+
this.intentDir = new DirIntent(context);
|
|
19
|
+
this.log = context.log;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
execute(directive, callback) {
|
|
23
|
+
if (this.log) { console.log("DirWhatsappStatic directive: ", directive); }
|
|
24
|
+
let action;
|
|
25
|
+
if (directive.action) {
|
|
26
|
+
action = directive.action;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
console.error("Incorrect directive: ", JSON.stringify(directive));
|
|
30
|
+
callback();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.go(action, (stop) => {
|
|
34
|
+
callback(stop);
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async go(action, callback) {
|
|
39
|
+
|
|
40
|
+
if (this.log) { console.log("DirWhatsappStatic action: ", JSON.stringify(action)) }
|
|
41
|
+
if (!this.tdcache) {
|
|
42
|
+
console.error("Error: DirAskGPT tdcache is mandatory");
|
|
43
|
+
callback();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let trueIntent = action.trueIntent;
|
|
48
|
+
let falseIntent = action.falseIntent;
|
|
49
|
+
|
|
50
|
+
let requestVariables = null;
|
|
51
|
+
requestVariables =
|
|
52
|
+
await TiledeskChatbot.allParametersStatic(
|
|
53
|
+
this.tdcache, this.requestId
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
// Declarations
|
|
57
|
+
let payload = action.payload;
|
|
58
|
+
|
|
59
|
+
const filler = new Filler();
|
|
60
|
+
|
|
61
|
+
// receiver_list will be of just one element, so we can pick up only the first element, if exists.
|
|
62
|
+
let receiver = payload.receiver_list[0];
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
//header_params: text, image, document. NO: location
|
|
66
|
+
//body_params: text
|
|
67
|
+
//button_params: text
|
|
68
|
+
//footer_paramas: non supportati
|
|
69
|
+
|
|
70
|
+
receiver = await this.fillWholeReceiver(receiver, requestVariables);
|
|
71
|
+
payload.receiver_list[0] = receiver;
|
|
72
|
+
payload.transaction_id = this.context.requestId;
|
|
73
|
+
payload.broadcast = false;
|
|
74
|
+
|
|
75
|
+
const whatsapp_api_url_pre = process.env.WHATSAPP_ENDPOINT;
|
|
76
|
+
const server_base_url = process.env.API_URL || process.env.API_ENDPOINT;
|
|
77
|
+
|
|
78
|
+
if (whatsapp_api_url_pre) {
|
|
79
|
+
whatsapp_api_url = whatsapp_api_url_pre;
|
|
80
|
+
} else {
|
|
81
|
+
whatsapp_api_url = server_base_url + "/modules/whatsapp/api"
|
|
82
|
+
}
|
|
83
|
+
if (this.log) { console.log("DirSendWhatsapp whatsapp_api_url: ", whatsapp_api_url); };
|
|
84
|
+
|
|
85
|
+
const HTTPREQUEST = {
|
|
86
|
+
url: whatsapp_api_url + "/tiledesk/broadcast",
|
|
87
|
+
headers: {
|
|
88
|
+
'Content-Type': 'application/json'
|
|
89
|
+
},
|
|
90
|
+
json: payload,
|
|
91
|
+
method: 'POST'
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (this.log) { console.log("DirSendWhatsapp HTTPREQUEST: ", HTTPREQUEST); }
|
|
95
|
+
|
|
96
|
+
this.#myrequest(
|
|
97
|
+
HTTPREQUEST, async (err, resbody) => {
|
|
98
|
+
if (err) {
|
|
99
|
+
console.error("DirSendWhatsapp error: ", err);
|
|
100
|
+
await this.chatbot.addParameter("flowError", "SendWhatsapp Error: " + err);
|
|
101
|
+
if (callback) {
|
|
102
|
+
if (falseIntent) {
|
|
103
|
+
await this.#executeCondition(false, trueIntent, null, falseIntent, null);
|
|
104
|
+
callback(true);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
callback();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
} else if (resbody.success === true) {
|
|
111
|
+
if (callback) {
|
|
112
|
+
if (trueIntent) {
|
|
113
|
+
await this.#executeCondition(true, trueIntent, null, falseIntent, null);
|
|
114
|
+
callback(true);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
callback();
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
if (this.log) { console.log("DirSendWhatsapp unexpected resbody: ", resbody); }
|
|
122
|
+
if (callback) {
|
|
123
|
+
if (falseIntent) {
|
|
124
|
+
await this.#executeCondition(false, trueIntent, null, falseIntent, null);
|
|
125
|
+
callback(true);
|
|
126
|
+
return
|
|
127
|
+
}
|
|
128
|
+
callback();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async #executeCondition(result, trueIntent, trueIntentAttributes, falseIntent, falseIntentAttributes, callback) {
|
|
137
|
+
let trueIntentDirective = null;
|
|
138
|
+
if (trueIntent) {
|
|
139
|
+
trueIntentDirective = DirIntent.intentDirectiveFor(trueIntent, trueIntentAttributes);
|
|
140
|
+
}
|
|
141
|
+
let falseIntentDirective = null;
|
|
142
|
+
if (falseIntent) {
|
|
143
|
+
falseIntentDirective = DirIntent.intentDirectiveFor(falseIntent, falseIntentAttributes);
|
|
144
|
+
}
|
|
145
|
+
if (result === true) {
|
|
146
|
+
if (trueIntentDirective) {
|
|
147
|
+
this.intentDir.execute(trueIntentDirective, () => {
|
|
148
|
+
if (callback) {
|
|
149
|
+
callback();
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
if (this.log) { console.log("No trueIntentDirective specified"); }
|
|
155
|
+
if (callback) {
|
|
156
|
+
callback();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
if (falseIntentDirective) {
|
|
162
|
+
this.intentDir.execute(falseIntentDirective, () => {
|
|
163
|
+
if (callback) {
|
|
164
|
+
callback();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
if (this.log) { console.log("No falseIntentDirective specified"); }
|
|
170
|
+
if (callback) {
|
|
171
|
+
callback();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
async fillWholeReceiver(receiver, requestVariables) {
|
|
178
|
+
return new Promise((resolve) => {
|
|
179
|
+
|
|
180
|
+
const filler = new Filler();
|
|
181
|
+
try {
|
|
182
|
+
receiver.phone_number = filler.fill(receiver.phone_number, requestVariables);
|
|
183
|
+
if (receiver.header_params) {
|
|
184
|
+
receiver.header_params.forEach(p => {
|
|
185
|
+
if (p.type === 'TEXT') {
|
|
186
|
+
p.text = filler.fill(p.text, requestVariables)
|
|
187
|
+
}
|
|
188
|
+
else if (p.type === 'IMAGE') {
|
|
189
|
+
p.image.link = filler.fill(p.image.link, requestVariables)
|
|
190
|
+
}
|
|
191
|
+
else if (p.type === 'DOCUMENT') {
|
|
192
|
+
p.document.link = filler.fill(p.document.link, requestVariables)
|
|
193
|
+
}
|
|
194
|
+
})
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (receiver.body_params) {
|
|
198
|
+
receiver.body_params.forEach(p => {
|
|
199
|
+
p.text = filler.fill(p.text, requestVariables)
|
|
200
|
+
})
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (receiver.buttons_params) {
|
|
204
|
+
receiver.buttons_params.forEach(p => {
|
|
205
|
+
p.text = filler.fill(p.text, requestVariables)
|
|
206
|
+
})
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
resolve(receiver);
|
|
210
|
+
|
|
211
|
+
} catch(err) {
|
|
212
|
+
console.error("DirSendWhatsapp fillWholeReceiver error: ", err)
|
|
213
|
+
resolve(null);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
})
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// HTTP REQUEST
|
|
220
|
+
async #myrequest(options, callback, log) {
|
|
221
|
+
return await axios({
|
|
222
|
+
url: options.url,
|
|
223
|
+
method: options.method,
|
|
224
|
+
data: options.json,
|
|
225
|
+
params: options.params,
|
|
226
|
+
headers: options.headers
|
|
227
|
+
}).then((res) => {
|
|
228
|
+
if (res && res.status == 200 && res.data) {
|
|
229
|
+
if (callback) {
|
|
230
|
+
callback(null, res.data);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
if (callback) {
|
|
235
|
+
callback(TiledeskClient.getErr({ message: "Response status not 200" }, options, res), null, null);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}).catch((err) => {
|
|
239
|
+
console.error("(tybot request) An error occured: ", err);
|
|
240
|
+
if (callback) {
|
|
241
|
+
callback(err, null, null);
|
|
242
|
+
}
|
|
243
|
+
})
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
module.exports = { DirSendWhatsapp }
|
|
@@ -97,11 +97,11 @@ class DirSetAttributeV2 {
|
|
|
97
97
|
|
|
98
98
|
async go(action, callback) {
|
|
99
99
|
if (this.log) {console.log("(DirSetAttribute) action before filling:", JSON.stringify(action));}
|
|
100
|
-
if (!action) {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
100
|
+
// if (!action) {
|
|
101
|
+
// if (this.log) {console.log("(SetAttributeV2) Error 'action' is missing");}
|
|
102
|
+
// callback();
|
|
103
|
+
// return;
|
|
104
|
+
// }
|
|
105
105
|
if (action && !action.operation) {
|
|
106
106
|
if (this.log) {console.log("(SetAttributeV2) Error operation is mandatory");}
|
|
107
107
|
callback();
|
|
@@ -27,6 +27,7 @@ class Directives {
|
|
|
27
27
|
static RANDOM_REPLY = 'randomreply';
|
|
28
28
|
static CODE = 'code';
|
|
29
29
|
static WHATSAPP_ATTRIBUTE = 'whatsapp_attribute';
|
|
30
|
+
static SEND_WHATSAPP = 'send_whatsapp';
|
|
30
31
|
static FORM = "form";
|
|
31
32
|
static CAPTURE_USER_REPLY = "capture_user_reply";
|
|
32
33
|
static REPLACE_BOT_V2 = "replacebotv2";
|