aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/notenoughupdates/util/SBData.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/moe/nea/notenoughupdates/util/SBData.kt')
-rw-r--r--src/main/kotlin/moe/nea/notenoughupdates/util/SBData.kt63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/main/kotlin/moe/nea/notenoughupdates/util/SBData.kt b/src/main/kotlin/moe/nea/notenoughupdates/util/SBData.kt
new file mode 100644
index 0000000..5391206
--- /dev/null
+++ b/src/main/kotlin/moe/nea/notenoughupdates/util/SBData.kt
@@ -0,0 +1,63 @@
+package moe.nea.notenoughupdates.util
+
+import dev.architectury.event.events.client.ClientPlayerEvent
+import kotlinx.serialization.SerializationException
+import kotlinx.serialization.decodeFromString
+import kotlin.time.Duration
+import kotlin.time.Duration.Companion.seconds
+import kotlin.time.ExperimentalTime
+import kotlin.time.TimeSource
+import moe.nea.notenoughupdates.NotEnoughUpdates
+import moe.nea.notenoughupdates.events.ServerChatLineReceivedEvent
+import moe.nea.notenoughupdates.events.SkyblockServerUpdateEvent
+
+@OptIn(ExperimentalTime::class)
+object SBData {
+ val profileRegex = "(?:Your profile was changed to: |You are playing on profile: )(.+)".toRegex()
+ var profileCuteName: String? = null
+
+ private var lastLocrawSent: TimeSource.Monotonic.ValueTimeMark? = null
+ private val locrawRoundtripTime: Duration = 5.seconds
+ var locraw: Locraw? = null
+ val skyblockLocation get() = locraw?.skyblockLocation
+
+
+ fun init() {
+ ServerChatLineReceivedEvent.subscribe { event ->
+ val profileMatch = profileRegex.matchEntire(event.unformattedString)
+ if (profileMatch != null) {
+ profileCuteName = profileMatch.groupValues[1]
+ }
+ if (event.unformattedString.startsWith("{")) {
+ val lLS = lastLocrawSent
+ if (tryReceiveLocraw(event.unformattedString) && lLS != null && lLS.elapsedNow() < locrawRoundtripTime) {
+ lastLocrawSent = null
+ event.cancel()
+ }
+ }
+ }
+
+ ClientPlayerEvent.CLIENT_PLAYER_JOIN.register(ClientPlayerEvent.ClientPlayerJoin {
+ locraw = null
+ sendLocraw()
+ })
+ }
+
+ private fun tryReceiveLocraw(unformattedString: String): Boolean = try {
+ val lastLocraw = locraw
+ locraw = NotEnoughUpdates.json.decodeFromString<Locraw>(unformattedString)
+ SkyblockServerUpdateEvent.publish(SkyblockServerUpdateEvent(lastLocraw, locraw))
+ true
+ } catch (e: SerializationException) {
+ false
+ } catch (e: IllegalArgumentException) {
+ false
+ }
+
+ fun sendLocraw() {
+ lastLocrawSent = TimeSource.Monotonic.markNow()
+ MC.player?.sendCommand("locraw")
+ }
+
+
+}