使用节点计划开始BotBuilder对话

时间:2018-05-08 17:18:46

标签: node.js botframework microsoft-teams

我有一个BotBuilder对话框的工作代码。我现在想要在每个星期一到星期五的上午8:30开始使用节点时间表,如下所示。

var rule = new schedule.RecurrenceRule();
// Run the task Mondays-Fridays
rule.dayOfWeek = [0, new schedule.Range(1, 5)];
rule.hour = 8;
rule.minute = 30;

schedule.scheduleJob(rule, beginStatusDialog);

console.log('Schedule initialzed.');

运行此"计划初始化"是按预期编写的。所以,我已将对话框代码包装在函数beginStatusDialog中,如下所示。

function beginStatusDialog() {


// Begin dialog - This is a question bot that uses a waterfall technique to prompt users for input.
const bot = new builder.UniversalBot(connector, [
    function (session) {
        session.send("Welcome to the daily status check " + session.message.user.name + ".");
        builder.Prompts.text(session, "What did you do yesterday?");
    },
    function (session, results) {
        session.dialogData.yesterday = session_yesterday = results.response;
        builder.Prompts.text(session, "What will you do today?");
    },
    function (session, results) {
        session.dialogData.today = session_today = results.response;
        builder.Prompts.text(session, "Are there any obstacles holding you up? Note: An email will be sent with your responses.");
    },
    function (session, results) {
        session.dialogData.obstacles = session_obstacles = results.response;

        session_username = session.message.user.name;

        // Write responses to DB
        executeStatement(session_username, session_yesterday, session_today, session_obstacles);

        //Process request and display details
        session.send(`Daily status details: <br/>Yesterday: ${session.dialogData.yesterday} <br/>Today: ${session.dialogData.today} <br/>Obstacles: ${session.dialogData.obstacles}`);
        session.dialogData = {};
        session.endDialog();

    }
]).set('storage', inMemoryStorage); // Register in-memory storage

}

当我在botframework-emulator中运行时,我收到以下错误:

enter image description here

将对话框包装在函数中是错误的吗?如果是这样,调度程序调用对话框的正确方法是什么?其他人都有这种特殊情况的经验吗?

任何帮助/指针将不胜感激。 :)

谢谢。

修改

刘嘉诚的评论让我思考。所以我像下面一样实例化了函数的机器人,它不再抛出错误,但它在预定的时间内没有做任何事情。

var bot = new builder.UniversalBot(connector).set('storage', inMemoryStorage);

然后我用bot.dialog在函数内部启动它 - 或者至少这是我的意图:

function beginStatusDialog() {
// Begin dialog - This is a question bot that uses a waterfall technique to prompt users for input.
//const bot = new builder.UniversalBot(connector, [
bot.dialog([
    function (session) {
        session.send("Welcome to the daily status check " + session.message.user.name + ".");
        builder.Prompts.text(session, "What did you do yesterday?");

无论如何,我正在进一步研究这个问题。

一如既往,我们将不胜感激任何帮助/指示 - 谢谢。

1 个答案:

答案 0 :(得分:3)

我可以通过将调度程序放入对话更新来使其正常工作。按照Reccurance Rule Scheduling的示例,我将scheduleJob放在一个匿名函数中,该函数然后称为bot.beginDialog()。 beginDialog创建对话框堆栈并开始对话框流程。必须传递message.address,因为它将当前用户信息分配给堆栈。

在我的测试中,它每分钟运行一次(请参阅日志时间戳记)。

我尝试使用命名函数代替匿名函数来调用bot.beginDialog()来创建它-调度程序似乎不喜欢这样(至少在启动bot的情况下)。它没有响应。

希望有帮助!

var rule = new schedule.RecurrenceRule();
// Run the task Mondays-Fridays
rule.dayOfWeek = [0, new schedule.Range(1, 5)];
rule.hour = 13;
// rule.minute = 08;

// schedule.scheduleJob(rule, beginStatusDialog);

console.log('Schedule initialzed.');

var bot = new builder.UniversalBot(connector);
bot.set('storage', new builder.MemoryBotStorage());

bot.on('conversationUpdate', function (message) {
    if (message.membersAdded) {
        message.membersAdded.forEach(function (identity) {
            if (identity.id === message.address.bot.id) {
                schedule.scheduleJob(rule, function () {
                    bot.beginDialog(message.address, '/');
                })
            }
        });
    }
});

bot.dialog('/', [
    function (session) {
        builder.Prompts.text(session, "What is your name?");
    },
    function (session) {
    session.send("You said %s", session.message.text);
    }
]);

enter image description here