/* * Copyright (C) 2022 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with NotEnoughUpdates. If not, see . */ package io.github.moulberry.notenoughupdates.miscfeatures; import com.google.common.collect.Lists; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.miscfeatures.tablisttutorial.TablistAPI; import io.github.moulberry.notenoughupdates.util.NotificationHandler; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.util.EnumChatFormatting; import java.util.List; import java.util.Locale; public class CookieWarning { private static boolean hasNotified; private static boolean hasErrorMessage; private static long cookieEndTime = 0; private static boolean hasCookie = true; private static long lastChecked = 0; public static void resetNotification() { hasNotified = false; hasCookie = true; NotificationHandler.cancelNotification(); } /** * Checks the tab list for a cookie timer, and sends a notification if the timer is within the tolerance */ public static void checkCookie() { if (!NotEnoughUpdates.INSTANCE.config.notifications.doBoosterNotif || !NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) { return; } String timeLine = getTimeLine(); if (!hasCookie) { if (!hasNotified) { NotificationHandler.displayNotification(Lists.newArrayList( "§cBooster Cookie Ran Out!", "§7Your Booster Cookie expired!", "§7", "§7Press X on your keyboard to close this notification" ), true, true); hasNotified = true; } return; } if (timeLine == null) return; int minutes = (int) (getMillisecondsRemaining(timeLine) / 60 / 1000); if (minutes < NotEnoughUpdates.INSTANCE.config.notifications.boosterCookieWarningMins && !hasNotified) { NotificationHandler.displayNotification(Lists.newArrayList( "§cBooster Cookie Running Low!", "§7Your Booster Cookie will expire in " + timeLine, "§7", "§7Press X on your keyboard to close this notification" ), true, true); hasNotified = true; } } private static long getMillisecondsRemaining(String timeLine) { if ("Less than an hour".equals(timeLine)) { return 10 * 60 * 1000; //Return 10 minutes, they need more cookie! } String clean = timeLine.replaceAll("(§.)", ""); clean = clean.replaceAll("(\\d)([smhdMy])", "$1 $2"); String[] digits = clean.split(" "); long ms = 0; try { for (int i = 0; i < digits.length; i++) { if (i % 2 == 1) continue; String number = digits[i]; String unit = digits[i + 1]; long val = Integer.parseInt(number); ms += (getEffectRemainingInMilliseconds(unit, val)); } } catch (Exception e) { if (!hasErrorMessage) { e.printStackTrace(); Utils.addChatMessage(EnumChatFormatting.RED + "NEU ran into an issue when retrieving the Booster Cookie Timer. Check the logs for details."); hasErrorMessage = true; } hasNotified = true; } return ms; } private static String getTimeLine() { List lines = TablistAPI.getOptionalWidgetLines(TablistAPI.WidgetNames.ACTIVE_EFFECTS); List lines2 = TablistAPI.getOptionalWidgetLines(TablistAPI.WidgetNames.COOKIE_BUFF); lines.addAll(lines2); String timeLine = null; // the line that contains the cookie timer for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); line = Utils.cleanColour(line).trim(); if (line.startsWith("Cookie Buff:")) { timeLine = line.replace("Cookie Buff: ", ""); if (timeLine.contains("INACTIVE")) { hasCookie = false; return null; } } else if (line.startsWith("Cookie Buff")) { timeLine = lines.get(i + 1); // the line after the "Cookie Buff" line timeLine = Utils.cleanColour(timeLine).trim(); } if (line.startsWith("Not active! Obtain booster cookies from the")) { hasCookie = false; return null; } } return timeLine; } public static boolean hasActiveBoosterCookie() { long cookieEndTime = getCookieEndTime(); return cookieEndTime > System.currentTimeMillis(); } private static long getCookieEndTime() { // Only updating every 10 seconds // if (System.currentTimeMillis() > lastChecked + 10_000) return cookieEndTime; if (lastChecked + 3_000 > System.currentTimeMillis()) return cookieEndTime; String timeLine = getTimeLine(); if (hasCookie && timeLine != null) { long ms = getMillisecondsRemaining(timeLine); cookieEndTime = System.currentTimeMillis() + ms; } else { cookieEndTime = 0; } lastChecked = System.currentTimeMillis(); return cookieEndTime; } public static void onProfileSwitch() { resetNotification(); hasErrorMessage = false; cookieEndTime = 0; hasCookie = true; lastChecked = 0; } public static long getEffectRemainingInMilliseconds(String remainingTimeType, long remainingTime) { switch (remainingTimeType.replace(",", "")) { case "months": case "month": case "mo": case "M": return remainingTime * 24 * 60 * 60 * 1000 * 30; } switch (remainingTimeType.toLowerCase(Locale.ROOT).replace(",", "")) { case "years": case "year": case "y": return remainingTime * 24 * 60 * 60 * 1000 * 30 * 12; case "months": case "month": case "mo": return remainingTime * 24 * 60 * 60 * 1000 * 30; case "days": case "day": case "d": return remainingTime * 24 * 60 * 60 * 1000; case "hours": case "hour": case "h": return remainingTime * 60 * 60 * 1000; case "minutes": case "minute": case "m": return remainingTime * 60 * 1000; case "seconds": case "second": case "s": return remainingTime * 1000; } return remainingTime; } }