From df9b0e26044c32e028723eecbb0931202701484a Mon Sep 17 00:00:00 2001 From: Liam Date: Thu, 22 Aug 2024 20:31:22 +0100 Subject: [PATCH] oopsie --- .../cc/fascinated/bat/common/TimeUtils.java | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 src/main/java/cc/fascinated/bat/common/TimeUtils.java diff --git a/src/main/java/cc/fascinated/bat/common/TimeUtils.java b/src/main/java/cc/fascinated/bat/common/TimeUtils.java new file mode 100644 index 0000000..736f1aa --- /dev/null +++ b/src/main/java/cc/fascinated/bat/common/TimeUtils.java @@ -0,0 +1,166 @@ +package cc.fascinated.bat.common; + +import lombok.*; +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Fascinated (fascinated7) + */ +@UtilityClass +public final class TimeUtils { + /** + * Format a time in millis to a readable time format. + * + * @param millis the millis to format + * @return the formatted time + */ + public static String format(long millis) { + return format(millis, BatTimeFormat.FIT); + } + + /** + * Format a time in millis to a readable time format. + * + * @param millis the millis to format + * @param timeUnit the time unit to format the millis to + * @return the formatted time + */ + public static String format(long millis, BatTimeFormat timeUnit) { + return format(millis, timeUnit, false); + } + + /** + * Format a time in millis to a readable time format. + * + * @param millis the millis to format + * @param timeUnit the time unit to format the millis to + * @param compact whether to use a compact display + * @return the formatted time + */ + public static String format(long millis, BatTimeFormat timeUnit, boolean compact) { + return format(millis, timeUnit, true, compact); + } + + /** + * Format a time in millis to a readable time format. + * + * @param millis the millis to format + * @param timeUnit the time unit to format the millis to + * @param decimals whether to include decimals + * @param compact whether to use a compact display + * @return the formatted time + */ + public static String format(long millis, BatTimeFormat timeUnit, boolean decimals, boolean compact) { + if (millis == -1L) { // Format permanent + return "Perm" + (compact ? "" : "anent"); + } + // Format the time to the best fitting time unit + if (timeUnit == BatTimeFormat.FIT) { + for (BatTimeFormat otherTimeUnit : BatTimeFormat.VALUES) { + if (otherTimeUnit != BatTimeFormat.FIT && millis >= otherTimeUnit.getMillis()) { + timeUnit = otherTimeUnit; + break; + } + } + } + double time = MathUtils.format((double) millis / timeUnit.getMillis(), 1); // Format the time + if (!decimals) { // Remove decimals + time = (int) time; + } + String formatted = time + (compact ? timeUnit.getSuffix() : " " + timeUnit.getDisplay()); // Append the time unit + if (time != 1.0 && !compact) { // Pluralize the time unit + formatted += "s"; + } + return formatted; + } + + /** + * Convert the given input into a time in millis. + *

+ * E.g: 1d, 1h, 1d1h, etc + *

+ * + * @param input the input to parse + * @return the time in millis + */ + public static long fromString(String input) { + Matcher matcher = BatTimeFormat.SUFFIX_PATTERN.matcher(input); // Match the given input + long millis = 0; // The total millis + + // Match corresponding suffixes and add up the total millis + while (matcher.find()) { + int amount = Integer.parseInt(matcher.group(1)); // The amount of time to add + String suffix = matcher.group(2); // The unit suffix + BatTimeFormat timeUnit = BatTimeFormat.fromSuffix(suffix); // The time unit to add + if (timeUnit != null) { // Increment the total millis + millis += amount * timeUnit.getMillis(); + } + } + return millis; + } + + /** + * Represents a unit of time. + */ + @NoArgsConstructor + @AllArgsConstructor + @Getter(AccessLevel.PRIVATE) + @ToString + public enum BatTimeFormat { + FIT, + YEARS("Year", "y", TimeUnit.DAYS.toMillis(365L)), + MONTHS("Month", "mo", TimeUnit.DAYS.toMillis(30L)), + WEEKS("Week", "w", TimeUnit.DAYS.toMillis(7L)), + DAYS("Day", "d", TimeUnit.DAYS.toMillis(1L)), + HOURS("Hour", "h", TimeUnit.HOURS.toMillis(1L)), + MINUTES("Minute", "m", TimeUnit.MINUTES.toMillis(1L)), + SECONDS("Second", "s", TimeUnit.SECONDS.toMillis(1L)), + MILLISECONDS("Millisecond", "ms", 1L); + + /** + * Our cached unit values. + */ + public static final BatTimeFormat[] VALUES = values(); + + /** + * Our cached suffix pattern. + */ + public static final Pattern SUFFIX_PATTERN = Pattern.compile("(\\d+)(mo|ms|[ywdhms])"); + + /** + * The display of this time unit. + */ + private String display; + + /** + * The suffix of this time unit. + */ + private String suffix; + + /** + * The amount of millis in this time unit. + */ + private long millis; + + /** + * Get the time unit with the given suffix. + * + * @param suffix the time unit suffix + * @return the time unit, null if not found + */ + @Nullable + public static BatTimeFormat fromSuffix(String suffix) { + for (BatTimeFormat unit : VALUES) { + if (unit != FIT && unit.getSuffix().equals(suffix)) { + return unit; + } + } + return null; + } + } +} \ No newline at end of file