Как мне удастся кэшировать определенное количество сообщений в канале, даже если некоторые из этих сообщений будут удалены

#java #discord #discord-jda

Вопрос:

Моя проблема здесь в том, что всякий раз, когда сообщение отправляется в канал и удаляется, бот не может получить последнее удаленное сообщение, даже когда я использую, getRetrievedHistory() . Например,

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

Я даже пытался использовать, ...stream.map(m -> m.get(0).getContentDisplay)...

Комментарии:

1. getHistory().getRetrievedHistory() всегда возвращает пустой список. Прочитайте документы этого средства получения.

Ответ №1:

Это копируется непосредственно из JDA discord:

Получение содержимого удаленного сообщения — очень распространенная задача для ботов-модераторов. В настоящее время Discord API не поддерживает эту функцию.

В качестве обходного пути вам придется кэшировать сообщения самостоятельно, а затем выполнять поиск из этого кэша при удалении сообщения. Discord предоставляет идентификатор удаленного сообщения, поэтому этот подход является наиболее распространенным.

Это не 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

Комментарии:

1. А, понятно. Я нашел класс кэша от Google после просмотра бота, который использовал эту же систему. Спасибо за очень полезную информацию

2. Нет проблем, большинство кредитов идет на JDA discord, хотя я предлагаю присоединиться к нему, поскольку у них более современные методы и, вероятно, они могут помочь намного быстрее. discord.gg/jda

3. Извините, я не могу подключиться к этому серверу. Облажался на этом сервере

4. Для разработчиков Discord существует альтернативный сервер. discord.gg/discord-developers