From cd728aecd0da561aa6800f5b5b975b8ad9435e0a Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Mon, 3 Mar 2025 05:09:39 +0100 Subject: Event Start Time in Calendar menu (#1147) * calendar yay * add 12-hour clock config * Use date time api * Fix rounding and optional parsing * Cleanup * More general config --------- Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> --- .../config/categories/GeneralCategory.java | 1 + .../config/categories/HelperCategory.java | 10 +++++ .../skyblocker/config/configs/HelperConfig.java | 3 ++ .../skyblock/item/tooltip/TooltipManager.java | 1 + .../tooltip/adders/CalendarStartTimeTooltip.java | 48 ++++++++++++++++++++++ .../itemlist/recipebook/UpcomingEventsTab.java | 36 ++++++++-------- .../java/de/hysky/skyblocker/utils/RegexUtils.java | 12 ++++++ 7 files changed, 91 insertions(+), 20 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CalendarStartTimeTooltip.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index 1df6bb26..24cd4974 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -58,6 +58,7 @@ public class GeneralCategory { .controller(ConfigUtils::createBooleanController) .build()) + // Speed Presets .group(OptionGroup.createBuilder() .name(Text.translatable("skyblocker.config.general.speedPresets")) .collapsed(true) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java index 31bac293..c0a643e1 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java @@ -46,6 +46,16 @@ public class HelperCategory { .controller(ConfigUtils::createBooleanController) .build()) + // Date Calculator + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.enableDateCalculator")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableDateCalculator.@Tooltip"))) + .binding(defaults.helpers.enableDateCalculator, + () -> config.helpers.enableDateCalculator, + newValue -> config.helpers.enableDateCalculator = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + //Mythological Ritual .group(OptionGroup.createBuilder() .name(Text.translatable("skyblocker.config.helpers.mythologicalRitual")) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java index 6541dee9..a2a4780e 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java @@ -14,6 +14,9 @@ public class HelperConfig { @SerialEntry public boolean enableWardrobeHelper = true; + @SerialEntry + public boolean enableDateCalculator = true; + @SerialEntry public MythologicalRitual mythologicalRitual = new MythologicalRitual(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index 2566ea13..b015e755 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -44,6 +44,7 @@ public class TooltipManager { new MuseumTooltip(11), new ColorTooltip(12), new AccessoryTooltip(13), + new CalendarStartTimeTooltip(14) }; private static final ArrayList currentScreenAdders = new ArrayList<>(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CalendarStartTimeTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CalendarStartTimeTooltip.java new file mode 100644 index 00000000..d3c0aa1e --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CalendarStartTimeTooltip.java @@ -0,0 +1,48 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.SimpleTooltipAdder; +import de.hysky.skyblocker.utils.Formatters; +import de.hysky.skyblocker.utils.RegexUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.jetbrains.annotations.Nullable; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CalendarStartTimeTooltip extends SimpleTooltipAdder { + private static final Pattern TIMER_PATTERN = Pattern.compile(".*(Starts in: |\\()((?\\d+)d)? ?((?\\d+)h)? ?((?\\d+)m)? ?((?\\d+)s)?\\)?"); + + public CalendarStartTimeTooltip(int priority) { + super("(Calendar and Events|.*?, Year \\d+.*)", priority); + } + + @Override + public void addToTooltip(@Nullable Slot focusedSlot, ItemStack stack, List lines) { + for (int i = 1; i < lines.size(); i++) { + Matcher matcher = TIMER_PATTERN.matcher(lines.get(i).getString()); + if (matcher.matches()) { + Instant instant = Instant.now() + .plus(RegexUtils.parseOptionalIntFromMatcher(matcher, "days").orElse(0), ChronoUnit.DAYS) + .plus(RegexUtils.parseOptionalIntFromMatcher(matcher, "hours").orElse(0), ChronoUnit.HOURS) + .plus(RegexUtils.parseOptionalIntFromMatcher(matcher, "minutes").orElse(0), ChronoUnit.MINUTES) + .plusSeconds(RegexUtils.parseOptionalIntFromMatcher(matcher, "seconds").orElse(0)) + .plusSeconds(30) // Add 30 seconds to round to the nearest minute + .truncatedTo(ChronoUnit.MINUTES); + + lines.add(++i, Text.literal(Formatters.DATE_FORMATTER.format(instant)).formatted(Formatting.ITALIC, Formatting.DARK_GRAY)); + } + } + } + + @Override + public boolean isEnabled() { + return SkyblockerConfigManager.get().helpers.enableDateCalculator; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/UpcomingEventsTab.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/UpcomingEventsTab.java index ee91d458..e5878c65 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/UpcomingEventsTab.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/UpcomingEventsTab.java @@ -1,15 +1,9 @@ package de.hysky.skyblocker.skyblock.itemlist.recipebook; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; - -import org.jetbrains.annotations.Nullable; - import de.hysky.skyblocker.mixins.accessors.DrawContextInvoker; import de.hysky.skyblocker.skyblock.events.EventNotifications; import de.hysky.skyblocker.skyblock.tabhud.widget.JacobsContestWidget; +import de.hysky.skyblocker.utils.Formatters; import de.hysky.skyblocker.utils.SkyblockTime; import de.hysky.skyblocker.utils.render.RenderHelper; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; @@ -24,6 +18,13 @@ import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Colors; import net.minecraft.util.Formatting; +import org.jetbrains.annotations.Nullable; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; public class UpcomingEventsTab implements RecipeTab { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); @@ -97,17 +98,9 @@ public class UpcomingEventsTab implements RecipeTab { @Override public void updateSearchResults(String query, FilterOption filterOption, boolean refresh) {} - private static class EventRenderer { + private record EventRenderer(String eventName, LinkedList events) { private static final int HEIGHT = 20; - private final String eventName; - private final LinkedList events; - - private EventRenderer(String eventName, LinkedList events) { - this.eventName = eventName; - this.events = events; - } - private void render(DrawContext context, int x, int y, int mouseX, int mouseY) { long time = System.currentTimeMillis() / 1000; TextRenderer textRenderer = CLIENT.textRenderer; @@ -121,7 +114,7 @@ public class UpcomingEventsTab implements RecipeTab { context.drawTextWithShadow(textRenderer, formatted, x, y + textRenderer.fontHeight, -1); } else { - Text formatted = Text.literal(" ").append(Text.translatable( "skyblocker.events.tab.endsIn", SkyblockTime.formatTime((int) (events.peekFirst().start() + events.peekFirst().duration() - time)))).formatted(Formatting.GREEN); + Text formatted = Text.literal(" ").append(Text.translatable("skyblocker.events.tab.endsIn", SkyblockTime.formatTime((int) (events.peekFirst().start() + events.peekFirst().duration() - time)))).formatted(Formatting.GREEN); context.drawTextWithShadow(textRenderer, formatted, x, y + textRenderer.fontHeight, -1); } @@ -134,15 +127,18 @@ public class UpcomingEventsTab implements RecipeTab { private List getTooltip() { List components = new ArrayList<>(); - if (events.peekFirst() == null) return components; + EventNotifications.SkyblockEvent event = events.peekFirst(); + if (event == null) return components; if (eventName.equals(EventNotifications.JACOBS)) { - components.add(new JacobsTooltip(events.peekFirst().extras())); + components.add(new JacobsTooltip(event.extras())); } - if (events.peekFirst().warpCommand() != null) { + if (event.warpCommand() != null) { components.add(TooltipComponent.of(Text.translatable("skyblocker.events.tab.clickToWarp").formatted(Formatting.ITALIC).asOrderedText())); } + components.add(TooltipComponent.of(Text.literal(Formatters.DATE_FORMATTER.format(Instant.ofEpochSecond(event.start()))).formatted(Formatting.ITALIC, Formatting.DARK_GRAY).asOrderedText())); + return components; } diff --git a/src/main/java/de/hysky/skyblocker/utils/RegexUtils.java b/src/main/java/de/hysky/skyblocker/utils/RegexUtils.java index 3d6b8842..866d510e 100644 --- a/src/main/java/de/hysky/skyblocker/utils/RegexUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/RegexUtils.java @@ -36,6 +36,18 @@ public class RegexUtils { return OptionalInt.of(parseIntFromMatcher(matcher, 1)); } + public static OptionalInt parseOptionalIntFromMatcher(Matcher matcher, int group) { + String s = matcher.group(group); + if (s == null) return OptionalInt.empty(); + return OptionalInt.of(Integer.parseInt(s.replace(",", ""))); + } + + public static OptionalInt parseOptionalIntFromMatcher(Matcher matcher, String group) { + String s = matcher.group(group); + if (s == null) return OptionalInt.empty(); + return OptionalInt.of(Integer.parseInt(s.replace(",", ""))); + } + public static int parseIntFromMatcher(Matcher matcher, int group) { return Integer.parseInt(matcher.group(group).replace(",", "")); } -- cgit