在本文中,我们将为我们的 AI 助手添加一个 Pokedex。
配置
首先,启用 ClientMatch 命令:
启用并单击右上角的保存更改。这个域将使我们能够创建我们的命令。我们需要自定义命令,因为 Houndify 没有对 Pokedex 的内置支持。
创建自定义命令
单击边栏中的自定义命令,然后单击新建页面。将新页面命名为简单的“Pokemon”。
接下来,您需要创建一个新命令,该命令将触发客户端打开 Pokedex。像这样填写详细信息。
该表达式显示触发命令所需的查询。结果 JSON 包含我们运行命令时发送到客户端的数据。
我们将响应留空,因为我们将根据神奇宝贝的统计数据创建它。
切换到对话框的配置选项卡。点击Imperative Phrase
。现在用户可以在命令末尾添加诸如“please”之类的内容。
单击Save and Test
。如果您正确配置了所有内容,您应该会看到所有测试都通过了。
处理客户端匹配命令
创建一个新的处理程序文件,命名它ClientMatchCommand.ts
。
使用以下代码完成文件:
import handlePokedexCommand, {
updatePokemonKeys,
} from "./ClientMatch/handlePokemonCommand";
export default async function handle(result: any) {
switch (result.Result.action) {
case "pokedex":
await updatePokemonKeys();
return handlePokedexCommand(result);
}
}
我们从结果 JSON 中检查是否需要 Pokedex。然后我们调用updatePokemonKeys
以获取来自我们的 Pokedex 响应的对象键。稍后再谈。
并且不要忘记在handlers
数组中包含我们的新处理程序。
const COMMANDS = [
"MusicCommand",
"MusicPlayerCommand",
"SoundHoundNowCommand",
"ClientMatchCommand",
];
读取pokemon数据
为了从 Pokemon API 获取数据,我们将从名为pokenode-ts
.
npm i pokenode-ts
ClientMatch
在目录中命名的文件夹中创建一个新文件handlers
。命名文件handlePokemonCommand.ts
。
导入库并在文件顶部初始化一个新对象,如下所示:
import { PokemonClient } from "pokenode-ts";
const pokedex = new PokemonClient();
现在我们需要定义一个函数来格式化 Pokedex 数据,以供客户端使用。这些字段包括一些基本属性以及额外的统计信息。
const parsePokemonData = (data: {
[key: string]: any;
}): { [key: string]: any } => {
let stats: { [key: string]: number } = {};
let statData;
for (let i = 0; i < data.stats.length; i++) {
statData = data.stats[i];
stats[statData.stat.name.replace("-", " ")] = statData.base_stat;
}
return {
name: data.name,
id: data.id,
height: data.height * 10 + "cm",
weight: data.weight / 10 + "kg",
moves: data.moves.map((move: any) => move.move.name).join(", "),
types: data.types.map((type: any) => type.type.name).join(", "),
abilities: data.abilities.map((ability: any) => ability.ability.name),
...stats,
};
};
处理 Pokedex 命令
现在我们需要为这个文件定义默认导出。首先,它提示用户输入口袋妖怪的名称和所需的属性。然后它会获取该信息并更改客户端的响应。
将以下代码添加到文件中:
export default async function handlePokedexCommand(result: any) {
try {
let name = window.prompt("Enter pokemon name");
let stat = window.prompt("Enter stat");
if (!name) {
throw new Error("Invalid name");
}
if (!stat) {
throw new Error("Invalid stat");
}
name = name.toLowerCase();
stat = stat.toLowerCase();
const pokemonData = await pokedex.getPokemonByName(name);
const data = parsePokemonData(pokemonData);
const statValue = data[stat];
const response = `${name}'s ${stat} is ${statValue}`;
return { ...result, SpokenResponseLong: response };
} catch (error: any) {
let response = "Unable to access pokemon data";
if (error.response?.status === 404) {
response = "Pokemon not found";
}
return { ...result, SpokenResponseLong: response };
}
}
我们还需要定义我们的pokemonKeys
数组。它包含结果类型的键parsePokemonData
。
在文件顶部插入以下内容:
let pokemonKeys: string[];
export const updatePokemonKeys = async () => {
if (pokemonKeys) return pokemonKeys;
const firstPokemonData = await pokedex.getPokemonById(1);
const data = parsePokemonData(firstPokemonData);
pokemonKeys = Object.keys(data);
return pokemonKeys;
};
这将使用示例 pokemon 数据 (id 1) 缓存键的值。
结论
本文的源代码发布在这里。如果您觉得这很有用,请务必与他人分享。
网友评论