JDA Discord bot,读取 textchannel 的最后一条消息

时间:2021-04-09 15:03:55

标签: java nullpointerexception discord discord-jda message-channel

我希望我的 Discord jda 机器人在启动后读取文本频道的最后一条消息。

所以我打电话:

textChannel.getHistory().getMessageById(config.getLatestMessageId());

MessageHistory 类不知何故没有 getLatestMessage 方法。 并且由于某种原因 textChannel.getHistory() 始终为空,因此始终返回 null。

是否有其他方式来读取消息(在机器人启动之前编写)。

一些附加信息: textchannel 是正确的 textchannel。 它不是空的,我还尝试在机器人处于活动状态时编写新消息。 但是消息历史总是空的。

还有一点我觉得很奇怪: textchannel.gethistory().isempty() 为真 textchannel.hasLastMessage 也是如此。

1 个答案:

答案 0 :(得分:1)

编辑:

执行以下操作:

channel.getHistory().retrievePast(1).queue(messages -> {
    // messages (list) contains all received messages
    // Access them in here
    // Use for example messages.get(0) to get the received message
    // (messages is of type List)
});
// DON'T access the received messages outside here
// If you use queue the received messages WON'T be available directly after the call

以前:

如果我在我的机器人上执行以下操作,它会起作用:

channel.getHistory().retrievePast(1).queue(messages -> {
    if (messages.size() > 0) System.out.println(messages.get(0).getContentDisplay());
});

调用成功并执行lambda后,调用

channel.getHistory().getRetrievedHistory()

应该返回收到的聊天记录


您也可以通过执行以下操作直接执行操作并阻塞当前线程,直到收到消息历史记录:

MessageHistory h = channel.getHistory();
h.retrievePast(1).complete();
List<Message> ml = h.getRetrievedHistory();
if (ml.size() > 0) System.out.println(ml.get(0).getContentDisplay());

但我不建议这样做,因为它会阻塞当前线程。改用我回答的第一部分中的代码,它不会阻止执行,并将用数据填充消息历史记录,一旦准备就绪,它将调用 lambda。

请注意,我将 1 作为参数传递给“retrievePast”。这只会接收文本通道内发送的最后一条消息。 我猜你不能接收整个文本通道,因为这将是昂贵的存储在RAM中的所有发送的数据或将只是采取长。