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

时间:2020-09-03 22:46:50

标签: java discord discord4j

(discord4j 3.1.0)所以我想从(Guild)MessageChannel中获取所有消息,但是据我所知,没有直接的方法可以做到这一点(我的意思是没有通道)。 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()方法的次数太多,因此它完全将我的通知填充为discord :(。 那么,是否有任何聪明的方法(或没有方法)以某种方式获取通道的所有消息,还是可以在MessageDeleteEvent期间更新存储在通道中的lastMessage?

1 个答案:

答案 0 :(得分:1)

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

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