Skip to content

Commit 9aa992d

Browse files
committed
Switch to GameAddress type
This basically ensures that, by having an instance of this class, you have a valid stringified host and port pair, at least according to Google's HostAndPort class.
1 parent 66edc3d commit 9aa992d

8 files changed

Lines changed: 57 additions & 31 deletions

File tree

mapsync-mod/src/main/java/gjum/minecraft/mapsync/mod/DimensionChunkMeta.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package gjum.minecraft.mapsync.mod;
22

3+
import gjum.minecraft.mapsync.mod.data.GameAddress;
34
import gjum.minecraft.mapsync.mod.data.RegionPos;
45
import java.io.FileNotFoundException;
56
import java.io.IOException;
@@ -10,7 +11,6 @@
1011
import java.nio.file.attribute.FileTime;
1112
import java.util.Arrays;
1213
import java.util.HashMap;
13-
import net.minecraft.client.Minecraft;
1414
import net.minecraft.world.level.ChunkPos;
1515

1616
/**
@@ -19,17 +19,17 @@
1919
* Each region's LastModifiedTime is set to the oldest contained chunk (or 0 if any chunks are absent), to easily find regions to request from the sync server.
2020
*/
2121
public class DimensionChunkMeta {
22-
public final String mcServerName;
22+
public final GameAddress gameAddress;
2323
public final String dimensionName;
2424
private final String dimensionDirPath;
2525

2626
private final HashMap<RegionPos, long[]> regionsTimestamps = new HashMap<>();
2727

28-
DimensionChunkMeta(String mcServerName, String dimensionName) {
29-
this.mcServerName = mcServerName;
28+
DimensionChunkMeta(GameAddress gameAddress, String dimensionName) {
29+
this.gameAddress = gameAddress;
3030
this.dimensionName = dimensionName;
3131
var dir = Path.of(MapSyncMod.getConfigDirectory().getAbsolutePath(), "cache",
32-
mcServerName.replaceAll(":", "~"), dimensionName.replaceAll(":", "~"));
32+
gameAddress.asFsName(), dimensionName.replaceAll(":", "~"));
3333
dir.toFile().mkdirs();
3434
this.dimensionDirPath = dir.toAbsolutePath().toString();
3535
}

mapsync-mod/src/main/java/gjum/minecraft/mapsync/mod/DimensionState.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import gjum.minecraft.mapsync.mod.data.CatchupChunk;
66
import gjum.minecraft.mapsync.mod.data.ChunkTile;
7+
import gjum.minecraft.mapsync.mod.data.GameAddress;
78
import gjum.minecraft.mapsync.mod.data.RegionPos;
89
import java.util.List;
910
import net.minecraft.client.Minecraft;
@@ -26,10 +27,10 @@ public class DimensionState {
2627
private int numChunksReceived = 0;
2728
private int numChunksRendered = 0;
2829

29-
DimensionState(String mcServerName, ResourceKey<Level> dimension) {
30+
DimensionState(GameAddress gameAddress, ResourceKey<Level> dimension) {
3031
this.dimension = dimension;
3132
String dimensionName = dimension.identifier().toString();
32-
chunkMeta = new DimensionChunkMeta(mcServerName, dimensionName);
33+
chunkMeta = new DimensionChunkMeta(gameAddress, dimensionName);
3334
renderQueue = new RenderQueue(this);
3435
catchup = new CatchupLogic(this);
3536
}

mapsync-mod/src/main/java/gjum/minecraft/mapsync/mod/MapSyncMod.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import gjum.minecraft.mapsync.mod.config.ServerConfig;
88
import gjum.minecraft.mapsync.mod.data.CatchupChunk;
99
import gjum.minecraft.mapsync.mod.data.ChunkTile;
10+
import gjum.minecraft.mapsync.mod.data.GameAddress;
1011
import gjum.minecraft.mapsync.mod.data.RegionPos;
1112
import gjum.minecraft.mapsync.mod.net.CloseContext;
1213
import gjum.minecraft.mapsync.mod.net.Packet;
@@ -165,9 +166,7 @@ public void handleRespawn(ClientboundRespawnPacket packet) {
165166
serverConfig = null;
166167
return null;
167168
}
168-
String gameAddress = currentServer.ip;
169-
if (!gameAddress.contains(":")) gameAddress += ":25565";
170-
169+
GameAddress gameAddress = new GameAddress(currentServer.ip);
171170
if (serverConfig == null) {
172171
serverConfig = ServerConfig.load(gameAddress);
173172
}

mapsync-mod/src/main/java/gjum/minecraft/mapsync/mod/config/ServerConfig.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.gson.Gson;
44
import com.google.gson.JsonObject;
55
import com.google.gson.annotations.Expose;
6+
import gjum.minecraft.mapsync.mod.data.GameAddress;
67
import java.io.File;
78
import java.nio.charset.StandardCharsets;
89
import java.nio.file.Path;
@@ -16,7 +17,7 @@
1617
import org.jetbrains.annotations.NotNull;
1718

1819
public class ServerConfig extends JsonConfig {
19-
public String gameAddress;
20+
public GameAddress gameAddress;
2021

2122
@Expose
2223
private @NotNull List<String> syncServerAddresses = new ArrayList<>();
@@ -36,8 +37,8 @@ public void setSyncServerAddresses(@NotNull List<String> addresses) {
3637
saveLater();
3738
}
3839

39-
public static ServerConfig load(String gameAddress) {
40-
var dir = Path.of(MapSyncMod.getConfigDirectory().getAbsolutePath(), gameAddress.replaceAll(":", "~")).toFile();
40+
public static ServerConfig load(GameAddress gameAddress) {
41+
var dir = Path.of(MapSyncMod.getConfigDirectory().getAbsolutePath(), gameAddress.asFsName()).toFile();
4142
dir.mkdirs();
4243
var conf = load(new File(dir, "server-config.json"), ServerConfig.class);
4344
conf.gameAddress = gameAddress;
@@ -60,7 +61,8 @@ private static void loadDefaults(ServerConfig conf) {
6061
String json = new String(input.readAllBytes(), StandardCharsets.UTF_8);
6162
JsonObject root = new Gson().fromJson(json, JsonObject.class);
6263
JsonObject servers = root.get("servers").getAsJsonObject();
63-
JsonObject server = servers.get(conf.gameAddress).getAsJsonObject();
64+
// TODO: Don't get, instead iterate through keys
65+
JsonObject server = servers.get(conf.gameAddress.address()).getAsJsonObject();
6466
defaults = GSON.fromJson(server, ServerConfig.class);
6567
} catch (IllegalStateException | NullPointerException ignored) {
6668
return;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package gjum.minecraft.mapsync.mod.data;
2+
3+
import com.google.common.net.HostAndPort;
4+
import java.util.Objects;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
7+
8+
public record GameAddress(
9+
@NotNull String address
10+
) {
11+
public GameAddress {
12+
Objects.requireNonNull(address);
13+
address = HostAndPort.fromString(address).withDefaultPort(25565).toString();
14+
}
15+
16+
public static @Nullable GameAddress from(
17+
final String address
18+
) {
19+
try {
20+
return new GameAddress(address);
21+
}
22+
catch (final Exception e) {
23+
return null;
24+
}
25+
}
26+
27+
/// Returns a version of this game address that's valid for file/folder names.
28+
public @NotNull String asFsName() {
29+
return this.address().replace(":", "~");
30+
}
31+
}

mapsync-mod/src/main/java/gjum/minecraft/mapsync/mod/net/SyncClient.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import gjum.minecraft.mapsync.mod.MapSyncMod;
44
import gjum.minecraft.mapsync.mod.data.ChunkTile;
5+
import gjum.minecraft.mapsync.mod.data.GameAddress;
56
import gjum.minecraft.mapsync.mod.deps.websockets.client.WebSocketClient;
67
import gjum.minecraft.mapsync.mod.deps.websockets.drafts.Draft;
78
import gjum.minecraft.mapsync.mod.deps.websockets.drafts.Draft_6455;
@@ -63,7 +64,7 @@ public synchronized void setServerKnownChunkHash(ChunkPos chunkPos, byte[] hash)
6364

6465
public final long clientId;
6566
public final String syncAddress;
66-
public final String gameAddress;
67+
public final GameAddress gameAddress;
6768

6869
/// false = don't auto-reconnect but maintain connection as long as it stays up.
6970
/// can be set to true again later.
@@ -74,7 +75,7 @@ public synchronized void setServerKnownChunkHash(ChunkPos chunkPos, byte[] hash)
7475

7576
public SyncClient(
7677
final @NotNull String syncAddress,
77-
final @NotNull String gameAddress
78+
final @NotNull GameAddress gameAddress
7879
) {
7980
this.clientId = LAST_CLIENT_ID.incrementAndGet();
8081
this.syncAddress = Objects.requireNonNull(syncAddress);

mapsync-mod/src/main/java/gjum/minecraft/mapsync/mod/net/SyncClients.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package gjum.minecraft.mapsync.mod.net;
22

3-
import com.google.common.net.HostAndPort;
43
import gjum.minecraft.mapsync.mod.MapSyncMod;
54
import gjum.minecraft.mapsync.mod.config.ServerConfig;
5+
import gjum.minecraft.mapsync.mod.data.GameAddress;
66
import java.lang.invoke.MethodHandles;
77
import java.lang.invoke.VarHandle;
88
import java.util.HashSet;
@@ -23,12 +23,12 @@
2323
public final class SyncClients implements Iterable<SyncClient> {
2424
private static final Logger LOGGER = LoggerFactory.getLogger(SyncClients.class);
2525

26-
public final String gameAddress;
26+
public final GameAddress gameAddress;
2727
public final ServerConfig serverConfig;
2828
private final Map<String, SyncClient> clients = new ConcurrentHashMap<>();
2929

3030
public SyncClients(
31-
final @NotNull String gameAddress,
31+
final @NotNull GameAddress gameAddress,
3232
final @NotNull ServerConfig serverConfig
3333
) {
3434
this.gameAddress = Objects.requireNonNull(gameAddress);
@@ -135,16 +135,7 @@ public static void initEvents() {
135135
LOGGER.error("Connection doesn't have server data yet... backing out");
136136
return;
137137
}
138-
final String gameAddress; {
139-
final String ip = serverData.ip;
140-
try {
141-
gameAddress = HostAndPort.fromString(ip).withDefaultPort(25565).toString();
142-
}
143-
catch (final Exception e) {
144-
LOGGER.error("Weirdly could not pass {} as a game address... backing out", ip, e);
145-
return;
146-
}
147-
}
138+
final GameAddress gameAddress = new GameAddress(serverData.ip);
148139
final ServerConfig serverConfig;
149140
try {
150141
serverConfig = ServerConfig.load(gameAddress);

mapsync-mod/src/main/java/gjum/minecraft/mapsync/mod/net/packet/ServerboundHandshakePacket.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package gjum.minecraft.mapsync.mod.net.packet;
22

3+
import gjum.minecraft.mapsync.mod.data.GameAddress;
34
import gjum.minecraft.mapsync.mod.net.Packet;
45
import gjum.minecraft.mapsync.mod.net.buffers.BufferWriter;
56
import gjum.minecraft.mapsync.mod.utils.Assertions;
@@ -11,7 +12,7 @@
1112
/// - Next: [ClientboundIdentityRequestPacket]
1213
public record ServerboundHandshakePacket(
1314
@NotNull String modVersion,
14-
@NotNull String gameAddress,
15+
@NotNull GameAddress gameAddress,
1516
@NotNull String dimension
1617
) implements Packet {
1718
public static final int PACKET_ID = 1;
@@ -27,7 +28,7 @@ public void write(
2728
final @NotNull BufferWriter writer
2829
) throws Exception {
2930
writer.writeString(this.modVersion());
30-
writer.writeString(this.gameAddress());
31+
writer.writeString(this.gameAddress().address());
3132
writer.writeString(this.dimension());
3233
}
3334
}

0 commit comments

Comments
 (0)