Skip to content

Commit f078921

Browse files
Fixes bugs in DiscordResponseParser (#113)
* fix: adds callAndParseMap to handle map responses * fix: adds error handling for callAndParseMap and callAndParseList
1 parent 93d6ecc commit f078921

File tree

2 files changed

+56
-16
lines changed

2 files changed

+56
-16
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public AuditLogsRequest(DiscordResponseParser responseParser, long guildId) {
1515
}
1616

1717
public AsyncResponse<List<AuditLogEntry>> getAuditLogs(GetAuditLogsBuilder builder) {
18-
return responseParser.callAndParseList(
19-
AuditLogEntry.class, builder.guildId(guildId).build());
18+
return responseParser.callAndParseMap(
19+
"audit_log_entries", builder.guildId(guildId).build());
2020
}
2121
}

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

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.javadiscord.jdi.internal.api.DiscordResponseFuture;
99

1010
import java.util.List;
11+
import java.util.Map;
1112

1213
public class DiscordResponseParser {
1314
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@@ -21,25 +22,60 @@ public <T> AsyncResponse<List<T>> callAndParseList(Class<T> clazz, DiscordReques
2122
AsyncResponse<List<T>> asyncResponse = new AsyncResponse<>();
2223
DiscordResponseFuture future = dispatcher.queue(request);
2324
future.onSuccess(
24-
res -> {
25-
try {
26-
List<T> resultList = parseResponse(clazz, res.body());
27-
asyncResponse.setResult(resultList);
28-
} catch (Exception e) {
29-
asyncResponse.setException(e);
25+
response -> {
26+
if (isSuccessfulResponse(response)) {
27+
try {
28+
List<T> resultList = parseResponseFromList(clazz, response.body());
29+
asyncResponse.setResult(resultList);
30+
} catch (Exception e) {
31+
asyncResponse.setException(e);
32+
}
33+
} else {
34+
asyncResponse.setException(errorResponseException(response));
3035
}
3136
});
3237
future.onError(asyncResponse::setException);
3338
return asyncResponse;
3439
}
3540

36-
private <T> List<T> parseResponse(Class<T> elementType, String response)
41+
public <T> AsyncResponse<List<T>> callAndParseMap(String key, DiscordRequest request) {
42+
AsyncResponse<List<T>> asyncResponse = new AsyncResponse<>();
43+
DiscordResponseFuture future = dispatcher.queue(request);
44+
future.onSuccess(
45+
response -> {
46+
if (isSuccessfulResponse(response)) {
47+
try {
48+
List<T> resultList = parseResponseFromMap(key, response.body());
49+
asyncResponse.setResult(resultList);
50+
} catch (Exception e) {
51+
asyncResponse.setException(e);
52+
}
53+
} else {
54+
asyncResponse.setException(errorResponseException(response));
55+
}
56+
});
57+
future.onError(asyncResponse::setException);
58+
return asyncResponse;
59+
}
60+
61+
private <T> List<T> parseResponseFromList(Class<T> elementType, String response)
3762
throws JsonProcessingException {
3863
return OBJECT_MAPPER.readValue(
3964
response,
4065
OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, elementType));
4166
}
4267

68+
private <T> List<T> parseResponseFromMap(String key, String response)
69+
throws JsonProcessingException {
70+
Map<String, List<T>> res =
71+
OBJECT_MAPPER.readValue(
72+
response,
73+
OBJECT_MAPPER
74+
.getTypeFactory()
75+
.constructMapType(Map.class, String.class, List.class));
76+
return res.get(key);
77+
}
78+
4379
public <T> AsyncResponse<T> callAndParse(Class<T> clazz, DiscordRequest request) {
4480
AsyncResponse<T> asyncResponse = new AsyncResponse<>();
4581
DiscordResponseFuture future = dispatcher.queue(request);
@@ -50,20 +86,24 @@ public <T> AsyncResponse<T> callAndParse(Class<T> clazz, DiscordRequest request)
5086

5187
private <T> void success(
5288
Class<T> type, DiscordResponse response, AsyncResponse<T> asyncResponse) {
53-
if (response.status() >= 200 && response.status() < 300) {
89+
if (isSuccessfulResponse(response)) {
5490
try {
5591
T result = OBJECT_MAPPER.readValue(response.body(), type);
5692
asyncResponse.setResult(result);
5793
} catch (JsonProcessingException e) {
5894
asyncResponse.setException(e);
5995
}
6096
} else {
61-
asyncResponse.setException(
62-
new Exception(
63-
"Received HTTP status code "
64-
+ response.status()
65-
+ " "
66-
+ response.body()));
97+
asyncResponse.setException(errorResponseException(response));
6798
}
6899
}
100+
101+
private boolean isSuccessfulResponse(DiscordResponse response) {
102+
return response.status() >= 200 && response.status() < 300;
103+
}
104+
105+
private Throwable errorResponseException(DiscordResponse response) {
106+
return new Exception(
107+
"Received HTTP status code " + response.status() + " " + response.body());
108+
}
69109
}

0 commit comments

Comments
 (0)