Skip to content

Commit ffa427f

Browse files
committed
Restart almost full sessions
Minecraft forces 30 member max sessions so this restarts the session if we hit 28 players+
1 parent 194d4c6 commit ffa427f

38 files changed

Lines changed: 253 additions & 197 deletions

bootstrap/geyser/src/main/java/com/rtm516/mcxboxbroadcast/bootstrap/geyser/MCXboxBroadcastExtension.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionCreationException;
88
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionUpdateException;
99
import com.rtm516.mcxboxbroadcast.core.exceptions.XboxFriendsException;
10-
import com.rtm516.mcxboxbroadcast.core.models.FollowerResponse;
10+
import com.rtm516.mcxboxbroadcast.core.models.session.FollowerResponse;
1111
import org.geysermc.event.subscribe.Subscribe;
1212
import org.geysermc.floodgate.util.Utils;
1313
import org.geysermc.floodgate.util.WhitelistUtils;

core/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ plugins {
33
}
44

55
dependencies {
6-
api(libs.jackson.databind)
6+
api(libs.bundles.jackson.databind)
77
api(libs.nimbus.jose.jwt)
88
api(libs.java.websocket)
99
}

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

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

3+
import com.fasterxml.jackson.annotation.JsonInclude;
34
import com.fasterxml.jackson.databind.DeserializationFeature;
45
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
57

68
import java.net.URI;
79

