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

Posted

技术标签:

【中文标题】即使删除了其中一些消息,我如何设法在频道中缓存一定数量的消息【英文标题】:How would I manage to cache a certain amount of messages within a channel even when some of those messages are deleted 【发布时间】:2022-01-04 22:35:06 【问题描述】:

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

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

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

【问题讨论】:

getHistory().getRetrievedHistory() always 返回一个空列表。阅读那个 getter 的文档。 【参考方案1】:

这是直接从 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);
  

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

这两个库可以更容易地将其作为缓存过期。所以你不会永远保留消息

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

【讨论】:

啊,我明白了。在查看了使用相同系统的机器人后,我发现了 Google 的缓存类。感谢您提供非常有用的见解 没问题,虽然大部分功劳归于 JDA discord,但我建议加入它,因为他们有更多最新的实践,并且可能会更快地提供帮助。 discord.gg/jda 抱歉,我无法加入该服务器。在那台服务器上搞砸了自己 Discord Developers 有一个替代服务器。 discord.gg/discord-developers

以上是关于即使删除了其中一些消息,我如何设法在频道中缓存一定数量的消息的主要内容,如果未能解决你的问题,请参考以下文章

删除频道中的每条消息

如何删除我的不和谐机器人在特定频道中发送的先前消息?

如何删除消息并将它们记录回另一个频道

discord.js 如何删除所有频道中包含黑名单的消息

Slack 清理频道中的所有消息(~8K)

通道缓存不连贯