diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java b/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java index 7f188669..d33fc9d3 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java @@ -3,10 +3,12 @@ import java.util.List; import java.util.Map; +import com.javadiscord.jdi.core.api.utils.CacheUpdater; import com.javadiscord.jdi.internal.api.DiscordRequest; import com.javadiscord.jdi.internal.api.DiscordRequestDispatcher; import com.javadiscord.jdi.internal.api.DiscordResponse; import com.javadiscord.jdi.internal.api.DiscordResponseFuture; +import com.javadiscord.jdi.internal.cache.Cache; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -14,9 +16,11 @@ public class DiscordResponseParser { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private final DiscordRequestDispatcher dispatcher; + private final CacheUpdater cacheUpdater; - public DiscordResponseParser(DiscordRequestDispatcher dispatcher) { + public DiscordResponseParser(DiscordRequestDispatcher dispatcher, Cache cache) { this.dispatcher = dispatcher; + this.cacheUpdater = new CacheUpdater(cache); } public AsyncResponse> callAndParseList(Class clazz, DiscordRequest request) { @@ -28,6 +32,7 @@ public AsyncResponse> callAndParseList(Class clazz, DiscordReques try { List resultList = parseResponseFromList(clazz, response.body()); asyncResponse.setResult(resultList); + cacheUpdater.updateCache(resultList); } catch (Exception e) { asyncResponse.setException(e); } @@ -49,6 +54,7 @@ public AsyncResponse> callAndParseMap(String key, DiscordRequest req try { List resultList = parseResponseFromMap(key, response.body()); asyncResponse.setResult(resultList); + cacheUpdater.updateCache(resultList); } catch (Exception e) { asyncResponse.setException(e); } @@ -105,6 +111,7 @@ private void success( result = OBJECT_MAPPER.readValue(response.body(), type); } asyncResponse.setResult(result); + cacheUpdater.updateCache(result); } catch (JsonProcessingException e) { asyncResponse.setException(e); } diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/utils/CacheUpdater.java b/api/src/main/java/com/javadiscord/jdi/core/api/utils/CacheUpdater.java new file mode 100644 index 00000000..9d323375 --- /dev/null +++ b/api/src/main/java/com/javadiscord/jdi/core/api/utils/CacheUpdater.java @@ -0,0 +1,63 @@ +package com.javadiscord.jdi.core.api.utils; + +import java.lang.reflect.Field; +import java.util.List; + +import com.javadiscord.jdi.internal.cache.Cache; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class CacheUpdater { + + private final Cache cache; + + private static final Logger LOGGER = LogManager.getLogger(CacheUpdater.class); + + public CacheUpdater(Cache cache) { + this.cache = cache; + } + + public void updateCache(T result) { + if (result == null) { + return; + } + try { + Field guildIdField = result.getClass().getDeclaredField("guildId"); + Field idField = result.getClass().getDeclaredField("id"); + + long guildId = getLongFromField(guildIdField, result); + long id = getLongFromField(idField, result); + + if (cache.getCacheForGuild(guildId) == null) { + LOGGER.trace( + "Failed to cache result of type {} with guildId of {}", + result.getClass().getName(), guildId + ); + } else { + cache.getCacheForGuild(guildId).add(id, result); + } + + } catch (IllegalAccessException | NoSuchFieldException | NumberFormatException e) { + LOGGER.trace( + "Failed to cache result of type {}, cause: {}", + result.getClass().getName(), e.getMessage() + ); + } + } + + public void updateCache(List resultList) { + resultList.forEach(this::updateCache); + } + + private long getLongFromField( + Field field, + T result + ) throws IllegalAccessException, NumberFormatException { + field.setAccessible(true); + if (field.getType() == String.class) { + return Long.parseLong((String) field.get(result)); + } + return (long) field.get(result); + } +} diff --git a/core/src/main/java/com/javadiscord/jdi/core/Guild.java b/core/src/main/java/com/javadiscord/jdi/core/Guild.java index 5b684774..92f67835 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Guild.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Guild.java @@ -32,7 +32,7 @@ public Guild(com.javadiscord.jdi.core.models.guild.Guild guild, Cache cache, Dis long guildId = guild.id(); DiscordResponseParser discordResponseParser = - new DiscordResponseParser(discord.getDiscordRequestDispatcher()); + new DiscordResponseParser(discord.getDiscordRequestDispatcher(), cache); this.applicationRequest = new ApplicationRequest(discordResponseParser, guildId); this.applicationRoleConnectionMetaRequest =