gpt4 book ai didi

java - 检测消息更新失败

转载 作者:行者123 更新时间:2023-11-30 05:30:43 25 4
gpt4 key购买 nike

我正在开发一个不和谐的机器人,其中如果不存在特定消息,则应更新或创建该消息。如果消息已被具有访问权限的人删除,则会出现问题...创建悬空引用,并且在需要更新时引发异常。如何检测当前 channel 中是否不存在特定ID的消息?

这是当前代码:

    TextChannel scoreChannel = channel.getGuild().getTextChannelsByName(gameType + "-ladder", true).get(0);
String id = ScoreboardController.getScoreboardMessageId(gameType);
if (id == null)
scoreChannel.sendMessage(eb.build()).queue();
else {
scoreChannel.editMessageById(id, eb.build()).queue(); // this part can fail
}

请注意,getScoreboardMessageId 从数据库中获取之前存储的 ID。

我需要按标题查询消息或通过其他方式查找消息是否丢失。

<小时/>

我尝试像这样检索嵌入的消息,但没有成功:

    List<Message> messages = scoreChannel.getHistory().getRetrievedHistory();

After some more searching I managed to do this which works but is not Async:

TextChannel scoreChannel = channel.getGuild().getTextChannelsByName(gameType + "-ladder", true).get(0);
List<Message> messages = new MessageHistory(scoreChannel).retrievePast(10).complete();
boolean wasUpdated = false;
for (Message msg : messages) {
if (msg.getEmbeds().get(0).getTitle().equals(content[0])) {
scoreChannel.editMessageById(msg.getId(), eb.build()).queue();
wasUpdated = true;
}
}
if (!wasUpdated)
scoreChannel.sendMessage(eb.build()).queue();

最佳答案

可以使用队列的失败回调:

channel.editMessageById(messageId, embed).queue(
(success) -> {
System.out.printf("[%#s] %s (edited)\n",
success.getAuthor(), success.getContentDisplay()); // its a Message
},
(failure) -> {
failure.printStackTrace(); // its a throwable
}
);

调用的失败回调意味着编辑失败。如果消息不再存在或发生某些连接问题,则可能会发生这种情况。请注意,您可以为这些回调中的任何一个传递 null,以简化仅应处理失败或仅处理成功的情况。

正如文档所建议的 getRetrievedHistory()方法返回一个空列表,除非您之前使用过retrievePastretrieveFuture,它们都返回 RestAction<List<Message>> 。这意味着您必须使用:

history.retrievePast(amount).queue((messages) -> {
/* use messages here */
});

每次通话最多可发送 100 条消息。 channel.getIterableHistory().takeAsync(amount) 提供了一个没有此限制的更简单的 API。它返回 CompletableFuture并且可以与 thenAccept 结合使用.

更好的是使用 channel.retrieveMessageById(messageId) 它仅检索消息,如果消息不存在则失败。然而,在您的情况下不需要这样做,因为您通过 id 编辑消息,并且可以仅使用该消息的失败响应,而不是遇到 TOCTOU Problem .

关于java - 检测消息更新失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57615401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com