从一个通道获取所有消息,discordapi



(discord4j 3.1.0(所以我想从(Guild(MessageChannel获取所有消息,但据我所知,没有直接的方法(我的意思是没有channel.getMessage((.block((或其他什么(。一段时间以来,我一直在用一种方法来代替它获取通道的最后一条消息,然后获取在此之前的所有消息。

public static List<Message> getMessagesOfChannel(MessageChannel channel){
try {
//get the last message
Message tempMessage = channel.getLastMessage().block();
//get all messages before the last message and then add the last message to it
List<Message> messages = channel.getMessagesBefore(tempMessage.getId()).collectList().block();
return messages;
}catch(ClientException | NullPointerException e){
//if there was no last message then the channel is empty so return an empty list
return new ArrayList<>();
}
}

直到今天,它一直很好。。。因为在MessageDeleteEvent内部调用此方法时出现问题。如果所述被删除的方法是频道的最后一个方法。因为即使消息被删除,channel.getLastMessage((和channel.gtLastMessageId((都引用了被删除的方法。(在这种情况下,第一个方法抛出异常,第二个方法没有用,因为即使它返回messageId,所有试图获取实际消息的方法也会抛出异常(。我曾尝试在通道中创建自己的消息,然后调用channel.getMessagesBefore(message(,但在我的程序中调用getMessagesOfChannel((方法的频率太高,因此它完全不协调地填充了我的通知:(。那么,有没有什么聪明的(或没有(方法可以以其他方式获取通道的所有消息,或者在MessageDeleteEvent期间更新存储在通道中的lastMessage?

您可以使用Snowflake.of(Instant.now())获取所有消息:

public static List<Message> getMessagesOfChannel(MessageChannel channel){
Snowflake now = Snowflake.of(Instant.now());
return channel.getMessagesBefore(now).collectList().block();
}

最新更新