diff options
| author | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-08-15 11:07:33 +0300 |
|---|---|---|
| committer | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-08-15 11:07:33 +0300 |
| commit | c7810521aa4c2f3ac12948b1c67df9ede5c1b850 (patch) | |
| tree | 8dba07789ff6bf4bb3b687a3ad756f6b7d297a27 | |
| parent | 37136d199a74d2dff5c27632170c7a3a5a2944e4 (diff) | |
| download | Skyblocker-c7810521aa4c2f3ac12948b1c67df9ede5c1b850.tar.gz Skyblocker-c7810521aa4c2f3ac12948b1c67df9ede5c1b850.tar.bz2 Skyblocker-c7810521aa4c2f3ac12948b1c67df9ede5c1b850.zip | |
Fix minister being changed from an array to object
Also adds some documentation and extra methods to Mayor and Minister classes
4 files changed, 67 insertions, 24 deletions
diff --git a/src/main/java/de/hysky/skyblocker/utils/mayor/Mayor.java b/src/main/java/de/hysky/skyblocker/utils/mayor/Mayor.java index eeade3bf..8944d6fc 100644 --- a/src/main/java/de/hysky/skyblocker/utils/mayor/Mayor.java +++ b/src/main/java/de/hysky/skyblocker/utils/mayor/Mayor.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.utils.mayor; import it.unimi.dsi.fastutil.objects.ObjectLists; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -10,9 +11,23 @@ import java.util.List; * @param name The name of the mayor. * @param perks The perks of the mayor. */ -public record Mayor(String key, String name, List<Perk> perks) { +public record Mayor(@NotNull String key, @NotNull String name, @NotNull List<Perk> perks) { /** * An empty mayor. Allows for better null safety. */ public static final Mayor EMPTY = new Mayor("", "", ObjectLists.emptyList()); + + /** + * For formatting purposes when printing out the result of the API call. + * @see MayorUtils#tickMayorCache() + */ + @Override + public String toString() { + if (isEmpty()) return "Mayor.EMPTY"; + return name; + } + + public boolean isEmpty() { + return this == EMPTY; + } } diff --git a/src/main/java/de/hysky/skyblocker/utils/mayor/MayorUtils.java b/src/main/java/de/hysky/skyblocker/utils/mayor/MayorUtils.java index 0a8f6342..eee35353 100644 --- a/src/main/java/de/hysky/skyblocker/utils/mayor/MayorUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/mayor/MayorUtils.java @@ -57,7 +57,9 @@ public class MayorUtils { if (!response.ok()) throw new HttpResponseException(response.statusCode(), response.content()); JsonObject json = JsonParser.parseString(response.content()).getAsJsonObject(); if (!json.get("success").getAsBoolean()) throw new RuntimeException("Request failed!"); //Can't find a more appropriate exception to throw here. - return json.get("mayor").getAsJsonObject(); + JsonObject mayorObject = json.getAsJsonObject("mayor"); + if (mayorObject == null) throw new RuntimeException("No mayor object found in response!"); + return mayorObject; } catch (Exception e) { throw new RuntimeException(e); //Wrap the exception to be handled by the exceptionally block } @@ -74,24 +76,30 @@ public class MayorUtils { return new JsonObject(); //Have to return a value for the thenAccept block. }).thenAccept(result -> { if (!result.isEmpty()) { - mayor = new Mayor(result.get("key").getAsString(), - result.get("name").getAsString(), - result.getAsJsonArray("perks") - .asList() - .stream() - .map(JsonElement::getAsJsonObject) - .map(object -> new Perk(object.get("name").getAsString(), object.get("description").getAsString())) - .toList()); - JsonObject ministerObject = result.getAsJsonObject("minister"); - minister = new Minister(ministerObject.get("key").getAsString(), - ministerObject.get("name").getAsString(), - ministerObject.getAsJsonArray("perk") - .asList() - .stream() - .map(JsonElement::getAsJsonObject) - .map(object -> new Perk(object.get("name").getAsString(), object.get("description").getAsString())) - .findFirst().orElse(Perk.EMPTY)); - LOGGER.info("[Skyblocker] Mayor set to {}, minister set to {}.", mayor.name(), minister.name()); + try { + mayor = new Mayor(result.get("key").getAsString(), + result.get("name").getAsString(), + result.getAsJsonArray("perks") + .asList() + .stream() + .map(JsonElement::getAsJsonObject) + .map(object -> new Perk(object.get("name").getAsString(), object.get("description").getAsString())) + .toList()); + } catch (Exception e) { + LOGGER.warn("[Skyblocker] Failed to parse mayor status from the API response.", e); + mayor = Mayor.EMPTY; + } + try { + JsonObject ministerObject = result.getAsJsonObject("minister"); + JsonObject ministerPerk = ministerObject.getAsJsonObject("perk"); + minister = new Minister(ministerObject.get("key").getAsString(), + ministerObject.get("name").getAsString(), + new Perk(ministerPerk.get("name").getAsString(), ministerPerk.get("description").getAsString())); + } catch (Exception e) { + LOGGER.warn("[Skyblocker] Failed to parse minister status from the API response. This might be due to a special mayor, in which case there are no ministers.", e); + minister = Minister.EMPTY; + } + LOGGER.info("[Skyblocker] Mayor set to {}, minister set to {}.", mayor, minister); scheduleMayorTick(); //Ends up as a cyclic task with finer control over scheduled time } }); diff --git a/src/main/java/de/hysky/skyblocker/utils/mayor/Minister.java b/src/main/java/de/hysky/skyblocker/utils/mayor/Minister.java index 13638b39..3420019a 100644 --- a/src/main/java/de/hysky/skyblocker/utils/mayor/Minister.java +++ b/src/main/java/de/hysky/skyblocker/utils/mayor/Minister.java @@ -1,14 +1,30 @@ package de.hysky.skyblocker.utils.mayor; +import org.jetbrains.annotations.NotNull; + /** * Represents a minister as retrieved from the API. * @param key The key of the minister. * @param name The name of the minister. * @param perk The perk of the minister. */ -public record Minister(String key, String name, Perk perk) { +public record Minister(@NotNull String key, @NotNull String name, @NotNull Perk perk) { /** * An empty minister. Allows for better null safety. */ public static final Minister EMPTY = new Minister("", "", Perk.EMPTY); + + /** + * For formatting purposes when printing out the result of the API call. + * @see MayorUtils#tickMayorCache() + */ + @Override + public String toString() { + if (isEmpty()) return "Mayor.EMPTY"; + return name; + } + + public boolean isEmpty() { + return this == EMPTY; + } } diff --git a/src/main/java/de/hysky/skyblocker/utils/mayor/Perk.java b/src/main/java/de/hysky/skyblocker/utils/mayor/Perk.java index a2dc1700..91c289c9 100644 --- a/src/main/java/de/hysky/skyblocker/utils/mayor/Perk.java +++ b/src/main/java/de/hysky/skyblocker/utils/mayor/Perk.java @@ -1,13 +1,17 @@ package de.hysky.skyblocker.utils.mayor; +import org.jetbrains.annotations.NotNull; + /** * Represents a mayor perk. * @param name The name of the perk. * @param description The description of the perk. This will include the formatting codes that are used in the game. */ -public record Perk(String name, String description) { +public record Perk(@NotNull String name, @NotNull String description) { /** - * An empty perk. Allows for better null safety. + * An empty perk. + * Represents a perk that does not exist for ministers. + * Allows for better null safety. */ - public static Perk EMPTY = new Perk("", ""); + public static final Perk EMPTY = new Perk("", ""); } |
