Discord.js 嵌入宽度不可靠

问题描述 投票:0回答:3

我正在使用 Discord.js 库创建一个 Discord 机器人。每当我向文本通道发送嵌入消息时,其宽度会随着不同的数据而不断变化。

const celestialObject = new MessageEmbed()
            .setColor("#F0386B")
            .setTitle(
              res.data.name == res.data.englishName
                ? res.data.englishName
                : `${res.data.englishName} (${res.data.name})`
            )
            .attachFiles(attachment)
            .setThumbnail("attachment://logo.png")

            .addFields(
              {
                name: "```Density```",
                value: res.data.density.toFixed(2) + " g/cm^3",
                inline: true,
              },
              {
                name: "```Gravity```",
                value: res.data.gravity + " m/s^2",
                inline: true,
              },
              {
                name: "```Moons```",
                value: res.data.moons ? Object.keys(res.data.moons).length : 0,
                inline: true,
              },
              {
                name: "```Mass```",
                value: `
                    ${res.data.mass.massValue.toFixed(2)}^
                    ${res.data.mass.massExponent} kgs
`,
                inline: true,
              },
              {
                name: "```Escape Velocity```",
                value: (res.data.escape / 1000).toFixed(1) + " km/s",
                inline: true,
              },
              {
                name: "```Orbital revolution```",
                value: res.data.sideralOrbit.toFixed(2) + " days",
                inline: true,
              },
              {
                name: "```Rotation speed```",
                value: (res.data.sideralRotation / 24).toFixed(2) + " days",
                inline: true,
              },
              {
                name: "```Radius```",
                value: res.data.meanRadius.toFixed(2) + " kms",
                inline: true,
              }
            )
            .setTimestamp()
            .setFooter(
              "Generated by astronomia with Solar System OpenData API",
              "https://api.le-systeme-solaire.net/assets/images/logo.png"
            );
          if (images[args[0]].description) {
            celestialObject
              .setDescription(`\`\`\` ${images[args[0]].description}\`\`\``)
              .setImage(images[args[0]].link);
          }
          if (res.data.discoveredBy) {
            celestialObject.addFields({
              name: "```Discovered By```",
              value: res.data.discoveredBy,
              inline: true,
            });
          }
          if (res.data.discoveryDate) {
            celestialObject.addFields({
              name: "```Discovered On```",
              value: res.data.discoveryDate,
              inline: true,
            });
          }
          message.channel.send(celestialObject);

使用此代码我得到以下结果。

这里嵌入的宽度更大。 enter image description here

这里嵌入的宽度较小。 enter image description here

如何每次都能获得最大宽度?我查看了discord.js 文档,但找不到任何内容。

javascript api discord discord.js
3个回答
1
投票

另一种可能的方法是在消息中插入 1px x 一些大值透明图像(您可以从here生成一个)。我没有使用过 DiscordJS,但在简单的 webhook 格式中它会是这样的:

const embed = { // ...
  image: {
    url: 'https://i.sstatic.net/Fzh0w.png'
  }
}

在开发机器人时,您可以使用一些免费服务,例如 Discohook 来直观地测试您的消息的外观。

使用此解决方法相对于 chan kelvin 建议的解决方法的好处是:

  1. 您无需担心页脚上的其他文本,例如时间戳。
  2. 如果您不将空格添加到页脚,而是添加到描述本身,那么它也会执行上述操作,但由于高度更高(16px vs 1px +一些填充),看起来会有些奇怪。
    • 请注意,如果您尝试创建固定宽度的标题/作者姓名,则该空间也将带有超链接(+下划线)。

缺点:在移动客户端上,即使是透明图像也有轻微可见! :/

PS:

  1. 您需要修改 chan 给出的方法以使用
    \u2800
    (盲文图案空白)代替表意空间,因为后者现已被 Discord 丢弃。
  2. 即使您在嵌入中添加了其他图像,您也可以使用我的方法。如果设置了 URL,Discord 允许每次嵌入最多添加 4 个图像。

0
投票

它的发生是因为你使用了奇怪的代码块,因为我也注意到了这一点,但不确定为什么会发生。

如果你想阻止线路断裂 -

   {
     name: "```Orbital \n revolution```",
     value: res.data.sideralOrbit.toFixed(2) + " days",
     inline: true,
   }

\n
打破了我在其周围使用空格的行,以便在您的代码中更清晰,您可以使用
Orbital \nrevolution


0
投票

您可以使用空格

 
和零宽度空格
的组合将页脚填充到固定长度。这种方法会生成比 1px 高度图像更宽的嵌入图像。另一个优点是,如果您使用页脚,此方法不会添加任何不必要的垂直空间:

const MAX_EMBED_WIDTH = 164

const embed = new EmbedBuilder()
    .setTitle('Example')
    .setFooter({ text: `Your footer text`.padEnd(MAX_EMBED_WIDTH) + '\u200B' });
© www.soinside.com 2019 - 2024. All rights reserved.