MS Bot Framework(Nodejs):会话生存期和延迟消息

时间:2016-08-17 07:00:30

标签: botframework

这是我第一次尝试使用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");
    }
});

此代码有效,但如此多的检查看起来很糟糕。所以我有几个问题:

  1. 为什么第一个代码示例不起作用?我想会话生命周期中的问题然后会话生命周期是什么?
  2. 如何在此示例中设置session.userData?所以在第一个代码示例中,我想在setTimeout中设置回调函数,但它也不起作用。
  3. 创建延迟答案的最佳方法是什么?

2 个答案:

答案 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>)
相关问题