首页 > 解决方案 > 从频道获取所有消息,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() 都引用了删除的方法。(在这种情况下,第一种方法会引发异常,而第二种方法是无用的,因为即使它返回 messageId,所有试图获取实际消息的方法也会引发异常)。我尝试在频道中创建自己的消息,然后调用 channel.getMessagesBefore(message) 但是 getMessagesOfChannel() 方法在我的程序中被调用得太频繁了,所以它完全填充了我的不和谐通知:(。那么有什么聪明的(或不是)以其他方式获取频道的所有消息的方法,

标签: javadiscorddiscord4j

解决方案


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

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

推荐阅读