我目前正在为我的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版本,如果有帮助
任何帮助将不胜感激!
答案 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;
}