让 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;
}
我目前正在为我的 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;
}