diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-02-19 13:38:29 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-19 13:38:29 -0500 |
commit | 8330e0be154fec3927dadbcdfb3a1ba3e7364dce (patch) | |
tree | b25356da8f875f76d2bd09ab62ff6e71839976b7 /src/main/java/de/hysky/skyblocker/skyblock | |
parent | 3cfad4cfc4da62ab0ff2f76846201d30e81c3ef7 (diff) | |
download | Skyblocker-8330e0be154fec3927dadbcdfb3a1ba3e7364dce.tar.gz Skyblocker-8330e0be154fec3927dadbcdfb3a1ba3e7364dce.tar.bz2 Skyblocker-8330e0be154fec3927dadbcdfb3a1ba3e7364dce.zip |
Improve secrets caching behaviour (#545)
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java | 71 |
1 files changed, 39 insertions, 32 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java index 68f09344..2f748792 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretsTracker.java @@ -10,9 +10,6 @@ import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.Http; import de.hysky.skyblocker.utils.Http.ApiResponse; import de.hysky.skyblocker.utils.Utils; -import it.unimi.dsi.fastutil.ints.IntIntPair; -import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.minecraft.client.MinecraftClient; @@ -24,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Map; +import java.util.Map.Entry; import java.util.concurrent.CompletableFuture; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -43,8 +41,6 @@ public class SecretsTracker { ClientReceiveMessageEvents.GAME.register(SecretsTracker::onMessage); } - //If -1 is somehow encountered, it would be very rare, so I just disregard its possibility for now - //people would probably recognize if it was inaccurate so yeah private static void calculate(RunPhase phase) { switch (phase) { case START -> CompletableFuture.runAsync(() -> { @@ -57,11 +53,11 @@ public class SecretsTracker { //The player name will be blank if there isn't a player at that index if (!playerName.isEmpty()) { - //If the player was a part of the last run (and didn't have -1 secret count) and that run ended less than 5 mins ago then copy the secrets over - if (lastRun != null && System.currentTimeMillis() <= lastRunEnded + 300_000 && lastRun.secretCounts().getOrDefault(playerName, -1) != -1) { - newlyStartedRun.secretCounts().put(playerName, lastRun.secretCounts().getInt(playerName)); + //If the player was a part of the last run, had non-empty secret data and that run ended less than 5 mins ago then copy the secret data over + if (lastRun != null && System.currentTimeMillis() <= lastRunEnded + 300_000 && lastRun.playersSecretData().getOrDefault(playerName, SecretData.EMPTY) != SecretData.EMPTY) { + newlyStartedRun.playersSecretData().put(playerName, lastRun.playersSecretData().get(playerName)); } else { - newlyStartedRun.secretCounts().put(playerName, getPlayerSecrets(playerName).leftInt()); + newlyStartedRun.playersSecretData().put(playerName, getPlayerSecrets(playerName)); } } } @@ -72,22 +68,23 @@ public class SecretsTracker { case END -> CompletableFuture.runAsync(() -> { //In case the game crashes from something if (currentRun != null) { - Object2ObjectOpenHashMap<String, IntIntPair> secretsFound = new Object2ObjectOpenHashMap<>(); + Object2ObjectOpenHashMap<String, SecretData> secretsFound = new Object2ObjectOpenHashMap<>(); //Update secret counts - for (Entry<String> entry : currentRun.secretCounts().object2IntEntrySet()) { + for (Entry<String, SecretData> entry : currentRun.playersSecretData().entrySet()) { String playerName = entry.getKey(); - int startingSecrets = entry.getIntValue(); - IntIntPair secretsNow = getPlayerSecrets(playerName); - int secretsPlayerFound = secretsNow.leftInt() - startingSecrets; + SecretData startingSecrets = entry.getValue(); + SecretData secretsNow = getPlayerSecrets(playerName); + int secretsPlayerFound = secretsNow.secrets() - startingSecrets.secrets(); - secretsFound.put(playerName, IntIntPair.of(secretsPlayerFound, secretsNow.rightInt())); - entry.setValue(secretsNow.leftInt()); + //Add an entry to the secretsFound map with the data - if the secret data from now or the start was cached a warning will be shown + secretsFound.put(playerName, secretsNow.updated(secretsPlayerFound, startingSecrets.cached() || secretsNow.cached())); + entry.setValue(secretsNow); } //Print the results all in one go, so its clean and less of a chance of it being broken up - for (Map.Entry<String, IntIntPair> entry : secretsFound.entrySet()) { - sendResultMessage(entry.getKey(), entry.getValue().leftInt(), entry.getValue().rightInt(), true); + for (Map.Entry<String, SecretData> entry : secretsFound.entrySet()) { + sendResultMessage(entry.getKey(), entry.getValue(), true); } //Swap the current and last run as well as mark the run end time @@ -95,30 +92,31 @@ public class SecretsTracker { lastRun = currentRun; currentRun = null; } else { - sendResultMessage(null, -1, -1, false); + sendResultMessage(null, null, false); } }); } } - private static void sendResultMessage(String player, int secrets, int cacheAge, boolean success) { + private static void sendResultMessage(String player, SecretData secretData, boolean success) { + @SuppressWarnings("resource") PlayerEntity playerEntity = MinecraftClient.getInstance().player; if (playerEntity != null) { if (success) { - playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.dungeons.secretsTracker.feedback", Text.literal(player).withColor(0xf57542), "§7" + secrets, getCacheText(cacheAge)))); + playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.dungeons.secretsTracker.feedback", Text.literal(player).withColor(0xf57542), "§7" + secretData.secrets(), getCacheText(secretData.cached(), secretData.cacheAge())))); } else { playerEntity.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.dungeons.secretsTracker.failFeedback"))); } } } - private static Text getCacheText(int cacheAge) { - return Text.literal("\u2139").styled(style -> style.withColor(cacheAge == -1 ? 0x218bff : 0xeac864).withHoverEvent( - new HoverEvent(HoverEvent.Action.SHOW_TEXT, cacheAge == -1 ? Text.translatable("skyblocker.api.cache.MISS") : Text.translatable("skyblocker.api.cache.HIT", cacheAge)))); + private static Text getCacheText(boolean cached, int cacheAge) { + return Text.literal("\u2139").styled(style -> style.withColor(cached ? 0xeac864 : 0x218bff).withHoverEvent( + new HoverEvent(HoverEvent.Action.SHOW_TEXT, cached ? Text.translatable("skyblocker.api.cache.HIT", cacheAge) : Text.translatable("skyblocker.api.cache.MISS")))); } private static void onMessage(Text text, boolean overlay) { - if (Utils.isInDungeons() && SkyblockerConfigManager.get().locations.dungeons.playerSecretsTracker) { + if (Utils.isInDungeons() && SkyblockerConfigManager.get().locations.dungeons.playerSecretsTracker && !overlay) { String message = Formatting.strip(text.getString()); try { @@ -136,35 +134,44 @@ public class SecretsTracker { return matcher != null ? matcher.group("name") : ""; } - private static IntIntPair getPlayerSecrets(String name) { + private static SecretData getPlayerSecrets(String name) { String uuid = ApiUtils.name2Uuid(name); if (!uuid.isEmpty()) { try (ApiResponse response = Http.sendHypixelRequest("player", "?uuid=" + uuid)) { - return IntIntPair.of(getSecretCountFromAchievements(JsonParser.parseString(response.content()).getAsJsonObject()), response.age()); + return new SecretData(getSecretCountFromAchievements(JsonParser.parseString(response.content()).getAsJsonObject()), response.cached(), response.age()); } catch (Exception e) { LOGGER.error("[Skyblocker] Encountered an error while trying to fetch {} secret count!", name + "'s", e); } } - return IntIntPair.of(-1, -1); + return SecretData.EMPTY; } /** * Gets a player's secret count from their hypixel achievements */ private static int getSecretCountFromAchievements(JsonObject playerJson) { - JsonObject player = playerJson.get("player").getAsJsonObject(); - JsonObject achievements = (player.has("achievements")) ? player.get("achievements").getAsJsonObject() : null; + JsonObject player = playerJson.getAsJsonObject("player"); + JsonObject achievements = player.has("achievements") ? player.getAsJsonObject("achievements") : null; return (achievements != null && achievements.has("skyblock_treasure_hunter")) ? achievements.get("skyblock_treasure_hunter").getAsInt() : 0; } /** * This will either reflect the value at the start or the end depending on when this is called */ - private record TrackedRun(Object2IntOpenHashMap<String> secretCounts) { + private record TrackedRun(Object2ObjectOpenHashMap<String, SecretData> playersSecretData) { private TrackedRun() { - this(new Object2IntOpenHashMap<>()); + this(new Object2ObjectOpenHashMap<>()); + } + } + + private record SecretData(int secrets, boolean cached, int cacheAge) { + private static final SecretData EMPTY = new SecretData(0, false, 0); + + //If only we had Derived Record Creation :( - https://bugs.openjdk.org/browse/JDK-8321133 + private SecretData updated(int secrets, boolean cached) { + return new SecretData(secrets, cached, this.cacheAge); } } |