diff --git a/src/main/java/de/fullrisk/citrusDev/client/CitrusDevClient.java b/src/main/java/de/fullrisk/citrusDev/client/CitrusDevClient.java index 89583fb..0e51974 100644 --- a/src/main/java/de/fullrisk/citrusDev/client/CitrusDevClient.java +++ b/src/main/java/de/fullrisk/citrusDev/client/CitrusDevClient.java @@ -4,10 +4,11 @@ package de.fullrisk.citrusDev.client; import de.fullrisk.citrusDev.Config; import de.fullrisk.citrusDev.UI.*; import de.fullrisk.citrusDev.UIHelper.DraggableHud; -import io.wispforest.owo.ui.hud.Hud; +import de.fullrisk.citrusDev.helper.RankHelper; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.minecraft.client.KeyMapping; import net.minecraft.resources.Identifier; import org.lwjgl.glfw.GLFW; @@ -40,6 +41,10 @@ public class CitrusDevClient implements ClientModInitializer { category )); + ClientPlayConnectionEvents.JOIN.register((sender, client1, player) -> { + RankHelper.fetchAllRanks(); + }); + ClientTickEvents.END_CLIENT_TICK.register(client -> { if (client.player != null && !client.isPaused()) { diff --git a/src/main/java/de/fullrisk/citrusDev/helper/RankHelper.java b/src/main/java/de/fullrisk/citrusDev/helper/RankHelper.java index 04e1ecc..4a55390 100644 --- a/src/main/java/de/fullrisk/citrusDev/helper/RankHelper.java +++ b/src/main/java/de/fullrisk/citrusDev/helper/RankHelper.java @@ -1,5 +1,7 @@ package de.fullrisk.citrusDev.helper; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import de.fullrisk.citrusDev.client.CitrusDevClient; import net.minecraft.client.Minecraft; @@ -7,21 +9,22 @@ 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.UUID; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; public class RankHelper { public static final ConcurrentHashMap rankCache = new ConcurrentHashMap<>(); - private static final HttpClient client = HttpClient.newHttpClient(); + private static final HttpClient client = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(10)).build(); + + private static boolean fetched = false; public static String getRankIcon(UUID uuid) { String rank = rankCache.get(uuid); - if (rank == null) { - rankCache.put(uuid, "loading"); - fetchRank(uuid); - return " "; + if (rank == null || rank.equals("none")) { + return ""; } if (rank.equals("loading")) return " "; @@ -37,52 +40,54 @@ public class RankHelper { }; } - private static String RANK_URL = CitrusDevClient.API_URL + "/api/player/%s/rank"; + private static final String RANKS_URL = CitrusDevClient.API_URL + "/api/ranks"; - private static void fetchRank(UUID uuid) { - CompletableFuture.runAsync(() -> { - try { - HttpRequest request = HttpRequest.newBuilder().uri(URI.create(RANK_URL.formatted(uuid))) - .GET() - .build(); + public static void fetchAllRanks() { + fetched = true; - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(RANKS_URL)) + .timeout(Duration.ofSeconds(10)) + .GET() + .build(); - if (response.statusCode() == 200) { - String rawRank = response.body().trim().toLowerCase(); + client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenAccept(response -> { + if (response.statusCode() == 200) { + JsonObject json = JsonParser.parseString(response.body()).getAsJsonObject(); - if (rawRank.equals(rankCache.get(uuid))) { - return; // No change - } + rankCache.clear(); - CitrusDevClient.debugLog("Received Rank Content: '" + rawRank + "'"); - - rankCache.put(uuid, rawRank); - - Minecraft.getInstance().execute(() -> { - var world = Minecraft.getInstance().level; - if (world != null) { - var player = world.getPlayerByUUID(uuid); - if (player != null) { - player.setCustomNameVisible(player.isCustomNameVisible()); - CitrusDevClient.debugLog("Refreshed nametag for: " + player.getName().getString()); - } + for (var entry : json.entrySet()) { + UUID uuid = UUID.fromString(entry.getKey()); + String rank = entry.getValue().getAsString(); + rankCache.put(uuid, rank); } - }); - } else { - rankCache.put(uuid, "none"); - } - } catch (Exception e) { - CitrusDevClient.debugLog("Failed to fetch rank: " + e.getMessage()); - rankCache.put(uuid, "none"); - } - }); + + CitrusDevClient.debugLog("Fetched ranks for " + json.size() + " players"); + + Minecraft.getInstance().execute(() -> { + var world = Minecraft.getInstance().level; + if (world != null) { + for (var player : world.players()) { + player.setCustomNameVisible(player.isCustomNameVisible()); + } + } + }); + } else { + CitrusDevClient.debugLog("Failed to fetch ranks: " + response.statusCode()); + } + }) + .exceptionally(error -> { + CitrusDevClient.debugLog("Failed to fetch ranks: " + error.getMessage()); + fetched = false; + return null; + }); } - public static void refreshRankIfChanged() { - Minecraft client = Minecraft.getInstance(); - if (client.getConnection() == null) return; - - client.getConnection().getOnlinePlayers().forEach(playerInfo -> fetchRank(playerInfo.getProfile().id())); + public static void refreshIfNecessary() { + if (!fetched) { + fetchAllRanks(); + } } }