#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