Alexa スキル開発で外部Json定義からIntentHandlerを生成する。

やりたいこと、

  1. WordPressから発話を更新
  2. Lambda関数にJsonを自動デプロイ
  3. Lambda関数ではJsonデータを読み込みそれからIntenteHandlerを生成

今回はの3の部分をメモ。

データのJson

{
    "CheckOutIntent": {
        "speechText":"チェックアウトは11:00です。"
    },
    "WifiIntent": {
        "speechText":"SSIDはn,a,m,u,r,a,です。パスワードは、g,u,e,s,tです。"
    }
}

汎用的にIntenteHandlerを生成する関数類を準備

var isCanIntentName = function(handlerInput,name){
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
        && handlerInput.requestEnvelope.request.intent.name === name;
};

var simpleResponce = function(handlerInput,speechText,repromptText){
    if(typeof repromptText == 'undefined'){
        return handlerInput.responseBuilder
            .speak(speechText)
            .getResponse();
    }else{
        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(repromptText)
            .getResponse();
    }
};

var makeSimpleHnaler = function(intentName,speechText,repromptText){
    return {
        canHandle(handlerInput) {
            return isCanIntentName(handlerInput,intentName);
        },
        handle(handlerInput) {
            return simpleResponce(handlerInput, speechText,repromptText);
        }
    };
};

メイン処理

 //データ読み込み
var data = require('./data.json'); 

//builderにわたすインテントを入れる配列 : 優先の高いLaunchRequestHandler入れておく。
var intents = [
    LaunchRequestHandler
];

//dataをループにしてintentsにpush()する。
_.each(data,(intent,key)=>{
    let i = makeSimpleHnaler(key,intent.speechText);
    intents.push(i);
});

//優先度の低いEnd,SessionEnded,Errorなどのハンドラー追加
intents = [...intents,EndHandler, SessionEndedRequestHandler, ErrorHandler];

//builderにわたす
exports.handler = Alexa.SkillBuilders.standard()
    .addRequestHandlers(...intents)
    .lambda();