我有一个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中运行时,我收到以下错误:
将对话框包装在函数中是错误的吗?如果是这样,调度程序调用对话框的正确方法是什么?其他人都有这种特殊情况的经验吗?
任何帮助/指针将不胜感激。 :)
谢谢。
修改
刘嘉诚的评论让我思考。所以我像下面一样实例化了函数的机器人,它不再抛出错误,但它在预定的时间内没有做任何事情。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?");
无论如何,我正在进一步研究这个问题。
一如既往,我们将不胜感激任何帮助/指示 - 谢谢。
答案 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);
}
]);