Используйте Node-Schedule, чтобы начать диалог BotBuilder - PullRequest
0 голосов
/ 08 мая 2018

У меня есть рабочий код для диалога 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

Разве неправильно заключать диалог в функцию? Если да, то как правильно планировать вызов диалога? Кто-нибудь еще имеет опыт работы с этим конкретным сценарием?

Любая помощь / указатели будут с благодарностью. :)

Спасибо.

Edit:

Комментарий Гэри Лю заставил меня задуматься. Таким образом, я создал нижнюю часть функции, как показано ниже, и она больше не выдает ошибку, но ничего не делает в назначенное время.

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 голосов
/ 28 июня 2018

Мне удалось заставить планировщик работать, поместив его в dialogUpdate.Следуя примеру Планирование правил Reccurance , я поместил scheduleJob в анонимную функцию, которая затем вызывала bot.beginDialog ().beginDialog создает стек диалога и начинает поток диалога.Передача message.address необходима, поскольку он присваивает текущую информацию о пользователе стеку.

В моем тесте он выполнялся каждую минуту (см. Временные метки журнала).

Я пытался создать это с помощьюименованная функция вместо анонимной функции для вызова bot.beginDialog () - планировщику это не нравится (по крайней мере, в контексте запуска бота).Он не отвечает.

Надежда на помощь!

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

...