ask-sdkをもっと手軽に使いたかったので、ask-utilsというライブラリを作りました

いろいろ触っていると、汎用的に使いたい処理が増えてきましたので、パッケージ化してみました。

やりたかったこと

ask-sdkの場合、以下の例のようにhandlerを実行するか否かをcanHandle()で判定します。

const HelpIntentHandler = {
  canHandle (handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
      handlerInput.requestEnvelope.request.intent.name === 'AMAZON.HelpIntent'
  },
  handle (handlerInput) {
    const speechText = 'This is example skill'

    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .withSimpleCard(SKILL_NAME, speechText)
      .getResponse()
  }
}

これはわかりやすくていいなと思うのですが、どうもreturn handlerInput.requestEnvelope.request.type === 'IntentRequest' && handlerInput.requestEnvelope.request.intent.name === 'AMAZON.HelpIntent'という書き方が冗長でやだなぁと思っていました。

どのHandlerも似たような分岐をかけるので、「じゃあラッパー的な関数作って処理しちゃえばよくね?」ということで作ってみました。

作ったもの

ask-utilsという割と直球な名前です。自分がスキルを作るときに必要になったものをガンガンここに追加していきたいなと思います。

インストール方法

npmで公開済みなので、npm i -S ask-utilsでインストールできます。

GitHubに開発版を置いていますので、そちらも使えます。が、さすがに開発版の動作保証まではできないので、自己責任でお願いします。

ask-utilsでできること

さっきのコードサンプルがこう変わります。

const { intentHandlers } = require('ask-utils')

const HelpIntentHandler = {
  canHandle (handlerInput) {
    return intentHandlers.canHandle(handlerInput, 'IntentRequest', 'AMAZON.HelpIntent')
  },
  handle (handlerInput) {
    const speechText = 'This is example skill'

    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .withSimpleCard(SKILL_NAME, speechText)
      .getResponse()
  }
}

canHandle()がだいぶスッキリしました。intentHandlers.canHandle(handlerInput, REQUEST_TYPE, INTENT_NAME)と書くことで、リクエストタイプとインテント名が一致しているかどうかを判定してくれます。

LaunchRequestSessionEndedRequestなどIntentRequest以外のリクエストタイプの場合は第三引数を省略すればOKです。

const SessionEndedRequestHandler = {
  canHandle (handlerInput) {
    return intentHandlers.canHandle(handlerInput, 'SessionEndedRequest')
  },
  handle (handlerInput) {
    console.log(`Session ended with reason: ${handlerInput.requestEnvelope.request.reason}`)

    return handlerInput.responseBuilder.getResponse()
  }
}

そのほか

「Alexaからのレスポンスは、ランダムにしてやったほうが会話っぽくていいよ(意訳)」な記事がAmazonに出ていましたので、これもラッパー化しておきました。

One way to add variety to your skill is have your skill choose a random word or phrase from a list of welcome greetings, re-prompts, confirmations, etc. For example, think of the many different ways Alexa can say “Hello” (think: “howdy”, “hi”, “good day”), or the many ways Alexa can say “OK” (think: “Got it,” “Thanks,” “Sounds good,” “Great,” and so on). You can use these opportunities to inject variety, color, and humor to your skill. You can even prepare clever responses to customers’ requests for features your skill doesn’t yet support.

Alexa Skill Recipe: Randomize Your Responses to Add Variety to Your Skill

コードサンプル

const { randomResponse } = require('ask-utils')
const errorMessages = [
  'すみません、よく聞き取れませんでした。もう一度お願いします。',
  'すみません、よく聞き取れませんでした。',
  '上手に聞き取れなくてすみません。もう一度言ってもらえますか?',
  'ごめんなさい。もう一度言ってもらえると助かります。'
]

const ErrorHandler = {
  canHandle () {
    return true
  },
  handle (handlerInput, error) {
    console.log(`Error handled: ${error.message}`)
    const message = randomResponse.getRandomMessage(errorMessages)
    return handlerInput.responseBuilder
      .speak(message)
      .reprompt(message)
      .getResponse()
  }
}

バグ・不具合報告など

GitHubのIssueを立ててもらえると助かります。Pull Requestでもらえるとめちゃ喜びますので、「この機能もほしい!」などもくださいませm(_ _)m

[PR]WordPressの入門書共著しました

ローカル環境の構築からテーマ作成・サイトの運営やコミュニティの紹介など、
「WordPressを触って終わり」ではなく、仕事でできるようになるには何が必要かがわかるようになる内容になっています。


(目次)
Lesson01:WordPressをはじめよう
Lesson02:必要な環境を整えインストールする
Lesson03:初期設定をしよう
Lesson04:コンテンツの追加・編集とナビゲーションの設定
Lesson05:テーマとプラグインによる外観カスタマイズ
Lesson06:プラグインによる機能の追加
Lesson07:ローカル開発環境をつくろう
Lesson08:テーマ作成の第一歩〜PHPとテーマの基礎
Lesson09:テンプレートファイルの作成
Lesson10:各種テンプレートファイルの作成
Lesson11:テーマカスタマイザーの実装
Lesson12:WordPressを本番環境へデプロイする
Lesson13:サイトの広報と集客
Lesson14:サイトの運営と管理
Lesson15:もっとWordPressを使いこなす・学ぶ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です