From 3708ea6a83c39badad3486143572949d1933dfe6 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Tue, 10 Sep 2024 20:40:01 +0200 Subject: Improvement: Add per election year diana trackers (#2487) Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> --- .../at/hannibal2/skyhanni/utils/CollectionUtils.kt | 43 ++++++++++----------- .../skyhanni/utils/tracker/SkyHanniItemTracker.kt | 8 ++-- .../skyhanni/utils/tracker/SkyHanniTracker.kt | 45 ++++++++++++++-------- 3 files changed, 54 insertions(+), 42 deletions(-) (limited to 'src/main/java/at/hannibal2/skyhanni/utils') diff --git a/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt b/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt index 41560553e..991b1a53e 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/CollectionUtils.kt @@ -15,28 +15,22 @@ import kotlin.math.ceil object CollectionUtils { inline fun , reified E> T.drainForEach(action: (E) -> Unit): T { - while (true) - action(this.poll() ?: break) + while (true) action(this.poll() ?: break) return this } inline fun , reified E> T.drain(amount: Int): T { - for (i in 1..amount) - this.poll() ?: break + for (i in 1..amount) this.poll() ?: break return this } - inline fun > - Queue.drainTo(list: L, action: (E) -> K): L { - while (true) - list.add(action(this.poll() ?: break)) + inline fun > Queue.drainTo(list: L, action: (E) -> K): L { + while (true) list.add(action(this.poll() ?: break)) return list } - inline fun > - Queue.drainTo(list: L): L { - while (true) - list.add(this.poll() ?: break) + inline fun > Queue.drainTo(list: L): L { + while (true) list.add(this.poll() ?: break) return list } @@ -155,11 +149,9 @@ object CollectionUtils { */ fun List.addIfNotNull(element: String?) = element?.let { plus(it) } ?: this - fun Map.editCopy(function: MutableMap.() -> Unit) = - toMutableMap().also { function(it) }.toMap() + fun Map.editCopy(function: MutableMap.() -> Unit) = toMutableMap().also { function(it) }.toMap() - fun List.editCopy(function: MutableList.() -> Unit) = - toMutableList().also { function(it) }.toList() + fun List.editCopy(function: MutableList.() -> Unit) = toMutableList().also { function(it) }.toList() fun Map.moveEntryToTop(matcher: (Map.Entry) -> Boolean): Map { val entry = entries.find(matcher) @@ -171,8 +163,7 @@ object CollectionUtils { return this } - operator fun IntRange.contains(range: IntRange): Boolean = - range.first in this && range.last in this + operator fun IntRange.contains(range: IntRange): Boolean = range.first in this && range.last in this fun MutableList>.addAsSingletonList(text: E) { add(Collections.singletonList(text)) @@ -262,12 +253,10 @@ object CollectionUtils { } else false @Suppress("UNCHECKED_CAST") - fun Iterable.takeIfAllNotNull(): Iterable? = - takeIf { null !in this } as? Iterable + fun Iterable.takeIfAllNotNull(): Iterable? = takeIf { null !in this } as? Iterable @Suppress("UNCHECKED_CAST") - fun List.takeIfAllNotNull(): List? = - takeIf { null !in this } as? List + fun List.takeIfAllNotNull(): List? = takeIf { null !in this } as? List // TODO add cache fun MutableList.addString( @@ -334,9 +323,17 @@ object CollectionUtils { getName: (T) -> String, isCurrent: (T) -> Boolean, crossinline onChange: (T) -> Unit, + ) = buildSelector(prefix, getName, isCurrent, onChange, enumValues()) + + inline fun buildSelector( + prefix: String, + getName: (T) -> String, + isCurrent: (T) -> Boolean, + crossinline onChange: (T) -> Unit, + universe: Array, ) = buildList { addString(prefix) - for (entry in enumValues()) { + for (entry in universe) { val display = getName(entry) if (isCurrent(entry)) { addString("§a[$display]") diff --git a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt index 8d6f98d69..3cadd767b 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt @@ -25,8 +25,9 @@ class SkyHanniItemTracker( name: String, createNewSession: () -> Data, getStorage: (ProfileSpecificStorage) -> Data, + vararg extraStorage: Pair Data>, drawDisplay: (Data) -> List, -) : SkyHanniTracker(name, createNewSession, getStorage, drawDisplay) { +) : SkyHanniTracker(name, createNewSession, getStorage, *extraStorage, drawDisplay = drawDisplay) { companion object { val SKYBLOCK_COIN = NEUInternalName.SKYBLOCK_COIN @@ -37,9 +38,8 @@ class SkyHanniItemTracker( it.addItem(internalName, amount, command) } getSharedTracker()?.let { sharedData -> - sharedData.get(DisplayMode.TOTAL).items[internalName]?.let { data -> - sharedData.get(DisplayMode.SESSION).items[internalName]!!.hidden = data.hidden - } + val isHidden = sharedData.get(DisplayMode.TOTAL).items[internalName]?.hidden + if (isHidden != null) sharedData.modify { it.items[internalName]?.hidden = isHidden } } if (command) { diff --git a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt index 5b07c9906..7810c1ee6 100644 --- a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt @@ -6,6 +6,7 @@ import at.hannibal2.skyhanni.config.storage.ProfileSpecificStorage import at.hannibal2.skyhanni.data.ProfileStorageData import at.hannibal2.skyhanni.data.TrackerManager import at.hannibal2.skyhanni.features.misc.items.EstimatedItemValue +import at.hannibal2.skyhanni.test.command.ErrorManager import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.CollectionUtils import at.hannibal2.skyhanni.utils.NEUInternalName @@ -24,9 +25,11 @@ open class SkyHanniTracker( val name: String, private val createNewSession: () -> Data, private val getStorage: (ProfileSpecificStorage) -> Data, + vararg extraStorage: Pair Data>, private val drawDisplay: (Data) -> List, ) { + private val extraDisplayModes = extraStorage.toMap() private var inventoryOpen = false private var displayMode: DisplayMode? = null private val currentSessions = mutableMapOf() @@ -61,12 +64,8 @@ open class SkyHanniTracker( } fun modify(mode: DisplayMode, modifyFunction: (Data) -> Unit) { - val storage = ProfileStorageData.profileSpecific ?: return - val data: Data = when (mode) { - DisplayMode.TOTAL -> storage.getTotal() - DisplayMode.SESSION -> storage.getCurrentSession() - } - modifyFunction(data) + val sharedTracker = getSharedTracker() ?: return + sharedTracker.modify(mode, modifyFunction) update() } @@ -124,6 +123,8 @@ open class SkyHanniTracker( }, ) + private val availableTrackers = arrayOf(DisplayMode.TOTAL, DisplayMode.SESSION) + extraDisplayModes.keys + private fun buildDisplayModeView() = Renderable.horizontalContainer( CollectionUtils.buildSelector( "§7Display Mode: ", @@ -134,11 +135,17 @@ open class SkyHanniTracker( storedTrackers[name] = it update() }, + universe = availableTrackers, ), ) - protected fun getSharedTracker() = ProfileStorageData.profileSpecific?.let { - SharedTracker(it.getTotal(), it.getCurrentSession()) + protected fun getSharedTracker() = ProfileStorageData.profileSpecific?.let { ps -> + SharedTracker( + mapOf( + DisplayMode.TOTAL to ps.getTotal(), + DisplayMode.SESSION to ps.getCurrentSession(), + ) + extraDisplayModes.mapValues { it.value(ps) }, + ) } private fun ProfileSpecificStorage.getCurrentSession() = currentSessions.getOrPut(this) { createNewSession() } @@ -165,22 +172,30 @@ open class SkyHanniTracker( } } - class SharedTracker(private val total: Data, private val currentSession: Data) { + inner class SharedTracker( + private val entries: Map, + ) { - fun modify(modifyFunction: (Data) -> Unit) { - modifyFunction(total) - modifyFunction(currentSession) + fun modify(mode: DisplayMode, modifyFunction: (Data) -> Unit) { + get(mode).let(modifyFunction) } - fun get(displayMode: DisplayMode) = when (displayMode) { - DisplayMode.TOTAL -> total - DisplayMode.SESSION -> currentSession + fun modify(modifyFunction: (Data) -> Unit) { + entries.values.forEach(modifyFunction) } + + fun get(displayMode: DisplayMode) = entries[displayMode] ?: ErrorManager.skyHanniError( + "Unregistered display mode accessed on tracker", + "tracker" to name, + "displayMode" to displayMode, + "availableModes" to entries.keys, + ) } enum class DisplayMode(val displayName: String) { TOTAL("Total"), SESSION("This Session"), + MAYOR("This Mayor"), ; } -- cgit