aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardElements.kt51
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardPattern.kt4
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/UnknownLinesHandler.kt37
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt9
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt7
5 files changed, 70 insertions, 38 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardElements.kt b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardElements.kt
index 18f8a9239..162124aa3 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardElements.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardElements.kt
@@ -39,11 +39,35 @@ import at.hannibal2.skyhanni.utils.StringUtils.firstLetterUppercase
import at.hannibal2.skyhanni.utils.StringUtils.matches
import at.hannibal2.skyhanni.utils.StringUtils.pluralize
import at.hannibal2.skyhanni.utils.TabListData
+import at.hannibal2.skyhanni.utils.TimeLimitedSet
import at.hannibal2.skyhanni.utils.TimeUtils.format
import at.hannibal2.skyhanni.utils.TimeUtils.formatted
import java.util.function.Supplier
+import kotlin.time.Duration.Companion.milliseconds
+
+internal var confirmedUnknownLines = mutableListOf<String>()
+internal var unconfirmedUnknownLines = listOf<String>()
+internal var unknownLinesSet = TimeLimitedSet<String>(500.milliseconds) { onRemoval(it) }
+
+private fun onRemoval(line: String) {
+ if (!unconfirmedUnknownLines.contains(line)) return
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filterNot { it == line }
+ confirmedUnknownLines.add(line)
+ if (!config.unknownLinesWarning) return
+ val pluralize = pluralize(confirmedUnknownLines.size, "unknown line", withNumber = true)
+ val message = "CustomScoreboard detected $pluralize"
+ ErrorManager.logErrorWithData(
+ CustomScoreboardUtils.UndetectedScoreboardLines(message),
+ message,
+ "Unknown Lines" to confirmedUnknownLines,
+ "Island" to HypixelData.skyBlockIsland,
+ "Area" to HypixelData.skyBlockArea,
+ "Full Scoreboard" to ScoreboardData.sidebarLinesFormatted,
+ noStackTrace = true,
+ betaOnly = true,
+ )
+}
-internal var unknownLines = listOf<String>()
internal var amountOfUnknownLines = 0
enum class ScoreboardElement(
@@ -773,30 +797,15 @@ private fun getFooterDisplayPair(): List<ScoreboardElementType> =
).flatten()
private fun getExtraDisplayPair(): List<ScoreboardElementType> {
- if (unknownLines.isEmpty()) return listOf("<hidden>" to HorizontalAlignment.LEFT)
-
- val size = unknownLines.size
- if (amountOfUnknownLines != size && config.unknownLinesWarning) {
- val message = "CustomScoreboard detected ${pluralize(unknownLines.size, "unknown line", withNumber = true)}"
- ErrorManager.logErrorWithData(
- CustomScoreboardUtils.UndetectedScoreboardLines(message),
- message,
- "Unknown Lines" to unknownLines,
- "Island" to HypixelData.skyBlockIsland,
- "Area" to HypixelData.skyBlockArea,
- "Full Scoreboard" to ScoreboardData.sidebarLinesFormatted,
- noStackTrace = true,
- betaOnly = true,
- )
- amountOfUnknownLines = size
- }
+ if (confirmedUnknownLines.isEmpty()) return listOf("<hidden>" to HorizontalAlignment.LEFT)
+ amountOfUnknownLines = confirmedUnknownLines.size
- return listOf("§cUndetected Lines:" to HorizontalAlignment.LEFT) + unknownLines.map { it to HorizontalAlignment.LEFT }
+ return listOf("§cUndetected Lines:" to HorizontalAlignment.LEFT) + confirmedUnknownLines.map { it to HorizontalAlignment.LEFT }
}
private fun getExtraShowWhen(): Boolean {
- if (unknownLines.isEmpty()) {
+ if (confirmedUnknownLines.isEmpty()) {
amountOfUnknownLines = 0
}
- return unknownLines.isNotEmpty()
+ return confirmedUnknownLines.isNotEmpty()
}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardPattern.kt b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardPattern.kt
index fdc2232be..84b6446fc 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardPattern.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/ScoreboardPattern.kt
@@ -297,10 +297,6 @@ object ScoreboardPattern {
"essence",
"^\\s*.*Essence: §.(?<essence>-?\\d+(:?,\\d{3})*(?:\\.\\d+)?)$"
)
- val brokenRedstonePattern by miscSb.pattern(
- "brokenredstone",
- "\\s*(?:(?:§.)*⚡ (§.)*Redston|e: (?:§.)*\\d+%)\\s*"
- )
val redstonePattern by miscSb.pattern(
"redstone",
"\\s*(§.)*⚡ §cRedstone: (§.)*\\d{1,3}%$"
diff --git a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/UnknownLinesHandler.kt b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/UnknownLinesHandler.kt
index da50f3a21..a5a991cfc 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/UnknownLinesHandler.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/gui/customscoreboard/UnknownLinesHandler.kt
@@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.data.PurseAPI
import at.hannibal2.skyhanni.data.ScoreboardData
import at.hannibal2.skyhanni.features.misc.ServerRestartTitle
import at.hannibal2.skyhanni.features.rift.area.stillgorechateau.RiftBloodEffigies
+import at.hannibal2.skyhanni.utils.ChatUtils
import at.hannibal2.skyhanni.utils.CollectionUtils.nextAfter
import at.hannibal2.skyhanni.utils.StringUtils.matches
import at.hannibal2.skyhanni.utils.StringUtils.removeResets
@@ -14,7 +15,7 @@ object UnknownLinesHandler {
fun handleUnknownLines() {
val sidebarLines = ScoreboardData.sidebarLinesFormatted
- unknownLines = sidebarLines
+ unconfirmedUnknownLines = sidebarLines
.map { it.removeResets() }
.filter { it.isNotBlank() }
.filter { it.trim().length > 3 }
@@ -86,7 +87,6 @@ object UnknownLinesHandler {
SbPattern.bossDamagePattern,
SbPattern.slayerQuestPattern,
SbPattern.essencePattern,
- SbPattern.brokenRedstonePattern,
SbPattern.redstonePattern,
SbPattern.visitingPattern,
SbPattern.flightDurationPattern,
@@ -123,7 +123,7 @@ object UnknownLinesHandler {
SbPattern.cluesPattern,
)
- unknownLines = unknownLines.filterNot { line ->
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filterNot { line ->
patternsToExclude.any { pattern -> pattern.matches(line) }
}
@@ -134,16 +134,16 @@ object UnknownLinesHandler {
val objectiveLine =
sidebarLines.firstOrNull { SbPattern.objectivePattern.matches(it) }
?: "Objective"
- unknownLines = unknownLines.filter { sidebarLines.nextAfter(objectiveLine) != it }
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filter { sidebarLines.nextAfter(objectiveLine) != it }
// TODO create function
- unknownLines = unknownLines.filter {
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filter {
sidebarLines.nextAfter(objectiveLine, 2) != it
&& !SbPattern.thirdObjectiveLinePattern.matches(it)
}
// Remove jacobs contest
for (i in 1..3)
- unknownLines = unknownLines.filter {
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filter {
sidebarLines.nextAfter(sidebarLines.firstOrNull { line ->
SbPattern.jacobsContestPattern.matches(line)
} ?: "§eJacob's Contest", i) != it
@@ -151,24 +151,43 @@ object UnknownLinesHandler {
// Remove slayer
for (i in 1..2)
- unknownLines = unknownLines.filter {
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filter {
sidebarLines.nextAfter(sidebarLines.firstOrNull { line ->
SbPattern.slayerQuestPattern.matches(line)
} ?: "Slayer Quest", i) != it
}
// remove trapper mob location
- unknownLines = unknownLines.filter {
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filter {
sidebarLines.nextAfter(sidebarLines.firstOrNull { line ->
SbPattern.mobLocationPattern.matches(line)
} ?: "Tracker Mob Location:") != it
}
// da
- unknownLines = unknownLines.filter {
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filter {
sidebarLines.nextAfter(sidebarLines.firstOrNull { line ->
SbPattern.darkAuctionCurrentItemPattern.matches(line)
} ?: "Current Item:") != it
}
+
+
+ /*
+ * handle broken scoreboard lines
+ */
+ confirmedUnknownLines.forEach { line ->
+ if (!unconfirmedUnknownLines.contains(line)) {
+ confirmedUnknownLines = confirmedUnknownLines.filterNot { it == line }.toMutableList()
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filterNot { it == line }
+ }
+ }
+ unconfirmedUnknownLines.forEach { line ->
+ if (confirmedUnknownLines.contains(line)) {
+ unconfirmedUnknownLines = unconfirmedUnknownLines.filterNot { it == line }
+ } else if (!unknownLinesSet.contains(line)) {
+ ChatUtils.debug("Unknown Scoreboard line: '$line'")
+ unknownLinesSet.add(line)
+ }
+ }
}
}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt
index d903ada07..8b4b0c372 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedCache.kt
@@ -4,10 +4,15 @@ import com.google.common.cache.CacheBuilder
import java.util.concurrent.TimeUnit
import kotlin.time.Duration
-class TimeLimitedCache<K, V>(expireAfterWrite: Duration) {
+class TimeLimitedCache<K, V>(
+ expireAfterWrite: Duration,
+ private val removalListener: (K?, V?) -> Unit = { _, _ -> },
+) {
private val cache = CacheBuilder.newBuilder()
- .expireAfterWrite(expireAfterWrite.inWholeMilliseconds, TimeUnit.MILLISECONDS).build<K, V>()
+ .expireAfterWrite(expireAfterWrite.inWholeMilliseconds, TimeUnit.MILLISECONDS)
+ .removalListener { removalListener(it.key, it.value) }
+ .build<K, V>()
fun put(key: K, value: V) = cache.put(key, value)
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt b/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt
index 39dac5247..5f0ccd404 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/TimeLimitedSet.kt
@@ -2,9 +2,12 @@ package at.hannibal2.skyhanni.utils
import kotlin.time.Duration
-class TimeLimitedSet<T>(expireAfterWrite: Duration) {
+class TimeLimitedSet<T>(
+ expireAfterWrite: Duration,
+ private val removalListener: (T) -> Unit = {},
+) {
- private val cache = TimeLimitedCache<T, Unit>(expireAfterWrite)
+ private val cache = TimeLimitedCache<T, Unit>(expireAfterWrite) { key, _ -> key?.let { removalListener(it) } }
fun add(element: T) = cache.put(element, Unit)