refactor uuid parsing

This commit is contained in:
UrAvgCode 2025-09-10 15:09:17 +02:00
parent 46da96472f
commit 6e7ed14b8d
No known key found for this signature in database
GPG key ID: 8A76A22B2CDDD634
2 changed files with 14 additions and 15 deletions

View file

@ -2,7 +2,6 @@ package com.uravgcode.globalwhitelist.command;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.tree.LiteralCommandNode;
import com.uravgcode.globalwhitelist.config.MessagesConfig;
import com.uravgcode.globalwhitelist.config.WhitelistConfig;
import com.uravgcode.globalwhitelist.service.MinecraftProfileService;

View file

@ -1,6 +1,5 @@
package com.uravgcode.globalwhitelist.service;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.uravgcode.globalwhitelist.whitelist.PlayerProfile;
import org.slf4j.Logger;
@ -13,11 +12,9 @@ import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.Optional;
import java.util.UUID;
import java.util.regex.Pattern;
public class MinecraftProfileService {
private static final URI API_BASE_URL = URI.create("https://api.minecraftservices.com/minecraft/profile/lookup/name/");
private static final Pattern UUID_PATTERN = Pattern.compile("(\\p{XDigit}{8})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{4})(\\p{XDigit}{12})");
private static final Duration TIMEOUT = Duration.ofSeconds(5);
private final Logger logger;
@ -69,28 +66,31 @@ public class MinecraftProfileService {
private Optional<PlayerProfile> parseProfile(String jsonString) {
try {
JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
var jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
if (!jsonObject.has("id") || !jsonObject.has("name")) {
logger.warn("missing 'id' or 'name' in json:\n{}", jsonString);
logger.warn("json is missing required fields:\n{}", jsonString);
return Optional.empty();
}
String uuidString = jsonObject.get("id").getAsString();
String name = jsonObject.get("name").getAsString();
var matcher = UUID_PATTERN.matcher(uuidString);
if (!matcher.matches()) {
logger.warn("invalid uuid format in json:\n{}", jsonString);
return Optional.empty();
}
var uuid = UUID.fromString(matcher.replaceFirst("$1-$2-$3-$4-$5"));
return Optional.of(new PlayerProfile(uuid, name));
return parseUUID(uuidString).map(uuid -> new PlayerProfile(uuid, name));
} catch (Exception e) {
logger.error("failed to parse json:\n{}\nerror: {}", jsonString, e.getMessage());
return Optional.empty();
}
}
private Optional<UUID> parseUUID(String uuidString) {
try {
long mostSigBits = Long.parseUnsignedLong(uuidString.substring(0, 16), 16);
long leastSigBits = Long.parseUnsignedLong(uuidString.substring(16), 16);
return Optional.of(new UUID(mostSigBits, leastSigBits));
} catch (NumberFormatException e) {
logger.warn("invalid uuid format: {}", uuidString);
return Optional.empty();
}
}
}