Skip to content

Commit

Permalink
Merge pull request #208 from FlintMC/improvement/async-server-data
Browse files Browse the repository at this point in the history
Move DNS resolving to ServerData.getServerAddress
  • Loading branch information
zortax committed May 31, 2021
2 parents 0101802 + a9776da commit fa95004
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 44 deletions.
Expand Up @@ -21,6 +21,7 @@

import java.net.UnknownHostException;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
import net.flintmc.framework.inject.assisted.Assisted;
import net.flintmc.framework.inject.assisted.AssistedInject;
import net.flintmc.framework.inject.implement.Implement;
Expand All @@ -29,36 +30,43 @@
import net.flintmc.mcapi.server.status.ServerStatus;
import net.flintmc.mcapi.server.status.ServerStatusResolver;

/**
* {@inheritDoc}
*/
@Implement(ServerData.class)
public class DefaultServerData implements ServerData {

private final ServerStatusResolver serverStatusResolver;

private final String name;
private final ServerAddress address;
private final Supplier<ServerAddress> addressProvider;
private final ResourceMode resourceMode;

private final ServerStatusResolver serverStatusResolver;

@AssistedInject
private DefaultServerData(
ServerStatusResolver serverStatusResolver,
@Assisted String name,
@Assisted ServerAddress address,
@Assisted ResourceMode resourceMode,
ServerStatusResolver serverStatusResolver) {
@Assisted("addressProvider") Supplier<ServerAddress> addressProvider,
@Assisted ResourceMode resourceMode) {
this.serverStatusResolver = serverStatusResolver;

this.name = name;
this.address = address;
this.addressProvider = addressProvider;
this.resourceMode = resourceMode;
this.serverStatusResolver = serverStatusResolver;
}

@AssistedInject
private DefaultServerData(
ServerStatusResolver serverStatusResolver,
@Assisted String name,
@Assisted("address") ServerAddress address,
@Assisted ResourceMode resourceMode) {
this(serverStatusResolver, name, () -> address, resourceMode);
}

/**
* {@inheritDoc}
*/
@Override
public CompletableFuture<ServerStatus> loadStatus() throws UnknownHostException {
return this.serverStatusResolver.resolveStatus(this.address);
return this.serverStatusResolver.resolveStatus(this.getServerAddress());
}

/**
Expand All @@ -74,7 +82,7 @@ public String getName() {
*/
@Override
public ServerAddress getServerAddress() {
return this.address;
return this.addressProvider.get();
}

/**
Expand Down
22 changes: 21 additions & 1 deletion mcapi/src/main/java/net/flintmc/mcapi/server/ServerData.java
Expand Up @@ -21,6 +21,7 @@

import java.net.UnknownHostException;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
import net.flintmc.framework.inject.assisted.Assisted;
import net.flintmc.framework.inject.assisted.AssistedFactory;
import net.flintmc.mcapi.server.status.ServerStatus;
Expand All @@ -44,6 +45,9 @@ public interface ServerData {
String getName();

/**
* Retrieves the address of this server data. This may invoke a DNS request to resolve the
* domain.
*
* @return the server address of the server described by this instance
*/
ServerAddress getServerAddress();
Expand All @@ -57,6 +61,7 @@ public interface ServerData {
* The resource mode of a server list entry.
*/
enum ResourceMode {

/**
* Accepts server resource packs without asking.
*/
Expand All @@ -82,7 +87,22 @@ interface Factory {
* @param resourceMode the resource mode of the server
* @return the new {@link ServerData} instance
*/
ServerData create(@Assisted String name, @Assisted ServerAddress address,
ServerData create(
@Assisted String name,
@Assisted("address") ServerAddress address,
@Assisted ResourceMode resourceMode);

/**
* Creates a new server list entry (but doesn't add it to the actual server list).
*
* @param name the name of the server
* @param addressProvider a supplier to provide the address of the server
* @param resourceMode the resource mode of the server
* @return the new {@link ServerData} instance
*/
ServerData create(
@Assisted String name,
@Assisted("addressProvider") Supplier<ServerAddress> addressProvider,
@Assisted ResourceMode resourceMode);
}
}
Expand Up @@ -34,13 +34,13 @@ public class VersionedServerAddress implements ServerAddress {
private final int port;

@AssistedInject
public VersionedServerAddress(@Assisted("ip") String ip, @Assisted("port") int port) {
private VersionedServerAddress(@Assisted("ip") String ip, @Assisted("port") int port) {
this.ip = ip;
this.port = port;
}

@AssistedInject
public VersionedServerAddress(@Assisted("rawAddress") String rawAddress) {
private VersionedServerAddress(@Assisted("rawAddress") String rawAddress) {
net.minecraft.client.multiplayer.ServerAddress address =
net.minecraft.client.multiplayer.ServerAddress.fromString(rawAddress);
Preconditions.checkNotNull(address, "address");
Expand All @@ -50,7 +50,7 @@ public VersionedServerAddress(@Assisted("rawAddress") String rawAddress) {
}

@AssistedInject
public VersionedServerAddress(@Assisted("socketAddress") InetSocketAddress address) {
private VersionedServerAddress(@Assisted("socketAddress") InetSocketAddress address) {
this(address.getAddress().getHostName(), address.getPort());
}

Expand Down
Expand Up @@ -26,8 +26,10 @@
import net.flintmc.framework.inject.implement.Implement;
import net.flintmc.mcapi.server.ServerAddress;
import net.flintmc.mcapi.server.ServerData;
import net.flintmc.mcapi.server.ServerData.ResourceMode;
import net.flintmc.mcapi.server.event.ServerListUpdateEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData.ServerResourceMode;
import net.minecraft.client.multiplayer.ServerList;

/**
Expand Down Expand Up @@ -72,8 +74,34 @@ public ServerData getServer(int index) {
net.minecraft.client.multiplayer.ServerData data = this.mcServerList.getServerData(index);
return this.serverDataFactory.create(
data.serverName,
this.serverAddressFactory.parse(data.serverIP),
ServerData.ResourceMode.valueOf(data.getResourceMode().name()));
() -> this.serverAddressFactory.parse(data.serverIP),
this.mapResourceMode(data.getResourceMode()));
}

private ResourceMode mapResourceMode(ServerResourceMode mode) {
switch (mode) {
case ENABLED:
return ResourceMode.ENABLED;
case DISABLED:
return ResourceMode.DISABLED;
case PROMPT:
return ResourceMode.PROMPT;
default:
throw new IllegalStateException("Unexpected value: " + mode);
}
}

private ServerResourceMode mapResourceMode(ResourceMode mode) {
switch (mode) {
case ENABLED:
return ServerResourceMode.ENABLED;
case DISABLED:
return ServerResourceMode.DISABLED;
case PROMPT:
return ServerResourceMode.PROMPT;
default:
throw new IllegalStateException("Unexpected value: " + mode);
}
}

/**
Expand All @@ -98,9 +126,7 @@ public void updateServerData(int index, ServerData server) {
net.minecraft.client.multiplayer.ServerData data = this.mcServerList.getServerData(index);
data.serverIP = server.getServerAddress().getIP() + ":" + server.getServerAddress().getPort();
data.serverName = server.getName();
data.setResourceMode(
net.minecraft.client.multiplayer.ServerData.ServerResourceMode.valueOf(
server.getResourceMode().name()));
data.setResourceMode(this.mapResourceMode(server.getResourceMode()));

this.eventBus.fireEvent(event, Subscribe.Phase.POST);
}
Expand All @@ -110,7 +136,7 @@ public void updateServerData(int index, ServerData server) {
*/
@Override
public void addServer(ServerData server) {
this.mcServerList.addServerData(createNMSServerData(server));
this.mcServerList.addServerData(createServerData(server));
}

/**
Expand All @@ -120,19 +146,17 @@ public void addServer(ServerData server) {
public void addServer(int index, ServerData server) {
((ServerListShadow) this.mcServerList)
.getServerDataList()
.add(index, createNMSServerData(server));
.add(index, this.createServerData(server));
}

/**
* {@inheritDoc}
*/
private net.minecraft.client.multiplayer.ServerData createNMSServerData(ServerData server) {
private net.minecraft.client.multiplayer.ServerData createServerData(ServerData server) {
String ip = server.getServerAddress().getIP() + ":" + server.getServerAddress().getPort();
net.minecraft.client.multiplayer.ServerData data =
new net.minecraft.client.multiplayer.ServerData(server.getName(), ip, false);
data.setResourceMode(
net.minecraft.client.multiplayer.ServerData.ServerResourceMode.valueOf(
server.getResourceMode().name()));
data.setResourceMode(this.mapResourceMode(server.getResourceMode()));
return data;
}

Expand Down
Expand Up @@ -57,7 +57,7 @@ private ServerListUpdateEvent createEvent(int index, Type type, ServerData data)
net.flintmc.mcapi.server.ServerData flintData =
this.dataFactory.create(
data.serverName,
this.addressFactory.parse(data.serverIP),
() -> this.addressFactory.parse(data.serverIP),
net.flintmc.mcapi.server.ServerData.ResourceMode.valueOf(
data.getResourceMode().name()));
return this.eventFactory.create(index, flintData, type);
Expand Down
Expand Up @@ -34,13 +34,13 @@ public class VersionedServerAddress implements ServerAddress {
private final int port;

@AssistedInject
public VersionedServerAddress(@Assisted("ip") String ip, @Assisted("port") int port) {
private VersionedServerAddress(@Assisted("ip") String ip, @Assisted("port") int port) {
this.ip = ip;
this.port = port;
}

@AssistedInject
public VersionedServerAddress(@Assisted("rawAddress") String rawAddress) {
private VersionedServerAddress(@Assisted("rawAddress") String rawAddress) {
net.minecraft.client.multiplayer.ServerAddress address =
net.minecraft.client.multiplayer.ServerAddress.fromString(rawAddress);
Preconditions.checkNotNull(address, "address");
Expand All @@ -50,7 +50,7 @@ public VersionedServerAddress(@Assisted("rawAddress") String rawAddress) {
}

@AssistedInject
public VersionedServerAddress(@Assisted("socketAddress") InetSocketAddress address) {
private VersionedServerAddress(@Assisted("socketAddress") InetSocketAddress address) {
this(address.getAddress().getHostName(), address.getPort());
}

Expand Down
Expand Up @@ -26,8 +26,10 @@
import net.flintmc.framework.inject.implement.Implement;
import net.flintmc.mcapi.server.ServerAddress;
import net.flintmc.mcapi.server.ServerData;
import net.flintmc.mcapi.server.ServerData.ResourceMode;
import net.flintmc.mcapi.server.event.ServerListUpdateEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ServerData.ServerResourceMode;
import net.minecraft.client.multiplayer.ServerList;

/**
Expand Down Expand Up @@ -72,8 +74,34 @@ public ServerData getServer(int index) {
net.minecraft.client.multiplayer.ServerData data = this.mcServerList.getServerData(index);
return this.serverDataFactory.create(
data.serverName,
this.serverAddressFactory.parse(data.serverIP),
ServerData.ResourceMode.valueOf(data.getResourceMode().name()));
() -> this.serverAddressFactory.parse(data.serverIP),
this.mapResourceMode(data.getResourceMode()));
}

private ResourceMode mapResourceMode(ServerResourceMode mode) {
switch (mode) {
case ENABLED:
return ResourceMode.ENABLED;
case DISABLED:
return ResourceMode.DISABLED;
case PROMPT:
return ResourceMode.PROMPT;
default:
throw new IllegalStateException("Unexpected value: " + mode);
}
}

private ServerResourceMode mapResourceMode(ResourceMode mode) {
switch (mode) {
case ENABLED:
return ServerResourceMode.ENABLED;
case DISABLED:
return ServerResourceMode.DISABLED;
case PROMPT:
return ServerResourceMode.PROMPT;
default:
throw new IllegalStateException("Unexpected value: " + mode);
}
}

/**
Expand All @@ -98,9 +126,7 @@ public void updateServerData(int index, ServerData server) {
net.minecraft.client.multiplayer.ServerData data = this.mcServerList.getServerData(index);
data.serverIP = server.getServerAddress().getIP() + ":" + server.getServerAddress().getPort();
data.serverName = server.getName();
data.setResourceMode(
net.minecraft.client.multiplayer.ServerData.ServerResourceMode.valueOf(
server.getResourceMode().name()));
data.setResourceMode(this.mapResourceMode(server.getResourceMode()));

this.eventBus.fireEvent(event, Subscribe.Phase.POST);
}
Expand All @@ -110,7 +136,7 @@ public void updateServerData(int index, ServerData server) {
*/
@Override
public void addServer(ServerData server) {
this.mcServerList.addServerData(createNMSServerData(server));
this.mcServerList.addServerData(createServerData(server));
}

/**
Expand All @@ -120,19 +146,17 @@ public void addServer(ServerData server) {
public void addServer(int index, ServerData server) {
((ServerListShadow) this.mcServerList)
.getServerDataList()
.add(index, createNMSServerData(server));
.add(index, this.createServerData(server));
}

/**
* {@inheritDoc}
*/
private net.minecraft.client.multiplayer.ServerData createNMSServerData(ServerData server) {
private net.minecraft.client.multiplayer.ServerData createServerData(ServerData server) {
String ip = server.getServerAddress().getIP() + ":" + server.getServerAddress().getPort();
net.minecraft.client.multiplayer.ServerData data =
new net.minecraft.client.multiplayer.ServerData(server.getName(), ip, false);
data.setResourceMode(
net.minecraft.client.multiplayer.ServerData.ServerResourceMode.valueOf(
server.getResourceMode().name()));
data.setResourceMode(this.mapResourceMode(server.getResourceMode()));
return data;
}

Expand Down
Expand Up @@ -57,7 +57,7 @@ private ServerListUpdateEvent createEvent(int index, Type type, ServerData data)
net.flintmc.mcapi.server.ServerData flintData =
this.dataFactory.create(
data.serverName,
this.addressFactory.parse(data.serverIP),
() -> this.addressFactory.parse(data.serverIP),
net.flintmc.mcapi.server.ServerData.ResourceMode.valueOf(
data.getResourceMode().name()));
return this.eventFactory.create(index, flintData, type);
Expand Down

0 comments on commit fa95004

Please sign in to comment.