Skip to content

Commit b460204

Browse files
committed
Move to Jackson from Gson
1 parent cbffef5 commit b460204

32 files changed

Lines changed: 372 additions & 512 deletions

bootstrap/geyser/src/main/java/com/rtm516/mcxboxbroadcast/boostrap/geyser/Main.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public void onPostInitialize(GeyserPreInitializeEvent event) {
2525

2626
SessionManager sessionManager = new SessionManager(this.dataFolder().toString());
2727

28+
// Taken from core Geyser code
2829
String ip = GeyserImpl.getInstance().getConfig().getBedrock().getAddress();
2930
try {
3031
// This is the most reliable for getting the main local IP

core/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
<dependencies>
2020
<dependency>
21-
<groupId>com.google.code.gson</groupId>
22-
<artifactId>gson</artifactId>
23-
<version>2.9.0</version>
21+
<groupId>com.fasterxml.jackson.core</groupId>
22+
<artifactId>jackson-databind</artifactId>
23+
<version>2.13.2</version>
2424
</dependency>
2525
<dependency>
2626
<groupId>com.nimbusds</groupId>

core/src/main/java/com/rtm516/mcxboxbroadcast/core/Constants.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.rtm516.mcxboxbroadcast.core;
22

3-
import com.google.gson.Gson;
4-
import com.google.gson.GsonBuilder;
3+
import com.fasterxml.jackson.databind.ObjectMapper;
54

65
import java.net.URI;
76

87
public class Constants {
9-
public static final Gson GSON = new GsonBuilder().create();
8+
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
109

1110
public static final String AUTH_TITLE = "00000000441cc96b";
1211
public static final String SCOPE = "service::user.auth.xboxlive.com::MBI_SSL";

core/src/main/java/com/rtm516/mcxboxbroadcast/core/LiveTokenManager.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ public LiveTokenManager(String cache, HttpClient httpClient) {
2727
public boolean verifyTokens() {
2828
LiveTokenCache tokenCache = getCache();
2929

30-
if (tokenCache.obtainedOn() == 0L) {
30+
if (tokenCache.obtainedOn == 0L) {
3131
return false;
3232
}
3333

34-
long expiry = tokenCache.obtainedOn() + (tokenCache.token().expires_in() * 1000L);
34+
long expiry = tokenCache.obtainedOn + (tokenCache.token.expires_in * 1000L);
3535
boolean valid = (expiry - System.currentTimeMillis()) > 1000;
3636

3737
if (!valid) {
@@ -58,16 +58,16 @@ private void refreshToken() throws Exception {
5858
.POST(HttpRequest.BodyPublishers.ofString("scope=" + Constants.SCOPE + "&client_id=" + Constants.AUTH_TITLE + "&grant_type=refresh_token&refresh_token=" + refreshToken))
5959
.build();
6060

61-
LiveTokenResponse tokenResponse = Constants.GSON.fromJson(httpClient.send(tokenRequest, HttpResponse.BodyHandlers.ofString()).body(), LiveTokenResponse.class);
61+
LiveTokenResponse tokenResponse = Constants.OBJECT_MAPPER.readValue(httpClient.send(tokenRequest, HttpResponse.BodyHandlers.ofString()).body(), LiveTokenResponse.class);
6262
updateCache(tokenResponse);
6363
}
6464

6565
public String getAccessToken() {
66-
return getCache().token().access_token();
66+
return getCache().token.access_token;
6767
}
6868

6969
private String getRefreshToken() {
70-
return getCache().token().refresh_token();
70+
return getCache().token.refresh_token;
7171
}
7272

7373
public Future<String> authDeviceCode() {
@@ -80,30 +80,32 @@ public Future<String> authDeviceCode() {
8080
.POST(HttpRequest.BodyPublishers.ofString("scope=" + Constants.SCOPE + "&client_id=" + Constants.AUTH_TITLE + "&response_type=device_code"))
8181
.build();
8282

83-
LiveDeviceCodeResponse codeResponse = Constants.GSON.fromJson(httpClient.send(codeRequest, HttpResponse.BodyHandlers.ofString()).body(), LiveDeviceCodeResponse.class);
83+
HttpResponse<String> response = httpClient.send(codeRequest, HttpResponse.BodyHandlers.ofString());
8484

85-
long expireTime = System.currentTimeMillis() + (codeResponse.expires_in() * 1000L);
85+
LiveDeviceCodeResponse codeResponse = Constants.OBJECT_MAPPER.readValue(response.body(), LiveDeviceCodeResponse.class);
8686

87-
System.out.println("To sign in, use a web browser to open the page " + codeResponse.verification_uri() + " and enter the code " + codeResponse.user_code() + " to authenticate.");
87+
long expireTime = System.currentTimeMillis() + (codeResponse.expires_in * 1000L);
88+
89+
System.out.println("To sign in, use a web browser to open the page " + codeResponse.verification_uri + " and enter the code " + codeResponse.user_code + " to authenticate.");
8890

8991
while (System.currentTimeMillis() < expireTime) {
90-
Thread.sleep(codeResponse.interval() * 1000L);
92+
Thread.sleep(codeResponse.interval * 1000L);
9193

9294
HttpRequest tokenRequest = HttpRequest.newBuilder()
9395
.uri(Constants.LIVE_TOKEN_REQUEST)
9496
.header("Content-Type", "application/x-www-form-urlencoded")
95-
.POST(HttpRequest.BodyPublishers.ofString("device_code=" + codeResponse.device_code() + "&client_id=" + Constants.AUTH_TITLE + "&grant_type=urn:ietf:params:oauth:grant-type:device_code"))
97+
.POST(HttpRequest.BodyPublishers.ofString("device_code=" + codeResponse.device_code + "&client_id=" + Constants.AUTH_TITLE + "&grant_type=urn:ietf:params:oauth:grant-type:device_code"))
9698
.build();
9799

98-
LiveTokenResponse tokenResponse = Constants.GSON.fromJson(httpClient.send(tokenRequest, HttpResponse.BodyHandlers.ofString()).body(), LiveTokenResponse.class);
100+
LiveTokenResponse tokenResponse = Constants.OBJECT_MAPPER.readValue(httpClient.send(tokenRequest, HttpResponse.BodyHandlers.ofString()).body(), LiveTokenResponse.class);
99101

100-
if (tokenResponse.error() != null && !tokenResponse.error().isEmpty()) {
101-
if (!tokenResponse.error().equals("authorization_pending")) {
102+
if (tokenResponse.error != null && !tokenResponse.error.isEmpty()) {
103+
if (!tokenResponse.error.equals("authorization_pending")) {
102104
// TODO handle error
103105
}
104106
} else {
105107
updateCache(tokenResponse);
106-
completableFuture.complete(tokenResponse.access_token());
108+
completableFuture.complete(tokenResponse.access_token);
107109
break;
108110
}
109111
}
@@ -116,15 +118,15 @@ public Future<String> authDeviceCode() {
116118

117119
private LiveTokenCache getCache() {
118120
try {
119-
return Constants.GSON.fromJson(Files.readString(cache), LiveTokenCache.class);
121+
return Constants.OBJECT_MAPPER.readValue(Files.readString(cache), LiveTokenCache.class);
120122
} catch (IOException e) {
121-
return new LiveTokenCache(0, new LiveTokenResponse(null, null, 0, null, null, null, null));
123+
return new LiveTokenCache();
122124
}
123125
}
124126

125127
private void updateCache(LiveTokenResponse tokenResponse) {
126128
try (FileWriter writer = new FileWriter(cache.toString(), StandardCharsets.UTF_8)) {
127-
Constants.GSON.toJson(new LiveTokenCache(System.currentTimeMillis(), tokenResponse), writer);
129+
Constants.OBJECT_MAPPER.writeValue(writer, new LiveTokenCache(System.currentTimeMillis(), tokenResponse));
128130
} catch (IOException e) {
129131
e.printStackTrace();
130132
// TODO Handle properly

core/src/main/java/com/rtm516/mcxboxbroadcast/core/RtaWebsocketClient.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.rtm516.mcxboxbroadcast.core;
22

3-
import com.google.gson.internal.LinkedTreeMap;
3+
import com.fasterxml.jackson.core.JsonProcessingException;
44
import org.java_websocket.client.WebSocketClient;
55
import org.java_websocket.handshake.ServerHandshake;
66

@@ -26,8 +26,10 @@ public void onOpen(ServerHandshake serverHandshake) {
2626
@Override
2727
public void onMessage(String message) {
2828
if (message.contains("ConnectionId")) {
29-
Object[] parts = Constants.GSON.fromJson(message, Object[].class);
30-
connectionId = ((LinkedTreeMap<String, String>)parts[4]).get("ConnectionId");
29+
try {
30+
Object[] parts = Constants.OBJECT_MAPPER.readValue(message, Object[].class);
31+
connectionId = ((Map<String, String>)parts[4]).get("ConnectionId");
32+
} catch (JsonProcessingException ignored) { }
3133
}
3234
}
3335

core/src/main/java/com/rtm516/mcxboxbroadcast/core/SessionManager.java

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.rtm516.mcxboxbroadcast.core;
22

3+
import com.fasterxml.jackson.core.JsonProcessingException;
34
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionCreationException;
45
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionUpdateException;
56
import com.rtm516.mcxboxbroadcast.core.models.CreateHandleRequest;
6-
import com.rtm516.mcxboxbroadcast.core.models.CreateHandleRequestSessionRef;
77
import com.rtm516.mcxboxbroadcast.core.models.CreateSessionRequest;
88
import com.rtm516.mcxboxbroadcast.core.models.XboxTokenInfo;
99

@@ -84,29 +84,34 @@ public void createSession(SessionInfo sessionInfo) throws SessionCreationExcepti
8484
throw new SessionCreationException("Unable to get connectionId for session: " + e.getMessage());
8585
}
8686

87-
this.sessionInfo = new ExpandedSessionInfo(connectionId, tokenInfo.userXUID(), sessionInfo);
87+
this.sessionInfo = new ExpandedSessionInfo(connectionId, tokenInfo.userXUID, sessionInfo);
8888

8989
updateSession();
9090

9191
CreateHandleRequest createHandleContent = new CreateHandleRequest(
9292
1,
9393
"activity",
94-
new CreateHandleRequestSessionRef(
94+
new CreateHandleRequest.SessionRef(
9595
Constants.SERVICE_CONFIG_ID,
9696
"MinecraftLobby",
9797
this.sessionInfo.getSessionId()
9898
)
9999
);
100100

101-
HttpRequest createHandleRequest = HttpRequest.newBuilder()
102-
.uri(Constants.CREATE_HANDLE)
103-
.header("Content-Type", "application/json")
104-
.header("Authorization", token)
105-
.header("x-xbl-contract-version", "107")
106-
.POST(HttpRequest.BodyPublishers.ofString(Constants.GSON.toJson(createHandleContent)))
107-
.build();
101+
HttpRequest createHandleRequest;
102+
try {
103+
createHandleRequest = HttpRequest.newBuilder()
104+
.uri(Constants.CREATE_HANDLE)
105+
.header("Content-Type", "application/json")
106+
.header("Authorization", token)
107+
.header("x-xbl-contract-version", "107")
108+
.POST(HttpRequest.BodyPublishers.ofString(Constants.OBJECT_MAPPER.writeValueAsString(createHandleContent)))
109+
.build();
110+
} catch (JsonProcessingException e) {
111+
throw new SessionCreationException("Unable to create session handle, error parsing json: " + e.getMessage());
112+
}
108113

109-
HttpResponse<String> createHandleResponse = null;
114+
HttpResponse<String> createHandleResponse;
110115
try {
111116
createHandleResponse = httpClient.send(createHandleRequest, HttpResponse.BodyHandlers.ofString());
112117
} catch (IOException | InterruptedException e) {
@@ -126,13 +131,18 @@ public void updateSession(SessionInfo sessionInfo) throws SessionUpdateException
126131
private void updateSession() throws SessionUpdateException {
127132
CreateSessionRequest createSessionContent = new CreateSessionRequest(this.sessionInfo);
128133

129-
HttpRequest createSessionRequest = HttpRequest.newBuilder()
130-
.uri(URI.create(Constants.CREATE_SESSION + this.sessionInfo.getSessionId()))
131-
.header("Content-Type", "application/json")
132-
.header("Authorization", getTokenHeader())
133-
.header("x-xbl-contract-version", "107")
134-
.PUT(HttpRequest.BodyPublishers.ofString(Constants.GSON.toJson(createSessionContent)))
135-
.build();
134+
HttpRequest createSessionRequest;
135+
try {
136+
createSessionRequest = HttpRequest.newBuilder()
137+
.uri(URI.create(Constants.CREATE_SESSION + this.sessionInfo.getSessionId()))
138+
.header("Content-Type", "application/json")
139+
.header("Authorization", getTokenHeader())
140+
.header("x-xbl-contract-version", "107")
141+
.PUT(HttpRequest.BodyPublishers.ofString(Constants.OBJECT_MAPPER.writeValueAsString(createSessionContent)))
142+
.build();
143+
} catch (JsonProcessingException e) {
144+
throw new SessionUpdateException("Unable to update session information, error parsing json: " + e.getMessage());
145+
}
136146

137147
HttpResponse<String> createSessionResponse;
138148
try {
@@ -142,7 +152,7 @@ private void updateSession() throws SessionUpdateException {
142152
}
143153

144154
if (createSessionResponse.statusCode() != 200 && createSessionResponse.statusCode() != 201) {
145-
throw new SessionUpdateException("Unable to update session, got status " + createSessionResponse.statusCode() + " trying to update");
155+
throw new SessionUpdateException("Unable to update session information, got status " + createSessionResponse.statusCode() + " trying to update");
146156
}
147157
}
148158

0 commit comments

Comments
 (0)