Редактирование встроенного сообщения с вложением для изображения удваивает его в чате — Discord JDA

#java #discord #bots #discord-jda

#java #Discord #боты #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();
                }
        );
    }
 

Результат:

Изображение удвоилось сверху в чате

Комментарии:

1. Попробуйте использовать TextChannel#SendMessage(File, filename).embed(eb.build()).queue()

2. Я почти уверен, что сообщение такое, потому что вы отправляете файл дважды, один раз в EmbedBuilder#setImage(String) и один раз в addFile(InputStream, String) .

3. @Redi Я предполагаю, что вы предлагаете мне использовать TextChannel#sendFile, если это так, он дает точно такой же результат, как и раньше.

4. @MrBorder, дело в том, что изображение появляется дважды только после изменения сообщения. Более того, я попытался вызвать MessageAction#clearFiles после editMessage(), это ничего не меняет, файл по-прежнему отображается дважды. Возможно, последний метод нельзя использовать после публикации сообщения. В любом случае проблема остается странной, возможно, это связано с тем, как discord связывает встраиваемое изображение и файлы, и в этом случае я не смог бы ничего сделать, чтобы предотвратить это: ‘(

Ответ №1:

Ваша проблема заключается в следующей строке: .setImage(me.getImage().getUrl()) , эта строка вернет URL-адрес discord like https://media.discordapp.net/attachments/203572340280262657/877103116036759642/unknown.png и not 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) создаст embeddbuilder, начиная с другого встраивания. Если вы используете это, вам нужно только установить части встраивания, которые необходимо изменить, и все остальное будет сохранено.
Хотя я предпочитаю использовать channel.sendFile(...).embed(..).queue() , как упоминал Redi, ваш способ отправки изображения одинаково правильный.

Однако, если вы хотите изменить изображение, это уже другая история. Как я упоминал ранее, discord не позволяет изменять вложения. Может возникнуть путаница с методом clearFiles, но этот метод закрывает только файлы, которые добавлены в RestAction, но не отправлены. Единственный способ изменить изображение после отправки вложения — это не использовать вложение, а использовать обычный URL-адрес с самого начала. Если вы сделаете это, вы можете изменить URL позже, что приведет к изменению изображения, поскольку оно не является вложением.