很遗憾,在当前版本的技能包中,您无法更改超时时间。此超时实际上由代理控制(因此,客户端、应用程序或搜索服务。)
Botframework 支持“键入”消息;不幸的是,Cortana 还没有。它还支持主动消息(带外),不幸的是 Cortana 不支持(目前)。
但还是有希望的!这取决于您构建对话框的方式和使用的输入提示,以及您的主要人机界面是什么设备。
例如,在 Windows 上,您可以使用“acceptingInput”的提示。这意味着对话无限期地等待用户做某事。这通常用于展示丰富的卡片。如果您遵循此路径,您的机器人应轮询任务的完成情况,然后显示“我仍在思考”消息以响应用户输入(在下一回合)。
你说的这个 UX 不是很好,因为用户不知道任务何时完成......但你可以在任务完成时使用 replaceDialog 让对话流程回到正轨!
如果您想提供任务正在进行的积极反馈,您可以这样做!使用带有“请稍候消息”的“ignoringInput”提示。创建一个轮询任务完成的循环,并每 5 秒发送一次此消息。 ignoringInput 会导致机器人继续下一轮,直到它得到一个接受或期待的输入提示。
var restify = require('restify');
var builder = require('botbuilder');
// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
console.log('%s listening to %s', server.name, server.url);
});
// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword,
openIdMetadata: process.env.BotOpenIdMetadata
});
// Listen for messages from users
server.post('/api/messages', connector.listen());
// Create your bot with a function to receive messages from the user
var bot = new builder.UniversalBot(connector);
bot.set('storage', new builder.MemoryBotStorage() );
const kWelcomeText = 'Hi! Say \'start\' to create a timer and a polling loop.';
const kMisunderstood = 'Sorry, I didn\'t get that.';
const kStarting = 'Starting 30 second timer. Please wait.';
const kWaiting = 'Please wait.';
const kDone = 'My task is done.';
bot.dialog('/', function (session) {
var txt = session.message.text;
if( !txt )
{
var msg = new builder.Message(session)
.text( kWelcomeText )
.speak( kWelcomeText )
.inputHint("acceptingInput");
session.send(msg);
return;
}
if( txt === 'start' )
{
console.log( 'entering pollerDialog' );
session.conversationData.counter = 0;
session.beginDialog('pollerDialog');
return;
}
else {
var msg = new builder.Message(session)
.text( kMisunderstood )
.speak( kMisunderstood )
.inputHint("acceptingInput");
session.send(msg);
return;
}
});
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
bot.dialog('pollerDialog', function (session) {
console.log( 'entering pollerDialog' );
var iter = session.conversationData.counter || 0;
session.conversationData.counter = iter + 1;
if( session.conversationData.done )
{
console.log( 'done' );
var msg = new builder.Message(session)
.text( kDone )
.speak( kDone )
.inputHint("acceptingInput");
session.endDialog(msg);
return;
}
console.log( `iteration is ${iter}` );
if( iter === 0 )
{
console.log( 'setting timeout' );
setTimeout(function () {
console.log( 'timeout done' );
session.conversationData.done = true;
}, 30000);
var msg = new builder.Message(session)
.text( kStarting )
.speak( kStarting )
.inputHint("ignoringInput");
session.sendTyping();
session.send(msg);
console.log( 'sent kStarting' );
setTimeout( function( ) {
console.log( 'replacing kStarting' );
session.replaceDialog('pollerDialog');
}, 5000);
sleep(4000);
return;
} else {
var msg = new builder.Message(session)
.text( kWaiting )
.speak( kWaiting )
.inputHint("ignoringInput");
session.sendTyping();
session.send(msg);
console.log( 'sent kWaiting' );
setTimeout( function( ) {
console.log( 'replacing kWaiting' );
session.replaceDialog('pollerDialog');
}, 5000);
sleep(4000);
return;
}
});