java - JDA Discord bot,阅读 textchannel 的最后一条消息
问题描述
我希望我的 Discord jda 机器人在启动后读取文本通道的最后一条消息。
所以我打电话:
textChannel.getHistory().getMessageById(config.getLatestMessageId());
MessageHistory 类没有 getLatestMessage 方法。并且由于某种原因 textChannel.getHistory() 始终为空,因此始终返回 null。
是否有其他方式来阅读消息(在机器人启动之前编写)。
一些附加信息:文本通道是正确的文本通道。它不是空的,我还尝试在机器人处于活动状态时编写新消息。但是消息历史总是空的。
还有一些我觉得很奇怪的东西:
textchannel.gethistory().isempty()
是真实的,textchannel.hasLastMessage
也是真实的。
解决方案
编辑:
请执行下列操作:
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 中会很昂贵,或者需要很长时间。
推荐阅读
- javascript - 调整图像大小以适合屏幕
- python - 使用 Python 找出两个 excel 中缺失的事务
- python - DRF 如何使注册 api 视图仅适用于我的反应应用程序
- java - 通过 serverless-framework 调试 java 函数调用本地
- bash - 检索印记/已知值之前的单词
- java - 如何为超类中的 List 元素使用不同的子类
- ruby-on-rails - Chartkick - 以百分比表示的堆积垂直图
- apache-kafka - 动态路由/复制到 Kafka 2 中的多个主题
- python - 如何使用 __str__ 更改对象属性的显示方式?
- node.js - 我如何解析来自 nrf24 缓冲区的 JSON?