使用 node-fetch 从 api 嵌入 DnD 咒语

Posted

技术标签:

【中文标题】使用 node-fetch 从 api 嵌入 DnD 咒语【英文标题】:Using node-fetch to embed DnD spells from api 【发布时间】:2020-08-12 14:22:36 【问题描述】:

我希望能够使用 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 酸性箭头(例如)

然后返回:

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 );
    ,
;

【问题讨论】:

【参考方案1】:

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

根据我在访问https://www.dnd5eapi.co/api/spells/ 时看到的情况,每个spell 都有一个index,可用于查找spell,通常是spell name 使用@987654330 加入@所以如果你抓住用户的输入,比如说!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!'));

【讨论】:

我无法立即尝试,但我只想对您如此彻底和快速的回​​复表示感谢!

以上是关于使用 node-fetch 从 api 嵌入 DnD 咒语的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 node-fetch 以使用公司代理?

从画布正确获取信息并通过带有 node-fetch 的 webhook 将信息发送到 discord 时出现问题

尝试使用 node-fetch 启动机器人时出错

node-fetch "api key is not a legal HTTP header" 错误

node.js node-fetch - 传递附加到url的查询字符串的问题

使用 node-fetch 跳过等待时间