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