aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament/util/SBData.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/moe/nea/firmament/util/SBData.kt')
-rw-r--r--src/main/kotlin/moe/nea/firmament/util/SBData.kt62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/main/kotlin/moe/nea/firmament/util/SBData.kt b/src/main/kotlin/moe/nea/firmament/util/SBData.kt
new file mode 100644
index 0000000..6e866f8
--- /dev/null
+++ b/src/main/kotlin/moe/nea/firmament/util/SBData.kt
@@ -0,0 +1,62 @@
+package moe.nea.firmament.util
+
+import kotlinx.serialization.SerializationException
+import kotlinx.serialization.decodeFromString
+import kotlin.time.Duration
+import kotlin.time.Duration.Companion.seconds
+import moe.nea.firmament.Firmament
+import moe.nea.firmament.events.ServerChatLineReceivedEvent
+import moe.nea.firmament.events.SkyblockServerUpdateEvent
+import moe.nea.firmament.events.WorldReadyEvent
+
+object SBData {
+ val profileRegex = "(?:Your profile was changed to: |You are playing on profile: )(.+)".toRegex()
+ var profileCuteName: String? = null
+
+ private var lastLocrawSent = Timer()
+ 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("{")) {
+ if (tryReceiveLocraw(event.unformattedString) && lastLocrawSent.timePassed() < locrawRoundtripTime) {
+ lastLocrawSent.markFarPast()
+ event.cancel()
+ }
+ }
+ }
+
+ WorldReadyEvent.subscribe {
+ sendLocraw()
+ locraw = null
+ }
+ }
+
+ private fun tryReceiveLocraw(unformattedString: String): Boolean = try {
+ val lastLocraw = locraw
+ locraw = Firmament.json.decodeFromString<Locraw>(unformattedString)
+ SkyblockServerUpdateEvent.publish(SkyblockServerUpdateEvent(lastLocraw, locraw))
+ true
+ } catch (e: SerializationException) {
+ e.printStackTrace()
+ false
+ } catch (e: IllegalArgumentException) {
+ e.printStackTrace()
+ false
+ }
+
+ fun sendLocraw() {
+ lastLocrawSent.markNow()
+ val nh = MC.player?.networkHandler ?: return
+ nh.sendChatCommand("locraw")
+ }
+
+
+}