Сделать JDA Discord Bot отправить случайное изображение - PullRequest
0 голосов
/ 27 января 2020

В настоящее время я работаю над ботом для моего сервера Discord, и мне было интересно, как реализовать различные команды изображения (например, !cat, !meme), чтобы бот отправлял случайный код изображение каждый раз, когда команда вызывается.

Почти у каждого бота, которого я видел, есть такая функция, но почему-то я не могу найти работающий способ сделать это в JDA. И любой пример JDA, который я нашел, был либо устаревшим, либо просто не работал, поэтому я очень надеюсь, что кто-то может мне здесь помочь.

Вот (очень базовый c) пример, который я уже сделал, но проблема в том, что картинки не рандомизируются при каждом вызове и просто остаются прежними, пока я не перезапущу разногласия

public void sendCatImage() {
        EmbedBuilder result= new EmbedBuilder();
        result.setTitle("Here's a cat!");
        result.setImage("http://thecatapi.com/api/images/get?format=src&type=png");
        event.getChannel().sendMessage(result.build()).queue();
    }

Я использую JDA версии 4.1.0_100, если это помогает

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 28 января 2020

Discord будет кэшировать изображение на основе URL. Вы можете добавить случайное число в качестве запроса, чтобы предотвратить это:

public String randomize(String url) {
    ThreadLocalRandom random = ThreadLocalRandom.current();
    return url + "&" + random.nextInt() + "=" + random.nextInt();
}

...
result.setImage(randomize(url));
...

Кроме того, вы можете избежать разногласий при обновлении изображения, также загружая его вместе с вложением. Для этого вам сначала нужно скачать изображение, а затем загрузить его:

// Use same HTTP client that jda uses
OkHttpClient http = jda.getHttpClient();
// Make an HTTP request to download the image
Request request = new Request.Builder().url(imageUrl).build();
Response response = http.newCall(request).execute();
try {
    InputStream body = response.body().byteStream();
    result.setImage("attachment://image.png"); // Use same file name from attachment
    channel.sendMessage(result.build())
           .addFile(body, "image.png") // Specify file name as "image.png" for embed (this must be the same, its a reference which attachment belongs to which image in the embed)
           .queue(m -> response.close(), error -> { // Send message and close response when done
               response.close();
               RestAction.getDefaultFailure().accept(error);
           });
} catch (Throwable ex) {
// Something happened, close response just in case
    response.close();
// Rethrow the throwable
    if (ex instanceof Error) throw (Error) ex;
    else throw (RuntimeException) ex;
}
...