从一个频道获取所有消息,discord-api

Get all messages from a channel, discord-api

(discord4j 3.1.0) 所以我想从 (Guild)MessageChannel 获取所有消息,但据我所知,没有直接的方法来做到这一点(我的意思是没有channel.getMessages().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.getLastMessageId() 都引用已删除的方法。 (在这种情况下,第一个方法会抛出异常,而第二个方法是无用的,因为尽管它 returns 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();
}