810
public class Constants {
9-
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
11+
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
12+
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
13+
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
14+
.registerModule(new JavaTimeModule());
1015

1116
public static final String AUTH_TITLE = "0000000048183522"; // 00000000441cc96b Nintendo Switch, 0000000048183522 Android
1217
public static final String SCOPE = "service::user.auth.xboxlive.com::MBI_SSL";

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.rtm516.mcxboxbroadcast.core.configs.FriendSyncConfig;
44
import com.rtm516.mcxboxbroadcast.core.exceptions.XboxFriendsException;
5-
import com.rtm516.mcxboxbroadcast.core.models.FollowerResponse;
5+
import com.rtm516.mcxboxbroadcast.core.models.session.FollowerResponse;
66

77
import java.io.IOException;
88
import java.net.URI;

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

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

33
import com.rtm516.mcxboxbroadcast.core.exceptions.LiveAuthenticationException;
4-
import com.rtm516.mcxboxbroadcast.core.models.LiveDeviceCodeResponse;
5-
import com.rtm516.mcxboxbroadcast.core.models.LiveTokenCache;
6-
import com.rtm516.mcxboxbroadcast.core.models.LiveTokenResponse;
4+
import com.rtm516.mcxboxbroadcast.core.models.auth.LiveDeviceCodeResponse;
5+
import com.rtm516.mcxboxbroadcast.core.models.auth.LiveTokenCache;
6+
import com.rtm516.mcxboxbroadcast.core.models.auth.LiveTokenResponse;
77

88
import java.io.FileWriter;
99
import java.io.IOException;

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

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

3+
import com.fasterxml.jackson.core.JsonProcessingException;
34
import com.rtm516.mcxboxbroadcast.core.configs.FriendSyncConfig;
45
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionCreationException;
56
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionUpdateException;
6-
import com.rtm516.mcxboxbroadcast.core.models.CreateSessionRequest;
7+
import com.rtm516.mcxboxbroadcast.core.models.session.CreateSessionRequest;
8+
import com.rtm516.mcxboxbroadcast.core.models.session.CreateSessionResponse;
79
import org.java_websocket.util.NamedThreadFactory;
810

911
import java.io.File;
@@ -113,7 +115,24 @@ protected void updateSession() throws SessionUpdateException {
113115
// Make sure the websocket connection is still active
114116
checkConnection();
115117

116-
super.updateSessionInternal(Constants.CREATE_SESSION.formatted(this.sessionInfo.getSessionId()), new CreateSessionRequest(this.sessionInfo));
118+
String responseBody = super.updateSessionInternal(Constants.CREATE_SESSION.formatted(this.sessionInfo.getSessionId()), new CreateSessionRequest(this.sessionInfo));
119+
try {
120+
CreateSessionResponse sessionResponse = Constants.OBJECT_MAPPER.readValue(responseBody, CreateSessionResponse.class);
121+
122+
// Restart if we have 28/30 session members
123+
int players = sessionResponse.members().size();
124+
if (players >= 28) {
125+
logger.info("Restarting session due to " + players + "/30 players");
126+
try {
127+
shutdown();
128+
init(sessionInfo, friendSyncConfig);
129+
} catch (SessionCreationException e) {
130+
throw new SessionUpdateException(e.getMessage());
131+
}
132+
}
133+
} catch (JsonProcessingException e) {
134+
throw new SessionUpdateException("Failed to parse session response: " + e.getMessage());
135+
}
117136
}
118137

119138
/**

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionCreationException;
55
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionUpdateException;
6-
import com.rtm516.mcxboxbroadcast.core.models.CreateHandleRequest;
7-
import com.rtm516.mcxboxbroadcast.core.models.CreateHandleResponse;
8-
import com.rtm516.mcxboxbroadcast.core.models.SISUAuthenticationResponse;
9-
import com.rtm516.mcxboxbroadcast.core.models.SessionRef;
10-
import com.rtm516.mcxboxbroadcast.core.models.SocialSummaryResponse;
11-
import com.rtm516.mcxboxbroadcast.core.models.XboxTokenInfo;
6+
import com.rtm516.mcxboxbroadcast.core.models.session.CreateHandleRequest;
7+
import com.rtm516.mcxboxbroadcast.core.models.session.CreateHandleResponse;
8+
import com.rtm516.mcxboxbroadcast.core.models.auth.SISUAuthenticationResponse;
9+
import com.rtm516.mcxboxbroadcast.core.models.session.SessionRef;
10+
import com.rtm516.mcxboxbroadcast.core.models.session.SocialSummaryResponse;
11+
import com.rtm516.mcxboxbroadcast.core.models.auth.XboxTokenInfo;
1212

1313
import java.io.File;
1414
import java.io.IOException;
@@ -39,7 +39,7 @@ public abstract class SessionManagerCore {
3939
protected ExpandedSessionInfo sessionInfo;
4040
protected String lastSessionResponse;
4141

42-
private boolean initialized = false;
42+
protected boolean initialized = false;
4343

4444
/**
4545
* Create an instance of SessionManager
@@ -261,9 +261,10 @@ private void createSession() throws SessionCreationException, SessionUpdateExcep
261261
*
262262
* @param url The url to send the PUT request containing the session data
263263
* @param data The data to update the session with
264+
* @return The response body from the request
264265
* @throws SessionUpdateException If the update fails
265266
*/
266-
protected void updateSessionInternal(String url, Object data) throws SessionUpdateException {
267+
protected String updateSessionInternal(String url, Object data) throws SessionUpdateException {
267268
HttpRequest createSessionRequest;
268269
try {
269270
createSessionRequest = HttpRequest.newBuilder()
@@ -288,6 +289,8 @@ protected void updateSessionInternal(String url, Object data) throws SessionUpda
288289
logger.debug("Got update session response: " + createSessionResponse.body());
289290
throw new SessionUpdateException("Unable to update session information, got status " + createSessionResponse.statusCode() + " trying to update");
290291
}
292+
293+
return createSessionResponse.body();
291294
}
292295

293296
/**
@@ -352,6 +355,7 @@ public void shutdown() {
352355
if (rtaWebsocket != null) {
353356
rtaWebsocket.close();
354357
}
358+
this.initialized = false;
355359
}
356360

357361
/**

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.rtm516.mcxboxbroadcast.core;
22

33
import com.rtm516.mcxboxbroadcast.core.exceptions.SessionUpdateException;
4-
import com.rtm516.mcxboxbroadcast.core.models.JoinSessionRequest;
4+
import com.rtm516.mcxboxbroadcast.core.models.session.JoinSessionRequest;
55

66
import java.util.concurrent.ScheduledExecutorService;
77

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
import com.nimbusds.jose.jwk.ECKey;
77
import com.nimbusds.jose.jwk.KeyUse;
88
import com.nimbusds.jose.jwk.gen.ECKeyGenerator;
9-
import com.rtm516.mcxboxbroadcast.core.models.GenericAuthenticationRequest;
10-
import com.rtm516.mcxboxbroadcast.core.models.GenericAuthenticationResponse;
11-
import com.rtm516.mcxboxbroadcast.core.models.JsonJWK;
12-
import com.rtm516.mcxboxbroadcast.core.models.SISUAuthenticationResponse;
13-
import com.rtm516.mcxboxbroadcast.core.models.XboxTokenCache;
14-
import com.rtm516.mcxboxbroadcast.core.models.XboxTokenInfo;
9+
import com.rtm516.mcxboxbroadcast.core.models.auth.GenericAuthenticationRequest;
10+
import com.rtm516.mcxboxbroadcast.core.models.auth.GenericAuthenticationResponse;
11+
import com.rtm516.mcxboxbroadcast.core.models.auth.JsonJWK;
12+
import com.rtm516.mcxboxbroadcast.core.models.auth.SISUAuthenticationResponse;
13+
import com.rtm516.mcxboxbroadcast.core.models.auth.XboxTokenCache;
14+
import com.rtm516.mcxboxbroadcast.core.models.auth.XboxTokenInfo;
1515

1616
import java.io.FileWriter;
1717
import java.io.IOException;

core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/CreateSessionRequest.java

Lines changed: 0 additions & 94 deletions
This file was deleted.

0 commit comments

Comments
 (0)