编辑带有图像附件的嵌入消息使其在聊天中翻倍 - Discord JDA

Edit an embed message with an attachment for image doubles it in chat - Discord JDA

我正在尝试使用另一个嵌入来编辑消息的嵌入。当我这样做时,图像再次出现在编辑嵌入顶部的聊天中。有什么办法可以防止这种情况发生吗?

@Override
    public void onGuildReady(@NotNull GuildReadyEvent event) {
        super.onGuildReady(event);

        String fileName = "image.png";

        Guild guild = event.getGuild();
        InputStream in = getClass().getResourceAsStream("/someResource.png");

        EmbedBuilder eb = new EmbedBuilder()
        .setTitle("Title :")
        .setDescription("Description")
        .setImage("attachment://" + fileName)
        .setColor(new Color(255, 204, 81));
        guild.getTextChannels().get(0).sendMessage(eb.build()).addFile(in, fileName).queue(
                message -> {
                    MessageEmbed me = message.getEmbeds().get(0);
                    message.editMessage(
                            new EmbedBuilder()
                            .setTitle(me.getTitle())
                            .setDescription(me.getDescription())
                            .setImage(me.getImage().getUrl())
                            .setColor(me.getColor())
                            .build()
                    ).queue();
                }
        );
    }

结果:

您的问题是以下行:.setImage(me.getImage().getUrl()),该行将 return 不和谐 url 像 https://media.discordapp.net/attachments/203572340280262657/877103116036759642/unknown.png 而不是 attachment://image.png

因此嵌入中的图像将更改为来自 url 的图像,并且由于 discord 无法编辑或删除附件,您的初始图像将被放置在嵌入之外。

解决此问题的一种方法是使用以下代码:

guild.getTextChannels().get(0).sendFile(in, fileName).embed(eb.build()).queue(
            message -> {
                MessageEmbed me = message.getEmbeds().get(0);
                message.editMessage(
                        new EmbedBuilder(me)
                        .setTitle("New Title")
                        .build()
                ).queue();
            }
    );

new EmbedBuilder(me) 将从另一个嵌入开始创建一个嵌入构建器。如果您使用它,您只需要设置需要更改的嵌入部分,它将保留其他所有内容。 尽管我更喜欢使用 Redi 提到的 channel.sendFile(...).embed(..).queue(),但您发送图像的方式同样正确。

如果您想更改图像,那就是另一回事了。正如我之前提到的,discord 不允许更改附件。 clearFiles method, but this method only closes files that are added to the RestAction 周围可能存在混淆但未发送。发送嵌入后能够更改图像的唯一方法是不使用附件,而是从一开始就使用正常的 url。如果这样做,您可以稍后更改 url,这将导致图像发生变化,因为它不是附件。