让 JDA Discord Bot 发送随机图像

Make JDA Discord Bot send a random image

我目前正在为我的 Discord 服务器开发一个机器人,我想知道如何实现各种 图像命令(例如,!cat!meme) 让机器人在每次调用命令时发送随机图像。

几乎我见过的每个机器人都有这样的功能,但出于某种原因,我似乎无法在 JDA 中找到执行此操作的有效方法。我发现的任何 JDA 示例要么已过时,要么根本不起作用,所以我真的希望有人能在这里帮助我。

这是我已经做过的一个(非常基本的)示例,但问题是图片不会在每次调用时随机化,而是保持不变,直到我重新启动 discord

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,如果它有帮助的话

任何帮助将不胜感激!

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;
}