├── .ask └── config ├── .github └── PULL_REQUEST_TEMPLATE.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.txt ├── README.md ├── hooks ├── post_new_hook.ps1 ├── post_new_hook.sh ├── pre_deploy_hook.ps1 └── pre_deploy_hook.sh ├── instructions ├── cli.md ├── create-alexa-hosted-function.md ├── create-aws-hosted-function.md ├── customize-skill-content.md ├── setup-vui-alexa-hosted.md ├── setup-vui-aws-hosted.md ├── submit-for-certification.md └── test-using-simulator.md ├── lambda └── custom │ ├── index.js │ ├── package.json │ └── recipes.js ├── models ├── de-DE.json ├── en-GB.json └── en-US.json └── skill.json /.ask/config: -------------------------------------------------------------------------------- 1 | { 2 | "deploy_settings": { 3 | "default": { 4 | "skill_id": "", 5 | "was_cloned": false, 6 | "merge": {} 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | *Issue #, if available:* 2 | 3 | *Description of changes:* 4 | 5 | 6 | By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. 7 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check [existing open](https://github.com/alexa/skill-sample-nodejs-quiz-game/issues), or [recently closed](https://github.com/alexa/skill-sample-nodejs-quiz-game/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *master* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Fork the repository. 33 | 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 34 | 3. Ensure local tests pass. 35 | 4. Commit to your fork using clear commit messages. 36 | 5. Send us a pull request, answering any default questions in the pull request interface. 37 | 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 38 | 39 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 40 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 41 | 42 | 43 | ## Finding contributions to work on 44 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels ((enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any ['help wanted'](https://github.com/alexa/skill-sample-nodejs-quiz-game/labels/help%20wanted) issues is a great place to start. 45 | 46 | 47 | ## Code of Conduct 48 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 49 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 50 | opensource-codeofconduct@amazon.com with any additional questions or comments. 51 | 52 | 53 | ## Security issue notifications 54 | If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. 55 | 56 | 57 | ## Licensing 58 | 59 | See the [LICENSE](https://github.com/alexa/skill-sample-nodejs-quiz-game/blob/master/LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. 60 | 61 | We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. 62 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | This tutorial will walk first-time Alexa skills developers through all the required steps involved in creating a skill using a template called ‘Minecraft Helper’. Ask how to craft an item in the game Minecraft, and this skill will give you instructions. 5 | 6 | ## Skill Architecture 7 | Each skill consists of two basic parts, a front end and a back end. 8 | The front end is the voice interface, or VUI. 9 | The voice interface is configured through the voice interaction model. 10 | The back end is where the logic of your skill resides. 11 | 12 | ## Three Options for Skill Setup 13 | There are a number of different ways for you to setup your skill, depending on your experience and what tools you have available. 14 | 15 | * If this is your first skill, choose the [Alexa-Hosted backend instructions](./instructions/setup-vui-alexa-hosted.md) to get started quickly. 16 | * If you want to manage the backend resources in your own AWS account, you can follow the [AWS-Hosted instructions](./instructions/setup-vui-aws-hosted.md). 17 | * Developers with the ASK Command Line Interface configured may follow the [ASK CLI instructions](./instructions/cli.md). 18 | 19 | --- 20 | 21 | ## Additional Resources 22 | 23 | ### Community 24 | * [Amazon Developer Forums](https://forums.developer.amazon.com/spaces/165/index.html) - Join the conversation! 25 | * [Hackster.io](https://www.hackster.io/amazon-alexa) - See what others are building with Alexa. 26 | 27 | ### Tutorials & Guides 28 | * [Voice Design Guide](https://developer.amazon.com/designing-for-voice/) - A great resource for learning conversational and voice user interface design. 29 | * [Codecademy: Learn Alexa](https://www.codecademy.com/learn/learn-alexa) - Learn how to build an Alexa Skill from within your browser with this beginner friendly tutorial on Codecademy! 30 | 31 | ### Documentation 32 | * [Alexa Skills Kit SDK for Node.js](https://alexa.design/node-sdk-docs) 33 | * [Alexa Skills Kit Documentation](https://developer.amazon.com/docs/ask-overviews/build-skills-with-the-alexa-skills-kit.html) 34 | 35 | -------------------------------------------------------------------------------- /hooks/post_new_hook.ps1: -------------------------------------------------------------------------------- 1 | # Powershell script for ask-cli post-new hook for Node.js 2 | # Script Usage: post_new_hook.ps1 3 | 4 | # SKILL_NAME is the preformatted name passed from the CLI, after removing special characters. 5 | # DO_DEBUG is boolean value for debug logging 6 | 7 | # Run this script one level outside of the skill root folder 8 | 9 | # The script does the following: 10 | # - Run "npm install" in each sourceDir in skill.json 11 | 12 | param( 13 | [string] $SKILL_NAME, 14 | [bool] $DO_DEBUG = $False 15 | ) 16 | 17 | if ($DO_DEBUG) { 18 | Write-Output "###########################" 19 | Write-Output "###### post-new hook ######" 20 | Write-Output "###########################" 21 | } 22 | 23 | function install_dependencies ($CWD, $SOURCE_DIR) { 24 | $INSTALL_PATH = $SKILL_NAME + "\" +$SOURCE_DIR 25 | Set-Location $INSTALL_PATH 26 | Invoke-Expression "npm install" 2>&1 | Out-Null 27 | $EXEC_RESULT = $? 28 | Set-Location $CWD 29 | return $EXEC_RESULT 30 | } 31 | 32 | $SKILL_FILE_PATH = $SKILL_NAME + "\skill.json" 33 | $ALL_SOURCE_DIRS = Get-Content -Path $SKILL_FILE_PATH | select-string -Pattern "sourceDir" -CaseSensitive 34 | Foreach ($SOURCE_DIR in $ALL_SOURCE_DIRS) { 35 | $FILTER_SOURCE_DIR = $SOURCE_DIR -replace "`"", "" -replace "\s", "" -replace ",","" -replace "sourceDir:", "" 36 | $CWD = (Get-Location).Path 37 | if (install_dependencies $CWD $FILTER_SOURCE_DIR) { 38 | if ($DO_DEBUG) { 39 | Write-Output "Codebase ($FILTER_SOURCE_DIR) built successfully." 40 | } 41 | } else { 42 | if ($DO_DEBUG) { 43 | Write-Output "There was a problem installing dependencies for ($FILTER_SOURCE_DIR)." 44 | } 45 | exit 1 46 | } 47 | } 48 | 49 | if ($DO_DEBUG) { 50 | Write-Output "###########################" 51 | } 52 | 53 | exit 0 54 | -------------------------------------------------------------------------------- /hooks/post_new_hook.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Shell script for ask-cli post-new hook for Node.js 3 | # Script Usage: post_new_hook.sh 4 | 5 | # SKILL_NAME is the preformatted name passed from the CLI, after removing special characters. 6 | # DO_DEBUG is boolean value for debug logging 7 | 8 | # Run this script one level outside of the skill root folder 9 | 10 | # The script does the following: 11 | # - Run "npm install" in each sourceDir in skill.json 12 | 13 | SKILL_NAME=$1 14 | DO_DEBUG=${2:-false} 15 | 16 | if [ $DO_DEBUG == false ] 17 | then 18 | exec > /dev/null 2>&1 19 | fi 20 | 21 | install_dependencies() { 22 | npm install --prefix "$SKILL_NAME/$1" >/dev/null 2>&1 23 | return $? 24 | } 25 | 26 | echo "###########################" 27 | echo "###### post-new hook ######" 28 | echo "###########################" 29 | 30 | grep "sourceDir" $SKILL_NAME/skill.json | cut -d: -f2 | sed 's/"//g' | sed 's/,//g' | while read -r SOURCE_DIR; do 31 | if install_dependencies $SOURCE_DIR; then 32 | echo "Codebase ($SOURCE_DIR) built successfully." 33 | else 34 | echo "There was a problem installing dependencies for ($SOURCE_DIR)." 35 | exit 1 36 | fi 37 | done 38 | echo "###########################" 39 | 40 | exit 0 41 | 42 | -------------------------------------------------------------------------------- /hooks/pre_deploy_hook.ps1: -------------------------------------------------------------------------------- 1 | # Powershell script for ask-cli pre-deploy hook for Node.js 2 | # Script Usage: pre_deploy_hook.ps1 3 | 4 | # SKILL_NAME is the preformatted name passed from the CLI, after removing special characters. 5 | # DO_DEBUG is boolean value for debug logging 6 | # TARGET is the deploy TARGET provided to the CLI. (eg: all, skill, lambda etc.) 7 | 8 | # Run this script under the skill root folder 9 | 10 | # The script does the following: 11 | # - Run "npm install" in each sourceDir in skill.json 12 | 13 | param( 14 | [string] $SKILL_NAME, 15 | [bool] $DO_DEBUG = $False, 16 | [string] $TARGET = "all" 17 | ) 18 | 19 | function install_dependencies ($CWD, $SOURCE_DIR) { 20 | Set-Location $SOURCE_DIR 21 | Invoke-Expression "npm install" 2>&1 | Out-Null 22 | $EXEC_RESULT = $? 23 | Set-Location $CWD 24 | return $EXEC_RESULT 25 | } 26 | 27 | if ($DO_DEBUG) { 28 | Write-Output "###########################" 29 | Write-Output "##### pre-deploy hook #####" 30 | Write-Output "###########################" 31 | } 32 | 33 | if ($TARGET -eq "all" -Or $TARGET -eq "lambda") { 34 | $ALL_SOURCE_DIRS = Get-Content -Path "skill.json" | select-string -Pattern "sourceDir" -CaseSensitive 35 | Foreach ($SOURCE_DIR in $ALL_SOURCE_DIRS) { 36 | $FILTER_SOURCE_DIR = $SOURCE_DIR -replace "`"", "" -replace "\s", "" -replace ",","" -replace "sourceDir:", "" 37 | $CWD = (Get-Location).Path 38 | if (install_dependencies $CWD $FILTER_SOURCE_DIR) { 39 | if ($DO_DEBUG) { 40 | Write-Output "Codebase ($FILTER_SOURCE_DIR) built successfully." 41 | } 42 | } else { 43 | if ($DO_DEBUG) { 44 | Write-Output "There was a problem installing dependencies for ($FILTER_SOURCE_DIR)." 45 | } 46 | exit 1 47 | } 48 | } 49 | if ($DO_DEBUG) { 50 | Write-Output "###########################" 51 | } 52 | } 53 | 54 | exit 0 -------------------------------------------------------------------------------- /hooks/pre_deploy_hook.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Shell script for ask-cli pre-deploy hook for Node.js 3 | # Script Usage: pre_deploy_hook.sh 4 | 5 | # SKILL_NAME is the preformatted name passed from the CLI, after removing special characters. 6 | # DO_DEBUG is boolean value for debug logging 7 | # TARGET is the deploy TARGET provided to the CLI. (eg: all, skill, lambda etc.) 8 | 9 | # Run this script under skill root folder 10 | 11 | # The script does the following: 12 | # - Run "npm install" in each sourceDir in skill.json 13 | 14 | SKILL_NAME=$1 15 | DO_DEBUG=${2:-false} 16 | TARGET=${3:-"all"} 17 | 18 | if [ $DO_DEBUG == false ] 19 | then 20 | exec > /dev/null 2>&1 21 | fi 22 | 23 | install_dependencies() { 24 | npm install --prefix "$1" >/dev/null 2>&1 25 | return $? 26 | } 27 | 28 | echo "###########################" 29 | echo "##### pre-deploy hook #####" 30 | echo "###########################" 31 | 32 | if [[ $TARGET == "all" || $TARGET == "lambda" ]]; then 33 | grep "sourceDir" ./skill.json | cut -d: -f2 | sed 's/"//g' | sed 's/,//g' | while read -r SOURCE_DIR; do 34 | if install_dependencies $SOURCE_DIR; then 35 | echo "Codebase ($SOURCE_DIR) built successfully." 36 | else 37 | echo "There was a problem installing dependencies for ($SOURCE_DIR)." 38 | exit 1 39 | fi 40 | done 41 | echo "###########################" 42 | fi 43 | 44 | exit 0 45 | -------------------------------------------------------------------------------- /instructions/cli.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | ## Setup w/ ASK CLI 5 | 6 | ### About 7 | This readme assumes you have your developer environment ready to go and that you have some familiarity with CLI (Command Line Interface) Tools, [AWS](https://aws.amazon.com/), and the [ASK Developer Portal](https://developer.amazon.com/alexa-skills-kit?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Content&sc_detail=howto-nodejs-V2_CLI-1&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Content_howto-nodejs-V2_CLI-1_Convert_WW_beginnersdevs&sc_segment=beginnersdevs). If not, [click here](./setup-vui-alexa-hosted.md) for a more detailed walkthrough. 8 | 9 | ### Pre-requisites 10 | 11 | * Node.js (> v8) 12 | * Register for an [AWS Account](https://aws.amazon.com/) 13 | * Register for an [Amazon Developer Account](https://developer.amazon.com?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Content&sc_detail=howto-nodejs-V2_CLI-1&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Content_howto-nodejs-V2_CLI-1_Convert_WW_beginnersdevs&sc_segment=beginnersdevs) 14 | * Install and Setup [ASK CLI](https://developer.amazon.com/docs/smapi/quick-start-alexa-skills-kit-command-line-interface.html?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Content&sc_detail=howto-nodejs-V2_CLI-1&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Content_howto-nodejs-V2_CLI-1_Convert_WW_beginnersdevs&sc_segment=beginnersdevs) 15 | 16 | ### Installation 17 | 1. **Make sure** you are running the latest version of the CLI 18 | 19 | ```bash 20 | npm update -g ask-cli 21 | ``` 22 | 23 | 2. **Clone** the repository. 24 | 25 | ```bash 26 | ask new --url https://github.com/alexa/skill-sample-nodejs-howto.git --skill-name how-to 27 | ``` 28 | 29 | ### Deployment 30 | 31 | ASK CLI **will create the skill and the lambda function for you**. The Lambda function will be created in ```us-east-1 (Northern Virginia)``` by default. 32 | 33 | 1. Navigate to the project's root directory. you should see a file named 'skill.json' there. 34 | 2. Deploy the skill and the lambda function in one step by running the following command: 35 | 36 | ```bash 37 | ask deploy 38 | ``` 39 | 40 | ### Testing 41 | 42 | 1. To test, you need to login to Alexa Developer Console, and **enable the "Test" switch on your skill from the "Test" Tab**. 43 | 44 | 2. Simulate verbal interaction with your skill through the command line (this might take a few moments) using the following example: 45 | 46 | ```bash 47 | ask simulate -l en-GB -t "start minecraft helper" 48 | 49 | ✓ Simulation created for simulation id: 4a7a9ed8-94b2-40c0-b3bd-fb63d9887fa7 50 | ◡ Waiting for simulation response{ 51 | "status": "SUCCESSFUL", 52 | ... 53 | ``` 54 | 55 | 3. Once the "Test" switch is enabled, your skill can be tested on devices associated with the developer account as well. Speak to Alexa from any enabled device, from your browser at [echosim.io](https://echosim.io/welcome), or through your Amazon Mobile App and say : 56 | 57 | ```text 58 | Alexa, start minecraft helper 59 | ``` 60 | ## Customization 61 | 62 | 1. ```./skill.json``` 63 | 64 | Change the skill name, example phrase, icons, testing instructions etc ... 65 | 66 | Remember than many information are locale-specific and must be changed for each locale (en-GB and en-US) 67 | 68 | See the Skill [Manifest Documentation](https://developer.amazon.com/docs/smapi/skill-manifest.html?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_CLI-3&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_CLI-3_Convert_WW_beginnersdevs&sc_segment=beginnersdevs) for more information. 69 | 70 | 2. ```./lambda/custom/index.js``` 71 | 72 | Modify messages, and data from the source code to customize the skill. 73 | 74 | 3. ```./models/*.json``` 75 | 76 | Change the model definition to replace the invocation name and the sample phrase for each intent. Repeat the operation for each locale you are planning to support. 77 | 78 | 4. Remember to re-deploy your skill and lambda function for your changes to take effect. 79 | -------------------------------------------------------------------------------- /instructions/create-alexa-hosted-function.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | ### Deploying Skill Code 5 | 6 | In the [first step of this guide](./setup-vui-alexa-hosted.md), we built the Voice User Interface (VUI) for our Alexa skill. 7 | On this page, we will be exploring the Alexa-Hosted code editor, and deploying our code to enable testing. 8 | 9 | * *For details on what the Alexa-Hosted skills service provides, open [this page](https://developer.amazon.com/docs/hosted-skills/build-a-skill-end-to-end-using-an-alexa-hosted-skill.html) in a new tab.* 10 | 11 | 1. Within your skill, click to the Code tab at the top of the page. 12 | You should see folders and files within the left panel, and the **index.js** file opened in the main panel. This index.js file is the main code file for the skill. 13 | There is also a file called **package.json**. We will be updating both these files next. 14 | 15 | 1. Click into the index.js file, Select-All the code, and delete it. 16 | 17 | 1. Click back to the browser tab with the Github project, locate and open the file [/lambda/custom/index.js](../lambda/custom/index.js). 18 | 19 | 1. Click the "Raw" button just above the code, and Select-All and copy the code. Return to the Alexa skill console and paste this into the index.js file you had previously cleared. 20 | 21 | 1. Repeat these steps for the **package.json** file: Copy the contents of [/lambda/custom/package.json](../lambda/custom/package.json), and paste them over the package.json file in your skill. 22 | 23 | 1. Repeat these steps for the **recipes.js** file: Copy the contents of [/lambda/custom/recipes.js](../lambda/custom/recipes.js), and paste them over the recipes.js file in your skill. 24 | 25 | 1. Select the Save button, then select Deploy. This will deploy your code into a Lambda function that is automatically managed for you by the Alexa-Hosted service. 26 | 27 | 1. At the bottom left corner of the page, notice the link to **Logs: Amazon CloudWatch**. CloudWatch is the logging service. 28 | 29 | [![Next](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/buttons/button_next_testing._TTH_.png)](./test-using-simulator.md) 30 | 31 | -------------------------------------------------------------------------------- /instructions/create-aws-hosted-function.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | ## Setting Up A Lambda Function Using Amazon Web Services 5 | 6 | In the [first step of this guide](./setup-vui-aws-hosted.md), we built the Voice User Interface (VUI) for our Alexa skill. On this page, we will be creating an AWS Lambda function using [Amazon Web Services](http://aws.amazon.com). You can [read more about what a Lambda function is](http://aws.amazon.com/lambda), but for the purposes of this guide, what you need to know is that AWS Lambda is where our code lives. When a user asks Alexa to use our skill, it is our AWS Lambda function that interprets the appropriate interaction, and provides the conversation back to the user. 7 | 8 | 1. **Go to http://aws.amazon.com and sign in to the console.** If you don't already have an account, you will need to create one. [If you don't have an AWS account, check out this quick walkthrough for setting it up](https://alexa.design/create-aws-account). 9 | 10 | [![Developer Console](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/2-1-sign-in-to-the-console._TTH_.png)](https://console.aws.amazon.com/console/home) 11 | 12 | 2. **Click "Services" at the top of the screen, and type "Lambda" in the search box.** You can also find Lambda in the list of services. It is in the "Compute" section. 13 | 14 | [![Lambda](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/2-2-services-lambda._TTH_.png)](https://console.aws.amazon.com/lambda/home) 15 | 16 | 3. **Check your AWS region.** AWS Lambda only works with the Alexa Skills Kit in these regions: US East (N. Virginia), US West (Oregon), Asia Pacific (Tokyo) and EU (Ireland). Make sure you choose the region closest to your customers. 17 | 18 | ![Check Region](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/2-3-check-region._TTH_.png) 19 | 20 | 4. **Click the orange "Create function" button.** It should be near the top of your screen. (If you don't see this button, it is because you haven't created a Lambda function before. Click the blue "Get Started" button near the center of your screen.) 21 | 22 | ![Create lambda function](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/2-4-create-a-lambda-function._TTH_.png) 23 | 24 | 5. There are three boxes labeled "Author from scratch", "Blueprints" and "Serverless Application Repository". **Click the radio button in the box titled "Serverless Application Repository"** We have created a repository as a shortcut to getting everything set up for your skill. 25 | 26 | 6. **Search for the application repository named "alexa-skills-kit-nodejs-howtoskill".** You can find it using the provided search box. 27 | 28 | 7. **Click on the repository.** This repository will create the Lambda function, add Alexa Skills Kit as its trigger, and sets up an IAM role for you. It will also add the code from this GitHub repo and include it's dependencies to your Lambda function so that you don't have to upload it yourself. 29 | 30 | 8. **Click the deploy button** at the bottom of the page. 31 | 32 | 9. Wait for the status of all resources to change to **CREATE_COMPLETE** 33 | 34 | 10. Click the **Test App** button to go to the Lambda console. 35 | 36 | 11. **Open** the function that was **just created** by clicking on it. 37 | 38 | 12. If you want to **secure this Lambda function** follow the instructions found [here](https://alexa.design/secure-lambda-function) 39 | 40 | 13. You should see the Amazon Resource Name (ARN) a unique identifier for this function in the top right corner of the page. **Copy the ARN value for this Lambda function** for use in the next section of the guide. 41 | 42 | ![Copy ARN](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/quiz-game/2-12-copy-ARN._TTH_.png) 43 | 44 | ## Connecting Your Voice User Interface To Your Lambda Function 45 | 46 | Now that we have created both the voice user interface for the intents and utterances we expect from our users plus the 47 | Lambda function that contains all of our logic for the skill, we need to connect those them together. 48 | 49 | 1. **Go back to the [Amazon Developer Portal](https://developer.amazon.com/alexa/console/ask?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-3&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-3_Convert_WW_beginnersdevs&sc_segment=beginnersdevs) and select your skill from the list.** You may still have a browser tab open if you started at the beginning of this tutorial. 50 | 51 | 2. While on the **Build** tab, select the **Endpoint** tab on the left side navigation panel. 52 | 53 | 3. **Select the "AWS Lambda ARN" option for your endpoint.** You have the ability to host your code anywhere that you would like, but for the purposes of simplicity and frugality, we are using AWS Lambda. ([Read more about Hosting Your Own Custom Skill Web Service](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/developing-an-alexa-skill-as-a-web-service?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-3&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-3_Convert_WW_beginnersdevs&sc_segment=beginnersdevs).) With the AWS Free Tier, you get 1,000,000 free requests per month, up to 3.2 million seconds of compute time per month. Learn more at [aws.amazon.com/free](https://aws.amazon.com/free/). In addition, Amazon now offers [AWS Promotional Credits for developers who have live Alexa skills that incur costs on AWS related to those skills](https://developer.amazon.com/alexa-skills-kit/alexa-aws-credits?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-3&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-3_Convert_WW_beginnersdevs&sc_segment=beginnersdevs). 54 | 55 | 4. Paste your Lambda's ARN (Amazon Resource Name) into the textbox provided for **Default Region**. 56 | 57 | 5. Click the **Save Endpoints** button at the top of the main panel. 58 | 59 | [![Next](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/buttons/button_next_testing._TTH_.png)](./test-using-simulator.md) 60 | -------------------------------------------------------------------------------- /instructions/customize-skill-content.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | ## Customize the Skill to be Yours 5 | 6 | At this point, you should have a working copy of our How To skill. In order to make it your own, you will need to customize it with data and responses that you create. Here are the things you will need to change: 7 | 8 | 1. **New data.** You will need to provide a set of recipes for your topic. We recommend a minimum of 25, but a total closer to 100 offers a better experience. 9 | 10 | 1. **Open a copy of recipes.js.** If you haven't already downloaded the code for this project, you can find a copy of recipes.js [here](../lambda/custom/recipes.js). You can use a simple, lightweight code editor like [Atom](http://atom.io), [Sublime Text](http://sublimetext.com), or [VSCode](http://code.visualstudio.com), but you also have the option to edit the code directly in your Alexa-hosted or AWS-hosted Lambda function. 11 | 12 | 1. **Search for the comment "TODO: Replace this data with your own."** This is the data for our skill. You can see that it is a list of recipes in name-value pairs. 13 | 14 | 1. **When you have replaced the data in recipes.js, copy the contents of your file to your Lambda function.** This should be as done in the same way as when you first created the skill (if you're not editing directly). 15 | 16 | 1. Open https://developer.amazon.com/alexa/console/ask and select your skill. If you already have it open in the developer console, navigate to the Build tab. Click on the LIST_OF_ITEMS slot type in the left navigation. Update the slot values with the names of each recipe in your recipes.js file. If you have many updates, consider using the **Bulk Edit** feature to edit the list in the browser, using the **Export** option if you want to edit using your favorite spreadsheet editor (you would import after making changes using the **Bulk Edit** feature), or modifying the original **en-US.json** file in a code/text editor and pasting it into the **JSON Editor** section. 17 | 18 | 1. After making changes to the interaction model, be sure to save and build your model. 19 | 20 | 2. **New sentences to respond to your users.** There are several sentences and responses that you will want to customize for your skill. 21 | 22 | 1. **Open a copy of index.js.** If you haven't already downloaded the code for this project, you can find a copy of index.js [here](../lambda/custom/index.js). You can use a simple, lightweight code editor like [Atom](http://atom.io), [Sublime Text](http://sublimetext.com), or [VSCode](http://code.visualstudio.com), but you also have the option to edit the code directly in your Alexa-hosted or AWS-hosted Lambda function. 23 | 24 | 2. **Look for the comment "TODO: The items below this comment need your attention."** This is the beginning of the section where you need to customize several text strings for your skill. 25 | 26 | 3. **Continue through index.js until you reach the bottom of the file.** This will ensure that you cover each of the values that you need to update. 27 | 28 | 3. **New language.** If you are creating this skill for another language other than English, you will need to make sure Alexa's responses are also in that language. 29 | 30 | * For example, if you are creating your skill in German, every single response that Alexa makes has to be in German. You can't use English responses or your skill will fail certification. 31 | 32 | 4. **Once you have made the updates listed on this page, you can click "Next" to move on to Publishing and Certification of your skill.** 33 | 34 | [![Next Publication](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/buttons/button_next_publication._TTH_.png)](./submit-for-certification.md) 35 | -------------------------------------------------------------------------------- /instructions/setup-vui-alexa-hosted.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | 5 | 1. **Go to the [Amazon Developer Portal](http://developer.amazon.com?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-1&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-1_Convert_WW_beginnersdevs&sc_segment=beginnersdevs). In the top-right corner of the screen, click the "Sign In" button.** 6 | (If you don't already have an account, you will be able to create a new one for free.) 7 | 8 | 2. Once you have signed in, move your mouse over the **Your Alexa Consoles** text at the top of the screen and Select the **Skills (New)** Link. 9 | 10 | 3. From the **Alexa Skills Console (New Console)** select the **Create Skill** button near the top of the screen. 11 | 12 | 4. Give your new skill a **Name**. This is the name that will be shown in the Alexa Skills Store, and the name your users will refer to. Push Next. 13 | 14 | 5. Keep the default **Custom** model selected, and scroll the page down. 15 | 16 | 6. Choose **Alexa-Hosted** for the method to host your skill's backend resources. Scroll backup and select the **Create Skill** button at the top right. 17 | It will take a minute to create your Alexa hosted skill, then you will be taken to the Build tab of the console. 18 | 19 | 7. **Build the Interaction Model for your skill** 20 | 1. On the left hand navigation panel. Select the **Invocation** tab. Enter a **Skill Invocation Name**. This is the name that your users will need to say to start your skill. 21 | 2. Next, select the **JSON Editor** tab. In the textfield provided, replace any existing code with the code provided in the [Interaction Model](../models) (make sure to pick the model that matches your skill's language), then click "Build Model". 22 | 23 | **Note:** You should notice that **Intents** and **Slot Types** will auto populate based on the JSON Interaction Model that you have now applied to your skill. Feel free to explore the changes here, to learn about **Intents**, **Slots**, and **Utterances** open our [technical documentation in a new tab](https://developer.amazon.com/docs/custom-skills/create-intents-utterances-and-slots.html?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-1&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-1_Convert_WW_beginnersdevs&sc_segment=beginnersdevs). 24 | 25 | 8. **Optional:** Select an intent by expanding the **Intents** from the left side navigation panel. Add some more sample utterances for your newly generated intents. Think of all the different ways that a user could request to make a specific intent happen. A few examples are provided. Be sure to click **Save Model** and **Build Model** after you're done making changes here. 26 | 27 | 9. If your interaction model builds successfully, proceed to the next step. If not, you should see an error. 28 | Try to resolve the errors. In our next step of this guide, we will be creating our code. 29 | 30 | If you get an error from your interaction model, check through this list: 31 | 32 | * **Did you copy & paste the provided code correctly?** 33 | * **Did you accidentally add any characters to the Interaction Model or Sample Utterances?** 34 | 35 | 36 | #### NEXT: Review and Deploy the Alexa-Hosted Code 37 | [![Next](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/buttons/next._TTH_.png)](./create-alexa-hosted-function.md) 38 | 39 | -------------------------------------------------------------------------------- /instructions/setup-vui-aws-hosted.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | 5 | 1. **Go to the [Amazon Developer Portal](http://developer.amazon.com?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-1&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-1_Convert_WW_beginnersdevs&sc_segment=beginnersdevs). In the top-right corner of the screen, click the "Sign In" button.** 6 | (If you don't already have an account, you will be able to create a new one for free.) 7 | 8 | 2. Once you have signed in, move your mouse over the **Your Alexa Consoles** text at the top of the screen and Select the **Skills (New)** Link. 9 | 10 | 3. From the **Alexa Skills Console (New Console)** select the **Create Skill** button near the top of the screen. 11 | 12 | 4. Give your new skill a **Name**. This is the name that will be shown in the Alexa Skills Store, and the name your users will refer to. Push Next. 13 | 14 | 5. Select the **Custom** model at the top of the page to add to your skill and select the **Create Skill** button at the top right. 15 | 16 | 6. **Build the Interaction Model for your skill** 17 | 1. On the left hand navigation panel. Select the **Invocation** tab. Enter a **Skill Invocation Name**. This is the name that your users will need to say to start your skill. 18 | 2. Next, select the **JSON Editor** tab. In the textfield provided, replace any existing code with the code provided in the [Interaction Model](../models) (make sure to pick the model that matches your skill's language), then click "Build Model". 19 | 20 | **Note:** You should notice that **Intents** and **Slot Types** will auto populate based on the JSON Interaction Model that you have now applied to your skill. Feel free to explore the changes here, to learn about **Intents**, **Slots**, and **Utterances** open our [technical documentation in a new tab](https://developer.amazon.com/docs/custom-skills/create-intents-utterances-and-slots.html?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-1&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-1_Convert_WW_beginnersdevs&sc_segment=beginnersdevs). 21 | 22 | 7. **Optional:** Select an intent by expanding the **Intents** from the left side navigation panel. Add some more sample utterances for your newly generated intents. Think of all the different ways that a user could request to make a specific intent happen. A few examples are provided. Be sure to click **Save Model** and **Build Model** after you're done making changes here. 23 | 24 | 8. If your interaction model builds successfully, proceed to the next step. If not, you should see an error. Try to resolve the errors. In our next step of this guide, we will be creating our Lambda function in the AWS developer console. 25 | 26 | If you get an error from your interaction model, check through this list: 27 | 28 | * **Did you copy & paste the provided code correctly?** 29 | * **Did you accidentally add any characters to the Interaction Model or Sample Utterances?** 30 | 31 | [![Next](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/buttons/button_next_lambda_function._TTH_.png)](./create-aws-hosted-function.md) 32 | 33 | -------------------------------------------------------------------------------- /instructions/submit-for-certification.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | ## Get Your Skill Certified and Published 5 | 6 | We are almost done! The last step is to add the metadata that your skill will use in the [Skill Store](http://amazon.com/skills). This page will walk you through the remaining steps to launch your skill! 7 | 8 | 1. Select the **Distribution** link from the top navigation menu. 9 | 10 | 2. Fill out the form fields per the guidance on the screen. Hover over the question mark icons for details regarding each respective field. **Fields marked with an Asterisk, are required!** 11 | * Take the time to get these right so that your skill will pass certification! 12 | 13 | 3. **Write your skill descriptions.** 14 | 15 | * **Spend some time coming up with an enticing, succinct description.** This is one of the few places you have an opportunity to attract new users, so make the most of it! These descriptions show up in the list of skills available in the [Alexa app](http://alexa.amazon.com/spa/index.html#skills) and the [skills store](http://www.amazon.com/skills). 16 | 17 | 4. For your example phrases, **come up with the three most exciting ways** a user can talk to your skill. 18 | 19 | * Make sure that each of your example phrases are a **perfect match with one of your Sample Utterances.** Incorrect example phrases are one of the most common reasons that skills fail certification, so we have provided a short list of things to consider as you write your example phrases: 20 | 21 | | Common Failure Points for Example Phrases | 22 | | ----------------------------------------- | 23 | | Example phrases **must** adhere to the [supported phrases](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/supported-phrases-to-begin-a-conversation?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-6&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-6_Convert_WW_beginnersdevs&sc_segment=beginnersdevs). | 24 | | Example phrases **must** be based on sample utterances specified in your Intent Schema. | 25 | | Your first example phrase **must** include a wake word and your invocation name. | 26 | | Example phrases **must** provide a contextual response. | 27 | 28 | * **Choose three example phrases that are likely to be the most common ways that users will attempt to interact with your skill.** Make sure that each of them works well, and provides an excellent user experience. 29 | 30 | 5. **Create your skill's icons.** You need two sizes of your icon: 108x108px and 512x512px. When you upload an image, it will be automatically fit to the required dimensions. 31 | 32 | * **Make sure you have the rights to the icons you create.** Please don't violate any trademarks or copyrights. 33 | * **If you don't have software to make icons, try one of these free options:** 34 | 35 | * [Alexa Skill Icon Builder](https://developer.amazon.com/docs/tools/icon-builder.html) (a link to this is included in the console) 36 | 37 | * [GIMP](https://www.gimp.org/) (Windows/Mac/Linux) 38 | * [Canva](https://www.canva.com/) (Web) 39 | * [Paint.NET](http://www.getpaint.net/index.html) (Windows) 40 | * [Inkscape](http://inkscape.org) (Windows/Mac/Linux) 41 | * [Iconion](http://iconion.com/) (Windows/Mac) 42 | 43 | * To make it easier to get started, we've created blank versions of these icons in both sizes for many formats: 44 | 45 | * [PSD](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/icon-templates/psd._TTH_.zip) 46 | * [PNG](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/icon-templates/png._TTH_.zip) 47 | * [GIF](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/icon-templates/gif._TTH_.zip) 48 | * [PDF](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/icon-templates/pdf._TTH_.zip) 49 | * [JPG](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/icon-templates/jpg._TTH_.zip) 50 | * [SVG](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/icon-templates/svg._TTH_.zip) 51 | * [PDN](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/icon-templates/pdn._TTH_.zip) - for [Paint.NET](http://www.getpaint.net/index.html) 52 | * [XCF](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/icon-templates/xcf._TTH_.zip) - for [GIMP](https://www.gimp.org/) 53 | 54 | 6. Choose the most appropriate category for your skill. 55 | 56 | 7. **Provide a comprehensive list of keywords for users that are searching for new skills.** This is an optional field, and searching the [Alexa app](http://alexa.amazon.com) or the [skill store](http://www.amazon.com/skills) will also find the words in your Skill Name and descriptions, so you don't need to overdo it. That being said, if there are words that you want users to find your skill with, you should include them here. Separate the keywords with commas. 57 | 58 | 8. **Privacy Policy URL.** This is an optional field, and should not be required for this fact skill sample. You can leave it blank. 59 | 60 | 9. **Terms of Use URL.** This is also optional, and you can leave it blank. 61 | 62 | 10. When you're ready, click **Save and Continue** at the bottom of the screen to move onto **Privacy & Compliance** 63 | 64 | 11. * **Does this skill allow users to make purchases or spend real money?** For this fact skill, the answer is no. For future skills, make sure you answer this appropriately. 65 | 66 | * **Does this Alexa skill collect users' personal information?** Again, for this fact skill, the answer is no. If you do collect information about a user, such as names, email addresses, phone numbers, and so forth, ensure that you answer Yes to this question. 67 | * Answering "yes" to this question will also require you to provide a link to your Privacy Policy on the previous page. 68 | 69 | * **Is your skill directed to children under the age of 13?** Because you customized this skill with data you provided, it is possible that you created a skill that targets children under the age of 13. For this fact skill, the answer is **no** because it doesn't target a specific age group. 70 | * Factors to consider in determining if this skill is directed to children under 13 include: 71 | * Subject matter of the skill 72 | * Presence of child-oriented activities and incentives 73 | * Type of language used in the skill 74 | * Music and other audio content in the skill 75 | * How the skill is described and marketed 76 | * Intended audience for the skill 77 | 78 | If you're not sure, please see the [FTC's COPPA Guidance and FAQ](https://www.ftc.gov/tips-advice/business-center/guidance/complying-coppa-frequently-asked-questions) for more information. 79 | 80 | 12. **Export Compliance.** Be certain that you agree with all of the conditions. If you do, make sure to check this box, as Amazon requires this permission to distribute your skill around the globe. 81 | 82 | 13. **Provide testing instructions.** Testing instructions give you an opportunity to explain your skill, and any special or possibly confusing features, to the certification team. A value is required in this box. 83 | 84 | * Since you are using our Sample, make sure to add a sentence to your Testing Instructions referencing the Sample you used. For example: 85 | 86 | ```text 87 | This was built using the how to sample. 88 | ``` 89 | 90 | This will let the testing team understand what you're providing them, and should decrease the testing time required. 91 | 92 | **Note:** More details on certification are [available here](https://alexa.design/certification). 93 | 94 | 1. Click the **Save and Continue** button at the bottom of the page to move on to **Availability**. 95 | * You'll want to allow the Public to access the skill unless you are using [Alexa for Business](https://aws.amazon.com/a4b). 96 | * Beta testing is a good idea for every skill, however since this is from a template and is very basic, we'll skip that for now. When you make your next skill, don't skip this step. Seriously. You won't regret it. 97 | * It is recommended to allow your skill to be available in all countries and regions where Amazon distributes skills, unless you are using facts which aren't applicable to a given area. Reasons to restrict distribution include not having intellectual property rights to distribute to that area and the content being illegal, offensive or otherwise prohibited in that area. 98 | 99 | 1. If you feel that your skill is ready for certification, click the **Save and Continue** button at the bottom of the page and you'll be taken to the certification tab. 100 | 101 | 1. The **Validation** page will tell you if you have missed any steps along the way which will prevent your skill from being submitted. You shouldn't see anything on this page, but if you do, go back and fix the issues. 102 | 103 | 1. Click on the **Functional test** section and click the **Run** button to run functional tests against your skill. You shouldn't see any errors on this page, but if you do, go back and fix the issues. 104 | 105 | 1. Click on **Submission**, and the click **Submit for Review**. 106 | 107 | 15. **You're done with your submission!** Here are a few things you might need to know: 108 | 109 | * **Certification can take several days to complete.** Please be patient. It takes time because we want to get it right. 110 | 111 | * **Did something go wrong?** Our team of evangelists run [online office hours every Tuesday from 1-2pm Pacific Time](https://alexa.design/officehours). They can help answer any questions you might have. 112 | 113 | * **Want to earn developer perks?** Check out current opportunities to earn perks for building skills: https://developer.amazon.com/alexa-skills-kit/alexa-developer-skill-promotion 114 | 115 | If you’re not in the US, please check out our other promotions in the [UK](https://developer.amazon.com/en-gb/alexa-skills-kit/alexa-developer-skill-promotion), [Germany](https://developer.amazon.com/de/alexa-skills-kit/alexa-developer-skill-promotion), [Japan](https://developer.amazon.com/ja/alexa-skills-kit/alexa-developer-skill-promotion), [France](https://developer.amazon.com/fr/alexa-skills-kit/alexa-developer-skills-promotion), [Australia](https://developer.amazon.com/alexa-skills-kit/anz/alexa-developer-skill-promotion), [Italy](https://developer.amazon.com/it/alexa-skills-kit/alexa-developer-skill-promotion), [Spain](https://developer.amazon.com/es/alexa-skills-kit/alexa-developer-skill-promotion), [Mexico](https://developer.amazon.com/es-mx/alexa-skills-kit/alexa-developer-skill-promotion), [Canada](https://developer.amazon.com/alexa-skills-kit/alexa-developer-skill-promotion-canada), and [India](https://developer.amazon.com/alexa-skills-kit/alexa-developer-skill-promotion-india) to see if your country of residence is included. 116 | 117 | -------------------------------------------------------------------------------- /instructions/test-using-simulator.md: -------------------------------------------------------------------------------- 1 | # Build An Alexa How-To Skill 2 | 3 | 4 | ## Testing Your Alexa Skill 5 | 6 | So far, we have created a Voice User Interface, and deployed code to a backend service linked to the skill. Your skill is now ready to test. 7 | 8 | 1. If you are not continuing immediately from the previous step, **go back to the [Amazon Developer Portal](https://developer.amazon.com/alexa/console/ask?&sc_category=Owned&sc_channel=RD&sc_campaign=Evangelism2018&sc_publisher=github&sc_content=Survey&sc_detail=howto-nodejs-V2_GUI-4&sc_funnel=Convert&sc_country=WW&sc_medium=Owned_RD_Evangelism2018_github_Survey_howto-nodejs-V2_GUI-4_Convert_WW_beginnersdevs&sc_segment=beginnersdevs) and select your skill from the list.** 9 | 10 | 2. Access the **Alexa Simulator**, by selecting the **Test** tab from the top navigation menu. Your browser may request permission to access your microphone. While it is recommended to do so, it is not required. Do note that if you don't allow access to the microphone, you must type your utterances to Alexa in the simulator. 11 | 12 | 3. Notice the dropdown labeled "Skill testing is enabled in:", found just underneath the top navigation menu. 13 | Toggle the dropdown from **Off** to **Development**. 14 | 15 | 4. To validate that your skill is working as expected, invoke your skill from the **Alexa Simulator** just below. You can either type or click and hold the mic from the input box to use your voice. 16 | 1. **Type** "Open" followed by the invocation name you gave your skill in step 1. For example, "Open minecraft helper". 17 | 2. **Use your voice** by clicking and holding the mic on the side panel and saying "Open" followed by the invocation name you gave your skill. 18 | 3. **If you've forgotten the invocation name** for your skill, revisit the **Build** panel on the top navigation menu and select **Invocation** from the sidebar to review it. 19 | 20 | * *Tip: Always finish your test by saying "stop" to formally end your session.* 21 | 22 | 23 | 5. Ensure your skill works the way that you designed it to. 24 | * After you interact with the Alexa Simulator, you should see the Skill I/O **JSON Input** and **JSON Output** boxes get populated with JSON data. You can also view the **Device Log** to trace your steps. 25 | * If it's not working as expected, you can dig into the JSON to see exactly what Alexa is sending and receiving from the endpoint. If something is broken, you can find the error in AWS Cloudwatch. 26 | 27 | 28 | 6. Troubleshooting with CloudWatch log messages: You can add `console.log()` statements to your code, to track what is happening as your code executes, and help to figure out what is happening when something goes wrong. 29 | You will find the log to be incredibly valuable as you move into more advanced skills. 30 | 31 | 32 | [![Next](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/buttons/button_next_customization._TTH_.png)](./customize-skill-content.md) 33 | 34 | --- 35 | 36 | #### Optional: AWS-Hosted skill testing option 37 | If you are not using Alexa-Hosted, but are hosting the code in your AWS account, you can run unit tests within the AWS Lambda console to help test and troubleshoot your code. 38 | 39 | 1. **Configure a test event in AWS Lambda.** Now that you are familiar with the **request** and **response** boxes in the Service Simulator, it's important for you to know that you can use your **requests** to directly test your Lambda function every time you update it. To do this: 40 | 1. Enter an utterance in the service simulator, and copy the generated Lambda Request (JSON Input) for the next step. 41 | 42 | 2. **Open your Lambda function in AWS, open the Actions menu, and select "Configure test events."**![Configure Test events drop down](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/4-5-2-configure-test-event._TTH_.png) 43 | 44 | 3. **Select "Create new test event". Choose "Amazon Alexa Start Session" as the Event Template from the dropdown list.** You can choose any test event in the list, as they are just templated event requests, but using "Amazon Alexa Start Session" is an easy one to remember. 45 | ![Alexa Start Session](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/4-5-3-alexa-start-session._TTH_.png) 46 | 47 | 4. Type in an Event Name into the **Event Name** field. Delete the contents of the code editor, and paste the Lambda request you copied above into the code editor. The Event Name is only visible to you. Name your test event something descriptive and memorable. For our example, we entered an event name as "startSession". Additionally, by copying and pasting your Lambda Request from the service simulator, you can test different utterances and skill events beyond the pre-populated templates in Lambda. 48 | 49 | 5. **Click the "Create" button.** This will save your test event and bring you back to the main configuration for your lambda function. 50 | 51 | 6. **Click the "Test" button to execute the "startSession" test event.** 52 | ![Test with event](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/4-5-5-save-and-test._TTH_.png) 53 | 54 | This gives you visibility into four things: 55 | 56 | * **Your response, listed in the "Execution Result."** 57 | ![execution result](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/fact/4-5-5-1-execution-result._TTH_.png) 58 | 59 | * **A Summary of the statistics for your request.** This includes things like duration, resources, and memory used. 60 | ![Summary](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/4-5-5-2-summary._TTH_.png) 61 | 62 | * **Log output.** By effectively using console.log() statements in your Lambda code, you can track what is happening inside your function, and help to figure out what is happening when something goes wrong. You will find the log to be incredibly valuable as you move into more advanced skills. 63 | ![CloudWatch Logs](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/tutorials/general/4-5-5-3-log-output._TTH_.png) 64 | 65 | * **A link to your [CloudWatch](https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logs:) logs for this function.** This will show you **all** of the responses and log statements from every user interaction. This is very useful, especially when you are testing your skill from a device with your voice. (It is the "[Click here](https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#logs:)" link in the Log Output description.) 66 | 67 | 7. **Other testing methods to consider:** 68 | 69 | * [Echosim.io](https://echosim.io) - a browser-based Alexa skill testing tool that makes it easy to test your skills without carrying a physical device everywhere you go. 70 | * [Unit Testing with Alexa](https://github.com/alexa/alexa-cookbook/tree/master/testing/postman/README.md) - a modern approach to unit testing your Alexa skills with [Postman](http://getpostman.com) and [Amazon API Gateway](http://aws.amazon.com/apigateway). 71 | 72 | 8. **If your sample skill is working properly, you can now customize your skill.** 73 | 74 | -------------------------------------------------------------------------------- /lambda/custom/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable func-names */ 2 | /* eslint-disable no-console */ 3 | 4 | const Alexa = require('ask-sdk-core'); 5 | const recipes = require('./recipes'); 6 | const i18n = require('i18next'); 7 | const sprintf = require('i18next-sprintf-postprocessor'); 8 | 9 | /* INTENT HANDLERS */ 10 | const LaunchRequestHandler = { 11 | canHandle(handlerInput) { 12 | return handlerInput.requestEnvelope.request.type === 'LaunchRequest'; 13 | }, 14 | handle(handlerInput) { 15 | const requestAttributes = handlerInput.attributesManager.getRequestAttributes(); 16 | const sessionAttributes = handlerInput.attributesManager.getSessionAttributes(); 17 | 18 | const item = requestAttributes.t(getRandomItem(Object.keys(recipes.RECIPE_EN_US))); 19 | 20 | const speakOutput = requestAttributes.t('WELCOME_MESSAGE', requestAttributes.t('SKILL_NAME'), item); 21 | const repromptOutput = requestAttributes.t('WELCOME_REPROMPT'); 22 | 23 | handlerInput.attributesManager.setSessionAttributes(sessionAttributes); 24 | 25 | return handlerInput.responseBuilder 26 | .speak(speakOutput) 27 | .reprompt(repromptOutput) 28 | .getResponse(); 29 | }, 30 | }; 31 | 32 | const RecipeHandler = { 33 | canHandle(handlerInput) { 34 | return handlerInput.requestEnvelope.request.type === 'IntentRequest' 35 | && handlerInput.requestEnvelope.request.intent.name === 'RecipeIntent'; 36 | }, 37 | handle(handlerInput) { 38 | const requestAttributes = handlerInput.attributesManager.getRequestAttributes(); 39 | const sessionAttributes = handlerInput.attributesManager.getSessionAttributes(); 40 | 41 | const itemSlot = handlerInput.requestEnvelope.request.intent.slots.Item; 42 | let itemName; 43 | if (itemSlot && itemSlot.value) { 44 | itemName = itemSlot.value.toLowerCase(); 45 | } 46 | 47 | const cardTitle = requestAttributes.t('DISPLAY_CARD_TITLE', requestAttributes.t('SKILL_NAME'), itemName); 48 | const myRecipes = requestAttributes.t('RECIPES'); 49 | const recipe = myRecipes[itemName]; 50 | let speakOutput = ''; 51 | 52 | if (recipe) { 53 | sessionAttributes.speakOutput = recipe; 54 | // uncomment the _2_ reprompt lines if you want to repeat the info 55 | // and prompt for a subsequent action 56 | // sessionAttributes.repromptSpeech = requestAttributes.t('RECIPE_REPEAT_MESSAGE'); 57 | handlerInput.attributesManager.setSessionAttributes(sessionAttributes); 58 | 59 | return handlerInput.responseBuilder 60 | .speak(sessionAttributes.speakOutput) 61 | // .reprompt(sessionAttributes.repromptSpeech) 62 | .withSimpleCard(cardTitle, recipe) 63 | .getResponse(); 64 | } 65 | const repromptSpeech = requestAttributes.t('RECIPE_NOT_FOUND_REPROMPT'); 66 | if (itemName) { 67 | speakOutput += requestAttributes.t('RECIPE_NOT_FOUND_WITH_ITEM_NAME', itemName); 68 | } else { 69 | speakOutput += requestAttributes.t('RECIPE_NOT_FOUND_WITHOUT_ITEM_NAME'); 70 | } 71 | speakOutput += repromptSpeech; 72 | 73 | // save outputs to attributes, so we can use it to repeat 74 | sessionAttributes.speakOutput = speakOutput; 75 | sessionAttributes.repromptSpeech = repromptSpeech; 76 | 77 | handlerInput.attributesManager.setSessionAttributes(sessionAttributes); 78 | 79 | return handlerInput.responseBuilder 80 | .speak(sessionAttributes.speakOutput) 81 | .reprompt(sessionAttributes.repromptSpeech) 82 | .getResponse(); 83 | }, 84 | }; 85 | 86 | const HelpHandler = { 87 | canHandle(handlerInput) { 88 | return handlerInput.requestEnvelope.request.type === 'IntentRequest' 89 | && handlerInput.requestEnvelope.request.intent.name === 'AMAZON.HelpIntent'; 90 | }, 91 | handle(handlerInput) { 92 | const requestAttributes = handlerInput.attributesManager.getRequestAttributes(); 93 | const sessionAttributes = handlerInput.attributesManager.getSessionAttributes(); 94 | 95 | const item = requestAttributes.t(getRandomItem(Object.keys(recipes.RECIPE_EN_US))); 96 | 97 | sessionAttributes.speakOutput = requestAttributes.t('HELP_MESSAGE', item); 98 | sessionAttributes.repromptSpeech = requestAttributes.t('HELP_REPROMPT', item); 99 | 100 | return handlerInput.responseBuilder 101 | .speak(sessionAttributes.speakOutput) 102 | .reprompt(sessionAttributes.repromptSpeech) 103 | .getResponse(); 104 | }, 105 | }; 106 | 107 | const RepeatHandler = { 108 | canHandle(handlerInput) { 109 | return handlerInput.requestEnvelope.request.type === 'IntentRequest' 110 | && handlerInput.requestEnvelope.request.intent.name === 'AMAZON.RepeatIntent'; 111 | }, 112 | handle(handlerInput) { 113 | const sessionAttributes = handlerInput.attributesManager.getSessionAttributes(); 114 | 115 | return handlerInput.responseBuilder 116 | .speak(sessionAttributes.speakOutput) 117 | .reprompt(sessionAttributes.repromptSpeech) 118 | .getResponse(); 119 | }, 120 | }; 121 | 122 | const ExitHandler = { 123 | canHandle(handlerInput) { 124 | return handlerInput.requestEnvelope.request.type === 'IntentRequest' 125 | && (handlerInput.requestEnvelope.request.intent.name === 'AMAZON.StopIntent' 126 | || handlerInput.requestEnvelope.request.intent.name === 'AMAZON.CancelIntent'); 127 | }, 128 | handle(handlerInput) { 129 | const requestAttributes = handlerInput.attributesManager.getRequestAttributes(); 130 | const speakOutput = requestAttributes.t('STOP_MESSAGE', requestAttributes.t('SKILL_NAME')); 131 | 132 | return handlerInput.responseBuilder 133 | .speak(speakOutput) 134 | .getResponse(); 135 | }, 136 | }; 137 | 138 | const SessionEndedRequestHandler = { 139 | canHandle(handlerInput) { 140 | console.log('Inside SessionEndedRequestHandler'); 141 | return handlerInput.requestEnvelope.request.type === 'SessionEndedRequest'; 142 | }, 143 | handle(handlerInput) { 144 | console.log(`Session ended with reason: ${JSON.stringify(handlerInput.requestEnvelope)}`); 145 | return handlerInput.responseBuilder.getResponse(); 146 | }, 147 | }; 148 | 149 | const ErrorHandler = { 150 | canHandle() { 151 | return true; 152 | }, 153 | handle(handlerInput, error) { 154 | console.log(`Error handled: ${error.message}`); 155 | 156 | return handlerInput.responseBuilder 157 | .speak('Sorry, I can\'t understand the command. Please say again.') 158 | .reprompt('Sorry, I can\'t understand the command. Please say again.') 159 | .getResponse(); 160 | }, 161 | }; 162 | 163 | /* Helper Functions */ 164 | 165 | // Finding the locale of the user 166 | const LocalizationInterceptor = { 167 | process(handlerInput) { 168 | const localizationClient = i18n.use(sprintf).init({ 169 | lng: handlerInput.requestEnvelope.request.locale, 170 | overloadTranslationOptionHandler: sprintf.overloadTranslationOptionHandler, 171 | resources: languageStrings, 172 | returnObjects: true, 173 | }); 174 | 175 | const attributes = handlerInput.attributesManager.getRequestAttributes(); 176 | attributes.t = function (...args) { 177 | return localizationClient.t(...args); 178 | }; 179 | }, 180 | }; 181 | 182 | // getRandomItem 183 | function getRandomItem(arrayOfItems) { 184 | // the argument is an array [] of words or phrases 185 | let i = 0; 186 | i = Math.floor(Math.random() * arrayOfItems.length); 187 | return (arrayOfItems[i]); 188 | } 189 | 190 | /* LAMBDA SETUP */ 191 | const skillBuilder = Alexa.SkillBuilders.custom(); 192 | exports.handler = skillBuilder 193 | .addRequestHandlers( 194 | LaunchRequestHandler, 195 | RecipeHandler, 196 | HelpHandler, 197 | RepeatHandler, 198 | ExitHandler, 199 | SessionEndedRequestHandler, 200 | ) 201 | .addRequestInterceptors(LocalizationInterceptor) 202 | .addErrorHandlers(ErrorHandler) 203 | .lambda(); 204 | 205 | // langauge strings for localization 206 | // TODO: The items below this comment need your attention 207 | 208 | const languageStrings = { 209 | 'en': { 210 | translation: { 211 | RECIPES: recipes.RECIPE_EN_US, 212 | SKILL_NAME: 'Minecraft Helper', 213 | WELCOME_MESSAGE: 'Welcome to %s. You can ask a question like, what\'s the recipe for a %s? ... Now, what can I help you with?', 214 | WELCOME_REPROMPT: 'For instructions on what you can say, please say help me.', 215 | DISPLAY_CARD_TITLE: '%s - Recipe for %s.', 216 | HELP_MESSAGE: 'You can ask questions such as, what\'s the recipe for a %s, or, you can say exit...Now, what can I help you with?', 217 | HELP_REPROMPT: 'You can say things like, what\'s the recipe for a %s, or you can say exit...Now, what can I help you with?', 218 | STOP_MESSAGE: 'Goodbye!', 219 | RECIPE_REPEAT_MESSAGE: 'Try saying repeat.', 220 | RECIPE_NOT_FOUND_WITH_ITEM_NAME: 'I\'m sorry, I currently do not know the recipe for %s. ', 221 | RECIPE_NOT_FOUND_WITHOUT_ITEM_NAME: 'I\'m sorry, I currently do not know that recipe. ', 222 | RECIPE_NOT_FOUND_REPROMPT: 'What else can I help with?', 223 | }, 224 | }, 225 | 'en-US': { 226 | translation: { 227 | RECIPES: recipes.RECIPE_EN_US, 228 | SKILL_NAME: 'American Minecraft Helper', 229 | }, 230 | }, 231 | 'en-GB': { 232 | translation: { 233 | RECIPES: recipes.RECIPE_EN_GB, 234 | SKILL_NAME: 'British Minecraft Helper', 235 | }, 236 | }, 237 | 'de': { 238 | translation: { 239 | RECIPES: recipes.RECIPE_DE_DE, 240 | SKILL_NAME: 'Assistent für Minecraft in Deutsch', 241 | WELCOME_MESSAGE: 'Willkommen bei %s. Du kannst beispielsweise die Frage stellen: Welche Rezepte gibt es für eine %s? ... Nun, womit kann ich dir helfen?', 242 | WELCOME_REPROMPT: 'Wenn du wissen möchtest, was du sagen kannst, sag einfach „Hilf mir“.', 243 | DISPLAY_CARD_TITLE: '%s - Rezept für %s.', 244 | HELP_MESSAGE: 'Du kannst beispielsweise Fragen stellen wie „Wie geht das Rezept für eine %s“ oder du kannst „Beenden“ sagen ... Wie kann ich dir helfen?', 245 | HELP_REPROMPT: 'Du kannst beispielsweise Sachen sagen wie „Wie geht das Rezept für eine %s“ oder du kannst „Beenden“ sagen ... Wie kann ich dir helfen?', 246 | STOP_MESSAGE: 'Auf Wiedersehen!', 247 | RECIPE_REPEAT_MESSAGE: 'Sage einfach „Wiederholen“.', 248 | RECIPE_NOT_FOUND_WITH_ITEM_NAME: 'Tut mir leid, ich kenne derzeit das Rezept für %s nicht. ', 249 | RECIPE_NOT_FOUND_WITHOUT_ITEM_NAME: 'Tut mir leid, ich kenne derzeit dieses Rezept nicht. ', 250 | RECIPE_NOT_FOUND_REPROMPT: 'Womit kann ich dir sonst helfen?', 251 | }, 252 | }, 253 | }; 254 | -------------------------------------------------------------------------------- /lambda/custom/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "how-to", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "ask-sdk-core": "^2.0.0", 13 | "ask-sdk-model": "^1.0.0", 14 | "i18next": "^10.5.0", 15 | "i18next-sprintf-postprocessor": "^0.2.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /models/de-DE.json: -------------------------------------------------------------------------------- 1 | { 2 | "interactionModel": { 3 | "languageModel": { 4 | "invocationName": "assistent für minecraft", 5 | "intents": [ 6 | { 7 | "name": "RecipeIntent", 8 | "slots": [ 9 | { 10 | "name": "Item", 11 | "type": "LIST_OF_ITEMS" 12 | } 13 | ], 14 | "samples": [ 15 | "wie kann ich ein {Item} bauen", 16 | "wie kann ich eine {Item} bauen", 17 | "wie kann ich einen {Item} bauen", 18 | "wie kann ich {Item} bauen", 19 | "wie kann ich ein {Item} craften", 20 | "wie kann ich eine {Item} craften", 21 | "wie kann ich einen {Item} craften", 22 | "wie kann ich {Item} craften", 23 | "wie kann ich ein {Item} bekommen", 24 | "wie kann ich eine {Item} bekommen", 25 | "wie kann ich einen {Item} bekommen", 26 | "wie kann ich {Item} bekommen", 27 | "wie kann ich ein {Item} machen", 28 | "wie kann ich eine {Item} machen", 29 | "wie kann ich einen {Item} machen", 30 | "wie kann ich {Item} machen", 31 | "wie kannst du ein {Item} bauen", 32 | "wie kannst du eine {Item} bauen", 33 | "wie kannst du einen {Item} bauen", 34 | "wie kannst du {Item} bauen", 35 | "wie kannst du ein {Item} craften", 36 | "wie kannst du eine {Item} craften", 37 | "wie kannst du einen {Item} craften", 38 | "wie kannst du {Item} craften", 39 | "wie kannst du ein {Item} bekommen", 40 | "wie kannst du eine {Item} bekommen", 41 | "wie kannst du einen {Item} bekommen", 42 | "wie kannst du {Item} bekommen", 43 | "wie kannst du ein {Item} machen", 44 | "wie kannst du eine {Item} machen", 45 | "wie kannst du einen {Item} machen", 46 | "wie kannst du {Item} machen", 47 | "wie baue ich ein {Item}", 48 | "wie baue ich eine {Item}", 49 | "wie baue ich einen {Item}", 50 | "wie baue ich {Item}", 51 | "wie crafte ich ein {Item}", 52 | "wie crafte ich eine {Item}", 53 | "wie crafte ich einen {Item}", 54 | "wie crafte ich {Item}", 55 | "wie bekomme ich ein {Item}", 56 | "wie bekomme ich eine {Item}", 57 | "wie bekomme ich einen {Item}", 58 | "wie bekomme ich {Item}", 59 | "wie mache ich ein {Item}", 60 | "wie mache ich eine {Item}", 61 | "wie mache ich einen {Item}", 62 | "wie mache ich {Item}", 63 | "wie baust du ein {Item}", 64 | "wie baust du eine {Item}", 65 | "wie baust du einen {Item}", 66 | "wie baust du {Item}", 67 | "wie craftest du ein {Item}", 68 | "wie craftest du eine {Item}", 69 | "wie craftest du einen {Item}", 70 | "wie craftest du {Item}", 71 | "wie bekommst du ein {Item}", 72 | "wie bekommst du eine {Item}", 73 | "wie bekommst du einen {Item}", 74 | "wie bekommst du {Item}", 75 | "wie machst du ein {Item}", 76 | "wie machst du eine {Item}", 77 | "wie machst du einen {Item}", 78 | "wie machst du {Item}", 79 | "wie wird ein {Item} gebaut", 80 | "wie wird eine {Item} gebaut", 81 | "wie wird ein {Item} gecraftet", 82 | "wie wird eine {Item} gecraftet", 83 | "wie wird ein {Item} gemacht", 84 | "wie wird eine {Item} gemacht", 85 | "wie wird {Item} gebaut", 86 | "wie wird {Item} gecraftet", 87 | "wie wird {Item} gemacht", 88 | "Rezept für ein {Item}", 89 | "Rezept für eine {Item}", 90 | "Rezept für einen {Item}", 91 | "Rezept für {Item}", 92 | "Rezepte für ein {Item}", 93 | "Rezepte für eine {Item}", 94 | "Rezepte für einen {Item}", 95 | "Rezepte für {Item}", 96 | "was sind die Zutaten für ein {Item}", 97 | "was sind die Zutaten für eine {Item}", 98 | "was sind die Zutaten für einen {Item}", 99 | "was sind die Zutaten für {Item}", 100 | "was brauche ich für ein {Item}", 101 | "was brauche ich für eine {Item}", 102 | "was brauche ich für einen {Item}", 103 | "was brauche ich für {Item}", 104 | "was brauche ich zum Bau eines {Item}", 105 | "was brauche ich zum Bau einer {Item}", 106 | "was brauche ich zum Bau von {Item}", 107 | "was brauche ich zum Craften eines {Item}", 108 | "was brauche ich zum Craften einer {Item}", 109 | "was brauche ich zum Craften von {Item}", 110 | "was muss ich für ein {Item} bekommen", 111 | "was muss ich für eine {Item} bekommen", 112 | "was muss ich für einen {Item} bekommen", 113 | "was muss ich für {Item} bekommen", 114 | "was muss ich zum Bau eines {Item} besorgen", 115 | "was muss ich zum Bau einer {Item} besorgen", 116 | "was muss ich zum Bau von {Item} besorgen", 117 | "was muss ich zum Craften eines {Item} besorgen", 118 | "was muss ich zum Craften einer {Item} besorgen", 119 | "was muss ich zum Craften von {Item} besorgen", 120 | "was muss ich zum Herstellen eines {Item} besorgen", 121 | "was muss ich zum Herstellen einer {Item} besorgen", 122 | "was muss ich zum Herstellen von {Item} besorgen", 123 | "was muss ich zum Bau eines {Item} haben", 124 | "was muss ich zum Bau einer {Item} haben", 125 | "was muss ich zum Bau von {Item} haben", 126 | "was muss ich zum Craften eines {Item} haben", 127 | "was muss ich zum Craften einer {Item} haben", 128 | "was muss ich zum Craften von {Item} haben", 129 | "was muss ich zum Herstellen eines {Item} haben", 130 | "was muss ich zum Herstellen einer {Item} haben", 131 | "was muss ich zum Herstellen von {Item} haben", 132 | "was brauche ich zum Herstellen eines {Item}", 133 | "was brauche ich zum Herstellen einer {Item}", 134 | "was brauche ich zum Herstellen von {Item}", 135 | "was brauche ich für ein {Item}", 136 | "was brauche ich für eine {Item}", 137 | "was brauche ich für einen {Item}", 138 | "was brauche ich für {Item}", 139 | "welche Zutaten brauche ich zum Bau eines {Item}", 140 | "welche Zutaten brauche ich zum Bau einer {Item}", 141 | "welche Zutaten brauche ich zum Bau von {Item}", 142 | "welche Zutaten brauche ich zum Craften eines {Item}", 143 | "welche Zutaten brauche ich zum Craften einer {Item}", 144 | "welche Zutaten brauche ich zum Craften von {Item}", 145 | "welche Zutaten brauche ich zum Herstellen eines {Item}", 146 | "welche Zutaten brauche ich zum Herstellen einer {Item}", 147 | "welche Zutaten brauche ich zum Herstellen von {Item}", 148 | "was ist in einem {Item}", 149 | "was ist in einer {Item}", 150 | "was ist in {Item}", 151 | "was ist das Rezept für ein {Item}", 152 | "was ist das Rezept für eine {Item}", 153 | "was ist das Rezept für einen {Item}", 154 | "was ist das Rezept für {Item}", 155 | "was ist in {Item}", 156 | "was ist in einem {Item}", 157 | "was ist in einer {Item}", 158 | "was ist in {Item}", 159 | "welches Rezept für ein {Item}", 160 | "welches Rezept für eine {Item}", 161 | "welches Rezept für einen {Item}", 162 | "welches Rezept für {Item}", 163 | "wie soll {Item} gecraftet werden", 164 | "wie soll ein {Item} gecraftet werden", 165 | "wie soll eine {Item} gecraftet werden", 166 | "wie soll ein {Item} gemacht werden", 167 | "wie soll eine {Item} gemacht werden", 168 | "wie soll {Item} gemacht werden", 169 | "wie soll ein {Item} gebaut werden", 170 | "wie soll eine {Item} gebaut werden", 171 | "wie soll {Item} gebaut werden", 172 | "wie soll ein {Item} bezogen werden", 173 | "wie soll eine {Item} bezogen werden", 174 | "wie soll {Item} bezogen werden" 175 | ] 176 | }, 177 | { 178 | "name": "AMAZON.RepeatIntent" 179 | }, 180 | { 181 | "name": "AMAZON.HelpIntent" 182 | }, 183 | { 184 | "name": "AMAZON.StopIntent" 185 | }, 186 | { 187 | "name": "AMAZON.CancelIntent" 188 | } 189 | ], 190 | "types": [ 191 | { 192 | "values": [ 193 | { 194 | "name": { 195 | "value": "Schneegolem" 196 | } 197 | }, 198 | { 199 | "name": { 200 | "value": "Quarzsäule" 201 | } 202 | }, 203 | { 204 | "name": { 205 | "value": "Feuerwerksrakete" 206 | } 207 | }, 208 | { 209 | "name": { 210 | "value": "Kaninchenragout" 211 | } 212 | }, 213 | { 214 | "name": { 215 | "value": "Kessel" 216 | } 217 | }, 218 | { 219 | "name": { 220 | "value": "Steinschaufel" 221 | } 222 | }, 223 | { 224 | "name": { 225 | "value": "Roter Teppich" 226 | } 227 | }, 228 | { 229 | "name": { 230 | "value": "Buch und Feder" 231 | } 232 | }, 233 | { 234 | "name": { 235 | "value": "Rahmen" 236 | } 237 | }, 238 | { 239 | "name": { 240 | "value": "Karte" 241 | } 242 | }, 243 | { 244 | "name": { 245 | "value": "Klebriger Kolben" 246 | } 247 | }, 248 | { 249 | "name": { 250 | "value": "Brot" 251 | } 252 | }, 253 | { 254 | "name": { 255 | "value": "Holzspitzhacke" 256 | } 257 | }, 258 | { 259 | "name": { 260 | "value": "Schere" 261 | } 262 | }, 263 | { 264 | "name": { 265 | "value": "Rohes Rindfleisch" 266 | } 267 | }, 268 | { 269 | "name": { 270 | "value": "Glatter roter Sandstein" 271 | } 272 | }, 273 | { 274 | "name": { 275 | "value": "Prismarinkristalle" 276 | } 277 | }, 278 | { 279 | "name": { 280 | "value": "Eichenholzstufe" 281 | } 282 | }, 283 | { 284 | "name": { 285 | "value": "Holzschwert" 286 | } 287 | }, 288 | { 289 | "name": { 290 | "value": "Treppe" 291 | } 292 | }, 293 | { 294 | "name": { 295 | "value": "Tropenholzzaun" 296 | } 297 | }, 298 | { 299 | "name": { 300 | "value": "Aktivierungsschiene" 301 | } 302 | }, 303 | { 304 | "name": { 305 | "value": "Ackerboden" 306 | } 307 | }, 308 | { 309 | "name": { 310 | "value": "Golderz" 311 | } 312 | }, 313 | { 314 | "name": { 315 | "value": "Andesit" 316 | } 317 | }, 318 | { 319 | "name": { 320 | "value": "Roter Farbstoff" 321 | } 322 | }, 323 | { 324 | "name": { 325 | "value": "Eisenaxt" 326 | } 327 | }, 328 | { 329 | "name": { 330 | "value": "Hellblauer Farbstoff" 331 | } 332 | }, 333 | { 334 | "name": { 335 | "value": "Grauer Farbstoff" 336 | } 337 | }, 338 | { 339 | "name": { 340 | "value": "Blau gefärbte Glasscheibe" 341 | } 342 | }, 343 | { 344 | "name": { 345 | "value": "Eiserne Pferderüstung" 346 | } 347 | }, 348 | { 349 | "name": { 350 | "value": "Rot gefärbte Glasscheibe" 351 | } 352 | }, 353 | { 354 | "name": { 355 | "value": "Ziegeltreppe" 356 | } 357 | }, 358 | { 359 | "name": { 360 | "value": "Goldene Hose" 361 | } 362 | }, 363 | { 364 | "name": { 365 | "value": "Schwarzeichenzauntor" 366 | } 367 | }, 368 | { 369 | "name": { 370 | "value": "Witherschädel" 371 | } 372 | }, 373 | { 374 | "name": { 375 | "value": "Spinnenauge" 376 | } 377 | }, 378 | { 379 | "name": { 380 | "value": "Magenta gefärbtes Glas" 381 | } 382 | }, 383 | { 384 | "name": { 385 | "value": "Braun gefärbte Glasscheibe" 386 | } 387 | }, 388 | { 389 | "name": { 390 | "value": "Kürbiskuchen" 391 | } 392 | }, 393 | { 394 | "name": { 395 | "value": "Schneeball" 396 | } 397 | }, 398 | { 399 | "name": { 400 | "value": "Jukebox" 401 | } 402 | }, 403 | { 404 | "name": { 405 | "value": "Sand" 406 | } 407 | }, 408 | { 409 | "name": { 410 | "value": "Toter Busch" 411 | } 412 | }, 413 | { 414 | "name": { 415 | "value": "Ziegelstufe" 416 | } 417 | }, 418 | { 419 | "name": { 420 | "value": "Seerosenblatt" 421 | } 422 | }, 423 | { 424 | "name": { 425 | "value": "Lederhose" 426 | } 427 | }, 428 | { 429 | "name": { 430 | "value": "Bemooste Bruchsteinmauer" 431 | } 432 | }, 433 | { 434 | "name": { 435 | "value": "Schallplatte 11" 436 | } 437 | }, 438 | { 439 | "name": { 440 | "value": "Violett gefärbte Glasscheibe" 441 | } 442 | }, 443 | { 444 | "name": { 445 | "value": "Magenta gefärbte Glasscheibe" 446 | } 447 | }, 448 | { 449 | "name": { 450 | "value": "Schallplatte Mall" 451 | } 452 | }, 453 | { 454 | "name": { 455 | "value": "Tropenholz" 456 | } 457 | }, 458 | { 459 | "name": { 460 | "value": "Diamantaxt" 461 | } 462 | }, 463 | { 464 | "name": { 465 | "value": "Leere Karte" 466 | } 467 | }, 468 | { 469 | "name": { 470 | "value": "Steindruckplatte" 471 | } 472 | }, 473 | { 474 | "name": { 475 | "value": "Falltür" 476 | } 477 | }, 478 | { 479 | "name": { 480 | "value": "Goldstiefel" 481 | } 482 | }, 483 | { 484 | "name": { 485 | "value": "Schallplatte Stall" 486 | } 487 | }, 488 | { 489 | "name": { 490 | "value": "Redstone-Kabel" 491 | } 492 | }, 493 | { 494 | "name": { 495 | "value": "Kolben" 496 | } 497 | }, 498 | { 499 | "name": { 500 | "value": "Weiß gefärbtes Glas" 501 | } 502 | }, 503 | { 504 | "name": { 505 | "value": "Antriebslore" 506 | } 507 | }, 508 | { 509 | "name": { 510 | "value": "Zucker" 511 | } 512 | }, 513 | { 514 | "name": { 515 | "value": "Kettenhemd" 516 | } 517 | }, 518 | { 519 | "name": { 520 | "value": "Feder" 521 | } 522 | }, 523 | { 524 | "name": { 525 | "value": "Hellblau gefärbtes Glas" 526 | } 527 | }, 528 | { 529 | "name": { 530 | "value": "Eichenholzzaun" 531 | } 532 | }, 533 | { 534 | "name": { 535 | "value": "Steinspitzhacke" 536 | } 537 | }, 538 | { 539 | "name": { 540 | "value": "Rosa Teppich" 541 | } 542 | }, 543 | { 544 | "name": { 545 | "value": "Monsterspawner" 546 | } 547 | }, 548 | { 549 | "name": { 550 | "value": "Goldene Karotte" 551 | } 552 | }, 553 | { 554 | "name": { 555 | "value": "Stock" 556 | } 557 | }, 558 | { 559 | "name": { 560 | "value": "Diamantblock" 561 | } 562 | }, 563 | { 564 | "name": { 565 | "value": "Grün gefärbtes Glas" 566 | } 567 | }, 568 | { 569 | "name": { 570 | "value": "Gebratenes Hühnchen" 571 | } 572 | }, 573 | { 574 | "name": { 575 | "value": "Schallplatte 13" 576 | } 577 | }, 578 | { 579 | "name": { 580 | "value": "Holzfalltür" 581 | } 582 | }, 583 | { 584 | "name": { 585 | "value": "Eichenzauntor" 586 | } 587 | }, 588 | { 589 | "name": { 590 | "value": "Werkbank" 591 | } 592 | }, 593 | { 594 | "name": { 595 | "value": "Netherquarzerz" 596 | } 597 | }, 598 | { 599 | "name": { 600 | "value": "Goldschwert" 601 | } 602 | }, 603 | { 604 | "name": { 605 | "value": "Grau gefärbter Ton" 606 | } 607 | }, 608 | { 609 | "name": { 610 | "value": "Hellblau gefärbter Ton" 611 | } 612 | }, 613 | { 614 | "name": { 615 | "value": "Diamantstiefel" 616 | } 617 | }, 618 | { 619 | "name": { 620 | "value": "Steinhacke" 621 | } 622 | }, 623 | { 624 | "name": { 625 | "value": "Steinkohle" 626 | } 627 | }, 628 | { 629 | "name": { 630 | "value": "Schwarzeichenlaub" 631 | } 632 | }, 633 | { 634 | "name": { 635 | "value": "TNT" 636 | } 637 | }, 638 | { 639 | "name": { 640 | "value": "Ziegel" 641 | } 642 | }, 643 | { 644 | "name": { 645 | "value": "Kartoffel" 646 | } 647 | }, 648 | { 649 | "name": { 650 | "value": "Oranger Teppich" 651 | } 652 | }, 653 | { 654 | "name": { 655 | "value": "Tintenbeutel" 656 | } 657 | }, 658 | { 659 | "name": { 660 | "value": "Redstone" 661 | } 662 | }, 663 | { 664 | "name": { 665 | "value": "Schwarzeichenholz" 666 | } 667 | }, 668 | { 669 | "name": { 670 | "value": "Diorit" 671 | } 672 | }, 673 | { 674 | "name": { 675 | "value": "Grau gefärbtes Glas" 676 | } 677 | }, 678 | { 679 | "name": { 680 | "value": "Tropenholzzauntor" 681 | } 682 | }, 683 | { 684 | "name": { 685 | "value": "Magenta Wolle" 686 | } 687 | }, 688 | { 689 | "name": { 690 | "value": "Erde" 691 | } 692 | }, 693 | { 694 | "name": { 695 | "value": "Rüstungsständer" 696 | } 697 | }, 698 | { 699 | "name": { 700 | "value": "Gebratener Fisch" 701 | } 702 | }, 703 | { 704 | "name": { 705 | "value": "Hebel" 706 | } 707 | }, 708 | { 709 | "name": { 710 | "value": "Leine" 711 | } 712 | }, 713 | { 714 | "name": { 715 | "value": "Gebratenes Kaninchen" 716 | } 717 | }, 718 | { 719 | "name": { 720 | "value": "Tropenholztreppe" 721 | } 722 | }, 723 | { 724 | "name": { 725 | "value": "Trichterlore" 726 | } 727 | }, 728 | { 729 | "name": { 730 | "value": "Fermentiertes Spinnenauge" 731 | } 732 | }, 733 | { 734 | "name": { 735 | "value": "Roher Fisch" 736 | } 737 | }, 738 | { 739 | "name": { 740 | "value": "Braun gefärbtes Glas" 741 | } 742 | }, 743 | { 744 | "name": { 745 | "value": "Schild" 746 | } 747 | }, 748 | { 749 | "name": { 750 | "value": "Trichter" 751 | } 752 | }, 753 | { 754 | "name": { 755 | "value": "Lohenrute" 756 | } 757 | }, 758 | { 759 | "name": { 760 | "value": "Redstone-Komparator" 761 | } 762 | }, 763 | { 764 | "name": { 765 | "value": "Knochen" 766 | } 767 | }, 768 | { 769 | "name": { 770 | "value": "Goldene Pferderüstung" 771 | } 772 | }, 773 | { 774 | "name": { 775 | "value": "Goldbeinschutz" 776 | } 777 | }, 778 | { 779 | "name": { 780 | "value": "Schiene" 781 | } 782 | }, 783 | { 784 | "name": { 785 | "value": "Weizenkörner" 786 | } 787 | }, 788 | { 789 | "name": { 790 | "value": "Birkenholzzaun" 791 | } 792 | }, 793 | { 794 | "name": { 795 | "value": "Violett gefärbter Ton" 796 | } 797 | }, 798 | { 799 | "name": { 800 | "value": "Goldharnisch:" 801 | } 802 | }, 803 | { 804 | "name": { 805 | "value": "Lederstiefel" 806 | } 807 | }, 808 | { 809 | "name": { 810 | "value": "Diamantschaufel" 811 | } 812 | }, 813 | { 814 | "name": { 815 | "value": "Roter Sand" 816 | } 817 | }, 818 | { 819 | "name": { 820 | "value": "Ranken" 821 | } 822 | }, 823 | { 824 | "name": { 825 | "value": "Glasflasche" 826 | } 827 | }, 828 | { 829 | "name": { 830 | "value": "Redstone-Erz" 831 | } 832 | }, 833 | { 834 | "name": { 835 | "value": "Smaragdblock" 836 | } 837 | }, 838 | { 839 | "name": { 840 | "value": "Granit" 841 | } 842 | }, 843 | { 844 | "name": { 845 | "value": "Braune Wolle" 846 | } 847 | }, 848 | { 849 | "name": { 850 | "value": "Goldener Apfel" 851 | } 852 | }, 853 | { 854 | "name": { 855 | "value": "Birkenlaub" 856 | } 857 | }, 858 | { 859 | "name": { 860 | "value": "Weiße Wolle" 861 | } 862 | }, 863 | { 864 | "name": { 865 | "value": "Violetter Teppich" 866 | } 867 | }, 868 | { 869 | "name": { 870 | "value": "Gebrannter Ton" 871 | } 872 | }, 873 | { 874 | "name": { 875 | "value": "Zombieschädel" 876 | } 877 | }, 878 | { 879 | "name": { 880 | "value": "Eisenfalltür" 881 | } 882 | }, 883 | { 884 | "name": { 885 | "value": "Blumentopf" 886 | } 887 | }, 888 | { 889 | "name": { 890 | "value": "Eisenerz" 891 | } 892 | }, 893 | { 894 | "name": { 895 | "value": "Tropenholzstufe" 896 | } 897 | }, 898 | { 899 | "name": { 900 | "value": "Birkenholzstufe" 901 | } 902 | }, 903 | { 904 | "name": { 905 | "value": "Tropenholztür" 906 | } 907 | }, 908 | { 909 | "name": { 910 | "value": "Goldaxt" 911 | } 912 | }, 913 | { 914 | "name": { 915 | "value": "Packeis" 916 | } 917 | }, 918 | { 919 | "name": { 920 | "value": "Hellblauer Teppich" 921 | } 922 | }, 923 | { 924 | "name": { 925 | "value": "Spender" 926 | } 927 | }, 928 | { 929 | "name": { 930 | "value": "Truhe" 931 | } 932 | }, 933 | { 934 | "name": { 935 | "value": "Rohes Hühnchen" 936 | } 937 | }, 938 | { 939 | "name": { 940 | "value": "Roher Lachs" 941 | } 942 | }, 943 | { 944 | "name": { 945 | "value": "Haken" 946 | } 947 | }, 948 | { 949 | "name": { 950 | "value": "Eichenholztreppe" 951 | } 952 | }, 953 | { 954 | "name": { 955 | "value": "Befehlsblocklore" 956 | } 957 | }, 958 | { 959 | "name": { 960 | "value": "Enderauge" 961 | } 962 | }, 963 | { 964 | "name": { 965 | "value": "Kohleblock" 966 | } 967 | }, 968 | { 969 | "name": { 970 | "value": "Netherstern" 971 | } 972 | }, 973 | { 974 | "name": { 975 | "value": "Kies" 976 | } 977 | }, 978 | { 979 | "name": { 980 | "value": "Blaue Wolle" 981 | } 982 | }, 983 | { 984 | "name": { 985 | "value": "Netherquarz" 986 | } 987 | }, 988 | { 989 | "name": { 990 | "value": "Verrottetes Fleisch" 991 | } 992 | }, 993 | { 994 | "name": { 995 | "value": "Magenta Teppich" 996 | } 997 | }, 998 | { 999 | "name": { 1000 | "value": "Weiß gefärbter Ton" 1001 | } 1002 | }, 1003 | { 1004 | "name": { 1005 | "value": "Birkenholzzauntor" 1006 | } 1007 | }, 1008 | { 1009 | "name": { 1010 | "value": "Karotten" 1011 | } 1012 | }, 1013 | { 1014 | "name": { 1015 | "value": "Violetter Farbstoff" 1016 | } 1017 | }, 1018 | { 1019 | "name": { 1020 | "value": "Lapislazuliblock" 1021 | } 1022 | }, 1023 | { 1024 | "name": { 1025 | "value": "Obsidian" 1026 | } 1027 | }, 1028 | { 1029 | "name": { 1030 | "value": "Schallplatte Mellohi" 1031 | } 1032 | }, 1033 | { 1034 | "name": { 1035 | "value": "Graue Wolle" 1036 | } 1037 | }, 1038 | { 1039 | "name": { 1040 | "value": "Redstonetruhe" 1041 | } 1042 | }, 1043 | { 1044 | "name": { 1045 | "value": "Hellgrau gefärbte Glasscheibe" 1046 | } 1047 | }, 1048 | { 1049 | "name": { 1050 | "value": "Eisenspitzhacke" 1051 | } 1052 | }, 1053 | { 1054 | "name": { 1055 | "value": "Roter Pilz" 1056 | } 1057 | }, 1058 | { 1059 | "name": { 1060 | "value": "Kugelfisch" 1061 | } 1062 | }, 1063 | { 1064 | "name": { 1065 | "value": "Smaragd" 1066 | } 1067 | }, 1068 | { 1069 | "name": { 1070 | "value": "Holzschaufel" 1071 | } 1072 | }, 1073 | { 1074 | "name": { 1075 | "value": "Goldhelm" 1076 | } 1077 | }, 1078 | { 1079 | "name": { 1080 | "value": "Melone" 1081 | } 1082 | }, 1083 | { 1084 | "name": { 1085 | "value": "Tonblock" 1086 | } 1087 | }, 1088 | { 1089 | "name": { 1090 | "value": "Amboss" 1091 | } 1092 | }, 1093 | { 1094 | "name": { 1095 | "value": "Tageslichtsensor" 1096 | } 1097 | }, 1098 | { 1099 | "name": { 1100 | "value": "Sandstein" 1101 | } 1102 | }, 1103 | { 1104 | "name": { 1105 | "value": "Lederjacke" 1106 | } 1107 | }, 1108 | { 1109 | "name": { 1110 | "value": "Schwarz gefärbtes Glas" 1111 | } 1112 | }, 1113 | { 1114 | "name": { 1115 | "value": "Hellgrün gefärbter Ton" 1116 | } 1117 | }, 1118 | { 1119 | "name": { 1120 | "value": "TNT-Lore" 1121 | } 1122 | }, 1123 | { 1124 | "name": { 1125 | "value": "Uhr" 1126 | } 1127 | }, 1128 | { 1129 | "name": { 1130 | "value": "Schwarzer Teppich" 1131 | } 1132 | }, 1133 | { 1134 | "name": { 1135 | "value": "Kakao" 1136 | } 1137 | }, 1138 | { 1139 | "name": { 1140 | "value": "Goldbarren" 1141 | } 1142 | }, 1143 | { 1144 | "name": { 1145 | "value": "Steinziegelstufe" 1146 | } 1147 | }, 1148 | { 1149 | "name": { 1150 | "value": "Clownfisch" 1151 | } 1152 | }, 1153 | { 1154 | "name": { 1155 | "value": "Kürbiskerne" 1156 | } 1157 | }, 1158 | { 1159 | "name": { 1160 | "value": "Bemooster Steinziegel" 1161 | } 1162 | }, 1163 | { 1164 | "name": { 1165 | "value": "Spinnennetz" 1166 | } 1167 | }, 1168 | { 1169 | "name": { 1170 | "value": "Milcheimer" 1171 | } 1172 | }, 1173 | { 1174 | "name": { 1175 | "value": "Eisenhelm" 1176 | } 1177 | }, 1178 | { 1179 | "name": { 1180 | "value": "Gelb gefärbter Ton" 1181 | } 1182 | }, 1183 | { 1184 | "name": { 1185 | "value": "Hellgrau gefärbter Ton" 1186 | } 1187 | }, 1188 | { 1189 | "name": { 1190 | "value": "Diamant" 1191 | } 1192 | }, 1193 | { 1194 | "name": { 1195 | "value": "Steinschwert" 1196 | } 1197 | }, 1198 | { 1199 | "name": { 1200 | "value": "Bruchsteintreppe" 1201 | } 1202 | }, 1203 | { 1204 | "name": { 1205 | "value": "Bett" 1206 | } 1207 | }, 1208 | { 1209 | "name": { 1210 | "value": "Birkenholz" 1211 | } 1212 | }, 1213 | { 1214 | "name": { 1215 | "value": "Quarzstufe" 1216 | } 1217 | }, 1218 | { 1219 | "name": { 1220 | "value": "Schwamm" 1221 | } 1222 | }, 1223 | { 1224 | "name": { 1225 | "value": "Skelettschädel" 1226 | } 1227 | }, 1228 | { 1229 | "name": { 1230 | "value": "Eimer" 1231 | } 1232 | }, 1233 | { 1234 | "name": { 1235 | "value": "Diamantschwert" 1236 | } 1237 | }, 1238 | { 1239 | "name": { 1240 | "value": "Goldschaufel" 1241 | } 1242 | }, 1243 | { 1244 | "name": { 1245 | "value": "Fichtenholztreppe" 1246 | } 1247 | }, 1248 | { 1249 | "name": { 1250 | "value": "Eisengitter" 1251 | } 1252 | }, 1253 | { 1254 | "name": { 1255 | "value": "Rohes Kaninchen" 1256 | } 1257 | }, 1258 | { 1259 | "name": { 1260 | "value": "Gelber Teppich" 1261 | } 1262 | }, 1263 | { 1264 | "name": { 1265 | "value": "Karottenrute" 1266 | } 1267 | }, 1268 | { 1269 | "name": { 1270 | "value": "Rohes Schweinefleisch" 1271 | } 1272 | }, 1273 | { 1274 | "name": { 1275 | "value": "Ofen" 1276 | } 1277 | }, 1278 | { 1279 | "name": { 1280 | "value": "Netherziegelzaun" 1281 | } 1282 | }, 1283 | { 1284 | "name": { 1285 | "value": "Zaun" 1286 | } 1287 | }, 1288 | { 1289 | "name": { 1290 | "value": "Diamantene Pferderüstung" 1291 | } 1292 | }, 1293 | { 1294 | "name": { 1295 | "value": "Rote Sandsteinstufe" 1296 | } 1297 | }, 1298 | { 1299 | "name": { 1300 | "value": "Birkenholzbrett" 1301 | } 1302 | }, 1303 | { 1304 | "name": { 1305 | "value": "Grundgestein" 1306 | } 1307 | }, 1308 | { 1309 | "name": { 1310 | "value": "Sattel" 1311 | } 1312 | }, 1313 | { 1314 | "name": { 1315 | "value": "Hellgrauer Farbstoff" 1316 | } 1317 | }, 1318 | { 1319 | "name": { 1320 | "value": "Tropenbaumlaub" 1321 | } 1322 | }, 1323 | { 1324 | "name": { 1325 | "value": "Schallplatte Blocks" 1326 | } 1327 | }, 1328 | { 1329 | "name": { 1330 | "value": "Kürbis" 1331 | } 1332 | }, 1333 | { 1334 | "name": { 1335 | "value": "Ofenkartoffel" 1336 | } 1337 | }, 1338 | { 1339 | "name": { 1340 | "value": "Leder" 1341 | } 1342 | }, 1343 | { 1344 | "name": { 1345 | "value": "Hellgrauer Teppich" 1346 | } 1347 | }, 1348 | { 1349 | "name": { 1350 | "value": "Eisenstiefel" 1351 | } 1352 | }, 1353 | { 1354 | "name": { 1355 | "value": "Endstein" 1356 | } 1357 | }, 1358 | { 1359 | "name": { 1360 | "value": "Kettenhose" 1361 | } 1362 | }, 1363 | { 1364 | "name": { 1365 | "value": "Hasenpfote" 1366 | } 1367 | }, 1368 | { 1369 | "name": { 1370 | "value": "Glas" 1371 | } 1372 | }, 1373 | { 1374 | "name": { 1375 | "value": "Stein" 1376 | } 1377 | }, 1378 | { 1379 | "name": { 1380 | "value": "Prismarin" 1381 | } 1382 | }, 1383 | { 1384 | "name": { 1385 | "value": "Kompass" 1386 | } 1387 | }, 1388 | { 1389 | "name": { 1390 | "value": "Grün gefärbte Glasscheibe" 1391 | } 1392 | }, 1393 | { 1394 | "name": { 1395 | "value": "Goldhose" 1396 | } 1397 | }, 1398 | { 1399 | "name": { 1400 | "value": "Befehlsblock" 1401 | } 1402 | }, 1403 | { 1404 | "name": { 1405 | "value": "Werfer" 1406 | } 1407 | }, 1408 | { 1409 | "name": { 1410 | "value": "Giftige Kartoffel" 1411 | } 1412 | }, 1413 | { 1414 | "name": { 1415 | "value": "Apfel" 1416 | } 1417 | }, 1418 | { 1419 | "name": { 1420 | "value": "Rote Blume" 1421 | } 1422 | }, 1423 | { 1424 | "name": { 1425 | "value": "Magenta Farbstoff" 1426 | } 1427 | }, 1428 | { 1429 | "name": { 1430 | "value": "Brauner Teppich" 1431 | } 1432 | }, 1433 | { 1434 | "name": { 1435 | "value": "Prismarinscherbe" 1436 | } 1437 | }, 1438 | { 1439 | "name": { 1440 | "value": "Redstone-Block" 1441 | } 1442 | }, 1443 | { 1444 | "name": { 1445 | "value": "Gelb gefärbte Glasscheibe" 1446 | } 1447 | }, 1448 | { 1449 | "name": { 1450 | "value": "Löwenzahngelb" 1451 | } 1452 | }, 1453 | { 1454 | "name": { 1455 | "value": "Akazienholztreppe" 1456 | } 1457 | }, 1458 | { 1459 | "name": { 1460 | "value": "Sandsteinstufe" 1461 | } 1462 | }, 1463 | { 1464 | "name": { 1465 | "value": "Grauer Teppich" 1466 | } 1467 | }, 1468 | { 1469 | "name": { 1470 | "value": "Polierter Granit" 1471 | } 1472 | }, 1473 | { 1474 | "name": { 1475 | "value": "Lore" 1476 | } 1477 | }, 1478 | { 1479 | "name": { 1480 | "value": "Braun gefärbter Ton" 1481 | } 1482 | }, 1483 | { 1484 | "name": { 1485 | "value": "Türkis gefärbte Glasscheibe" 1486 | } 1487 | }, 1488 | { 1489 | "name": { 1490 | "value": "Buch" 1491 | } 1492 | }, 1493 | { 1494 | "name": { 1495 | "value": "Güterlore" 1496 | } 1497 | }, 1498 | { 1499 | "name": { 1500 | "value": "Akaziensetzling" 1501 | } 1502 | }, 1503 | { 1504 | "name": { 1505 | "value": "Papier" 1506 | } 1507 | }, 1508 | { 1509 | "name": { 1510 | "value": "Goldharnisch" 1511 | } 1512 | }, 1513 | { 1514 | "name": { 1515 | "value": "Türkis gefärbter Ton" 1516 | } 1517 | }, 1518 | { 1519 | "name": { 1520 | "value": "Pilzsuppe" 1521 | } 1522 | }, 1523 | { 1524 | "name": { 1525 | "value": "Netherziegel" 1526 | } 1527 | }, 1528 | { 1529 | "name": { 1530 | "value": "Magmacreme" 1531 | } 1532 | }, 1533 | { 1534 | "name": { 1535 | "value": "Schnee" 1536 | } 1537 | }, 1538 | { 1539 | "name": { 1540 | "value": "Oranger Farbstoff" 1541 | } 1542 | }, 1543 | { 1544 | "name": { 1545 | "value": "Trank" 1546 | } 1547 | }, 1548 | { 1549 | "name": { 1550 | "value": "Hellgrün gefärbte Glasscheibe" 1551 | } 1552 | }, 1553 | { 1554 | "name": { 1555 | "value": "Weiß gefärbte Glasscheibe" 1556 | } 1557 | }, 1558 | { 1559 | "name": { 1560 | "value": "Boot" 1561 | } 1562 | }, 1563 | { 1564 | "name": { 1565 | "value": "Dunkler Prismarin" 1566 | } 1567 | }, 1568 | { 1569 | "name": { 1570 | "value": "Eichenholztür" 1571 | } 1572 | }, 1573 | { 1574 | "name": { 1575 | "value": "Eichenholz" 1576 | } 1577 | }, 1578 | { 1579 | "name": { 1580 | "value": "Rote Wolle" 1581 | } 1582 | }, 1583 | { 1584 | "name": { 1585 | "value": "Gebratenes Hammelfleisch" 1586 | } 1587 | }, 1588 | { 1589 | "name": { 1590 | "value": "Schwarzeichenholzzaun" 1591 | } 1592 | }, 1593 | { 1594 | "name": { 1595 | "value": "Eisentür" 1596 | } 1597 | }, 1598 | { 1599 | "name": { 1600 | "value": "Gemälde" 1601 | } 1602 | }, 1603 | { 1604 | "name": { 1605 | "value": "Fichtennadeln" 1606 | } 1607 | }, 1608 | { 1609 | "name": { 1610 | "value": "Rosa gefärbter Ton" 1611 | } 1612 | }, 1613 | { 1614 | "name": { 1615 | "value": "Akazienholzstufe" 1616 | } 1617 | }, 1618 | { 1619 | "name": { 1620 | "value": "Schwarzeichenholzstufe" 1621 | } 1622 | }, 1623 | { 1624 | "name": { 1625 | "value": "Gemeißelter Sandstein" 1626 | } 1627 | }, 1628 | { 1629 | "name": { 1630 | "value": "Eichenholzbrett" 1631 | } 1632 | }, 1633 | { 1634 | "name": { 1635 | "value": "Gebratener Lachs" 1636 | } 1637 | }, 1638 | { 1639 | "name": { 1640 | "value": "Eisenschaufel" 1641 | } 1642 | }, 1643 | { 1644 | "name": { 1645 | "value": "Zaubertisch" 1646 | } 1647 | }, 1648 | { 1649 | "name": { 1650 | "value": "Redstone-Verstärker" 1651 | } 1652 | }, 1653 | { 1654 | "name": { 1655 | "value": "Schallplatte Far" 1656 | } 1657 | }, 1658 | { 1659 | "name": { 1660 | "value": "Grüner Teppich" 1661 | } 1662 | }, 1663 | { 1664 | "name": { 1665 | "value": "Eisenbarren" 1666 | } 1667 | }, 1668 | { 1669 | "name": { 1670 | "value": "Orange Wolle" 1671 | } 1672 | }, 1673 | { 1674 | "name": { 1675 | "value": "Tropenbaumsetzling" 1676 | } 1677 | }, 1678 | { 1679 | "name": { 1680 | "value": "Steinstufe" 1681 | } 1682 | }, 1683 | { 1684 | "name": { 1685 | "value": "Hellblau gefärbte Glasscheibe" 1686 | } 1687 | }, 1688 | { 1689 | "name": { 1690 | "value": "Türkiser Farbstoff" 1691 | } 1692 | }, 1693 | { 1694 | "name": { 1695 | "value": "Steak" 1696 | } 1697 | }, 1698 | { 1699 | "name": { 1700 | "value": "Orange gefärbtes Glas" 1701 | } 1702 | }, 1703 | { 1704 | "name": { 1705 | "value": "Blau gefärbtes Glas" 1706 | } 1707 | }, 1708 | { 1709 | "name": { 1710 | "value": "Fichtenholzzaun" 1711 | } 1712 | }, 1713 | { 1714 | "name": { 1715 | "value": "Kohle" 1716 | } 1717 | }, 1718 | { 1719 | "name": { 1720 | "value": "Kartoffeln" 1721 | } 1722 | }, 1723 | { 1724 | "name": { 1725 | "value": "Hellgrau gefärbtes Glas" 1726 | } 1727 | }, 1728 | { 1729 | "name": { 1730 | "value": "Zauntor" 1731 | } 1732 | }, 1733 | { 1734 | "name": { 1735 | "value": "Ei" 1736 | } 1737 | }, 1738 | { 1739 | "name": { 1740 | "value": "Fichtenholzbrett" 1741 | } 1742 | }, 1743 | { 1744 | "name": { 1745 | "value": "Orange gefärbte Glasscheibe" 1746 | } 1747 | }, 1748 | { 1749 | "name": { 1750 | "value": "Akazienholz" 1751 | } 1752 | }, 1753 | { 1754 | "name": { 1755 | "value": "Hellgraue Wolle" 1756 | } 1757 | }, 1758 | { 1759 | "name": { 1760 | "value": "Strohballen" 1761 | } 1762 | }, 1763 | { 1764 | "name": { 1765 | "value": "Ton" 1766 | } 1767 | }, 1768 | { 1769 | "name": { 1770 | "value": "Schüssel" 1771 | } 1772 | }, 1773 | { 1774 | "name": { 1775 | "value": "Lederkappe" 1776 | } 1777 | }, 1778 | { 1779 | "name": { 1780 | "value": "Rosa gefärbte Glasscheibe" 1781 | } 1782 | }, 1783 | { 1784 | "name": { 1785 | "value": "Diamantbrustpanzer" 1786 | } 1787 | }, 1788 | { 1789 | "name": { 1790 | "value": "Grau gefärbte Glasscheibe" 1791 | } 1792 | }, 1793 | { 1794 | "name": { 1795 | "value": "Schneemann" 1796 | } 1797 | }, 1798 | { 1799 | "name": { 1800 | "value": "Diamanterz" 1801 | } 1802 | }, 1803 | { 1804 | "name": { 1805 | "value": "Banner" 1806 | } 1807 | }, 1808 | { 1809 | "name": { 1810 | "value": "Steinaxt" 1811 | } 1812 | }, 1813 | { 1814 | "name": { 1815 | "value": "Feuerwerksstern" 1816 | } 1817 | }, 1818 | { 1819 | "name": { 1820 | "value": "Netherwarze" 1821 | } 1822 | }, 1823 | { 1824 | "name": { 1825 | "value": "Rot gefärbter Ton" 1826 | } 1827 | }, 1828 | { 1829 | "name": { 1830 | "value": "Quarzblock" 1831 | } 1832 | }, 1833 | { 1834 | "name": { 1835 | "value": "Mohn" 1836 | } 1837 | }, 1838 | { 1839 | "name": { 1840 | "value": "Akazienholzzaun" 1841 | } 1842 | }, 1843 | { 1844 | "name": { 1845 | "value": "Kaktus" 1846 | } 1847 | }, 1848 | { 1849 | "name": { 1850 | "value": "Fichtenholztür" 1851 | } 1852 | }, 1853 | { 1854 | "name": { 1855 | "value": "Schallplatte Cat" 1856 | } 1857 | }, 1858 | { 1859 | "name": { 1860 | "value": "Feuerzeug" 1861 | } 1862 | }, 1863 | { 1864 | "name": { 1865 | "value": "Schleimball" 1866 | } 1867 | }, 1868 | { 1869 | "name": { 1870 | "value": "Gebratenes Schweinefleisch" 1871 | } 1872 | }, 1873 | { 1874 | "name": { 1875 | "value": "Polierter Andesit" 1876 | } 1877 | }, 1878 | { 1879 | "name": { 1880 | "value": "Prismarinziegel" 1881 | } 1882 | }, 1883 | { 1884 | "name": { 1885 | "value": "Wither" 1886 | } 1887 | }, 1888 | { 1889 | "name": { 1890 | "value": "Hellgrüner Farbstoff" 1891 | } 1892 | }, 1893 | { 1894 | "name": { 1895 | "value": "Blauer Teppich" 1896 | } 1897 | }, 1898 | { 1899 | "name": { 1900 | "value": "Tür" 1901 | } 1902 | }, 1903 | { 1904 | "name": { 1905 | "value": "Stolperdraht" 1906 | } 1907 | }, 1908 | { 1909 | "name": { 1910 | "value": "Türkiser Teppich" 1911 | } 1912 | }, 1913 | { 1914 | "name": { 1915 | "value": "Polierter Diorit" 1916 | } 1917 | }, 1918 | { 1919 | "name": { 1920 | "value": "Eisenblock" 1921 | } 1922 | }, 1923 | { 1924 | "name": { 1925 | "value": "Akazienlaub" 1926 | } 1927 | }, 1928 | { 1929 | "name": { 1930 | "value": "Schwarzeichensetzling" 1931 | } 1932 | }, 1933 | { 1934 | "name": { 1935 | "value": "Diamantenhacke" 1936 | } 1937 | }, 1938 | { 1939 | "name": { 1940 | "value": "Löwenzahn" 1941 | } 1942 | }, 1943 | { 1944 | "name": { 1945 | "value": "Lapislazuli" 1946 | } 1947 | }, 1948 | { 1949 | "name": { 1950 | "value": "Zuckerrohr" 1951 | } 1952 | }, 1953 | { 1954 | "name": { 1955 | "value": "Birkenholztür" 1956 | } 1957 | }, 1958 | { 1959 | "name": { 1960 | "value": "Kaktusgrün" 1961 | } 1962 | }, 1963 | { 1964 | "name": { 1965 | "value": "Goldblock" 1966 | } 1967 | }, 1968 | { 1969 | "name": { 1970 | "value": "Glatter Sandstein" 1971 | } 1972 | }, 1973 | { 1974 | "name": { 1975 | "value": "Magenta gefärbter Ton" 1976 | } 1977 | }, 1978 | { 1979 | "name": { 1980 | "value": "Notenblock" 1981 | } 1982 | }, 1983 | { 1984 | "name": { 1985 | "value": "Schnee-Block" 1986 | } 1987 | }, 1988 | { 1989 | "name": { 1990 | "value": "Kreaturenschädel" 1991 | } 1992 | }, 1993 | { 1994 | "name": { 1995 | "value": "Diamantbeinschutz" 1996 | } 1997 | }, 1998 | { 1999 | "name": { 2000 | "value": "Roter Sandstein" 2001 | } 2002 | }, 2003 | { 2004 | "name": { 2005 | "value": "Orange gefärbter Ton" 2006 | } 2007 | }, 2008 | { 2009 | "name": { 2010 | "value": "Schleimblock" 2011 | } 2012 | }, 2013 | { 2014 | "name": { 2015 | "value": "Bücherregal" 2016 | } 2017 | }, 2018 | { 2019 | "name": { 2020 | "value": "Kuchen" 2021 | } 2022 | }, 2023 | { 2024 | "name": { 2025 | "value": "Holzknopf" 2026 | } 2027 | }, 2028 | { 2029 | "name": { 2030 | "value": "Gemeißelter Quarzblock" 2031 | } 2032 | }, 2033 | { 2034 | "name": { 2035 | "value": "Steinknopf" 2036 | } 2037 | }, 2038 | { 2039 | "name": { 2040 | "value": "Glowstonestaub" 2041 | } 2042 | }, 2043 | { 2044 | "name": { 2045 | "value": "Hellgrün gefärbtes Glas" 2046 | } 2047 | }, 2048 | { 2049 | "name": { 2050 | "value": "Bruchsteinmauer" 2051 | } 2052 | }, 2053 | { 2054 | "name": { 2055 | "value": "Namensschild" 2056 | } 2057 | }, 2058 | { 2059 | "name": { 2060 | "value": "Schwarzpulver" 2061 | } 2062 | }, 2063 | { 2064 | "name": { 2065 | "value": "Lohenstaub" 2066 | } 2067 | }, 2068 | { 2069 | "name": { 2070 | "value": "Braustand" 2071 | } 2072 | }, 2073 | { 2074 | "name": { 2075 | "value": "Fackel" 2076 | } 2077 | }, 2078 | { 2079 | "name": { 2080 | "value": "Gelbe Wolle" 2081 | } 2082 | }, 2083 | { 2084 | "name": { 2085 | "value": "Schallplatte Wait" 2086 | } 2087 | }, 2088 | { 2089 | "name": { 2090 | "value": "Glitzernde Melone" 2091 | } 2092 | }, 2093 | { 2094 | "name": { 2095 | "value": "Netherrack" 2096 | } 2097 | }, 2098 | { 2099 | "name": { 2100 | "value": "Holzstufe" 2101 | } 2102 | }, 2103 | { 2104 | "name": { 2105 | "value": "Netherziegeltreppe" 2106 | } 2107 | }, 2108 | { 2109 | "name": { 2110 | "value": "Eis" 2111 | } 2112 | }, 2113 | { 2114 | "name": { 2115 | "value": "Großer Farn" 2116 | } 2117 | }, 2118 | { 2119 | "name": { 2120 | "value": "Netherziegelstufe" 2121 | } 2122 | }, 2123 | { 2124 | "name": { 2125 | "value": "Fichtenholzstufe" 2126 | } 2127 | }, 2128 | { 2129 | "name": { 2130 | "value": "Eisenhacke" 2131 | } 2132 | }, 2133 | { 2134 | "name": { 2135 | "value": "Farn" 2136 | } 2137 | }, 2138 | { 2139 | "name": { 2140 | "value": "Seelaterne" 2141 | } 2142 | }, 2143 | { 2144 | "name": { 2145 | "value": "Keks" 2146 | } 2147 | }, 2148 | { 2149 | "name": { 2150 | "value": "Melonenkerne" 2151 | } 2152 | }, 2153 | { 2154 | "name": { 2155 | "value": "Goldklumpen" 2156 | } 2157 | }, 2158 | { 2159 | "name": { 2160 | "value": "Diamanthelm" 2161 | } 2162 | }, 2163 | { 2164 | "name": { 2165 | "value": "Fichtenholzzauntor" 2166 | } 2167 | }, 2168 | { 2169 | "name": { 2170 | "value": "Goldhacke" 2171 | } 2172 | }, 2173 | { 2174 | "name": { 2175 | "value": "Akazienholzbrett" 2176 | } 2177 | }, 2178 | { 2179 | "name": { 2180 | "value": "Diamantspitzhacke" 2181 | } 2182 | }, 2183 | { 2184 | "name": { 2185 | "value": "Lapislazulierz" 2186 | } 2187 | }, 2188 | { 2189 | "name": { 2190 | "value": "Rohes Hammelfleisch" 2191 | } 2192 | }, 2193 | { 2194 | "name": { 2195 | "value": "Quarztreppe" 2196 | } 2197 | }, 2198 | { 2199 | "name": { 2200 | "value": "Ziegelstein-Block" 2201 | } 2202 | }, 2203 | { 2204 | "name": { 2205 | "value": "Bruchsteinstufe" 2206 | } 2207 | }, 2208 | { 2209 | "name": { 2210 | "value": "Smaragderz" 2211 | } 2212 | }, 2213 | { 2214 | "name": { 2215 | "value": "Gelbe Blume" 2216 | } 2217 | }, 2218 | { 2219 | "name": { 2220 | "value": "Kürbislaternen" 2221 | } 2222 | }, 2223 | { 2224 | "name": { 2225 | "value": "Rot gefärbtes Glas" 2226 | } 2227 | }, 2228 | { 2229 | "name": { 2230 | "value": "Eisenbeinschutz" 2231 | } 2232 | }, 2233 | { 2234 | "name": { 2235 | "value": "Rosa gefärbtes Glas" 2236 | } 2237 | }, 2238 | { 2239 | "name": { 2240 | "value": "Schwarzer Farbstoff" 2241 | } 2242 | }, 2243 | { 2244 | "name": { 2245 | "value": "Holzhacke" 2246 | } 2247 | }, 2248 | { 2249 | "name": { 2250 | "value": "Violett gefärbtes Glas" 2251 | } 2252 | }, 2253 | { 2254 | "name": { 2255 | "value": "Sensorschiene" 2256 | } 2257 | }, 2258 | { 2259 | "name": { 2260 | "value": "Türkise Wolle" 2261 | } 2262 | }, 2263 | { 2264 | "name": { 2265 | "value": "Eisenbrustpanzer" 2266 | } 2267 | }, 2268 | { 2269 | "name": { 2270 | "value": "Bruchstein" 2271 | } 2272 | }, 2273 | { 2274 | "name": { 2275 | "value": "Schwarzeichenholztreppe" 2276 | } 2277 | }, 2278 | { 2279 | "name": { 2280 | "value": "Creeperkopf" 2281 | } 2282 | }, 2283 | { 2284 | "name": { 2285 | "value": "Karotte" 2286 | } 2287 | }, 2288 | { 2289 | "name": { 2290 | "value": "Kaninchenfell" 2291 | } 2292 | }, 2293 | { 2294 | "name": { 2295 | "value": "Gras" 2296 | } 2297 | }, 2298 | { 2299 | "name": { 2300 | "value": "Schallplatte Strad" 2301 | } 2302 | }, 2303 | { 2304 | "name": { 2305 | "value": "Birkensetzlinge" 2306 | } 2307 | }, 2308 | { 2309 | "name": { 2310 | "value": "Moosstein" 2311 | } 2312 | }, 2313 | { 2314 | "name": { 2315 | "value": "Rosa Farbstoff" 2316 | } 2317 | }, 2318 | { 2319 | "name": { 2320 | "value": "Redstone-Fackel" 2321 | } 2322 | }, 2323 | { 2324 | "name": { 2325 | "value": "Grün gefärbter Ton" 2326 | } 2327 | }, 2328 | { 2329 | "name": { 2330 | "value": "Hohes Gras" 2331 | } 2332 | }, 2333 | { 2334 | "name": { 2335 | "value": "Schwarze Wolle" 2336 | } 2337 | }, 2338 | { 2339 | "name": { 2340 | "value": "Weizen" 2341 | } 2342 | }, 2343 | { 2344 | "name": { 2345 | "value": "Enderperle" 2346 | } 2347 | }, 2348 | { 2349 | "name": { 2350 | "value": "Angel" 2351 | } 2352 | }, 2353 | { 2354 | "name": { 2355 | "value": "Knochenmehl" 2356 | } 2357 | }, 2358 | { 2359 | "name": { 2360 | "value": "Quarz" 2361 | } 2362 | }, 2363 | { 2364 | "name": { 2365 | "value": "Schwarzeichenholzbrett" 2366 | } 2367 | }, 2368 | { 2369 | "name": { 2370 | "value": "Antriebsschiene" 2371 | } 2372 | }, 2373 | { 2374 | "name": { 2375 | "value": "Leuchtfeuer" 2376 | } 2377 | }, 2378 | { 2379 | "name": { 2380 | "value": "Blau gefärbter Ton" 2381 | } 2382 | }, 2383 | { 2384 | "name": { 2385 | "value": "Schwarzeichenholztür" 2386 | } 2387 | }, 2388 | { 2389 | "name": { 2390 | "value": "Eisengolem" 2391 | } 2392 | }, 2393 | { 2394 | "name": { 2395 | "value": "Fichtenholz" 2396 | } 2397 | }, 2398 | { 2399 | "name": { 2400 | "value": "Rosa Wolle" 2401 | } 2402 | }, 2403 | { 2404 | "name": { 2405 | "value": "Feuerkugel" 2406 | } 2407 | }, 2408 | { 2409 | "name": { 2410 | "value": "Akazienholztür" 2411 | } 2412 | }, 2413 | { 2414 | "name": { 2415 | "value": "Schallplatte Chirp" 2416 | } 2417 | }, 2418 | { 2419 | "name": { 2420 | "value": "Eichenlaub" 2421 | } 2422 | }, 2423 | { 2424 | "name": { 2425 | "value": "Pfeil" 2426 | } 2427 | }, 2428 | { 2429 | "name": { 2430 | "value": "Holzaxt" 2431 | } 2432 | }, 2433 | { 2434 | "name": { 2435 | "value": "Glasscheibe" 2436 | } 2437 | }, 2438 | { 2439 | "name": { 2440 | "value": "Endertruhe" 2441 | } 2442 | }, 2443 | { 2444 | "name": { 2445 | "value": "Hellblaue Wolle" 2446 | } 2447 | }, 2448 | { 2449 | "name": { 2450 | "value": "Faden" 2451 | } 2452 | }, 2453 | { 2454 | "name": { 2455 | "value": "Rote Sandsteintreppe" 2456 | } 2457 | }, 2458 | { 2459 | "name": { 2460 | "value": "Violette Wolle" 2461 | } 2462 | }, 2463 | { 2464 | "name": { 2465 | "value": "Schwarz gefärbter Ton" 2466 | } 2467 | }, 2468 | { 2469 | "name": { 2470 | "value": "Verzaubertes Buch" 2471 | } 2472 | }, 2473 | { 2474 | "name": { 2475 | "value": "Knopf" 2476 | } 2477 | }, 2478 | { 2479 | "name": { 2480 | "value": "Hellgrüne Wolle" 2481 | } 2482 | }, 2483 | { 2484 | "name": { 2485 | "value": "Grobe Erde" 2486 | } 2487 | }, 2488 | { 2489 | "name": { 2490 | "value": "Ghastträne" 2491 | } 2492 | }, 2493 | { 2494 | "name": { 2495 | "value": "Seelensand" 2496 | } 2497 | }, 2498 | { 2499 | "name": { 2500 | "value": "Brauner Pilz" 2501 | } 2502 | }, 2503 | { 2504 | "name": { 2505 | "value": "Kettenhaube" 2506 | } 2507 | }, 2508 | { 2509 | "name": { 2510 | "value": "Beschriebenes Buch" 2511 | } 2512 | }, 2513 | { 2514 | "name": { 2515 | "value": "Fichtensetzling" 2516 | } 2517 | }, 2518 | { 2519 | "name": { 2520 | "value": "Eichensetzling" 2521 | } 2522 | }, 2523 | { 2524 | "name": { 2525 | "value": "Nachtlichtsensor" 2526 | } 2527 | }, 2528 | { 2529 | "name": { 2530 | "value": "Sandsteintreppe" 2531 | } 2532 | }, 2533 | { 2534 | "name": { 2535 | "value": "Redstone-Lampe" 2536 | } 2537 | }, 2538 | { 2539 | "name": { 2540 | "value": "Glowstone" 2541 | } 2542 | }, 2543 | { 2544 | "name": { 2545 | "value": "Holzdruckplatte" 2546 | } 2547 | }, 2548 | { 2549 | "name": { 2550 | "value": "Holzkohle" 2551 | } 2552 | }, 2553 | { 2554 | "name": { 2555 | "value": "Kettenstiefel" 2556 | } 2557 | }, 2558 | { 2559 | "name": { 2560 | "value": "Leiter" 2561 | } 2562 | }, 2563 | { 2564 | "name": { 2565 | "value": "Bemooster Bruchstein" 2566 | } 2567 | }, 2568 | { 2569 | "name": { 2570 | "value": "Goldspitzhacke" 2571 | } 2572 | }, 2573 | { 2574 | "name": { 2575 | "value": "Akazienholzzauntor" 2576 | } 2577 | }, 2578 | { 2579 | "name": { 2580 | "value": "Birkenholztreppe" 2581 | } 2582 | }, 2583 | { 2584 | "name": { 2585 | "value": "Schallplatte Ward" 2586 | } 2587 | }, 2588 | { 2589 | "name": { 2590 | "value": "Schallplatte" 2591 | } 2592 | }, 2593 | { 2594 | "name": { 2595 | "value": "Verzauberter goldener Apfel" 2596 | } 2597 | }, 2598 | { 2599 | "name": { 2600 | "value": "Weißer Teppich" 2601 | } 2602 | }, 2603 | { 2604 | "name": { 2605 | "value": "Eisenschwert" 2606 | } 2607 | }, 2608 | { 2609 | "name": { 2610 | "value": "Gemeißelter roter Sandstein" 2611 | } 2612 | }, 2613 | { 2614 | "name": { 2615 | "value": "Steinziegeltreppe" 2616 | } 2617 | }, 2618 | { 2619 | "name": { 2620 | "value": "Druckplatte" 2621 | } 2622 | }, 2623 | { 2624 | "name": { 2625 | "value": "Tropenholzbrett" 2626 | } 2627 | }, 2628 | { 2629 | "name": { 2630 | "value": "Grüne Wolle" 2631 | } 2632 | }, 2633 | { 2634 | "name": { 2635 | "value": "Bogen" 2636 | } 2637 | }, 2638 | { 2639 | "name": { 2640 | "value": "Feuerstein" 2641 | } 2642 | }, 2643 | { 2644 | "name": { 2645 | "value": "Schwarz gefärbte Glasscheibe" 2646 | } 2647 | } 2648 | ], 2649 | "name": "LIST_OF_ITEMS" 2650 | } 2651 | ] 2652 | } 2653 | } 2654 | } 2655 | -------------------------------------------------------------------------------- /skill.json: -------------------------------------------------------------------------------- 1 | { 2 | "skillManifest": { 3 | "publishingInformation": { 4 | "locales": { 5 | "en-US": { 6 | "summary": "Spend some time coming up with an interesting, succinct description.", 7 | "examplePhrases": [ 8 | "Alexa open Minecraft Helper", 9 | "Alexa ask Minecraft Helper what's the recipe for a chest", 10 | "Alexa ask Minecraft Helper how do I get a map" 11 | ], 12 | "keywords": [ 13 | "Minecraft", 14 | "game" 15 | ], 16 | "name": "Minecraft Helper", 17 | "description": "Sample Full Description" 18 | }, 19 | "de-DE": { 20 | "name": "Assistent für Minecraft in Deutsch" 21 | }, 22 | "en-GB": { 23 | "name": "British Minecraft Helper" 24 | } 25 | }, 26 | "isAvailableWorldwide": true, 27 | "testingInstructions": "Sample Testing Instructions.", 28 | "distributionCountries": [] 29 | }, 30 | "apis": { 31 | "custom": { 32 | "endpoint": { 33 | "sourceDir": "lambda/custom", 34 | "uri": "ask-custom-how-to-default" 35 | } 36 | } 37 | }, 38 | "manifestVersion": "1.0", 39 | "permissions": [], 40 | "privacyAndCompliance": { 41 | "allowsPurchases": false, 42 | "isExportCompliant": true, 43 | "containsAds": false, 44 | "isChildDirected": false, 45 | "usesPersonalInfo": false 46 | } 47 | } 48 | } 49 | --------------------------------------------------------------------------------