将参数传递给 smooch-bot 中的回发方法
pass param to postback method in smooch-bot
我正在关注@dstoiko 的回答from here
我在 ADD_MOVIE
块中调用 API 并希望通过有效负载 ADD_TO_FIREBASE
将一些值传递给我的回发
这是我的积木
'use strict';
const Script = require('smooch-bot').Script;
var YtsHelper = require('./libs/YtsHelper.js');
const FirebaseHelper = require('./libs/FirebaseHelper.js');
var firebaseHelperObj = new FirebaseHelper();
module.exports = new Script({
processing: {
prompt: (bot) => bot.say('Beep boop...'),
receive: () => 'processing'
},
start: {
receive: (bot) => {
return bot.say('Hi! I\'m Smooch Bot!')
.then(() => 'showUserMenu');
}
},
showUserMenu: {
prompt: (bot) => bot.say("Here are the areas I can help you out. %[Add Movie](postback:ADD_MOVIE) %[Serve Food](postback:SERVE_FOOD)"),
receive: () => 'finish'
},
ADD_MOVIE : {
prompt: (bot) => bot.say('Enter movie name or keywords you want to search please.'),
receive: (bot, message) => {
const movie_name_searched = message.text;
return bot.setProp('movie_name_searched', movie_name_searched)
.then(() => bot.say('Search in progress...'))
.then(() => {
YtsHelper.getMoviesList(movie_name_searched,function(movies_array){
var movies_postbacks = "";
console.log("Movies SIZE " + movies_array.length);
for (var i = 0; i < movies_array.length ; i++){
movies_postbacks = movies_postbacks + " %["+movies_array[i]+"](postback:ADD_TO_FIREBASE)";
}
bot.say(movies_postbacks)
.then(() => bot.say("Click any movie to add into firebase."));
});
});
}
},
ADD_TO_FIREBASE: {
prompt: (bot) => bot.say("confirm, y/n"),
receive: () => 'showUserMenu'
},
finish: {
receive: (bot, message) => {
return bot.getProp('name')
.then((name) => bot.say(`Sorry ${name}, my creator didn't ` +
'teach me how to do anything else!'))
.then(() => 'showUserMenu');
}
}
});
问题
Q0。我也是 nodeJS 的新手,我应该怎么称呼 ADD_MOVIE、start、showUserMenu(在我的代码中)块?函数、方法、代码、模块等
Q1。我在 ADD_MOVIE 块中调用了 yts api。在 script.js 文件中调用 API 可以吗?
Q2。重要提示!:我如何将参数传递到我的回发中,有效负载 ADD_MOVIE 以便我可以在 ADD_TO_FIREBASE 块
中执行一些条件代码
Q0:是风格问题,这里没有确定的答案。换句话说,这是进行此类讨论的错误论坛:) https://whosebug.com/help/how-to-ask
Q1: 是的,在 receive
中进行数据库查询没问题,但是您的 receive
函数并未等待查询完成解决您的机器人状态。例如,如果您不希望您的机器人在电影列表返回之前接受用户输入,您可以这样做:
receive: (bot, message) => {
const movie_name_searched = message.text;
return bot.setProp('movie_name_searched', movie_name_searched)
.then(() => bot.say('Search in progress...'))
.then(() => {
return new Promise((res) => YtsHelper.getMoviesList(movie_name_searched, (movies_array) => res(movies_array)));
})
.then((movies_array) => {
var movies_postbacks = "";
for (var i = 0; i < movies_array.length ; i++){
movies_postbacks = movies_postbacks + " %["+movies_array[i]+"](postback:ADD_TO_FIREBASE)";
}
return bot.say(movies_postbacks);
})
.then(() => bot.say("Click any movie to add into firebase."))
.then(() => 'ADD_MOVIE');
}
请注意,我正在用 'ADD_MOVIE' 解析承诺链的最后端,它会告诉您的机器人保持与之前相同的状态。
Q2:我看到两个选项。
选项 1: 将电影 ID 附加到 post 返回负载,例如 ADD_TO_FIREBASE.movieid1
、ADD_TO_FIREBASE.movieid2
等等..
如果你这样做,你必须在 handlePostback 中定义你自己的行为,从你的 post 返回负载中解析出电影 ID。
您还必须自己将状态机转换为所需的 ADD_TO_FIREBASE
状态。例如,根据您的自定义 handlePostback
方法,您将执行如下操作:
const stateMachine = new StateMachine({
script,
bot: createBot(req.body.appUser)
});
stateMachine.setState('ADD_TO_FIREBASE');
选项 2: 您使用的 %[foo](postback:bar)
消息实际上是 shorthand 语法。 post 返回消息的真正内部工作是可以发送到 Smooch API directly 的操作按钮。操作按钮还允许您指定一个 metadata
对象。如果不使用内置的 bot.say
,您可以直接通过 API 发送 post 消息,并且可以将您的电影 ID 存储在操作元数据中。您将不得不再次通过自定义 handlePostback
从该元数据中检索选定的 movieId,就像您在选项 1 中所做的那样。
我正在关注@dstoiko 的回答from here
我在 ADD_MOVIE
块中调用 API 并希望通过有效负载 ADD_TO_FIREBASE
这是我的积木
'use strict';
const Script = require('smooch-bot').Script;
var YtsHelper = require('./libs/YtsHelper.js');
const FirebaseHelper = require('./libs/FirebaseHelper.js');
var firebaseHelperObj = new FirebaseHelper();
module.exports = new Script({
processing: {
prompt: (bot) => bot.say('Beep boop...'),
receive: () => 'processing'
},
start: {
receive: (bot) => {
return bot.say('Hi! I\'m Smooch Bot!')
.then(() => 'showUserMenu');
}
},
showUserMenu: {
prompt: (bot) => bot.say("Here are the areas I can help you out. %[Add Movie](postback:ADD_MOVIE) %[Serve Food](postback:SERVE_FOOD)"),
receive: () => 'finish'
},
ADD_MOVIE : {
prompt: (bot) => bot.say('Enter movie name or keywords you want to search please.'),
receive: (bot, message) => {
const movie_name_searched = message.text;
return bot.setProp('movie_name_searched', movie_name_searched)
.then(() => bot.say('Search in progress...'))
.then(() => {
YtsHelper.getMoviesList(movie_name_searched,function(movies_array){
var movies_postbacks = "";
console.log("Movies SIZE " + movies_array.length);
for (var i = 0; i < movies_array.length ; i++){
movies_postbacks = movies_postbacks + " %["+movies_array[i]+"](postback:ADD_TO_FIREBASE)";
}
bot.say(movies_postbacks)
.then(() => bot.say("Click any movie to add into firebase."));
});
});
}
},
ADD_TO_FIREBASE: {
prompt: (bot) => bot.say("confirm, y/n"),
receive: () => 'showUserMenu'
},
finish: {
receive: (bot, message) => {
return bot.getProp('name')
.then((name) => bot.say(`Sorry ${name}, my creator didn't ` +
'teach me how to do anything else!'))
.then(() => 'showUserMenu');
}
}
});
问题
Q0。我也是 nodeJS 的新手,我应该怎么称呼 ADD_MOVIE、start、showUserMenu(在我的代码中)块?函数、方法、代码、模块等
Q1。我在 ADD_MOVIE 块中调用了 yts api。在 script.js 文件中调用 API 可以吗?
Q2。重要提示!:我如何将参数传递到我的回发中,有效负载 ADD_MOVIE 以便我可以在 ADD_TO_FIREBASE 块
中执行一些条件代码Q0:是风格问题,这里没有确定的答案。换句话说,这是进行此类讨论的错误论坛:) https://whosebug.com/help/how-to-ask
Q1: 是的,在 receive
中进行数据库查询没问题,但是您的 receive
函数并未等待查询完成解决您的机器人状态。例如,如果您不希望您的机器人在电影列表返回之前接受用户输入,您可以这样做:
receive: (bot, message) => {
const movie_name_searched = message.text;
return bot.setProp('movie_name_searched', movie_name_searched)
.then(() => bot.say('Search in progress...'))
.then(() => {
return new Promise((res) => YtsHelper.getMoviesList(movie_name_searched, (movies_array) => res(movies_array)));
})
.then((movies_array) => {
var movies_postbacks = "";
for (var i = 0; i < movies_array.length ; i++){
movies_postbacks = movies_postbacks + " %["+movies_array[i]+"](postback:ADD_TO_FIREBASE)";
}
return bot.say(movies_postbacks);
})
.then(() => bot.say("Click any movie to add into firebase."))
.then(() => 'ADD_MOVIE');
}
请注意,我正在用 'ADD_MOVIE' 解析承诺链的最后端,它会告诉您的机器人保持与之前相同的状态。
Q2:我看到两个选项。
选项 1: 将电影 ID 附加到 post 返回负载,例如 ADD_TO_FIREBASE.movieid1
、ADD_TO_FIREBASE.movieid2
等等..
如果你这样做,你必须在 handlePostback 中定义你自己的行为,从你的 post 返回负载中解析出电影 ID。
您还必须自己将状态机转换为所需的 ADD_TO_FIREBASE
状态。例如,根据您的自定义 handlePostback
方法,您将执行如下操作:
const stateMachine = new StateMachine({
script,
bot: createBot(req.body.appUser)
});
stateMachine.setState('ADD_TO_FIREBASE');
选项 2: 您使用的 %[foo](postback:bar)
消息实际上是 shorthand 语法。 post 返回消息的真正内部工作是可以发送到 Smooch API directly 的操作按钮。操作按钮还允许您指定一个 metadata
对象。如果不使用内置的 bot.say
,您可以直接通过 API 发送 post 消息,并且可以将您的电影 ID 存储在操作元数据中。您将不得不再次通过自定义 handlePostback
从该元数据中检索选定的 movieId,就像您在选项 1 中所做的那样。