使JDA Discord Bot发送随机图像

时间:2020-01-27 19:38:20

标签: image bots discord discord-jda

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

我见过的几乎每个机器人都具有这样的功能,但是由于某种原因,我似乎无法在JDA中找到一种可行的方法来做到这一点。而且我发现的任何JDA示例要么过时,要么根本不起作用,所以我真的希望有人可以在这里帮我一个忙。

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

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 个答案:

答案 0 :(得分:1)

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