diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java index b5c1c305ec..aeaec4e1ed 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/FriendsTab.java @@ -20,6 +20,8 @@ import meteordevelopment.meteorclient.utils.network.MeteorExecutor; import net.minecraft.client.gui.screen.Screen; +import static meteordevelopment.meteorclient.MeteorClient.mc; + public class FriendsTab extends Tab { public FriendsTab() { super("Friends"); @@ -64,7 +66,7 @@ public void initWidgets() { MeteorExecutor.execute(() -> { friend.updateInfo(); - reload(); + mc.execute(this::reload); }); } }; @@ -80,7 +82,6 @@ private void initTable(WTable table) { MeteorExecutor.execute(() -> { if (friend.headTextureNeedsUpdate()) { friend.updateInfo(); - reload(); } }) ); diff --git a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java index 35514dfc60..125479962d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/friends/Friend.java @@ -6,7 +6,9 @@ package meteordevelopment.meteorclient.systems.friends; import com.mojang.util.UndashedUuid; +import meteordevelopment.meteorclient.MeteorClient; import meteordevelopment.meteorclient.utils.misc.ISerializable; +import meteordevelopment.meteorclient.utils.network.FailedHttpResponse; import meteordevelopment.meteorclient.utils.network.Http; import meteordevelopment.meteorclient.utils.render.PlayerHeadTexture; import meteordevelopment.meteorclient.utils.render.PlayerHeadUtils; @@ -15,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; +import java.net.http.HttpResponse; import java.util.Objects; import java.util.UUID; @@ -49,11 +52,32 @@ public PlayerHeadTexture getHead() { public void updateInfo() { updating = true; - APIResponse res = Http.get("https://api.mojang.com/users/profiles/minecraft/" + name).sendJson(APIResponse.class); - if (res == null || res.name == null || res.id == null) return; - name = res.name; - id = UndashedUuid.fromStringLenient(res.id); - mc.execute(() -> headTexture = PlayerHeadUtils.fetchHead(id)); + HttpResponse res = null; + + if (id != null) { + res = Http.get("https://sessionserver.mojang.com/session/minecraft/profile/" + UndashedUuid.toString(id)) + .exceptionHandler(e -> MeteorClient.LOG.error("Error while trying to connect session server for friend '{}'", name)) + .sendJsonResponse(APIResponse.class); + } + + // Fallback to name-based lookup + if (res == null || res.statusCode() != 200) { + res = Http.get("https://api.mojang.com/users/profiles/minecraft/" + name) + .exceptionHandler(e -> MeteorClient.LOG.error("Error while trying to update info for friend '{}'", name)) + .sendJsonResponse(APIResponse.class); + } + + if (res != null && res.statusCode() == 200) { + name = res.body().name; + id = UndashedUuid.fromStringLenient(res.body().id); + mc.execute(() -> headTexture = PlayerHeadUtils.fetchHead(id)); + } + + // cracked accounts shouldn't be assigned ids + else if (!(res instanceof FailedHttpResponse)) { + id = null; + } + updating = false; } @@ -91,7 +115,7 @@ public int hashCode() { @Override public int compareTo(@NotNull Friend friend) { - return name.compareTo(friend.name); + return name.compareToIgnoreCase(friend.name); } private static class APIResponse {