我已经使用Bot Framework使用node.js开发了一个聊天机器人。我使用了自定义操作和缩略图卡来创建按钮,并根据正则表达式匹配它会调用其他函数。无论何时用户键入yes / No,Bot都必须转到上一个对话框的操作。例如。我正在使用两个对话框/ main和/ final,具有两个yes / no自定义操作(Onselect和imback卡),如果我打开/ main,它将为/ main打开yes / no自定义操作对话框,它应该执行以下操作/主要。在我的情况下,由于两个具有相同按钮名称和相同Imback消息的自定义操作而没有发生。我将regex用作/ yes | y / gi&/ no | n / gi来执行这两个自定义操作。
bot.dialog('/',function (session, args, results) {
if (!session.userData.name)
{
console.log('Start conversation');
name = session.message.text;
session.userData.name = name;
//session.send("Hello ,"+userName +"\nI can help you with the following")
session.send("I can help you with the following")
session.beginDialog('/main');
}
else if(!session.userData.conformation)
{
console.log('execute command');
dialog_flow(session);
}
dialog_flow(session);
}
);
bot.dialog('/main',function (session, args, results) {
const card = new builder.ThumbnailCard(session)
.title('Bot for Global Service Desk')
.text(' You can choose one of the options below')
.buttons([
builder.CardAction.imBack(session, 'Network Support','Network Support')
]);
const message = new builder.Message(session)
.addAttachment(card)
session.send(message);
option = session.message.text;
session.userData.option = option;
}
);
bot.customAction({ matches:/Network/gi,
onSelectAction: (session, args, next) => {
const card = new builder.ThumbnailCard(session)
.text("You have Selected Network Support")
.buttons([
builder.CardAction.imBack(session,'Internet Connectivity Check','Internet Connectivity Check')
]);
const message = new builder.Message(session)
.addAttachment(card);
session.send(message);
option = session.message.text
session.userData.option = option }}
);
bot.customAction({
matches:/Internet Connectivity Check/gi,
onSelectAction: (session, args, next) => {
option = session.message.text
itsmdata["subcategory"] = option
session.userData.option1 = option
session.send("You have Selected\t"+option+",\tPlease confirm?");
const card = new builder.ThumbnailCard(session)
.buttons([
builder.CardAction.imBack(session, 'YES', 'YES'),
builder.CardAction.imBack(session, 'NO', 'NO')
]);
const message = new builder.Message(session)
.addAttachment(card);
session.endConversation(message);
}
}
);
bot.dialog('/final',function (session, args, results) {
const card = new builder.ThumbnailCard(session)
.text('Do you want to Continue')
.buttons([
builder.CardAction.imBack(session, 'YES', 'YES'),
builder.CardAction.imBack(session, 'NO', 'NO')
]);
const message = new builder.Message(session)
.addAttachment(card);
session.endConversation(message);
}
);
function dialog_flow(session){
//session.sendTyping();
conformation = session.message.text
option = session.userData.option1
session.userData.conformation = conformation
console.log('User Selected Option is %s', option);
console.log('User conformation %', conformation);
var yesconfor = /Yes|Y|ok/gi;
var noconfor = /cancel|no|n/gi;
if(conformation.match(yesconfor)){
session.clearDialogStack();
session.beginDialog('/main');
}
else if(conformation.match(noconfor)){
session.clearDialogStack();
session.send("Thank you,\t Please Close the session");
session.endDialog();
}
else if(conformation.match(noconfor)){
session.clearDialogStack();
session.beginDialog('/main');
}
else if(conformation.match(yesconfor))
{
session.sendTyping();
postdata(itsmdata, "snow", session);
session.sendTyping();
}
}
答案 0 :(得分:0)
如果在每个对话框中都设置了 session.userData.option ,则 dialog_flow 方法中的是/否检查应检查该值,以确定哪个是/否回答用户正在回应。像这样:
var builder = require('botbuilder');
var restify = require('restify');
// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
console.log('%s listening to %s', server.name, server.url);
});
// Create chat bot and listen to messages
var connector = new builder.ChatConnector({
appId: process.env.MICROSOFT_APP_ID,
appPassword: process.env.MICROSOFT_APP_PASSWORD
});
server.post('/api/messages', connector.listen());
var inMemoryStorage = new builder.MemoryBotStorage();
var bot = new builder.UniversalBot(connector)
.set('storage', inMemoryStorage); // Register in memory storage
bot.dialog('/', function (session, args, results) {
if (!session.userData.name) {
console.log('Start conversation');
name = session.message.text;
session.userData.name = name;
//session.send("Hello ,"+userName +"\nI can help you with the following")
session.send("I can help you with the following")
session.beginDialog('/main');
}
else if (!session.userData.conformation) {
console.log('execute command');
dialog_flow(session);
}
dialog_flow(session);
}
);
bot.dialog('/main', function (session, args, results) {
const card = new builder.ThumbnailCard(session)
.title('Bot for Global Service Desk')
.text(' You can choose one of the options below')
.buttons([
builder.CardAction.imBack(session, 'Network Support', 'Network Support')
]);
const message = new builder.Message(session)
.addAttachment(card)
session.send(message);
option = session.message.text;
session.userData.option = option;
}
);
bot.customAction({
matches: /Network/gi,
onSelectAction: (session, args, next) => {
const card = new builder.ThumbnailCard(session)
.text("You have Selected Network Support")
.buttons([
builder.CardAction.imBack(session, 'Internet Connectivity Check', 'Internet Connectivity Check')
]);
const message = new builder.Message(session)
.addAttachment(card);
session.send(message);
option = session.message.text
session.userData.option = option
}
}
);
bot.customAction({
matches: /Internet Connectivity Check/gi,
onSelectAction: (session, args, next) => {
option = session.message.text
//itsmdata["subcategory"] = option
session.userData.option1 = option
session.send("You have Selected\t" + option + ",\tPlease confirm?");
const card = new builder.ThumbnailCard(session)
.buttons([
builder.CardAction.imBack(session, 'YES', 'YES'),
builder.CardAction.imBack(session, 'NO', 'NO')
]);
const message = new builder.Message(session)
.addAttachment(card);
session.endConversation(message);
}
}
);
bot.dialog('/final', function (session, args, results) {
const card = new builder.ThumbnailCard(session)
.text('Do you want to Continue')
.buttons([
builder.CardAction.imBack(session, 'YES', 'YES'),
builder.CardAction.imBack(session, 'NO', 'NO')
]);
const message = new builder.Message(session)
.addAttachment(card);
session.endConversation(message);
}
);
function dialog_flow(session) {
//session.sendTyping();
conformation = session.message.text
option = session.userData.option1;
session.userData.conformation = conformation;
console.log('User Selected Option is %s', option);
console.log('User conformation %', conformation);
var yesconfor = /Yes|Y|ok/gi;
var noconfor = /cancel|no|n/gi;
if (conformation.match(yesconfor)) {
if(option == 'Internet Connectivity Check'){
session.clearDialogStack();
session.beginDialog('/main');
}else{
postdata(itsmdata, "snow", session);
session.sendTyping();
}
}
else if (conformation.match(noconfor)) {
if(option == 'Internet Connectivity Check'){
session.clearDialogStack();
session.send("Thank you,\t Please Close the session");
session.endDialog();
}
else{
session.clearDialogStack();
session.beginDialog('/main');
}
}
}