ace-of-shades-2/launcher/src/main/java/nl/andrewl/aos2_launcher/ServersFetcher.java

60 lines
1.8 KiB
Java

package nl.andrewl.aos2_launcher;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import nl.andrewl.aos2_launcher.model.Server;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
class ServersFetcher {
private static final String registryURL = "http://localhost:8080";
private final HttpClient httpClient;
private final Gson gson;
public ServersFetcher() {
httpClient = HttpClient.newBuilder().build();
gson = new Gson();
}
public CompletableFuture<List<Server>> fetchServers() {
HttpRequest req = HttpRequest.newBuilder(URI.create(registryURL + "/servers"))
.GET()
.timeout(Duration.ofSeconds(3))
.header("Accept", "application/json")
.build();
return httpClient.sendAsync(req, HttpResponse.BodyHandlers.ofString())
.thenApplyAsync(resp -> {
if (resp.statusCode() == 200) {
JsonArray serversArray = gson.fromJson(resp.body(), JsonArray.class);
List<Server> servers = new ArrayList<>(serversArray.size());
for (JsonElement serverJson : serversArray) {
if (serverJson instanceof JsonObject obj) {
servers.add(new Server(
obj.get("host").getAsString(),
obj.get("port").getAsInt(),
obj.get("name").getAsString(),
obj.get("description").getAsString(),
obj.get("maxPlayers").getAsInt(),
obj.get("currentPlayers").getAsInt(),
obj.get("lastUpdatedAt").getAsLong()
));
}
}
return servers;
} else {
throw new RuntimeException("Invalid response: " + resp.statusCode());
}
});
}
}