1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
package at.hannibal2.skyhanni.features.chat.playerchat
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.data.hypixel.chat.event.SystemMessageEvent
import at.hannibal2.skyhanni.features.misc.MarkedPlayerManager
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.StringUtils.applyIfPossible
import net.minecraft.event.ClickEvent
import net.minecraft.event.HoverEvent
import net.minecraft.util.IChatComponent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
@SkyHanniModule
object PlayerChatModifier {
private val config get() = SkyHanniMod.feature.chat.playerMessage
private val patterns = mutableListOf<Regex>()
init {
patterns.add("§[ab6]\\[(?:VIP|MVP)(?:§.|\\+)*] {1,2}(?:§[7ab6])?(\\w{2,16})".toRegex()) // ranked player with prefix everywhere
patterns.add("§[7ab6](\\w{2,16})§r(?!§7x)(?!\$)".toRegex()) // all players without rank prefix in notification messages
}
@SubscribeEvent
fun onChat(event: SystemMessageEvent) {
event.applyIfPossible { cutMessage(it) }
}
private fun findClickableTexts(chatComponent: IChatComponent, clickEvents: MutableList<ClickEvent>) {
for (sibling in chatComponent.siblings) {
findClickableTexts(sibling, clickEvents)
}
val clickEvent = chatComponent.chatStyle.chatClickEvent ?: return
clickEvent.action ?: return
if (clickEvents.any { it.value == clickEvent.value }) return
clickEvents.add(clickEvent)
}
private fun findHoverTexts(chatComponent: IChatComponent, hoverEvents: MutableList<HoverEvent>) {
for (sibling in chatComponent.siblings) {
findHoverTexts(sibling, hoverEvents)
}
val hoverEvent = chatComponent.chatStyle.chatHoverEvent ?: return
hoverEvent.action ?: return
if (hoverEvents.any { it.value == hoverEvent.value }) return
hoverEvents.add(hoverEvent)
}
private fun cutMessage(input: String): String {
var string = input
if (config.playerRankHider) {
for (pattern in patterns) {
string = string.replace(pattern, "§b$1")
}
string = string.replace("§[7ab6]((?:\\w+){2,16})'s", "§b$1's")
string = string.replace("§[7ab6]((?:\\w+){2,16}) (§.)", "§b$1 $2")
}
string = MarkedPlayerManager.replaceInChat(string)
return string
}
@SubscribeEvent
fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) {
event.move(3, "chat.playerRankHider", "chat.playerMessage.playerRankHider")
event.move(3, "chat.chatFilter", "chat.playerMessage.chatFilter")
}
}
|