2017-02-11 13 views
0

Привет, у меня есть проактивный викторины, где я отправляю сообщение каждые несколько часов, и люди получают шанс участвовать в викторине. Есть 2 способа, чтобы начать диалог в Node.js с помощью рамки бота, если я не ошибаюсьИнициировать проактивное приглашение без нарушения диалога в рамке бота

bot.send() 
bot.beginDialog() 

1-одно не конец текущего диалога, а второй один делает. Я хочу задать пользователю вопрос «Что такое 1500 + 450 и 4 варианта» 1800 1950 2500 3000 и начать диалог только в том случае, если человек отвечает на вопрос выше. Как я могу это сделать, не нарушая текущий стек диалога?

ответ

1

То, что вы запрашиваете, в принципе невозможен - использование проактивных сообщений не позволяет вам изменять стек вызовов текущего контекста - он позволяет вам отправлять сообщения пользователю.

Единственный способ, которым я мог бы подумать об обходе, это использовать middleware, чтобы перехватывать сообщения и решать, следует ли менять стоп-код или нет (используя beginDialog).

Это также не оптимально, так как у вас может быть следующий сценарий: 1. Вопрос о стеке текущих вызовов: «Сколько лет опыта у вас есть?» 2. Проактивное приглашение: «Выберите ответ: 1) 1000. 2) 2000 и т. Д.»

Если пользователь набирает «2», в каком контексте он имеет в виду?

Может быть хорошим решением было бы попросить пользователя ввести «викторины ответ: 2», который позволит вам перехватить это сообщение с помощью промежуточного ПО:

bot.use({ 
    botbuilder: function (session, next) { 
     if (/^(quiz answer)/g.test(session.message.text)) { 
      session.beginDialog('/quizAnswer'); 
     } 
     else { 
      next(); 
     } 
    } 
}); 

После диалога /quizAnswer концов, это вернется к нормальному потоку. Имейте в виду, что даже в этом случае пользователь может не помнить, в каком контексте он находился, и вам будет трудно найти, что было последним сообщением/приглашением и т. Д.

Возможно, лучшим решением было бы иметь отдельный бот для викторины.

+0

Ok быстрый вопрос Я столкнулся с этой проблемой, которая обращается к чему-то подобному. Я думаю, https://github.com/Microsoft/BotBuilder/issues/1352, но я не понял, как beginDialogAction должен исправить это, любые идеи? – PirateApp

+1

Я не пытаюсь это сделать, но если я не ошибаюсь, это очень похоже на промежуточное ПО, то есть независимо от того, в каком состоянии вы находитесь, если определенная работа получена ботом, запустите новый диалог. Точно так же, как endConversationAction выбирает работу, например cancel/quit, которая всегда очищает текущий стек. –