即使删除了其中一些消息,我如何设法在通道中缓存一定数量的消息

How would I manage to cache a certain amount of messages within a channel even when some of those messages are deleted

我的问题是,每当将消息发送到频道并删除时,即使我使用 getRetrievedHistory(),机器人也无法检索最新删除的消息。例如,

event.getChannel().getHistory().getRetrievedHistory().get(0).getContentDisplay())

我什至尝试使用,...stream.map(m -> m.get(0).getContentDisplay)...

这是直接从JDA discord复制过来的

获取已删除邮件的内容是审核机器人的一项非常常见的任务。目前,Discord API 不支持此功能。

作为变通方法,您必须自己缓存消息,然后在删除消息时从该缓存中查找。 Discord确实提供了被删除消息的ID,所以这种方式是最常见的。

这不是 100% 完美的解决方案,因为缓存不会在机器人加入之前/当机器人离线时发送任何消息,但它适用于大多数用例。

这样的缓存看起来像这样:

public class MessageCache {
  private final Map<Long, CachedMessage> cache = new ConcurrentHashMap<>(); // we use a ConcurrentHashMap for thread safety
                                                                            

  public void add(Message m) {
    cache.put(m.getIdLong(), new CachedMessage(m));
  }

  public void delete(long id) {
    cache.remove(id);
  }

  @Nullable // we might not have the message cached
  public CachedMessage get(long id) {
    return cache.get(id);
  }
}

这是一个天真的解决方案,它不会使消息过期,这意味着它们只会留在缓存中并占用内存。 此外,它不会在邮件被删除时删除邮件,除非您专门执行此操作。

这 2 个库可以更轻松地将其作为缓存进行导出。所以你不会永远保留消息

https://github.com/jhalterman/expiringmap https://github.com/ben-manes/caffeine