Smooch: How to do postback dependent state transition?

后端 未结 3 950
挽巷
挽巷 2021-01-20 19:42

I am trying to transition the script from one state to another based on Smooch postback payloads; but getting error code H12.

Consider the example https://github.com

3条回答
  •  离开以前
    2021-01-20 19:55

    I got the same issue with the [object Object] instead of a string. This is because the state you get or set with a function is contained in an object, not a string... I fixed it with this code inside index.js, replacing the existing handlePostback function in the smooch-bot-example GitHub repo:

    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());
    };
    }
    

    Then inside script.js all you need to do is define states corresponding to the exact postback payloads. If you have multiple postbacks that should take the user to other states, just add them to the case list like so :

    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;
    

    Note that you should not write break; at the end of each case if the outcome you want is the same (here : setting the state and prompting the corresponding message).

    If you want to handle other postbacks differently, you can add cases after the break; statement and do other stuff instead.

    Hope this helps!

提交回复
热议问题