6
6
import com .javadiscord .jdi .internal .api .DiscordRequestDispatcher ;
7
7
import com .javadiscord .jdi .internal .api .DiscordResponse ;
8
8
import com .javadiscord .jdi .internal .api .DiscordResponseFuture ;
9
+ import com .javadiscord .jdi .internal .cache .Cache ;
9
10
11
+ import java .lang .reflect .Field ;
10
12
import java .util .List ;
11
13
import java .util .Map ;
12
14
13
15
public class DiscordResponseParser {
14
16
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper ();
15
17
private final DiscordRequestDispatcher dispatcher ;
18
+ private final Cache cache ;
16
19
17
- public DiscordResponseParser (DiscordRequestDispatcher dispatcher ) {
20
+ public DiscordResponseParser (DiscordRequestDispatcher dispatcher , Cache cache ) {
18
21
this .dispatcher = dispatcher ;
22
+ this .cache = cache ;
19
23
}
20
24
21
25
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
27
31
try {
28
32
List <T > resultList = parseResponseFromList (clazz , response .body ());
29
33
asyncResponse .setResult (resultList );
34
+ for (T result : resultList ) {
35
+ cacheResult (result );
36
+ }
37
+ } catch (NoSuchFieldException e ) { // ignore
30
38
} catch (Exception e ) {
31
39
asyncResponse .setException (e );
32
40
}
@@ -38,6 +46,13 @@ public <T> AsyncResponse<List<T>> callAndParseList(Class<T> clazz, DiscordReques
38
46
return asyncResponse ;
39
47
}
40
48
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
+
41
56
public <T > AsyncResponse <List <T >> callAndParseMap (String key , DiscordRequest request ) {
42
57
AsyncResponse <List <T >> asyncResponse = new AsyncResponse <>();
43
58
DiscordResponseFuture future = dispatcher .queue (request );
@@ -47,7 +62,11 @@ public <T> AsyncResponse<List<T>> callAndParseMap(String key, DiscordRequest req
47
62
try {
48
63
List <T > resultList = parseResponseFromMap (key , response .body ());
49
64
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 ){
51
70
asyncResponse .setException (e );
52
71
}
53
72
} else {
@@ -58,13 +77,6 @@ public <T> AsyncResponse<List<T>> callAndParseMap(String key, DiscordRequest req
58
77
return asyncResponse ;
59
78
}
60
79
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
-
68
80
private <T > List <T > parseResponseFromMap (String key , String response )
69
81
throws JsonProcessingException {
70
82
Map <String , List <T >> res =
@@ -90,14 +102,34 @@ private <T> void success(
90
102
try {
91
103
T result = OBJECT_MAPPER .readValue (response .body (), type );
92
104
asyncResponse .setResult (result );
93
- } catch (JsonProcessingException e ) {
105
+ cacheResult (result );
106
+ } catch (NoSuchFieldException e ) { // ignore
107
+ } catch (JsonProcessingException | IllegalAccessException e ) {
94
108
asyncResponse .setException (e );
95
109
}
96
110
} else {
97
111
asyncResponse .setException (errorResponseException (response ));
98
112
}
99
113
}
100
114
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
+
101
133
private boolean isSuccessfulResponse (DiscordResponse response ) {
102
134
return response .status () >= 200 && response .status () < 300 ;
103
135
}
0 commit comments