aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRime <81419447+Emirlol@users.noreply.github.com>2024-08-15 11:07:33 +0300
committerRime <81419447+Emirlol@users.noreply.github.com>2024-08-15 11:07:33 +0300
commitc7810521aa4c2f3ac12948b1c67df9ede5c1b850 (patch)
tree8dba07789ff6bf4bb3b687a3ad756f6b7d297a27
parent37136d199a74d2dff5c27632170c7a3a5a2944e4 (diff)
downloadSkyblocker-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
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/mayor/Mayor.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/mayor/MayorUtils.java46
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/mayor/Minister.java18
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/mayor/Perk.java10
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("", "");
}