3

我正在尝试基于 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)

无济于事。

4

3 回答 3

4

我用 [object Object] 而不是字符串遇到了同样的问题。这是因为state您使用函数获取或设置的内容包含在一个对象中,而不是字符串中......我在里面用这段代码修复了它,替换了smooch-bot-example GitHub存储库中index.js的现有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;

请注意,如果您想要的结果相同,则不应break;在每个末尾写case(此处:设置状态并提示相应的消息)。

如果您想以不同的方式处理其他回发,您可以在break;语句之后添加案例并执行其他操作。

希望这可以帮助!

于 2016-07-27T08:52:37.510 回答
2

回发不会自动将您的对话从一种状态转换到另一种状态,您必须自己编写该逻辑。幸运的是,您使用的 smooch-bot-example 已经在此处定义了一个回发处理程序:

https://github.com/smooch/smooch-bot-example/blob/30d2fc6/heroku/index.js#L115

所以无论你想要什么转换逻辑都应该放在那里。您可以通过创建 stateMachine 并以与 handleMessages()已经工作receiveMessage()的相同方式调用它来做到这一点。例如:

const stateMachine = new StateMachine({
    script,
    bot: createBot(req.body.appUser)
});

stateMachine.receiveMessage({
    text: 'whatever your script expects'
})

或者,如果您想让回发的行为与常规文本响应不同,您可以单独调用handlePostback实现。stateMachine.setState(state)stateMachine.prompt(state)

于 2016-07-25T15:22:15.470 回答
0

如果您想基于回发推进对话,您必须首先从机器人的提示中输出按钮(以便您可以处理接收中的按钮单击),修改 中的handlePostback功能index.js,然后处理用户的“回复”你的接收方法 - 试试这个 -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'
},

然后修改handlePostback函数index.js,使其将回发视为常规消息:

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 并像回复一样处理。

于 2016-08-24T19:21:01.807 回答