即使删除了其中一些消息,我如何设法在通道中缓存一定数量的消息
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
我的问题是,每当将消息发送到频道并删除时,即使我使用 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