1

ここから@dstoikoの回答に従っています

API をADD_MOVIEブロックで呼び出しており、ペイロードを使用してポストバックに値を渡したい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_TO_FIREBASE ブロックで条件付きコードを実行できるように、ペイロード ADD_MOVIE を使用してパラメーターをポストバックに渡すにはどうすればよいですか?

4

1 に答える 1

2

Q0:はスタイルの問題です。ここで決定的な答えはありません。言い換えれば、これはこの種の議論のための間違ったフォーラムです:) https://stackoverflow.com/help/how-to-ask

Q1:はい、DB クエリを作成して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: 2 つの選択肢があります。

オプション 1:映画 ID をポストバック ペイロードに追加します (例:ADD_TO_FIREBASE.movieid1などADD_TO_FIREBASE.movieid2)。

これを行った場合、ポストバック ペイロードからムービー ID を解析する独自の動作をhandlePostback内で定義する必要があります。

また、状態 amchine をADD_TO_FIREBASE自分で目的の状態に遷移させる必要があります。たとえば、カスタムhandlePostbackメソッドから次のようにします。

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

オプション 2:使用%[foo](postback:bar)しているメッセージは、実際には簡略化された構文です。ポストバック メッセージの実際の内部動作は、 Smooch API に直接送信できるアクション ボタンです。アクション ボタンでは、オブジェクトを指定することもできますmetadata。組み込みの を使用する代わりにbot.say、API にメッセージを直接投稿し、アクション メタデータ内にムービー ID を保存することができます。handlePostbackオプション 1 で行ったように、カスタムを介してこのメ​​タデータから選択した movieId を再度取得する必要があります。

于 2016-08-25T18:18:49.317 に答える