From 5c78ec907fcd092f767544e4fef04a50f0eed416 Mon Sep 17 00:00:00 2001 From: Liam Date: Thu, 15 Aug 2024 13:59:13 +0100 Subject: [PATCH] fix minecraft player lookup error handling --- .../cc/fascinated/bat/common/TimeUtils.java | 166 ------------------ .../minecraft/LookupPlayerSubCommand.java | 15 +- .../scoresaber/ScoresSummarySubCommand.java | 4 +- 3 files changed, 15 insertions(+), 170 deletions(-) delete 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 deleted file mode 100644 index 736f1aa..0000000 --- a/src/main/java/cc/fascinated/bat/common/TimeUtils.java +++ /dev/null @@ -1,166 +0,0 @@ -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 diff --git a/src/main/java/cc/fascinated/bat/features/minecraft/command/minecraft/LookupPlayerSubCommand.java b/src/main/java/cc/fascinated/bat/features/minecraft/command/minecraft/LookupPlayerSubCommand.java index 4b25c78..2673000 100644 --- a/src/main/java/cc/fascinated/bat/features/minecraft/command/minecraft/LookupPlayerSubCommand.java +++ b/src/main/java/cc/fascinated/bat/features/minecraft/command/minecraft/LookupPlayerSubCommand.java @@ -16,6 +16,7 @@ import net.dv8tion.jda.api.interactions.commands.SlashCommandInteraction; import net.dv8tion.jda.api.interactions.commands.build.OptionData; import org.springframework.stereotype.Component; import xyz.mcutils.McUtilsAPI; +import xyz.mcutils.exception.ErrorResponse; import xyz.mcutils.models.cache.CachedPlayer; import xyz.mcutils.models.player.Skin; @@ -38,9 +39,19 @@ public class LookupPlayerSubCommand extends BatCommand { public void execute(BatGuild guild, @NonNull BatUser user, @NonNull MessageChannel channel, Member member, Message commandMessage, String[] arguments, SlashCommandInteraction event) { OptionMapping playerOption = event.getOption("player"); assert playerOption != null; - String player = playerOption.getAsString(); - CachedPlayer cachedPlayer = McUtilsAPI.getPlayer(player); + + // Check if the player id is valid + if (player.length() > 16 || player.contains(" ")) { + event.reply("The player id `%s` is invalid".formatted(player)).queue(); + return; + } + + // Fetch the player from the API + CachedPlayer cachedPlayer = null; + try { + cachedPlayer = McUtilsAPI.getPlayer(player); + } catch (ErrorResponse ignored) { } // The error response is handled below if (cachedPlayer == null) { event.reply("The player `%s` could not be found".formatted(player)).queue(); return; diff --git a/src/main/java/cc/fascinated/bat/features/scoresaber/command/scoresaber/ScoresSummarySubCommand.java b/src/main/java/cc/fascinated/bat/features/scoresaber/command/scoresaber/ScoresSummarySubCommand.java index 3df0861..f2fa6c6 100644 --- a/src/main/java/cc/fascinated/bat/features/scoresaber/command/scoresaber/ScoresSummarySubCommand.java +++ b/src/main/java/cc/fascinated/bat/features/scoresaber/command/scoresaber/ScoresSummarySubCommand.java @@ -107,8 +107,8 @@ public class ScoresSummarySubCommand extends BatCommand { **Scores Summary** Here is a summary of score for %s \s - Total Scores: %s - Total Ranked Scores: %s + Total Scores: `%s` + Total Ranked Scores: `%s` """.formatted( user.getDiscordUser().getAsMention(), NumberFormatter.simpleFormat(scores.size()),