首页 > 解决方案 > Discord.js 使用来自其他消息的附件来更新嵌入中的图像

问题描述

我正在从 Canvas 生成一张图片(它在 中imageBuffer),并从中制作一个 MessageAttachment:

const attachment = new MessageAttachment(imageBuffer, "bufferedImg.png");

然后我创建一个像这样的嵌入对象,其中包含图像作为文件附件:

const messageObj = {
  embed: {
    title: "The Image",
    files: [
        attachment
    ],
    image: {
        url: 'attachment://bufferedImg.png'
    }
  }
}

我第一次将这个对象发送到文本通道 ( this.channel.send(messageObj).then(msg => this.displayMessage = msg) 时,它会正常工作。它发布了带有图片的嵌入。但是,当我生成新图片/附件,重新创建嵌入对象,然后编辑嵌入以使用该新附件 ( this.displayMessage.edit(messageObj)) 时,它不起作用。

图片没有更新。

我还尝试给它一个随机名称,以确保它不只是使用旧的缓存图像 - 这只是将旧图片与嵌入断开 - 但新图片没有出现。

在另一个 Stackoverflow 帖子中,有人说 Discord API不允许您更新 Message 的附件。但也有人说,你可以更改图片 url

所以,我的想法是,用新图片作为附件发送一条新消息。然后在旧邮件中,将图片的 url 更改为新邮件的附件。例如,我发布了一条包含 bufferedImg2.png 作为附件的新消息,在链接指向的旧消息中attachment://bufferedImg.png,我只是将其更改为使用newMessage:attachment://bufferedImg2.png.

问题是: 如何使 url 指向另一条消息的附件?

标签: javascriptdiscorddiscord.js

解决方案


要使用最新的 discordjs (13.0.1) (Typescript) 实现这一点:

1. 创建并发送您要更新的第一条消息。

let embed = new MessageEmbed().setImage(INSERT_YOUR_FIRST_URL)
const displayMessage = await channel.send({ embeds: [embed] })

2. 发送第二条消息并获取 URL。如果您想保持频道清洁,可以将其发送到其他频道或服务器

const msg = await channel.send({ files: [attachment] })
const url = msg.attachments.first()?.url ?? '';

3. 编辑您的第一条消息。

embed = new MessageEmbed().setImage(url)
displayMessage.edit({ embeds: [embed] })

推荐阅读