ask-sdk V2 になってたのでまとめた

***ごめんなさ、いろいろと間違ってたり古かったりしたので修正します。***

ask sdkがv2になっていたので、githubに乗っていたのを自分用にまとめる。
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/wiki

# とりあえずインストール

```
$ mkdir SampleV2
$ cd SampleV2
$ npm init
$ npm install --save ask-sdk
```

# とりあえずLounchRequestの処理まで
`LaunchRequest`とは、特別なインテントなしでスキル名を呼ばれたときに発動される処理

```
$ vi index.js
```

```js
'use strict';

const Alexa = require('ask-sdk');

const LaunchRequestHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
  },
  handle(handlerInput) {
    const speechText = 'こんにちわー';

    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .withSimpleCard('これはカード', speechText)
      .getResponse();
  }
};

// LaunchRequestHnadlerより後に書く必要あり
exports.handler = Alexa.SkillBuilders.standard()
  .addRequestHandlers(LaunchRequestHandler)
  .lambda();
```

とりあえず、これで起動名を呼べば返答がくる

```
俺：「アレクサ、○○を開いて」
アレクサ：「こんにちわー」
...会話は続く...
```

# 自分で定義したインテントを設定する

以下を追加
`sampleIntent`が自分で定義したインテント名

```js
const sampleIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'sampleIntent';
    },
    handle(handlerInput) {
        const speechText = 'これは自分で設定したインテントです';

        return handlerInput.responseBuilder
            .speak(speechText)
            .withSimpleCard('自分で設定したインテントのカード', speechText)
            .getResponse();
    }
};
```

以下を修正

```js
exports.handler = Alexa.SkillBuilders.standard()
  .addRequestHandlers(LaunchRequestHandler, sampleIntentHandler) // sampleIntentHandlerを追加
  .lambda();
```

に修正。`sampleIntentHandler`を追加しただけ

# エラー処理(unhandled)

v1での`unhandled`の代わりのやつ
以下を追加

```js
const ErrorHandler = {
    canHandle() {
        return true;
    },
    handle(handlerInput, error) {
        return handlerInput.responseBuilder
            .speak('もう一度おねがい（ハート）')
            .getResponse();
    },
};
```

以下を修正

```js
exports.handler = Alexa.SkillBuilders.standard()
  .addRequestHandlers(LaunchRequestHandler, sampleIntentHandler)
  .addErrorHandlers(ErrorHandler) // これを追加
  .lambda();
```
# sessionの保持
v1の時に`this.attributes["sample"];`とかってやってたやつ

## 保存

```js
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
sessionAttributes.sample = 'sampleは保存したい名前';
```

## 取得

```js
const attributesManager = handlerInput.attributesManager;
const sessionAttributes = attributesManager.getSessionAttributes();
console.log(sessionAttributes.sample); //sampleは保存したい名前
```

# dynamodbに保存

以下を追加

```js
let skill;
exports.handler = async function (event, context) {
    if (!skill) {
      skill = Alexa.SkillBuilders.standard() // <= standard()
        .addRequestHandlers(
            LaunchRequestHandler)
        .withTableName("sampleTableName") // これを追加（テーブル名）
        .withAutoCreateTable(true) //テーブル作成もスキルから行う場合は、これも追加
        .create();
    }
    return skill.invoke(event);
}
```


```js
const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
    },
    async handle(handlerInput) {
        // 取得。awaitで取得するまで待つ
        var attributes = await handlerInput.attributesManager.getPersistentAttributes()
        
        // 保存。awaitで保存できるまで待つ
        // attributes = {
        //   "key": "value"
        // }
        handlerInput.attributesManager.setPersistentAttributes(attributes); // セット
        await handlerInput.attributesManager.savePersistentAttributes(); // 保存
        var msg = "お返事";
        return handlerInput.responseBuilder.speak(msg).reprompt(msg).getResponse();
    }
};
```