Skip to content

Commit 9b06559

Browse files
enhancement: adds caching to DiscordResponseParser
1 parent b89c512 commit 9b06559

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@
66
import com.javadiscord.jdi.internal.api.DiscordRequestDispatcher;
77
import com.javadiscord.jdi.internal.api.DiscordResponse;
88
import com.javadiscord.jdi.internal.api.DiscordResponseFuture;
9+
import com.javadiscord.jdi.internal.cache.Cache;
910

11+
import java.lang.reflect.Field;
1012
import java.util.List;
1113
import java.util.Map;
1214

1315
public class DiscordResponseParser {
1416
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
1517
private final DiscordRequestDispatcher dispatcher;
18+
private final Cache cache;
1619

17-
public DiscordResponseParser(DiscordRequestDispatcher dispatcher) {
20+
public DiscordResponseParser(DiscordRequestDispatcher dispatcher, Cache cache) {
1821
this.dispatcher = dispatcher;
22+
this.cache = cache;
1923
}
2024

2125
public <T> AsyncResponse<List<T>> callAndParseList(Class<T> clazz, DiscordRequest request) {
@@ -27,6 +31,10 @@ public <T> AsyncResponse<List<T>> callAndParseList(Class<T> clazz, DiscordReques
2731
try {
2832
List<T> resultList = parseResponseFromList(clazz, response.body());
2933
asyncResponse.setResult(resultList);
34+
for (T result : resultList) {
35+
cacheResult(result);
36+
}
37+
} catch (NoSuchFieldException e) { // ignore
3038
} catch (Exception e) {
3139
asyncResponse.setException(e);
3240
}
@@ -38,6 +46,13 @@ public <T> AsyncResponse<List<T>> callAndParseList(Class<T> clazz, DiscordReques
3846
return asyncResponse;
3947
}
4048

49+
private <T> List<T> parseResponseFromList(Class<T> elementType, String response)
50+
throws JsonProcessingException {
51+
return OBJECT_MAPPER.readValue(
52+
response,
53+
OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, elementType));
54+
}
55+
4156
public <T> AsyncResponse<List<T>> callAndParseMap(String key, DiscordRequest request) {
4257
AsyncResponse<List<T>> asyncResponse = new AsyncResponse<>();
4358
DiscordResponseFuture future = dispatcher.queue(request);
@@ -47,7 +62,11 @@ public <T> AsyncResponse<List<T>> callAndParseMap(String key, DiscordRequest req
4762
try {
4863
List<T> resultList = parseResponseFromMap(key, response.body());
4964
asyncResponse.setResult(resultList);
50-
} catch (Exception e) {
65+
for(T result : resultList) {
66+
cacheResult(result);
67+
}
68+
} catch (NoSuchFieldException e) { // ignore
69+
} catch (Exception e){
5170
asyncResponse.setException(e);
5271
}
5372
} else {
@@ -58,13 +77,6 @@ public <T> AsyncResponse<List<T>> callAndParseMap(String key, DiscordRequest req
5877
return asyncResponse;
5978
}
6079

61-
private <T> List<T> parseResponseFromList(Class<T> elementType, String response)
62-
throws JsonProcessingException {
63-
return OBJECT_MAPPER.readValue(
64-
response,
65-
OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, elementType));
66-
}
67-
6880
private <T> List<T> parseResponseFromMap(String key, String response)
6981
throws JsonProcessingException {
7082
Map<String, List<T>> res =
@@ -90,14 +102,34 @@ private <T> void success(
90102
try {
91103
T result = OBJECT_MAPPER.readValue(response.body(), type);
92104
asyncResponse.setResult(result);
93-
} catch (JsonProcessingException e) {
105+
cacheResult(result);
106+
} catch(NoSuchFieldException e) { // ignore
107+
} catch (JsonProcessingException | IllegalAccessException e) {
94108
asyncResponse.setException(e);
95109
}
96110
} else {
97111
asyncResponse.setException(errorResponseException(response));
98112
}
99113
}
100114

115+
private <T> void cacheResult(T result) throws IllegalAccessException, NoSuchFieldException {
116+
Field guildIdField = result.getClass().getDeclaredField("guildId");
117+
Field idField = result.getClass().getDeclaredField("id");
118+
119+
long guildId = getLongFromField(guildIdField);
120+
long id = getLongFromField(idField);
121+
122+
cache.getCacheForGuild(guildId).add(id, result);
123+
}
124+
125+
private long getLongFromField(Field field) throws IllegalAccessException {
126+
field.setAccessible(true);
127+
if (field.getType() == String.class) {
128+
return Long.parseLong((String) field.get(field.getName()));
129+
}
130+
return (long) field.get(field.getName());
131+
}
132+
101133
private boolean isSuccessfulResponse(DiscordResponse response) {
102134
return response.status() >= 200 && response.status() < 300;
103135
}

core/src/main/java/com/javadiscord/jdi/core/Guild.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public Guild(com.javadiscord.jdi.core.models.guild.Guild guild, Cache cache, Dis
3131
long guildId = guild.id();
3232

3333
DiscordResponseParser discordResponseParser =
34-
new DiscordResponseParser(discord.getDiscordRequestDispatcher());
34+
new DiscordResponseParser(discord.getDiscordRequestDispatcher(), cache);
3535

3636
this.applicationRequest = new ApplicationRequest(discordResponseParser, guildId);
3737
this.applicationRoleConnectionMetaRequest =

0 commit comments

Comments
 (0)