aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/events
diff options
context:
space:
mode:
authorvicisacat <victor.branchu@gmail.com>2024-04-20 21:08:48 +0200
committerviciscat <51047087+viciscat@users.noreply.github.com>2024-06-02 13:26:45 +0200
commitcc4823e3646573d052ea36fef1ce6d9f9e9b90fd (patch)
treed10abc3836a2f4af81dde88a4f2c2543bb6d684d /src/main/java/de/hysky/skyblocker/skyblock/events
parent4e82c974a7217824eab084fe43ce4385b6aae52d (diff)
downloadSkyblocker-cc4823e3646573d052ea36fef1ce6d9f9e9b90fd.tar.gz
Skyblocker-cc4823e3646573d052ea36fef1ce6d9f9e9b90fd.tar.bz2
Skyblocker-cc4823e3646573d052ea36fef1ce6d9f9e9b90fd.zip
some more progress
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/events')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/events/EventNotifications.java102
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/events/EventToast.java76
2 files changed, 178 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/events/EventNotifications.java b/src/main/java/de/hysky/skyblocker/skyblock/events/EventNotifications.java
new file mode 100644
index 00000000..1d5761a5
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/events/EventNotifications.java
@@ -0,0 +1,102 @@
+package de.hysky.skyblocker.skyblock.events;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.mojang.logging.LogUtils;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.events.SkyblockEvents;
+import de.hysky.skyblocker.utils.Http;
+import de.hysky.skyblocker.utils.scheduler.Scheduler;
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.toast.SystemToast;
+import net.minecraft.text.Text;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.jetbrains.annotations.Nullable;
+import org.slf4j.Logger;
+
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+
+public class EventNotifications {
+ private static final Logger LOGGER = LogUtils.getLogger();
+
+ private static long currentTime = System.currentTimeMillis() / 1000;
+
+ public static void init() {
+ Scheduler.INSTANCE.scheduleCyclic(EventNotifications::timeUpdate, 20);
+
+ SkyblockEvents.JOIN.register(EventNotifications::refreshEvents);
+ }
+
+ private static final Map<String, LinkedList<SkyblockEvent>> events = new Object2ObjectOpenHashMap<>();
+
+ public static void refreshEvents() {
+ CompletableFuture.supplyAsync(() -> {
+ try {
+ JsonArray jsonElements = SkyblockerMod.GSON.fromJson(Http.sendGetRequest("https://hysky.de/api/calendar"), JsonArray.class);
+ return jsonElements.asList().stream().map(JsonElement::getAsJsonObject).toList();
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker] Failed to download warps list", e);
+ }
+ return List.<JsonObject>of();
+ }).thenAccept(eventsList -> {
+ events.clear();
+ for (JsonObject object : eventsList) {
+ if (object.get("timestamp").getAsLong() + object.get("duration").getAsInt() < currentTime) continue;
+ SkyblockEvent skyblockEvent = SkyblockEvent.of(object);
+ events.computeIfAbsent(object.get("event").getAsString(), s -> new LinkedList<>()).add(skyblockEvent);
+ }
+
+ for (Map.Entry<String, LinkedList<SkyblockEvent>> entry : events.entrySet()) {
+ entry.getValue().sort(Comparator.comparingLong(SkyblockEvent::start)); // Sort just in case it's not in order for some reason in API
+ //LOGGER.info("Next {} is at {}", entry.getKey(), entry.getValue().peekFirst());
+ }
+ });
+ }
+
+
+
+ private static void timeUpdate() {
+ long newTime = System.currentTimeMillis() / 1000;
+ for (Map.Entry<String, LinkedList<SkyblockEvent>> entry : events.entrySet()) {
+ LinkedList<SkyblockEvent> nextEvents = entry.getValue();
+ SkyblockEvent skyblockEvent = nextEvents.peekFirst();
+ if (skyblockEvent == null) continue;
+ if (newTime > skyblockEvent.start() + skyblockEvent.duration()) {
+ nextEvents.pollFirst();
+ skyblockEvent = nextEvents.peekFirst();
+ if (skyblockEvent == null) continue;
+ }
+ if (currentTime + 60 < skyblockEvent.start() && newTime + 60 >= skyblockEvent.start()) {
+ MinecraftClient.getInstance().getToastManager().add(new SystemToast(
+ SystemToast.Type.PERIODIC_NOTIFICATION,
+ Text.literal(entry.getKey()),
+ Text.literal("Starting soon!")));
+ }
+ }
+ currentTime = newTime;
+ }
+
+ public record SkyblockEvent(long start, int duration, String[] extras, @Nullable String warpCommand) {
+ public static SkyblockEvent of(JsonObject jsonObject) {
+ String location = jsonObject.get("location").getAsString();
+ location = location.isBlank() ? null: location;
+ return new SkyblockEvent(jsonObject.get("timestamp").getAsLong(),
+ jsonObject.get("duration").getAsInt(),
+ jsonObject.get("extras").getAsJsonArray().asList().stream().map(JsonElement::getAsString).toArray(String[]::new),
+ location);
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this)
+ .append("start", start)
+ .append("duration", duration)
+ .append("extras", extras)
+ .append("warpCommand", warpCommand)
+ .toString();
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/events/EventToast.java b/src/main/java/de/hysky/skyblocker/skyblock/events/EventToast.java
new file mode 100644
index 00000000..4a0d139b
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/events/EventToast.java
@@ -0,0 +1,76 @@
+package de.hysky.skyblocker.skyblock.events;
+
+import de.hysky.skyblocker.SkyblockerMod;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.toast.Toast;
+import net.minecraft.client.toast.ToastManager;
+import net.minecraft.item.ItemStack;
+import net.minecraft.screen.ScreenTexts;
+import net.minecraft.text.MutableText;
+import net.minecraft.text.OrderedText;
+import net.minecraft.text.Text;
+import net.minecraft.util.Colors;
+import net.minecraft.util.Formatting;
+import net.minecraft.util.Identifier;
+
+import java.util.List;
+
+public class EventToast implements Toast {
+ private static final Identifier TEXTURE = new Identifier(SkyblockerMod.NAMESPACE, "notification");
+
+ private final long eventStartTime;
+
+ private final List<OrderedText> message;
+ private final ItemStack icon;
+
+ public EventToast(long eventStartTime, String name, ItemStack icon) {
+ this.eventStartTime = eventStartTime;
+ MutableText formatted = Text.translatable("skyblocker.events.startsSoon", Text.literal(name).formatted(Formatting.YELLOW)).formatted(Formatting.WHITE);
+ message = MinecraftClient.getInstance().textRenderer.wrapLines(formatted, 200);
+ this.icon = icon;
+
+ }
+ @Override
+ public Visibility draw(DrawContext context, ToastManager manager, long startTime) {
+ context.drawGuiTexture(TEXTURE, 0, 0, getWidth(), getHeight());
+
+ long currentTime = System.currentTimeMillis() / 1000;
+ int timeTillEvent = (int) (eventStartTime - currentTime);
+
+ int seconds = timeTillEvent % 60;
+ int minutes = (timeTillEvent/60) % 60;
+ int hours = (timeTillEvent/3600) % 24;
+
+ MutableText time = Text.empty();
+ if (hours > 0) {
+ time.append(hours + "h").append(" ");
+ }
+ if (hours > 0 || minutes > 0) {
+ time.append(minutes + "m").append(" ");
+ }
+ time.append(seconds + "s");
+
+ int y = 4;
+ TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
+ for (OrderedText orderedText : message) {
+ context.drawText(textRenderer, orderedText, 30, y, Colors.WHITE, false);
+ y += textRenderer.fontHeight;
+ }
+ context.drawText(textRenderer, time, 30, y, Colors.LIGHT_YELLOW, false);
+
+ context.drawItemWithoutEntity(icon, 8, getHeight()/2 - 8);
+ return startTime > 5_000 ? Visibility.HIDE: Visibility.SHOW;
+ }
+
+ @Override
+ public int getWidth() {
+ return 200 + 30 + 5;
+ }
+
+ @Override
+ public int getHeight() {
+ return 8 + 9 + message.size()*9;
+ }
+}