这是我第一次尝试使用Bot Framework(Nodejs)。我想测试延迟消息,例如,我的机器人必须在收到消息后5秒后回答。 所以我尝试了这段代码:
var builder = require('botbuilder');
var connector = new builder.consoleconnector().listen();
var bot = new builder.universalbot(connector);
bot.dialog('/', function (session) {
if (!session.userData.TimeoutStarted) {
session.send("I'll answer in 5 seconds");
session.userData.TimeoutStarted = true;
setTimeout(function() {
session.send("Answer after 5 seconds");
session.userData.TimeoutStarted = false;
}, 5000);
} else {
session.send("Bot is busy");
}
});
但这不起作用。触发setTimeout内部的回调函数,但所有带会话的操作都不起作用。
所以,我在这里找到了可能的解决方案:How to send message later in bot framework并重写我的代码:
var builder = require('botbuilder');
var connector = new builder.ConsoleConnector().listen();
var bot = new builder.UniversalBot(connector);
bot.dialog('/', function (session) {
if (session.userData.Timeout > 0 && Date.now() - session.userData.Timeout > 5000)
session.userData.Timeout = 0;
if (!session.userData.Timeout) {
session.send("I'll answer in 5 seconds");
var reply = session.message;
setTimeout(function() {
reply.text = "Answer after 5 seconds";
bot.send(reply);
}, 5000);
session.userData.Timeout = Date.now();
} else {
session.send("Bot is busy");
}
});
此代码有效,但如此多的检查看起来很糟糕。所以我有几个问题:
答案 0 :(得分:2)
我刚刚调查了这个问题。看起来ConsoleConnector
中存在一个错误,导致无法使用相同的session
对象发送两条消息(由于内部批处理,在消息之间的给定间隔之上)。由于状态在send
期间也持续存在,因此延迟状态更新也不起作用。如果您向session.save
中的回调添加了对setTimeout
的调用,则会保留新状态(但仍然不会发送该消息)。
我相信你的第一个例子应该与ChatConnector
一起使用(虽然没有机会尝试)。我将使用ConsoleConnector
的修复程序创建一个拉取请求。
我希望这能解答你所有的问题。
<强>更新强>
有关更多详细信息,请参阅this issue和相关的提取请求。
<强> UPDATE2 强>
使用此代码对我ChatConnector
有效:
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
console.log('%s listening to %s', server.name, server.url);
});
var connector = new builder.ChatConnector({
appId: '',
appPassword: ''
});
var bot = new builder.UniversalBot(connector);
server.post('/api/messages', connector.listen());
bot.dialog('/', function (session) {
if (!session.userData.TimeoutStarted) {
session.send("I'll answer in 5 seconds");
session.userData.TimeoutStarted = true;
setTimeout(function() {
session.send("Answer after 5 seconds");
session.userData.TimeoutStarted = false;
}, 5000);
} else {
session.send("Bot is busy");
}
});
答案 1 :(得分:2)
对于有兴趣从机器人发送延迟消息的人,您可以使用Dim UserInput As String
UserInput = Console.Readline()
Dim (UserInput) As String
例如,
session.delay(<ms>)