diff options
Diffstat (limited to 'src/main/kotlin/moe/nea/firmament/util/SBData.kt')
-rw-r--r-- | src/main/kotlin/moe/nea/firmament/util/SBData.kt | 62 |
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") + } + + +} |