JDA Discord 机器人,读取文本通道的最后一条消息
JDA Discord bot, read last message of textchannel
我希望我的 Discord jda 机器人在启动后读取文本通道的最后一条消息。
所以我打电话给:
textChannel.getHistory().getMessageById(config.getLatestMessageId());
MessageHistory class 不知何故没有 getLatestMessage 方法。
由于某种原因 textChannel.getHistory() 总是空的,因此总是 return 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()
应该return收到的聊天记录
您也可以直接执行操作并阻塞当前线程,直到收到消息历史记录,方法如下:
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 中会非常昂贵,否则会花费很长时间。
我希望我的 Discord jda 机器人在启动后读取文本通道的最后一条消息。
所以我打电话给:
textChannel.getHistory().getMessageById(config.getLatestMessageId());
MessageHistory class 不知何故没有 getLatestMessage 方法。 由于某种原因 textChannel.getHistory() 总是空的,因此总是 return 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()
应该return收到的聊天记录
您也可以直接执行操作并阻塞当前线程,直到收到消息历史记录,方法如下:
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 中会非常昂贵,否则会花费很长时间。