refactor uuid parsing
This commit is contained in:
parent
46da96472f
commit
6e7ed14b8d
2 changed files with 14 additions and 15 deletions
|
|
@ -2,7 +2,6 @@ package com.uravgcode.globalwhitelist.command;
|
||||||
|
|
||||||
import com.mojang.brigadier.arguments.StringArgumentType;
|
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
|
||||||
import com.uravgcode.globalwhitelist.config.MessagesConfig;
|
import com.uravgcode.globalwhitelist.config.MessagesConfig;
|
||||||
import com.uravgcode.globalwhitelist.config.WhitelistConfig;
|
import com.uravgcode.globalwhitelist.config.WhitelistConfig;
|
||||||
import com.uravgcode.globalwhitelist.service.MinecraftProfileService;
|
import com.uravgcode.globalwhitelist.service.MinecraftProfileService;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package com.uravgcode.globalwhitelist.service;
|
package com.uravgcode.globalwhitelist.service;
|
||||||
|
|
||||||
import com.google.gson.JsonObject;
|
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
import com.uravgcode.globalwhitelist.whitelist.PlayerProfile;
|
import com.uravgcode.globalwhitelist.whitelist.PlayerProfile;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
@ -13,11 +12,9 @@ import java.net.http.HttpResponse;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
public class MinecraftProfileService {
|
public class MinecraftProfileService {
|
||||||
private static final URI API_BASE_URL = URI.create("https://api.minecraftservices.com/minecraft/profile/lookup/name/");
|
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 static final Duration TIMEOUT = Duration.ofSeconds(5);
|
||||||
|
|
||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
|
|
@ -69,28 +66,31 @@ public class MinecraftProfileService {
|
||||||
|
|
||||||
private Optional<PlayerProfile> parseProfile(String jsonString) {
|
private Optional<PlayerProfile> parseProfile(String jsonString) {
|
||||||
try {
|
try {
|
||||||
JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
|
var jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
|
||||||
|
|
||||||
if (!jsonObject.has("id") || !jsonObject.has("name")) {
|
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();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
String uuidString = jsonObject.get("id").getAsString();
|
String uuidString = jsonObject.get("id").getAsString();
|
||||||
String name = jsonObject.get("name").getAsString();
|
String name = jsonObject.get("name").getAsString();
|
||||||
|
|
||||||
var matcher = UUID_PATTERN.matcher(uuidString);
|
return parseUUID(uuidString).map(uuid -> new PlayerProfile(uuid, name));
|
||||||
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));
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("failed to parse json:\n{}\nerror: {}", jsonString, e.getMessage());
|
logger.error("failed to parse json:\n{}\nerror: {}", jsonString, e.getMessage());
|
||||||
return Optional.empty();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue