当前位置: 首页 > 知识库问答 >
问题:

JDA不和谐机器人,读取文本频道的最后一条消息

法子昂
2023-03-14

我希望我的Discord jda bot在启动后读取textchannel的最后一条消息。

所以我打电话:

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

MessageHistory类没有getLatestMessage方法。出于某种原因,我选择了短信频道。getHistory()始终为空,因此始终返回null。

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

一些附加信息:文本频道是正确的文本频道。它不是空的,我也试着在机器人活跃的时候写新消息。但是信息历史总是空的。

还有一些我觉得奇怪的事情:textchannel.gethistory(). is空()是真的,textchannel.hasLastMessage也是真的。

共有1个答案

徐鸿文
2023-03-14

执行以下操作:

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中会非常昂贵,或者只需要很长时间。

 类似资料:
  • 我正在尝试让我的JDA discord bot删除文本频道中的所有消息,目前我使用的代码效率极低,偶尔有效,有时无效。代码: 我知道一个事实,我正在调用函数,我知道一个事实,正在传递的文本通道是正确的。请帮我同样的忙。

  • 我觉得我对这个话题的所有研究只会让我找到过时的解决方案。 与我的不和。js机器人,我有一个命令。为了让它工作,我需要在命令发出之前获取通道中的最后一条消息。我正在努力处理所有的抓取、分区和缓存等问题。 有时,当我在机器人启动后立即发布消息并使用上面的命令时,它会起作用,但是如果我重新启动机器人,它似乎会得到错误的消息。另外,超过14天的邮件怎么办? 我不能真正提供代码,因为它只有一行,比如:

  • 我希望我的不和谐机器人加入语音频道。但是我遇到了一个问题,每当我想让它加入风投时,什么都不会发生——甚至没有错误。我尝试过SO/Git的其他解决方案,但没有一个适合我(下面有一个)。 编辑:解决了!问题是:没有不和。已安装py[语音]模块。解决方案:

  • 我正在努力让我的机器人进入语音频道,我已经阅读了这里的很多帖子,但没有一篇能够解决我的问题,我正在尝试让我的机器人复制yt视频的声音,但它甚至没有加入,我不知道该怎么办,下面是代码:

  • 我使用Python3.6idle编写了一个bot,我想添加一个命令,但我不知道如何添加它。你们中的一些人能帮我举一些例子或建议吗?我会很高兴的,谢谢。

  • 当用户使用搜索命令时,我的机器人将用结果和表情符号回复。如何检查用户是否单击此表情符号? 事件回复(idResults.getMovieResults()。获取(0)。toString())。队列();事件getChannel()。sendMessage(“单击将其添加到您关注的列表中”)。队列(msg)-