diff --git a/src/main/java/org/saturnclient/client/ServiceClient.java b/src/main/java/org/saturnclient/client/ServiceClient.java index e9fb1e6..ce436f3 100644 --- a/src/main/java/org/saturnclient/client/ServiceClient.java +++ b/src/main/java/org/saturnclient/client/ServiceClient.java @@ -183,18 +183,18 @@ public class ServiceClient { }); } - public static void player(UUID uuid, String name) { + public static SaturnPlayer getPlayer(UUID uuid, String name) { try { - session.request(ServiceMethods.GetPlayer, uuid.toString()) - .whenComplete((user, throwable) -> { - if (throwable != null) { - throwable.printStackTrace(); - } else if (user != null) { - SaturnPlayer.set(user.toSaturnPlayer(uuid, name)); - } - }); + ServiceMethods.Types.Player player = session.request(ServiceMethods.GetPlayer, uuid.toString()).join(); + + if (player == null) + return null; + + return player.toSaturnPlayer(uuid, name); } catch (Exception e) { Providers.saturn.logError("Failed to get player", e); } + + return null; } } diff --git a/src/main/java/org/saturnclient/client/player/SaturnPlayer.java b/src/main/java/org/saturnclient/client/player/SaturnPlayer.java index a2a32c9..83c5827 100644 --- a/src/main/java/org/saturnclient/client/player/SaturnPlayer.java +++ b/src/main/java/org/saturnclient/client/player/SaturnPlayer.java @@ -2,13 +2,23 @@ package org.saturnclient.client.player; import java.util.HashMap; import java.util.Map; +import java.util.Queue; +import java.util.Set; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; import org.saturnclient.client.ServiceClient; +import org.saturnclient.common.provider.Providers; public class SaturnPlayer { - private static Map PLAYERS = new HashMap<>(); - private static Map PLAYER_NAMES = new HashMap<>(); + private static final Map PLAYERS = new HashMap<>(); + + private static final Queue QUEUE = new ConcurrentLinkedQueue<>(); + private static final Set QUEUED = ConcurrentHashMap.newKeySet(); + + private static volatile boolean RUNNING = false; + private static Thread WORKER; public String cloak = ""; public String hat = ""; @@ -29,19 +39,30 @@ public class SaturnPlayer { return PLAYERS.get(ServiceClient.uuid); } + public static SaturnPlayer get(String name, UUID uuid) { + if (uuid == null) + return null; + + SaturnPlayer player = PLAYERS.get(uuid); + + if (player == null && QUEUED.add(uuid)) { + PLAYERS.put(uuid, null); + QUEUE.add(uuid); + startPlayerThread(); + } + + return player; + } + public static SaturnPlayer get(UUID uuid) { - return PLAYERS.get(uuid); + return get(Providers.saturn.getClient().getPlayerListEntry(uuid), uuid); } public static SaturnPlayer get(String name) { - UUID uuid = PLAYER_NAMES.get(name); - if (uuid == null) - return null; - return PLAYERS.get(uuid); + return get(name, Providers.saturn.getClient().getPlayerListEntryUUID(name)); } public static void set(SaturnPlayer player) { - PLAYER_NAMES.put(player.name, player.uuid); PLAYERS.put(player.uuid, player); } @@ -51,4 +72,52 @@ public class SaturnPlayer { .toArray(String[]::new); } + public static synchronized void startPlayerThread() { + if (RUNNING) + return; + + RUNNING = true; + + WORKER = new Thread(() -> { + long lastWorkTime = System.currentTimeMillis(); + + while (true) { + UUID uuid = QUEUE.poll(); + + if (uuid != null) { + try { + String name = Providers.saturn.getClient().getPlayerListEntry(uuid); + + SaturnPlayer player = ServiceClient.getPlayer(uuid, name); + + // Apply on main thread + Providers.saturn.getClient().executeOnThread(() -> { + PLAYERS.put(uuid, player); + }); + + } catch (Exception e) { + Providers.saturn.logError("Failed to fetch player " + uuid, e); + } finally { + QUEUED.remove(uuid); + } + + lastWorkTime = System.currentTimeMillis(); + } else { + if (System.currentTimeMillis() - lastWorkTime > 5000) { + break; + } + + try { + Thread.sleep(50); + } catch (InterruptedException ignored) { + } + } + } + + RUNNING = false; + }, "SaturnPlayer-Worker"); + + WORKER.setDaemon(true); + WORKER.start(); + } } diff --git a/src/main/java/org/saturnclient/common/ref/game/MinecraftClientRef.java b/src/main/java/org/saturnclient/common/ref/game/MinecraftClientRef.java index fd3229a..6843d14 100644 --- a/src/main/java/org/saturnclient/common/ref/game/MinecraftClientRef.java +++ b/src/main/java/org/saturnclient/common/ref/game/MinecraftClientRef.java @@ -35,5 +35,9 @@ public interface MinecraftClientRef { public void scheduleStop(); - public void executeOnThread(Runnable runnable); + public void executeOnThread(Runnable runnable); + + public String getPlayerListEntry(UUID uuid); + + public UUID getPlayerListEntryUUID(String name); }