Skip to content

Commit e5a2b0b

Browse files
authored
Add TransferModule#ping validation & increase PingRequest timeout to 10s (#302)
1 parent e1592bb commit e5a2b0b

8 files changed

Lines changed: 54 additions & 3 deletions

File tree

api/src/main/java/com/lunarclient/apollo/module/transfer/PingRequest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,15 @@ public final class PingRequest extends ApolloRequest<PingResponse> {
4545
*/
4646
List<String> serverIps;
4747

48+
/**
49+
* Returns the timeout for ping requests, in milliseconds.
50+
*
51+
* @return the request timeout, in milliseconds
52+
* @since 1.2.9
53+
*/
54+
@Override
55+
public long getTimeoutMillis() {
56+
return 10_000L;
57+
}
58+
4859
}

api/src/main/java/com/lunarclient/apollo/module/transfer/TransferModule.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@
4242
@ModuleDefinition(id = "transfer", name = "Transfer")
4343
public abstract class TransferModule extends ApolloModule {
4444

45+
/**
46+
* The maximum amount of server IPs the client will ping
47+
* for a single {@link PingRequest}.
48+
*
49+
* @since 1.2.9
50+
*/
51+
public static final int MAX_PINGS_PER_PACKET = 10;
52+
4553
@Override
4654
public Collection<ApolloPlatform.Kind> getSupportedPlatforms() {
4755
return Arrays.asList(ApolloPlatform.Kind.SERVER, ApolloPlatform.Kind.PROXY);
@@ -55,6 +63,8 @@ public Collection<ApolloPlatform.Kind> getSupportedPlatforms() {
5563
* @param player the player
5664
* @param serverIps all server IPs to ping
5765
* @return future to be listened to for errors/success
66+
* @throws IllegalArgumentException if no server IPs or more than
67+
* {@value #MAX_PINGS_PER_PACKET} server IPs are provided
5868
* @since 1.0.0
5969
*/
6070
public Future<PingResponse> ping(ApolloPlayer player, List<String> serverIps) {
@@ -85,6 +95,8 @@ public Future<TransferResponse> transfer(ApolloPlayer player, String serverIp) {
8595
* @param player the player
8696
* @param request the ping request
8797
* @return future to be listened to for errors/success
98+
* @throws IllegalArgumentException if no server IPs or more than
99+
* {@value #MAX_PINGS_PER_PACKET} server IPs are provided
88100
* @since 1.0.0
89101
*/
90102
public abstract Future<PingResponse> ping(ApolloPlayer player, PingRequest request);

api/src/main/java/com/lunarclient/apollo/roundtrip/ApolloRequest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,14 @@ public ApolloRequest() {
6767
this.sentTime = System.currentTimeMillis();
6868
}
6969

70+
/**
71+
* Returns the time to wait for a response, in milliseconds.
72+
*
73+
* @return the request timeout, in milliseconds
74+
* @since 1.2.9
75+
*/
76+
public long getTimeoutMillis() {
77+
return TIMEOUT;
78+
}
79+
7080
}

api/src/main/java/com/lunarclient/apollo/roundtrip/ApolloRoundtripManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,14 @@ public <T extends ApolloResponse> void registerListener(ApolloRequest<T> request
119119
this.paginationManager.handleTimeout(packetId);
120120

121121
if (listener != null) {
122-
Throwable error = new Throwable("Timeout exceeded!");
122+
Throwable error = new Throwable("Timeout exceeded! No " + request.getClass().getSimpleName()
123+
+ " response received within " + request.getTimeoutMillis() + "ms");
123124
future.handleFailure(error);
124125
}
125126
} catch (Exception e) {
126127
e.printStackTrace();
127128
}
128-
}, ApolloRequest.TIMEOUT, TimeUnit.MILLISECONDS);
129+
}, request.getTimeoutMillis(), TimeUnit.MILLISECONDS);
129130

130131
this.listeners.put(packetId, (UncertainFuture<ApolloResponse>) future);
131132
}

common/src/main/java/com/lunarclient/apollo/module/transfer/TransferModuleImpl.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,20 @@ public TransferModuleImpl() {
5353

5454
@Override
5555
public Future<PingResponse> ping(@NonNull ApolloPlayer player, @NonNull PingRequest request) {
56+
List<String> serverIps = request.getServerIps();
57+
58+
if (serverIps == null || serverIps.isEmpty()) {
59+
throw new IllegalArgumentException("PingRequest must contain at least 1 server IP!");
60+
}
61+
62+
if (serverIps.size() > MAX_PINGS_PER_PACKET) {
63+
throw new IllegalArgumentException("PingRequest supports up to " + MAX_PINGS_PER_PACKET
64+
+ " server IPs, got " + serverIps.size() + "!");
65+
}
66+
5667
com.lunarclient.apollo.transfer.v1.PingRequest requestProto = com.lunarclient.apollo.transfer.v1.PingRequest.newBuilder()
5768
.setRequestId(ByteString.copyFromUtf8(request.getRequestId().toString()))
58-
.addAllServerIps(request.getServerIps())
69+
.addAllServerIps(serverIps)
5970
.build();
6071

6172
return ((AbstractApolloPlayer) player).sendRoundTripPacket(request, requestProto);

docs/developers/modules/transfer.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ public void transferExample(Player viewer) {
119119

120120
<Callout type="info">
121121
You can provide up to `10` different addresses per ping packet.
122+
Requests with more addresses are rejected with an `IllegalArgumentException`.
122123
</Callout>
123124

124125

@@ -209,6 +210,7 @@ public void transferExample(Player player) {
209210

210211
<Callout type="info">
211212
You can provide up to `10` different addresses per ping packet.
213+
Addresses beyond the first `10` are reported as `STATUS_TIMED_OUT` instead of being pinged.
212214
</Callout>
213215

214216
```java

example/bukkit/json/src/main/resources/plugin.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ commands:
5454
description: "Pay Now!"
5555
richpresence:
5656
description: "Rich Presence!"
57+
serverlink:
58+
description: "Server Links!"
5759
saturation:
5860
description: "Saturation!"
5961
serverrule:

example/bukkit/proto/src/main/resources/plugin.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ commands:
5454
description: "Pay Now!"
5555
richpresence:
5656
description: "Rich Presence!"
57+
serverlink:
58+
description: "Server Links!"
5759
saturation:
5860
description: "Saturation!"
5961
serverrule:

0 commit comments

Comments
 (0)