diff options
author | CalMWolfs <94038482+CalMWolfs@users.noreply.github.com> | 2024-02-06 09:01:12 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-05 23:01:12 +0100 |
commit | 6ed818521cd2c9e97743881966632488e598c20e (patch) | |
tree | 1a1f92cc4feeff03bbc82240c4b86ae610a17842 /src/main/java/at/hannibal2/skyhanni/features/mining | |
parent | ab43b1989ebb75d5ca3ddd59a71e6a8879f040b0 (diff) | |
download | skyhanni-6ed818521cd2c9e97743881966632488e598c20e.tar.gz skyhanni-6ed818521cd2c9e97743881966632488e598c20e.tar.bz2 skyhanni-6ed818521cd2c9e97743881966632488e598c20e.zip |
Send Mining Island Events (#969)
Added sending mining events to Soopy's API to test for new Mining Event feature. #969
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features/mining')
4 files changed, 198 insertions, 3 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEvent.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEvent.kt new file mode 100644 index 000000000..f5d8e26d8 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEvent.kt @@ -0,0 +1,26 @@ +package at.hannibal2.skyhanni.features.mining.eventtracker + +import at.hannibal2.skyhanni.utils.StringUtils.removeColor +import kotlin.time.Duration +import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.seconds + +enum class MiningEvent(val eventName: String, val defaultLength: Duration, private val colourCode: Char) { + GONE_WITH_THE_WIND("GONE WITH THE WIND", 18.minutes, '9'), + DOUBLE_POWDER("2X POWDER", 15.minutes, 'b'), + GOBLIN_RAID("GOBLIN RAID", 5.minutes, 'c'), + BETTER_TOGETHER("BETTER TOGETHER", 18.minutes, 'd'), + RAFFLE("RAFFLE", 160.seconds, '6'), + MITHRIL_GOURMAND("MITHRIL GOURMAND", 10.minutes, 'b'), + ; + + override fun toString(): String { + return "§$colourCode$eventName" + } + + companion object { + fun fromBossbarName(bossbarName: String): MiningEvent? { + return MiningEvent.entries.find { it.eventName == bossbarName.removeColor() } + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEventData.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEventData.kt new file mode 100644 index 000000000..ee2033ed4 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEventData.kt @@ -0,0 +1,13 @@ +package at.hannibal2.skyhanni.features.mining.eventtracker + +import at.hannibal2.skyhanni.data.IslandType +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + +data class MiningEventData( + @Expose @SerializedName("server_type") val serverType: IslandType, + @Expose @SerializedName("server_id") val serverId: String, + @Expose val event: MiningEvent, + @Expose @SerializedName("time_left") val timeRemaining: Long, + @Expose @SerializedName("reporter_uuid") val uuid: String +) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEventTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEventTracker.kt new file mode 100644 index 000000000..1fef5b2ee --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/eventtracker/MiningEventTracker.kt @@ -0,0 +1,156 @@ +package at.hannibal2.skyhanni.features.mining.eventtracker + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.ConfigManager +import at.hannibal2.skyhanni.data.BossbarData +import at.hannibal2.skyhanni.data.HypixelData +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.data.ScoreboardData +import at.hannibal2.skyhanni.events.BossbarUpdateEvent +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent +import at.hannibal2.skyhanni.test.command.ErrorManager +import at.hannibal2.skyhanni.utils.APIUtil +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland +import at.hannibal2.skyhanni.utils.SimpleTimeMark +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.TabListData +import at.hannibal2.skyhanni.utils.TimeUtils +import at.hannibal2.skyhanni.utils.getBoolean +import at.hannibal2.skyhanni.utils.getStringOrValue +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern +import kotlinx.coroutines.launch +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import kotlin.time.Duration.Companion.seconds + +class MiningEventTracker { + private val config get() = SkyHanniMod.feature.mining.miningEvent + + private val patternGroup = RepoPattern.group("mining.eventtracker") + private val bossbarPassivePattern by patternGroup.pattern( + "bossbar.passive", + "§e§lPASSIVE EVENT (?<event>.+) §e§lRUNNING FOR §a§l(?<time>\\S+)§r" + ) + private val bossbarActivePattern by patternGroup.pattern( + "bossbar.active", + "§e§lEVENT (?<event>.+) §e§lACTIVE IN (?<area>.+) §e§lfor §a§l(?<time>\\S+)§r" + ) + private val eventStartedPattern by patternGroup.pattern( + "started", + "(?:§.)*\\s+(?:§.)+§l(?<event>.+) STARTED!" + ) + private val eventEndedPattern by patternGroup.pattern( + "ended", + "(?:§.)*\\s+(?:§.)+§l(?<event>.+) ENDED!" + ) + + private var lastRequestSent = SimpleTimeMark.farPast() + private var lastWorldSwitch = SimpleTimeMark.farPast() + private var eventEndTime = SimpleTimeMark.farPast() + + private var lastSentEvent: MiningEvent? = null + + @SubscribeEvent + fun onWorldChange(event: LorenzWorldChangeEvent) { + lastRequestSent = SimpleTimeMark.now() + lastWorldSwitch = SimpleTimeMark.farPast() + eventEndTime = SimpleTimeMark.farPast() + + lastSentEvent = null + } + + @SubscribeEvent + fun onBossbarChange(event: BossbarUpdateEvent) { + if (!isEnabled()) return + if (lastWorldSwitch.passedSince() < 2.seconds) return + if (!eventEndTime.isInPast()) { + return + } + + bossbarPassivePattern.matchMatcher(event.bossbar) { + sendData(group("event"), group("time")) + } + bossbarActivePattern.matchMatcher(event.bossbar) { + sendData(group("event"), group("time")) + } + } + + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + if (!isEnabled()) return + + eventStartedPattern.matchMatcher(event.message) { + sendData(group("event"), null) + } + eventEndedPattern.matchMatcher(event.message) { + lastSentEvent = null + } + } + + private fun sendData(eventName: String, time: String?) { + val eventType = MiningEvent.fromBossbarName(eventName) + if (lastSentEvent == eventType) return + if (eventType == null) { + ErrorManager.logErrorWithData( + Exception("UnknownMiningEvent"), "Unknown mining event detected from string $eventName", + "eventName" to eventName, + "bossbar" to BossbarData.getBossbar(), + "serverType" to LorenzUtils.skyBlockIsland, + "fromChat" to (time == null) + ) + return + } + lastSentEvent = eventType + + val timeRemaining = if (time == null) { + eventType.defaultLength + } else { + TimeUtils.getDuration(time) + } + eventEndTime = SimpleTimeMark.now() + timeRemaining + + val serverId = HypixelData.getCurrentServerId() + if (serverId == null) { + ErrorManager.logErrorWithData( + Exception("NoServerId"), "Could not find server id", + "islandType" to LorenzUtils.skyBlockIsland, + "tablist" to TabListData.getTabList(), + "scoreboard" to ScoreboardData.sidebarLinesFormatted + ) + return + } + + val miningEventData = MiningEventData( + LorenzUtils.skyBlockIsland, + serverId, + eventType, + timeRemaining.inWholeMilliseconds, + LorenzUtils.getPlayerUuid() + ) + val miningEventJson = ConfigManager.gson.toJson(miningEventData) +// //todo remove +// println("\n```json$miningEventJson```") + SkyHanniMod.coroutineScope.launch { + sendData(miningEventJson) + } + } + + private fun isEnabled() = (IslandType.DWARVEN_MINES.isInIsland() || IslandType.CRYSTAL_HOLLOWS.isInIsland()) && config.sendData +// && config.enabled + + + private fun sendData(json: String) { + val response = APIUtil.postJSON("https://api.soopy.dev/skyblock/chevents/set", json) + if (!response.success) return + val success = response.data.getBoolean("success") + if (!success) { + val cause = response.data.getStringOrValue("cause", "unknown") + ErrorManager.logErrorWithData( + Exception("PostFailure"), "Sending mining event data was unsuccessful", + "cause" to cause, + "sentData" to json + ) + } + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/powdertracker/PowderTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/powdertracker/PowderTracker.kt index a328d12ce..3c3b0dfd3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/powdertracker/PowderTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/powdertracker/PowderTracker.kt @@ -3,6 +3,7 @@ package at.hannibal2.skyhanni.features.mining.powdertracker import at.hannibal2.skyhanni.SkyHanniMod import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator import at.hannibal2.skyhanni.config.features.mining.PowderTrackerConfig.PowderDisplayEntry +import at.hannibal2.skyhanni.data.BossbarData import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.ConfigLoadEvent import at.hannibal2.skyhanni.events.GuiRenderEvent @@ -23,7 +24,6 @@ import at.hannibal2.skyhanni.utils.tracker.TrackerData import com.google.gson.JsonArray import com.google.gson.JsonNull import com.google.gson.annotations.Expose -import net.minecraft.entity.boss.BossStatus import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import kotlin.concurrent.fixedRateTimer @@ -153,8 +153,8 @@ object PowderTracker { fun onTick(event: LorenzTickEvent) { if (!isEnabled()) return if (event.repeatSeconds(1)) { - doublePowder = powderBossBarPattern.matcher(BossStatus.bossName).find() - powderBossBarPattern.matchMatcher(BossStatus.bossName) { + doublePowder = powderBossBarPattern.matcher(BossbarData.getBossbar()).find() + powderBossBarPattern.matchMatcher(BossbarData.getBossbar()) { powderTimer = group("time") doublePowder = powderTimer != "00:00" |