Alexa Skill開発でよく使いそうな関数をまとめたnpmモジュールを作った

Echo Showが発売され、音声と画面の合わせ技でより多くの表現が広まりつつある、Amazon Alexaの世界。
日本でも「NOID」と言ったノンプログラミングの開発ツールも出揃い、1年ほど前に日本でのAlexaサービス開始時に比べ、開発しやすい環境になってきたかと思います。
一方で、複雑なスキルを考えた時にノンプログラミングでは対応できる範囲に限界があります。そう言った時は、実際にコーディングをしてということになりますが、UserIdの取得であったり画面サポートの判定であったり、正直なところ「ask-sdk」のヘルパー関数を呼んで、何かを生成して、レスポンスに含めて戻すような部分が多く面倒に感じることが若干あります。
そんな背景もあり、個人的に面倒に感じた部分を使いやすくask-sdkの機能をラッパーしたモジュールを作ってみました。
地味に最近リリースされた、LocationAPIの検知もサポートしました。

#katana-alexa-utility
できることは大きく分けて5つです。

- デバイス情報の取得
    - UserIDの取得機能や画面インターフェースの判定機能など 
- インテントスロットの取得
    - リクエストされたインテントに含まれるスロットの値を取得する機能
- DynamoDBの操作
    - DynamoDBへのデータ保存、取得
- APIの同期リクエスト
    - 指定したURLへの同期リクエストを行います
- テンプレートの生成
    - 表示したい文字列や画像のURLを渡すだけで、テンプレートの生成を行えます。

基本的に、Alexaスキルを当たり前に開発してる方からすると、普段から実装してるよー！のような簡単なものになってます。
APLが出た今、Templateの需要がどこまであるかわからないですが、Templateはとにかく作りやすくなってる。。。はず。。。です。。。

##Installation
npmからどうぞ！

```
npm install --save katana-alexa-utility
```
## Deviceデータを取得する
### ApplicationIdを取得する
```ApplicsationId.js
const Katana = require('katana-alexa-utility')
let appId = Katana.device.getApplicationId(handlerInput);
```

### UserIdを取得する
```UserId.js
const Katana = require('katana-alexa-utility')
let userId = Katana.device.getUserId(handlerInput);
```

### DeviceIdを取得する
```DeviceId.js
const Katana = require('katana-alexa-utility')
let deviceId = Katana.device.getDeviceId(handlerInput);
```

### ディスプレイの有無を判定する
```IsDisplay.js
const Katana = require('katana-alexa-utility')
let isDisplay = Katana.device.getDeviceId(handlerInput);
```

### シェイプタイプを取得する
```shapeType.js
const Katana = require('katana-alexa-utility')
let shapeType = Katana.device.getDeviceId(handlerInput);
```

### スクリーンサイズを取得する
**戻り値：[w , h]**

```screenSize.js
const Katana = require('katana-alexa-utility')
let screenSize = Katana.device.getScreenSize(handlerInput);
```

### Locationインターフェースの有無を判定する
```isGeolocation.js
const Katana = require('katana-alexa-utility')
let isGeolocation = Katana.device.getGeolocation(handlerInput);
```

### GeolocationDataを取得する
```Geolocation.js
const Katana = require('katana-alexa-utility')
let geolocData = Katana.device.getGeolocation(handlerInput);
```

## API同期リクエストを行う
※ awaitで必ず実行すること

```Syncrequest.js
const Katana = require('katana-alexa-utility')
let result = await Katana.syncAPI.request('request url');
```

## インテントスロットの値を取得する
```IntentSlot.js
const Katana = require('katana-alexa-utility')
let value = Katana.slot.getSlotValue(handlerInput , 'slot name');
```

## DynamoDBのデータを取得、セーブをする
```dynamodb.js
const Katana = require('katana-alexa-utility')
let dynamoDBData = Katana.dynamodb.getData(handlerInput)
await util.dynamodb.saveData(handlerInput , saveData)
```

##テンプレートを生成する
テキスト使うにしても、画像を使うにしても、ask-sdkに用意されたヘルパー関数を一回介さないといけなく、画面対応のスキルを作れるようになったとは言っても面倒なことが多かったと思います。
なので、公式のヘルパー関数をラッパーしてより使いやすくならないかなーと思いつつ実装してみています。画面付きデバイスであるか、DisplayInterfaceが含まれているかを元に判別する必要がありますが、その判別も中で行っているので基本的には出したいコンテンツをkatana-alexa-utilityに渡せばOKです。

```bodytype.js
const Katana = require('katana-alexa-utility')
//トークンの指定    
Katana.template.bodyType.setToken('TOKEN');
//バックボタンの指定 true...visible false...hidden
Katana.template.bodyType.setBackBtnIsVisible(true)
//タイトルの指定
Katana.template.bodyType.setTitle(displayTitle);
//背景の画像ソースの指定
Katana.template.bodyType.setBackgroundImgSrc('Image url');
//Body内部で使用する画像のソース指定
Katana.template.bodyType.setImgSrc('Image url');
//Body内部で使用するテキストの指定
//各項目は指定されていない場合は、空文字がデフォルト値です
Katana.template.bodyType.setText(primaryText , secondaryText , tertiaryText);
//画面下部に表示されるヒントメッセージの指定
//Body template 3 のみで有効
Katana.template.bodyType.setHintMsg('Hint text');
//Body templateを生成します
//画面付きであるかの判別もするので、Echo dotなどのデバイスでそのまま実行しても問題ありません
Katana.template.bodyType.create(handlerInput , 'Body template id')
```

```listtype.js
const Katana = require('katana-alexa-utility')
//トークンの指定
Katana.template.listType.setToken('TOKEN');
//バックボタンの指定 true...visible false...hidden
Katana.template.listType.setBackBtnIsVisible(true)
//タイトルの指定
Katana.template.listType.setTitle(displayTitle);
//背景の画像ソースの指定
Katana.template.listType.setBackgroundImgSrc('Image url');
//List Itemをセットします
//TokenId , List表示用画像のソース,Listで表示するテキストをセットする
//ループなどで回して使う前提です
Katana.template.listType.addListItem(tokenId , imgSrc , primaryText , secondaryText , tertiaryText);
//List templateを生成します
//画面付きであるかの判別もするので、Echo dotなどのデバイスでそのまま実行しても問題ありません
Katana.template.listType.create(handlerInput , 'List template id');
```