Smooch:如何进行依赖于回发的状态转换
Smooch: How to do postback dependent state transition?
我正在尝试基于Smooch回发有效负载将脚本从一种状态转换到另一种状态;但是得到错误代码H12。
考虑一下这个例子https://github.com/smooch/smooch-bot-example
假设我修改了脚本https://github.com/smooch/smooch-bot-example/blob/master/script.js如下
start: {
receive: (bot) => {
return bot.say('Hi! I''m Smooch Bot! Continue? %[Yes](postback:askName) %[No](postback:bye) );
}
},
bye: {
prompt: (bot) => bot.say('Pleasure meeting you'),
receive: () => 'processing'
},
其意图是,机器人的状态将根据回发负载进行转换。
问题是,我该如何做到这一点?
我的方法是添加
stateMachine.setState(postback.action.payload)
到github.com/smooch/smooch-bot-example/blob/master/heroku/index.js 的handlePostback方法
然而,这引发了一个错误代码H12。我还试验了
stateMachine.transition(postback.action,postback.action.payload)
但无济于事。
我在使用[object object]而不是字符串时遇到了同样的问题。这是因为用函数获取或设置的state
包含在对象中,而不是字符串中。。。我在index.js
中用这段代码修复了它,替换了smoch bot示例GitHub repo:中现有的handlePostback
函数
function handlePostback(req, res) {
const stateMachine = new StateMachine({
script,
bot: createBot(req.body.appUser)
});
const postback = req.body.postbacks[0];
if (!postback || !postback.action) {
res.end();
};
const smoochPayload = postback.action.payload;
// Change conversation state according to postback clicked
switch (smoochPayload) {
case "POSTBACK-PAYLOAD":
Promise.all([
stateMachine.bot.releaseLock(),
stateMachine.setState(smoochPayload), // set new state
stateMachine.prompt(smoochPayload) // call state prompt() if any
]);
res.end();
break;
default:
stateMachine.bot.say("POSTBACK ISN'T RECOGNIZED") // for testing purposes
.then(() => res.end());
};
}
然后在script.js
中,您所需要做的就是定义与确切的回发有效负载相对应的状态。如果有多个回发应该将用户带到其他状态,只需将它们添加到case
列表中,如下所示:
case "POSTBACK-PAYLOAD-1":
case "POSTBACK-PAYLOAD-2":
case "POSTBACK-PAYLOAD-3":
case "POSTBACK-PAYLOAD-4":
Promise.all([
stateMachine.bot.releaseLock(),
stateMachine.setState(smoochPayload), // set new state
stateMachine.prompt(smoochPayload) // call state prompt() if any
]);
res.end();
break;
请注意,如果您想要的结果相同(此处:设置状态并提示相应的消息),则不应在每个case
的末尾写入break;
。
如果您想以不同的方式处理其他回发,可以在break;
语句之后添加case,然后执行其他操作。
希望这能有所帮助!
Postbacks不会自动将您的对话从一种状态转换到下一种状态,您必须自己编写该逻辑。幸运的是,您使用的接吻机器人示例已经在这里定义了一个回发处理程序:
https://github.com/smooch/smooch-bot-example/blob/30d2fc6/heroku/index.js#L115
所以,无论你想要什么样的转换逻辑,都应该在那里。您可以通过创建一个stateMachine并在其上调用receiveMessage()
来实现这一点,方法与handleMessages()的工作方式相同。例如:
const stateMachine = new StateMachine({
script,
bot: createBot(req.body.appUser)
});
stateMachine.receiveMessage({
text: 'whatever your script expects'
})
或者,如果您希望回发的行为与常规文本响应不同,您可以让handlePostback
实现独立地调用stateMachine.setState(state)
和stateMachine.prompt(state)
。
如果你想在回发的基础上推进对话,你必须首先从机器人的提示中输出按钮(这样你就可以处理接收中的按钮点击),修改index.js
中的handlePostback
功能,然后在你的接收方法中处理用户的"回复"-试试这个-这样修改script.js
:
start: {
prompt: (bot) => bot.say(`Hi! I'm Smooch Bot! Continue? %[Yes](postback:askName) %[No](postback:bye)`),
receive: (bot, message) => {
switch(message.text) {
case 'Yes':
return bot.say(`Ok, great!`)
.then(() => 'hi')
break;
case 'No':
return bot.say(`Ok, no prob!`)
.then(() => 'bye')
break;
default:
return bot.say(`hmm...`)
.then(() => 'processing')
break;
}
}
},
hi: {
prompt: (bot) => bot.say('Pleasure meeting you'),
receive: () => 'processing'
},
bye: {
prompt: (bot) => bot.say('Pleasure meeting you'),
receive: () => 'processing'
},
然后修改index.js
中的handlePostback
函数,使其将回发处理为常规消息:
function handlePostback(req, res) {
const postback = req.body.postbacks[0];
if (!postback || !postback.action)
res.end();
const stateMachine = new StateMachine({
script,
bot: createBot(req.body.appUser)
});
const msg = postback;
// if you want the payload instead just do msg.action.paylod
msg.text = msg.action.text;
stateMachine.receiveMessage(msg)
.then(() => res.end())
.catch((err) => {
console.error('SmoochBot error:', err);
res.end();
});
}
现在,当用户单击您的按钮时,它将被推到stateMachine,并像回复一样进行处理。
- 混合 ui-sref 和 $state.go 在 Angular ui-router 中进行状态转换
- 无法在现有状态转换期间更新-未使用任何非法的setState()
- CSS转换立即进入最终状态
- 如何处理 React / Flux 组件中的状态转换
- Angular JS具有在状态转换期间可见的来自两个不同状态的页面(用于动画目的)
- 如何在AngularJS$rootScope事件侦听器中应用状态转换
- UI路由器-状态转换延迟(非常慢)
- 角度 UI 状态转换问题
- 从一种特定状态转换到另一种特定状态时执行操作
- 角度 UI 路由器 - 在没有参数的情况下从一个状态转换到同一状态失败
- index.js:1335警告:setState(..):无法在现有状态转换期间更新(例如在' render '或其他组
- Angular UI-Router——在resolve中返回被拒绝的承诺并不能停止状态转换
- ReactNativeJS:警告:setState(..):在现有状态转换期间无法更新(例如在“渲染”中)
- 添加“active"状态转换为Javascript
- 在AngularJS和Ionic中,每次状态转换都会发生两次导航
- React:警告:setState(..):在现有状态转换期间无法更新
- 从包含ng网格对象的状态转换不起作用
- Smooch:如何进行依赖于回发的状态转换
- 如何在状态转换之前暂停组件的延迟
- 在angular js中,如何将json对象作为状态转换的一部分发送到另一个控制器