Skip to content

Commit 8c4624c

Browse files
committed
Updated package.json version and LKG build.
1 parent 340ba33 commit 8c4624c

File tree

8 files changed

+534
-188
lines changed

8 files changed

+534
-188
lines changed

Node/lib/Channel.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function maxButtons(session) {
2+
var account = session.message.from || session.message.to;
3+
switch (account.channelId.toLowerCase()) {
4+
case 'facebook':
5+
return 3;
6+
case 'telegram':
7+
case 'kik':
8+
return 100;
9+
default:
10+
return 0;
11+
}
12+
}
13+
exports.maxButtons = maxButtons;

Node/lib/botbuilder.d.ts

Lines changed: 286 additions & 133 deletions
Large diffs are not rendered by default.

Node/lib/bots/BotConnectorBot.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ var BotConnectorBot = (function (_super) {
148148
};
149149
data.perUserConversationData[consts.Data.SessionState] = ses.sessionState;
150150
_this.saveData(userId, sessionId, data, reply, function (err) {
151+
var settings = ses.message.to.channelId == 'emulator' ? { endpoint: 'http://localhost:9000' } : _this.options;
151152
if (res) {
152153
_this.emit('reply', reply);
153154
res.send(200, reply);
@@ -163,7 +164,7 @@ var BotConnectorBot = (function (_super) {
163164
reply.participants = ses.message.participants;
164165
reply.totalParticipants = ses.message.totalParticipants;
165166
_this.emit('reply', reply);
166-
post(_this.options, '/bot/v1.0/messages', reply, function (err) {
167+
post(settings, '/bot/v1.0/messages', reply, function (err) {
167168
if (err) {
168169
_this.emit('error', err);
169170
}
@@ -173,7 +174,7 @@ var BotConnectorBot = (function (_super) {
173174
reply.from = ses.message.from;
174175
reply.to = ses.message.to;
175176
_this.emit('send', reply);
176-
post(_this.options, '/bot/v1.0/messages', reply, function (err) {
177+
post(settings, '/bot/v1.0/messages', reply, function (err) {
177178
if (err) {
178179
_this.emit('error', err);
179180
}

Node/lib/dialogs/EntityRecognizer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ var EntityRecognizer = (function () {
3535
entities.forEach(function (entity) {
3636
if (entity.resolution) {
3737
switch (entity.resolution.resolution_type || entity.type) {
38+
case 'builtin.datetime':
3839
case 'builtin.datetime.date':
3940
case 'builtin.datetime.time':
4041
var parts = (entity.resolution.date || entity.resolution.time).split('T');

Node/lib/dialogs/Prompts.js

Lines changed: 101 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ var __extends = (this && this.__extends) || function (d, b) {
66
var dialog = require('./Dialog');
77
var consts = require('../consts');
88
var entities = require('./EntityRecognizer');
9+
var mb = require('../Message');
10+
var Channel = require('../Channel');
911
(function (PromptType) {
1012
PromptType[PromptType["text"] = 0] = "text";
1113
PromptType[PromptType["number"] = 1] = "number";
@@ -18,6 +20,8 @@ var PromptType = exports.PromptType;
1820
ListStyle[ListStyle["none"] = 0] = "none";
1921
ListStyle[ListStyle["inline"] = 1] = "inline";
2022
ListStyle[ListStyle["list"] = 2] = "list";
23+
ListStyle[ListStyle["button"] = 3] = "button";
24+
ListStyle[ListStyle["auto"] = 4] = "auto";
2125
})(exports.ListStyle || (exports.ListStyle = {}));
2226
var ListStyle = exports.ListStyle;
2327
var SimplePromptRecognizer = (function () {
@@ -109,9 +113,10 @@ var Prompts = (function (_super) {
109113
session.dialogData[key] = args[key];
110114
}
111115
}
112-
session.send(args.prompt);
116+
session.send(this.formatPrompt(session, args));
113117
};
114118
Prompts.prototype.replyReceived = function (session) {
119+
var _this = this;
115120
var args = session.dialogData;
116121
Prompts.options.recognizer.recognize({
117122
promptType: args.promptType,
@@ -131,11 +136,90 @@ var Prompts = (function (_super) {
131136
}
132137
else {
133138
args.maxRetries--;
134-
session.send(args.retryPrompt || "I didn't understand. " + args.prompt);
139+
session.send(_this.formatPrompt(session, args, true));
135140
}
136141
}
137142
});
138143
};
144+
Prompts.prototype.formatPrompt = function (session, args, retry) {
145+
if (retry === void 0) { retry = false; }
146+
var prompt = args.prompt;
147+
if (Array.isArray(prompt)) {
148+
prompt = mb.Message.randomPrompt(prompt);
149+
}
150+
if (retry) {
151+
if (args.retryPrompt) {
152+
prompt = args.retryPrompt;
153+
if (Array.isArray(prompt)) {
154+
prompt = mb.Message.randomPrompt(prompt);
155+
}
156+
}
157+
else if (typeof prompt == 'string') {
158+
prompt = Prompts.options.defaultRetryPrompt + ' ' + prompt;
159+
}
160+
}
161+
if (typeof prompt == 'string') {
162+
var msg = new mb.Message();
163+
if (args.promptType == PromptType.choice) {
164+
var style = args.listStyle || ListStyle.auto;
165+
if (style == ListStyle.auto) {
166+
var maxBtns = Channel.maxButtons(session);
167+
if (maxBtns > 0 && args.enumValues.length <= maxBtns) {
168+
style = ListStyle.button;
169+
}
170+
else if (args.enumValues.length < 4) {
171+
style = ListStyle.inline;
172+
}
173+
else {
174+
style = ListStyle.list;
175+
}
176+
}
177+
var connector = '', list;
178+
switch (style) {
179+
case ListStyle.button:
180+
var a = { actions: [] };
181+
for (var i = 0; i < session.dialogData.enumValues.length; i++) {
182+
var action = session.dialogData.enumValues[i];
183+
a.actions.push({ title: action, message: action });
184+
}
185+
msg.setText(session, prompt)
186+
.addAttachment(a);
187+
break;
188+
case ListStyle.inline:
189+
list = ' ';
190+
args.enumValues.forEach(function (value, index) {
191+
list += connector + (index + 1) + '. ' + value;
192+
if (index == args.enumValues.length - 2) {
193+
connector = index == 0 ? ' or ' : ', or ';
194+
}
195+
else {
196+
connector = ', ';
197+
}
198+
});
199+
msg.setText(session, prompt + '%s', list);
200+
break;
201+
case ListStyle.list:
202+
list = '\n ';
203+
args.enumValues.forEach(function (value, index) {
204+
list += connector + (index + 1) + '. ' + value;
205+
connector = '\n ';
206+
});
207+
msg.setText(session, prompt + '%s', list);
208+
break;
209+
default:
210+
msg.setText(session, prompt);
211+
break;
212+
}
213+
}
214+
else {
215+
msg.setText(session, prompt);
216+
}
217+
return msg;
218+
}
219+
else {
220+
return prompt;
221+
}
222+
};
139223
Prompts.configure = function (options) {
140224
if (options) {
141225
for (var key in options) {
@@ -145,30 +229,30 @@ var Prompts = (function (_super) {
145229
}
146230
}
147231
};
148-
Prompts.text = function (ses, prompt) {
149-
beginPrompt(ses, {
232+
Prompts.text = function (session, prompt) {
233+
beginPrompt(session, {
150234
promptType: PromptType.text,
151235
prompt: prompt
152236
});
153237
};
154-
Prompts.number = function (ses, prompt, options) {
238+
Prompts.number = function (session, prompt, options) {
155239
var args = options || {};
156240
args.promptType = PromptType.number;
157241
args.prompt = prompt;
158-
beginPrompt(ses, args);
242+
beginPrompt(session, args);
159243
};
160-
Prompts.confirm = function (ses, prompt, options) {
244+
Prompts.confirm = function (session, prompt, options) {
161245
var args = options || {};
162246
args.promptType = PromptType.confirm;
163247
args.prompt = prompt;
164-
beginPrompt(ses, args);
248+
beginPrompt(session, args);
165249
};
166-
Prompts.choice = function (ses, prompt, choices, options) {
250+
Prompts.choice = function (session, prompt, choices, options) {
167251
var args = options || {};
168252
args.promptType = PromptType.choice;
169253
args.prompt = prompt;
170254
args.enumValues = entities.EntityRecognizer.expandChoices(choices);
171-
args.listStyle = args.listStyle || ListStyle.list;
255+
args.listStyle = args.listStyle || ListStyle.auto;
172256
var connector = '', list;
173257
switch (args.listStyle) {
174258
case ListStyle.list:
@@ -193,20 +277,21 @@ var Prompts = (function (_super) {
193277
args.prompt += list;
194278
break;
195279
}
196-
beginPrompt(ses, args);
280+
beginPrompt(session, args);
197281
};
198-
Prompts.time = function (ses, prompt, options) {
282+
Prompts.time = function (session, prompt, options) {
199283
var args = options || {};
200284
args.promptType = PromptType.time;
201285
args.prompt = prompt;
202-
beginPrompt(ses, args);
286+
beginPrompt(session, args);
203287
};
204288
Prompts.options = {
205-
recognizer: new SimplePromptRecognizer()
289+
recognizer: new SimplePromptRecognizer(),
290+
defaultRetryPrompt: "I didn't understand."
206291
};
207292
return Prompts;
208293
})(dialog.Dialog);
209294
exports.Prompts = Prompts;
210-
function beginPrompt(ses, args) {
211-
ses.beginDialog(consts.DialogId.Prompts, args);
295+
function beginPrompt(session, args) {
296+
session.beginDialog(consts.DialogId.Prompts, args);
212297
}

Node/lib/storage/BotConnectorStorage.js

Lines changed: 85 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,98 @@ var BotConnectorStorage = (function () {
33
function BotConnectorStorage(options) {
44
this.options = options;
55
}
6-
BotConnectorStorage.prototype.get = function (id, callback) {
6+
BotConnectorStorage.prototype.get = function (address, callback) {
7+
var ops = 2;
78
var settings = this.options;
8-
var options = {
9-
url: settings.endpoint + '/bot/v1.0/bots' + id
10-
};
11-
if (settings.appId && settings.appSecret) {
12-
options.auth = {
13-
username: settings.appId,
14-
password: settings.appSecret
15-
};
16-
options.headers = {
17-
'Ocp-Apim-Subscription-Key': settings.appSecret
18-
};
19-
}
20-
request.get(options, function (err, response, body) {
21-
try {
22-
var data;
23-
if (!err && typeof body === 'string') {
24-
data = JSON.parse(body);
9+
var data = {};
10+
function read(path, field) {
11+
if (path) {
12+
var options = {
13+
url: settings.endpoint + '/bot/v1.0/bots' + path
14+
};
15+
if (settings.appId && settings.appSecret) {
16+
options.auth = {
17+
username: settings.appId,
18+
password: settings.appSecret
19+
};
20+
options.headers = {
21+
'Ocp-Apim-Subscription-Key': settings.appSecret
22+
};
2523
}
26-
callback(err, data);
24+
request.get(options, function (err, response, body) {
25+
if (!err) {
26+
try {
27+
data[field + 'Hash'] = body;
28+
data[field] = typeof body === 'string' ? JSON.parse(body) : null;
29+
}
30+
catch (e) {
31+
err = e instanceof Error ? e : new Error(e.toString());
32+
}
33+
}
34+
if (callback && (err || --ops == 0)) {
35+
callback(err, data);
36+
callback = null;
37+
}
38+
});
2739
}
28-
catch (e) {
29-
callback(e instanceof Error ? e : new Error(e.toString()), null);
40+
else if (callback && --ops == 0) {
41+
callback(null, data);
3042
}
31-
});
43+
}
44+
var userPath = address.userId ? '/users/' + address.userId : null;
45+
var convoPath = address.conversationId ? '/conversations/' + address.conversationId + userPath : null;
46+
read(userPath, 'userData');
47+
read(convoPath, 'conversationData');
3248
};
33-
BotConnectorStorage.prototype.save = function (id, data, callback) {
49+
BotConnectorStorage.prototype.save = function (address, data, callback) {
50+
var ops = 2;
3451
var settings = this.options;
35-
var options = {
36-
url: settings.endpoint + '/bot/v1.0/bots' + id,
37-
body: data
38-
};
39-
if (settings.appId && settings.appSecret) {
40-
options.auth = {
41-
username: settings.appId,
42-
password: settings.appSecret
43-
};
44-
options.headers = {
45-
'Ocp-Apim-Subscription-Key': settings.appSecret
46-
};
52+
function write(path, field) {
53+
if (path) {
54+
var err;
55+
var body;
56+
var hashField = field + 'Hash';
57+
try {
58+
body = JSON.stringify(data[field]);
59+
}
60+
catch (e) {
61+
err = e instanceof Error ? e : new Error(e.toString());
62+
}
63+
if (!err && (!data[hashField] || body !== data[hashField])) {
64+
data[hashField] = body;
65+
var options = {
66+
url: settings.endpoint + '/bot/v1.0/bots' + path,
67+
body: body
68+
};
69+
if (settings.appId && settings.appSecret) {
70+
options.auth = {
71+
username: settings.appId,
72+
password: settings.appSecret
73+
};
74+
options.headers = {
75+
'Ocp-Apim-Subscription-Key': settings.appSecret
76+
};
77+
}
78+
request.post(options, function (err) {
79+
if (callback && (err || --ops == 0)) {
80+
callback(err);
81+
callback = null;
82+
}
83+
});
84+
}
85+
else if (callback && (err || --ops == 0)) {
86+
callback(err);
87+
callback = null;
88+
}
89+
}
90+
else if (callback && --ops == 0) {
91+
callback(null);
92+
}
4793
}
48-
request.post(options, callback);
94+
var userPath = address.userId ? '/users/' + address.userId : null;
95+
var convoPath = address.conversationId ? '/conversations/' + address.conversationId + userPath : null;
96+
write(userPath, 'userData');
97+
write(convoPath, 'conversationData');
4998
};
5099
return BotConnectorStorage;
51100
})();

0 commit comments

Comments
 (0)