2016-07-25 6 views
3

私はSmoochポストバックペイロードに基づいてスクリプトをある状態から別の状態に移行しようとしています。エラーコードH12を取得しています。Smooch:ポストバック依存状態遷移を行う方法?

https://github.com/smooch/smooch-bot-example

例を考えてみましょう

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' 
}, 

を次のように私は意図はのボットの状態がポストバックペイロードに応じて、移行だろうということですスクリプトhttps://github.com/smooch/smooch-bot-example/blob/master/script.jsを変更すると言います。

質問:どうすればいいですか?

私のアプローチは投げたこと、しかしgithub.com/smooch/smooch-bot-example/blob/master/heroku/index.js

のhandlePostback方法に

stateMachine.setState(postback.action.payload) 

を追加しましたエラーコードH12。私も実験しました

stateMachine.transition(postback.action,postback.action.payload) 

いいえ、利用できません。

答えて

1

ポストバックは会話をある州から次の州に自動的に移行することはありません。あなた自身でそのロジックを書く必要があります。幸いにも、あなたがすでに使用しているキス・ボットの例では、ここで定義されたポストバックハンドラを持っています

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

だから、あなたがそこに行く必要があり、好きな移行ロジック。これを行うには、stateMachineを作成し、handleMessages()already worksと同じ方法でを呼び出します。たとえば:あなたはあなたのポストバックが通常のテキスト応答から異なる動作を持っていると思った場合

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

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

また、あなたは、あなたのhandlePostback実装コールstateMachine.setState(state)と独立stateMachine.prompt(state)を持つことができます。

+0

返信いただきありがとうございます。私のOPで言及したように、私はこれがうまくいくと思っていたでしょう。なぜそれがしないのか分かりません。 smooch-botの例https://github.com/nbikar/smooch-bot-exampleをフォークし、https://postback-example1.herokuapp.com/にデプロイしました。ボットは状態遷移をしません。私は2つの変更を行ったhttps://github.com/nbikar/smooch-bot-example/blob/master/script.js#L18、https://github.com/nbikar/smooch-bot-example/blob/master /heroku/index.js#L118。ありがとうございます。 – sera

+0

ポストバックレスポンスを、「はい」または「いいえ」と言っているユーザーメッセージであるかのように扱っているようですが、script.jsにはこれらのレスポンスを処理するものは何もありません。 –

+0

script.js( "start"、 "bye"、 "askName" ..)の状態の名前は、ユーザーの応答とは関係がないことに注意してください。メッセージまたはポストバックイベントを自分で処理し、状態の遷移方法を定義する必要があります。たとえば、askNameハンドラは、ここで文字列 "finish"で解決することで終了することができます:https://github.com/nbikar/smooch-bot-example/blob/master/script.js#L35 stateMachineを使用することもできます。私の答えに示唆したようにsetState。 –

4

文字列ではなく[オブジェクトオブジェクト]で同じ問題が発生しました。 stateを取得または関数で設定がオブジェクトに含まれているので、これは文字列ではありません、です...私はsmooch-bot-example GitHubのレポでは、既存のhandlePostback機能を置き換え、index.jsの内側にこのコードでそれを固定:

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の終わりにbreak;を書くべきではないと

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;ステートメントの後にケースを追加して、代わりに他の処理を行うことができます。

希望すると便利です。

+0

これは非常に便利です。ありがとう。これは私のハックよりはるかに優れています。 – sera

+0

問題ありません!最初はやや不安ですが、このオブジェクトと文字列の問題を解決するためにhandleMessage関数からインスピレーションを受けました...あなたが役に立つと思うなら、アップしてください;-) – dstoiko

+0

私はあなたの正しい答えを私のレポに入れましたこれを実装している[Working github repo](https://github.com/nbikar/smooch-bot-example) – sera

0

ポストバックに基づいて会話を進めたい場合は、最初にボットのプロンプトからボタンを出力する必要があります(受信でボタンのクリックを処理できるように)の機能をindex.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.jshandlePostback機能を変更します:

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(); 
     }); 
} 
を - これを試してみてください - そうのような script.jsを変更し、ユーザーのあなたの受信方法に「返信」

ユーザーがあなたのボタンをクリックすると、stateMachineにプッシュされ、返信のように処理されます。

関連する問題