リマインダの登録

# 概要
Alexaスキルで、リマインダの登録を行うサンプルスキルです。
（リマインダ情報の取得や削除はなしです）
https://developer.amazon.com/ja/docs/smapi/alexa-reminders-overview.html

# 内容

ライブラリ

```bash
$ npm ls --depth=0
├── ask-sdk@2.4.0
├── ask-sdk-core@2.4.0
├── ask-sdk-model@1.12.0
└── ask-utils@1.3.0
```


index.js前半

```js

const Alexa = require('ask-sdk-core');
const { getRandomMessage, isLaunchRequest, isMatchedIntent } = require('ask-utils');
const { ReminderRequest } = require('ask-sdk-model');

const SetReminderHandler = {
  canHandle(handlerInput) {
    return isLaunchRequest(handlerInput)
      || isMatchedIntent(handlerInput, 'SetReminderIntent')
  },
  async handle(handlerInput) {
    const { serviceClientFactory, responseBuilder } = handlerInput;

    const speechText = '1分後にリマインダーをセットしました。';
    const client = serviceClientFactory.getReminderManagementServiceClient();

    const request = {
      trigger: {
        type: "SCHEDULED_RELATIVE",
        offsetInSeconds: '60'
      },
      alertInfo: {
        spokenInfo: {
          content: [{
            locale: "ja-JP",
            text: "リマインダーのテストです"
          }]
        }
      },
      pushNotification: {
        status: "DISABLED"
      }
    };

    try {
      const response = await client.createReminder(request);
      return responseBuilder
        .speak(speechText)
        .getResponse();
    } catch (error) {
      console.log(error);
      return responseBuilder
        .speak("すいません、エラーが発生しました")
        .getResponse();
    }
  }
};

```

`handlerInput.serviceClientFactory.getReminderManagementServiceClient()` でリマインダー用のクライアントを取得します。

[client#method](https://ask-sdk-for-nodejs.readthedocs.io/en/latest/Calling-Alexa-Service-APIs.html#remindermanagementserviceclient)
[request](https://developer.amazon.com/ja/docs/smapi/alexa-reminders-api-reference.html
)

clientに実装されているメソッド一覧とrequestを参考にAPIを叩きます。

メソッド一覧

```
class ReminderManagementServiceClient extends BaseServiceClient {
  deleteReminder(alertToken: string): Promise<void>;
  getReminder(alertToken: string): Promise<services.reminderManagement.GetReminderResponse>;
  updateReminder(alertToken: string, reminderRequest: services.reminderManagement.ReminderRequest): Promise<services.reminderManagement.ReminderResponse>;
  deleteReminders(): Promise<void>;
  getReminders(): Promise<services.reminderManagement.GetRemindersResponse>;
  createReminder(reminderRequest: services.reminderManagement.ReminderRequest): Promise<services.reminderManagement.ReminderResponse>;
}
```

---

index.js後半

```
const skillBuilder = Alexa.SkillBuilders.custom();

exports.handler = skillBuilder
  .addRequestHandlers(
    SetReminderHandler,
    HelpHandler,
    ExitHandler,
    FallbackHandler,
    SessionEndedRequestHandler
  )
  .addErrorHandlers(ErrorHandler)
  .withApiClient(new Alexa.DefaultApiClient())
  .lambda();

```

`.withApiClient(new Alexa.DefaultApiClient())` が重要です。
これで`handlerInput`でリマインダークライアントを取得できるようになります。
`accessToken`もセットされているので便利です。

https://ask-sdk-for-nodejs.readthedocs.io/en/latest/Configuring-Skill-Instance.html#customskillbuilder

---

skill.json

```json
  "manifest": {
    "permissions": [
      {
        "name": "alexa::alerts:reminders:skill:readwrite"
      }
    ],
...
```
スキルのpermissionも追加する必要があります。

以上が、起動すると１分後にリマインダーがセットされるサンプルアプリになります。


# ハマりポイント

- 実機以外はユーザーに対してのpermissionの許可ができないためだめそう
    - iphoneのAlexaアプリやAlexa Developer Consoleのシュミレータや `ask simulate` コマンドではうまくいかなかった
- `skillBuilder.withApiClient()`の設定が必要
- `apiAccessToken`は一度のみ利用可能
  - ひとつのIntentのなかで、 リマインダー一覧を取得して、空が返ってきたら登録するなどのように、同じ`apiAccessToken`で２回叩くとダメなようです。


# 一言
https://developer.amazon.com/ja/docs/smapi/alexa-reminders-api-reference.html#subscribe-to-reminder-events

イベントのサブスクリプションという機能もあるようなのでここも気になる :eyes: