使用 node-fetch 嵌入来自 api 的 DnD 法术

Using node-fetch to embed DnD spells from api

我希望能够使用 Discord 机器人嵌入取自 5e Api 的特定 DnD 法术。我可以使用 node-fetch 将所有法术记录到控制台,但完全不确定下一步是获取用户输入,将其映射到正确的法术,然后将其嵌入。

运行 命令后控制台日志的样子:

{
  count: 319,
  results: [
    {
      index: 'acid-arrow',
      name: 'Acid Arrow',
      url: '/api/spells/acid-arrow'
    },
(*Continuing on for all of the spells*)

我基本上希望命令是:

!s酸箭(例)

然后 returns:

Discord embed image

这是我目前使用的命令的代码:

const fetch = require('node-fetch');
const Discord = require('discord.js');

module.exports = {
    name: 'spells',
    aliases: ['s'],
    category: 'dnd',
    description: 'Returns spell info',
    usage: '!s <spell name>',
    run: async (client, message, args) => {

        fetch('https://www.dnd5eapi.co/api/spells/')
            .then(res => res.json())
            .then(json => console.log(json));

        **?????????????;**

        const embed = new Discord.MessageEmbed()
            .setTitle()
            .addField('Description:')
            .addField('At higher levels:')
            .addField('Range:')
            .addField('Components:')
            .addField('Materials needed:')
            .addField('Is it a ritual:')
            .addField('Needs concentration:')
            .addField('Level:')
            .addField('Casting time:');

        message.channel.send({ embed });
    },
};

首先,您不需要在获取 spells 后使用 .then() 两次。

根据我在访问 https://www.dnd5eapi.co/api/spells/ 时看到的内容,每个 spell 都有一个 index 可以用来查找 spell 并且通常是 spell name 使用 - 加入,所以如果你获取用户的输入,假设 !s acid arrow 你可以

fetch(`https://www.dnd5eapi.co/api/spells/${args.join('-')}`)

这将获取 https://www.dnd5eapi.co/api/spells/acid-arrow。这将有助于避免让您寻找 spell.

然后你可以使用.then()来使用spell的信息并传递给embed

所以你的解决方案是:

fetch('https://www.dnd5eapi.co/api/spells/')
    .then(res => {
        const embed = new Discord.MessageEmbed()
            .setTitle(res.name)
            .addField('Description:', res.desc.join('\n'))
            .addField('At higher levels:', res.higher_level.join('\n'))
            .addField('Range:', res.range)
            .addField('Components:', res.components.join('\n'))
            .addField('Materials needed:', res.material)
            .addField('Is it a ritual:', res.ritual ? 'Yes' : 'No')
            .addField('Needs concentration:', res.concentration ? 'Yes' : 'No')
            .addField('Level:', res.level)
            .addField('Casting time:', res.casting_time);

        message.channel.send(embed);
    })
    .catch(err => message.reply('that spell does not exist!'));