Skip to content

Commit

Permalink
Fix + Improvement: Stash Compact (#3009)
Browse files Browse the repository at this point in the history
Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com>
  • Loading branch information
DavidArthurCole and hannibal002 authored Dec 5, 2024
1 parent 4dc35a0 commit 32058d2
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,9 @@ public class StashConfig {
@ConfigOption(name = "Use /ViewStash", desc = "Use /viewstash [type] instead of /pickupstash.")
@ConfigEditorBoolean
public boolean useViewStash = false;

@Expose
@ConfigOption(name = "Disable Empty Warnings", desc = "Disable first-time warnings for empty messages left behind.")
@ConfigEditorBoolean
public boolean disableEmptyWarnings = false;
}
88 changes: 72 additions & 16 deletions src/main/java/at/hannibal2/skyhanni/features/chat/StashCompact.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,22 @@ package at.hannibal2.skyhanni.features.chat

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.events.ProfileJoinEvent
import at.hannibal2.skyhanni.features.chat.StashCompact.StashType.Companion.fromGroup
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.ChatUtils
import at.hannibal2.skyhanni.utils.ConfigUtils.jumpToEditor
import at.hannibal2.skyhanni.utils.HypixelCommands
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NumberUtil.formatInt
import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat
import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher
import at.hannibal2.skyhanni.utils.RegexUtils.matches
import at.hannibal2.skyhanni.utils.SimpleTimeMark
import at.hannibal2.skyhanni.utils.StringUtils
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import java.util.regex.Matcher
import kotlin.time.Duration.Companion.seconds

@SkyHanniModule
object StashCompact {
Expand All @@ -22,8 +27,10 @@ object StashCompact {

/**
* REGEX-TEST: §f §7You have §3226 §7materials stashed away!
* REGEX-TEST: §f §7You have §31,000 §7items stashed away!
* REGEX-TEST: §f §7You have §322 §7materials stashed away!
* REGEX-TEST: §f §7You have §a1,000 §7items stashed away!
* REGEX-TEST: §f §7You have §a2 §7items stashed away!
* REGEX-TEST: §f §7You have §a109 §7items stashed away!
*/
private val materialCountPattern by patternGroup.pattern(
"material.count",
Expand All @@ -35,6 +42,7 @@ object StashCompact {
* REGEX-TEST: §f §8(This totals 2 types of items stashed!)
* REGEX-TEST: §f §8(This totals 3 types of materials stashed!)
* REGEX-TEST: §f §8(This totals 4 types of items stashed!)
* REGEX-TEST: §f §8(This totals 8 types of materials stashed!)
*/
private val differingMaterialsCountPattern by patternGroup.pattern(
"differing.materials.count",
Expand All @@ -44,6 +52,7 @@ object StashCompact {
/**
* REGEX-TEST: §f §3§l>>> §3§lCLICK HERE§b to pick them up! §3§l<<<
* REGEX-TEST: §f §6§l>>> §6§lCLICK HERE§e to pick them up! §6§l<<<
* REGEX-TEST: §f §3§l>>> §3§lCLICK HERE§b to pick them up! §3§l<<<
*/
private val pickupStashPattern by patternGroup.pattern(
"pickup.stash",
Expand All @@ -62,36 +71,79 @@ object StashCompact {
// </editor-fold>

private val config get() = SkyHanniMod.feature.chat.filterType.stashMessages

private var currentMessage: StashMessage? = null
private var lastMessage: StashMessage? = null
private val filterConfig get() = SkyHanniMod.feature.chat.filterType

private var currentType: StashType? = null
private val currentMessages: MutableMap<StashType, StashMessage?> = mutableMapOf()
private val lastMessages: MutableMap<StashType, StashMessage?> = mutableMapOf()
private var emptyLineWarned = false
private var joinedProfileAt: SimpleTimeMark? = null

enum class StashType(val displayName: String, val colorCodePair: Pair<String, String>) {
ITEM("item", Pair("§e", "§6")),
MATERIAL("material", Pair("§b", "§3")),
;

companion object {
fun Matcher.fromGroup() = StashType.fromStringOrNull(group("type"))
private fun fromStringOrNull(string: String) = entries.find { it.displayName == string }
}
}

data class StashMessage(val materialCount: Int, val type: String) {
var differingMaterialsCount: Int? = null
}

@SubscribeEvent
fun onProfileJoin(event: ProfileJoinEvent) {
joinedProfileAt = SimpleTimeMark.now()
}

@SubscribeEvent
fun onChat(event: LorenzChatEvent) {
if (!isEnabled()) return

// TODO make a system for detecting message "groups" (multiple consecutive messages)
materialCountPattern.matchMatcher(event.message) {
currentMessage = StashMessage(group("count").formatInt(), group("type"))

// If the user does not have hideEmptyLines enabled, and disableEmptyWarnings is false, warn them
val emptyEnabled = filterConfig.empty
val hideWarnings = config.disableEmptyWarnings
val tenSecPassed = (joinedProfileAt?.passedSince() ?: 0.seconds) > 10.seconds
if (!emptyEnabled && !hideWarnings && !emptyLineWarned && tenSecPassed) {
ChatUtils.clickToActionOrDisable(
"Above empty lines were left behind by §6/sh stash compact§e." +
"This can be prevented with §6/sh empty messages§e.",
config::disableEmptyWarnings,
actionName = "hide empty lines",
action = { filterConfig::empty.jumpToEditor() }
)
emptyLineWarned = true
}

currentType = fromGroup() ?: return@matchMatcher
val currentType = currentType ?: return@matchMatcher
currentMessages[currentType] = StashMessage(group("count").formatInt(), group("type"))
event.blockedReason = "stash_compact"
}

differingMaterialsCountPattern.matchMatcher(event.message) {
currentMessage?.differingMaterialsCount = group("count").formatInt()
currentType = fromGroup() ?: return@matchMatcher
currentMessages[currentType]?.differingMaterialsCount = group("count").formatInt()
event.blockedReason = "stash_compact"
}

if (pickupStashPattern.matches(event.message)) {
pickupStashPattern.matchMatcher(event.message) {
event.blockedReason = "stash_compact"
val current = currentMessage ?: return
if (current.materialCount <= config.hideLowWarningsThreshold) return
if (config.hideDuplicateCounts && current == lastMessage) return
val currentType = currentType ?: return@matchMatcher

val currentMessage = currentMessages[currentType] ?: return@matchMatcher
if (currentMessage.materialCount <= config.hideLowWarningsThreshold) return@matchMatcher
lastMessages[currentType]?.let { lastMessage ->
if (config.hideDuplicateCounts && lastMessage == currentMessage) return@matchMatcher
}

current.sendCompactedStashMessage()
currentMessage.sendCompactedStashMessage()
}

if (!config.hideAddedMessages) return
Expand All @@ -101,8 +153,11 @@ object StashCompact {
}

private fun StashMessage.sendCompactedStashMessage() {
val typeNameFormat = StringUtils.pluralize(materialCount, type)
val (mainColor, accentColor) = if (type == "item") "§e" to "§6" else "§b" to "§3"
val currentType = currentType ?: return

val typeNameFormat = StringUtils.pluralize(materialCount, currentType.displayName)
val (mainColor, accentColor) = currentType.colorCodePair

val typeStringExtra = differingMaterialsCount?.let {
", ${mainColor}totalling $accentColor$it ${StringUtils.pluralize(it, "type")}$mainColor"
}.orEmpty()
Expand All @@ -117,8 +172,9 @@ object StashCompact {
},
hover = "§eClick to $action your $type stash!",
)
currentMessage = null
lastMessage = this

currentMessages.replace(currentType, null)
lastMessages[currentType] = this
}

private fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled
Expand Down

0 comments on commit 32058d2

Please sign in to comment.