Image 使JDA Discord Bot发送随机图像

Image 使JDA Discord Bot发送随机图像,image,bots,discord,discord-jda,Image,Bots,Discord,Discord Jda,我目前正在为我的Discord服务器开发一个bot,我想知道如何实现各种图像命令(例如,!cat,!meme),使bot在每次调用命令时发送一个随机图像 几乎我见过的每个机器人都有这样的特性,但出于某种原因,我似乎找不到一种在JDA中实现这一点的有效方法。我发现的任何JDA示例要么已经过时,要么根本不起作用,所以我真的希望有人能帮我一把 这里有一个我已经做过的(非常基本的)例子,但问题是图片不会随机化,而是保持不变,直到我重新启动discord public void sendCatImage(

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

几乎我见过的每个机器人都有这样的特性,但出于某种原因,我似乎找不到一种在JDA中实现这一点的有效方法。我发现的任何JDA示例要么已经过时,要么根本不起作用,所以我真的希望有人能帮我一把

这里有一个我已经做过的(非常基本的)例子,但问题是图片不会随机化,而是保持不变,直到我重新启动discord

public void sendCatImage(){
EmbeddeBuilder结果=新的EmbeddeBuilder();
setTitle(“这是一只猫!”);
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缓存图像。您可以附加一个随机数作为查询,以防止出现这种情况:

公共字符串随机化(字符串url){
ThreadLocalRandom=ThreadLocalRandom.current();
返回url+“&”+random.nextInt()+“=”+random.nextInt();
}
...
结果:setImage(随机化(url));
...
此外,您还可以通过将图像与嵌入文件一起上载来避免更新图像时出现不一致。为此,您首先需要下载图像,然后上传:

//使用jda使用的相同HTTP客户端
OkHttpClient http=jda.getHttpClient();
//发出HTTP请求以下载映像
Request Request=newrequest.Builder().url(imageUrl.build();
Response-Response=http.newCall(request.execute();
试一试{
InputStream body=response.body().ByTestStream();
result.setImage(“attachment://image.png“”;//使用附件中的相同文件名
channel.sendMessage(result.build())
.addFile(body,“image.png”)//为嵌入指定文件名为“image.png”(这必须是相同的,它是一个引用,该附件属于嵌入中的哪个图像)
.queue(m->response.close(),错误->{//发送消息并在完成后关闭响应
response.close();
RestAction.getDefaultFailure().accept(错误);
});
}捕获(可丢弃的ex){
//发生了什么事,立即做出反应以防万一
response.close();
//把扔出去的东西重新扔掉
if(ex instanceof Error)throw(Error)ex;
else抛出(RuntimeException)ex;
}

非常感谢您的帮助!我刚试过,图像实际上是随机的!然而,由于某些原因,当我单击图像以获得完整视图时,它显示的图像与嵌入中的图像不同。我知道如果有人真的点击了图片,这只会给你带来不便,但我想知道是否也有办法解决这个问题?在
OkHttpClient http=jda.getHttpClient()
MyIDE说它无法解析符号
jda
。我用的是IntelliJ。有什么建议吗?它指的是任何JDA实例,您可以使用
x.getJDA()
通过大多数JDA实体获得一个实例,例如
event.getJDA()
channel.getJDA()
。啊,现在它可以工作了!谢谢你花时间帮我做这件事!我面临的另一个问题是
Response=http.newCall(request.execute()引发了未处理的
IOException
。我在方法中添加了
抛出IOException
,然后用
try
catch
包围方法调用。虽然这解决了问题,但我仍然想知道是否有一种“更正确”的方法来避免这个问题。