То, что вы запрашиваете, в принципе невозможен - использование проактивных сообщений не позволяет вам изменять стек вызовов текущего контекста - он позволяет вам отправлять сообщения пользователю.
Единственный способ, которым я мог бы подумать об обходе, это использовать 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 концов, это вернется к нормальному потоку. Имейте в виду, что даже в этом случае пользователь может не помнить, в каком контексте он находился, и вам будет трудно найти, что было последним сообщением/приглашением и т. Д.
Возможно, лучшим решением было бы иметь отдельный бот для викторины.
Ok быстрый вопрос Я столкнулся с этой проблемой, которая обращается к чему-то подобному. Я думаю, https://github.com/Microsoft/BotBuilder/issues/1352, но я не понял, как beginDialogAction должен исправить это, любые идеи? – PirateApp
Я не пытаюсь это сделать, но если я не ошибаюсь, это очень похоже на промежуточное ПО, то есть независимо от того, в каком состоянии вы находитесь, если определенная работа получена ботом, запустите новый диалог. Точно так же, как endConversationAction выбирает работу, например cancel/quit, которая всегда очищает текущий стек. –