aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2024-08-12 19:28:45 -0400
committerGitHub <noreply@github.com>2024-08-12 19:28:45 -0400
commitac08fb6514defbac92876dc70e1ba98f7504ae24 (patch)
treed1e76ea51b5d28dccfcfd4c8db28555ee54aafad /src/main/java
parent3830cea067dd2d0cdb2910dd624e0d9f0e46b7c3 (diff)
downloadSkyblocker-ac08fb6514defbac92876dc70e1ba98f7504ae24.tar.gz
Skyblocker-ac08fb6514defbac92876dc70e1ba98f7504ae24.tar.bz2
Skyblocker-ac08fb6514defbac92876dc70e1ba98f7504ae24.zip
Crystals Waypoint WebSocket Enhancements (#917)
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/ws/WsMessageHandler.java30
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/ws/WsStateManager.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/ws/message/CrystalsWaypointSubscribeMessage.java26
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/ws/message/Message.java2
5 files changed, 54 insertions, 17 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java
index 8b8a7737..3ce4cfe0 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java
@@ -18,6 +18,7 @@ import de.hysky.skyblocker.utils.ws.WsMessageHandler;
import de.hysky.skyblocker.utils.ws.Service;
import de.hysky.skyblocker.utils.ws.WsStateManager;
import de.hysky.skyblocker.utils.ws.message.CrystalsWaypointMessage;
+import de.hysky.skyblocker.utils.ws.message.CrystalsWaypointSubscribeMessage;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
@@ -327,6 +328,7 @@ public class CrystalsLocationsManager {
MiningLocationLabel waypoint = new MiningLocationLabel(category, pos);
waypointsSent2Socket.add(category);
activeWaypoints.put(category.name(), waypoint);
+ CLIENT.player.sendMessage(Constants.PREFIX.get().append(Text.translatable("skyblocker.webSocket.receivedCrystalsWaypoint", Text.literal(category.getName()).withColor(category.getColor()))));
}
protected static void addCustomWaypoint(String waypointName, BlockPos pos) {
@@ -362,7 +364,7 @@ public class CrystalsLocationsManager {
private static void onLocationChange(Location newLocation) {
if (newLocation == Location.CRYSTAL_HOLLOWS) {
- WsStateManager.subscribe(Service.CRYSTAL_WAYPOINTS);
+ WsStateManager.subscribe(Service.CRYSTAL_WAYPOINTS, Optional.of(CrystalsWaypointSubscribeMessage.create(CLIENT.world)));
}
}
diff --git a/src/main/java/de/hysky/skyblocker/utils/ws/WsMessageHandler.java b/src/main/java/de/hysky/skyblocker/utils/ws/WsMessageHandler.java
index d85ccbb8..f4aadbc4 100644
--- a/src/main/java/de/hysky/skyblocker/utils/ws/WsMessageHandler.java
+++ b/src/main/java/de/hysky/skyblocker/utils/ws/WsMessageHandler.java
@@ -23,23 +23,15 @@ public class WsMessageHandler {
/**
* Used for sending messages to the current channel/server
*/
- @SuppressWarnings("unchecked")
public static void sendMessage(Service service, Message<? extends Message<?>> message) {
- try {
- Codec<Message<?>> codec = (Codec<Message<?>>) message.getCodec();
- Dynamic<JsonElement> dynamic = new Dynamic<>(JsonOps.INSTANCE, codec.encodeStart(JsonOps.INSTANCE, message).getOrThrow());
-
- send(Type.PUBLISH, service, Utils.getServer(), Optional.of(dynamic));
- } catch (Exception e) {
- LOGGER.info("[Skyblocker WebSocket Message Handler] Failed to encode message! Message: {}", message, e);
- }
+ send(Type.PUBLISH, service, Utils.getServer(), Optional.of(encodeMessage(message)));
}
/**
- * Useful for sending simple state updates
+ * Useful for sending simple state updates with an optional message
*/
- static void sendSimple(Type type, Service service, String serverId) {
- send(type, service, serverId, Optional.empty());
+ static void sendSimple(Type type, Service service, String serverId, Optional<Message<? extends Message<?>>> message) {
+ send(type, service, serverId, message.isPresent() ? Optional.of(encodeMessage(message.get())) : Optional.empty());
}
private static void send(Type type, Service service, String serverId, Optional<Dynamic<?>> message) {
@@ -53,6 +45,20 @@ public class WsMessageHandler {
}
}
+ private static Dynamic<?> encodeMessage(Message<? extends Message<?>> message) {
+ try {
+ @SuppressWarnings("unchecked")
+ Codec<Message<?>> codec = (Codec<Message<?>>) message.getCodec();
+ Dynamic<JsonElement> dynamic = new Dynamic<>(JsonOps.INSTANCE, codec.encodeStart(JsonOps.INSTANCE, message).getOrThrow());
+
+ return dynamic;
+ } catch (Exception e) {
+ LOGGER.info("[Skyblocker WebSocket Message Handler] Failed to encode message! Message: {}", message, e);
+ }
+
+ return new Dynamic<>(JsonOps.INSTANCE);
+ }
+
static void handleMessage(String message) {
try {
JsonObject payloadEncoded = JsonParser.parseString(message).getAsJsonObject();
diff --git a/src/main/java/de/hysky/skyblocker/utils/ws/WsStateManager.java b/src/main/java/de/hysky/skyblocker/utils/ws/WsStateManager.java
index 6715c1f6..e3d7bec5 100644
--- a/src/main/java/de/hysky/skyblocker/utils/ws/WsStateManager.java
+++ b/src/main/java/de/hysky/skyblocker/utils/ws/WsStateManager.java
@@ -1,7 +1,10 @@
package de.hysky.skyblocker.utils.ws;
+import java.util.Optional;
+
import de.hysky.skyblocker.events.SkyblockEvents;
import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.ws.message.Message;
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
import it.unimi.dsi.fastutil.objects.ReferenceSet;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
@@ -18,7 +21,7 @@ public class WsStateManager {
private static void reset() {
if (!lastServerId.isEmpty()) {
for (Service service : SUBSCRIBED_SERVICES) {
- WsMessageHandler.sendSimple(Type.UNSUBSCRIBE, service, lastServerId);
+ WsMessageHandler.sendSimple(Type.UNSUBSCRIBE, service, lastServerId, Optional.empty());
}
lastServerId = "";
@@ -29,9 +32,9 @@ public class WsStateManager {
* @implNote The service must be registered after the {@link ClientPlayConnectionEvents#JOIN} event fires, one good
* place is inside of the {@link SkyblockEvents#LOCATION_CHANGE} event.
*/
- public static void subscribe(Service service) {
+ public static void subscribe(Service service, Optional<Message<? extends Message<?>>> message) {
SUBSCRIBED_SERVICES.add(service);
- WsMessageHandler.sendSimple(Type.SUBSCRIBE, service, Utils.getServer());
+ WsMessageHandler.sendSimple(Type.SUBSCRIBE, service, Utils.getServer(), message);
//Update tracked server id
lastServerId = Utils.getServer();
diff --git a/src/main/java/de/hysky/skyblocker/utils/ws/message/CrystalsWaypointSubscribeMessage.java b/src/main/java/de/hysky/skyblocker/utils/ws/message/CrystalsWaypointSubscribeMessage.java
new file mode 100644
index 00000000..ee63eced
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/ws/message/CrystalsWaypointSubscribeMessage.java
@@ -0,0 +1,26 @@
+package de.hysky.skyblocker.utils.ws.message;
+
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
+
+import net.minecraft.client.world.ClientWorld;
+
+public record CrystalsWaypointSubscribeMessage(long timestamp) implements Message<CrystalsWaypointSubscribeMessage> {
+ private static final Codec<CrystalsWaypointSubscribeMessage> CODEC = RecordCodecBuilder.create(instance -> instance.group(
+ Codec.LONG.fieldOf("timestamp").forGetter(CrystalsWaypointSubscribeMessage::timestamp))
+ .apply(instance, CrystalsWaypointSubscribeMessage::new));
+ /** 26 Minecraft days in ticks */
+ private static final int TWENTY_SIX_DAYS = 24000 * 26;
+
+ public static CrystalsWaypointSubscribeMessage create(ClientWorld world) {
+ //Current timestamp as seconds + ((26 mc days - mc time) / ticks per second)
+ long closeTime = (System.currentTimeMillis() / 1000L) + ((TWENTY_SIX_DAYS - world.getTimeOfDay()) / 20L);
+
+ return new CrystalsWaypointSubscribeMessage(closeTime);
+ }
+
+ @Override
+ public Codec<CrystalsWaypointSubscribeMessage> getCodec() {
+ return CODEC;
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/ws/message/Message.java b/src/main/java/de/hysky/skyblocker/utils/ws/message/Message.java
index 2d145ca4..13f1309a 100644
--- a/src/main/java/de/hysky/skyblocker/utils/ws/message/Message.java
+++ b/src/main/java/de/hysky/skyblocker/utils/ws/message/Message.java
@@ -2,7 +2,7 @@ package de.hysky.skyblocker.utils.ws.message;
import com.mojang.serialization.Codec;
-public sealed interface Message<T extends Message<T>> permits CrystalsWaypointMessage {
+public sealed interface Message<T extends Message<T>> permits CrystalsWaypointMessage, CrystalsWaypointSubscribeMessage {
Codec<T> getCodec();
}