aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/chat/playerchat/PlayerChatModifier.kt
blob: 7967fddba436f65936f94162ca8d73e0729446f6 (plain)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package at.hannibal2.skyhanni.features.chat.playerchat

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.features.misc.MarkedPlayerManager
import net.minecraft.util.ChatComponentText
import net.minecraft.util.IChatComponent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

class PlayerChatModifier {

    private val patterns = mutableListOf<Regex>()

    init {
        patterns.add("§(?:a|b|6)\\[(?:VIP|MVP)(?:(?:§.|\\+)*)](?: {1,2})(?:§[7ab6])?(\\w{2,16})".toRegex()) // ranked player everywhere
        patterns.add("§(?:7|a|b|6)((?:\\w+){2,16})§r(?!§7x)".toRegex()) // nons in notification message
        patterns.add("(?:§7 )?§7((?:\\w+){2,16})§7§r".toRegex()) // nons user chat
    }

    @SubscribeEvent
    fun onChatReceive(event: LorenzChatEvent) {
        val foundCommands = mutableListOf<IChatComponent>()
        val message = event.chatComponent

        addComponent(foundCommands, event.chatComponent)
        for (sibling in message.siblings) {
            addComponent(foundCommands, sibling)
        }

        val size = foundCommands.size
        if (size > 1) {
            return
        }
        val original = event.chatComponent.formattedText
        val newText = cutMessage(original)
        if (original == newText) return


        val text = ChatComponentText(newText)
        if (size == 1) {
            val chatStyle = foundCommands[0].chatStyle
            text.chatStyle.chatClickEvent = chatStyle.chatClickEvent
            text.chatStyle.chatHoverEvent = chatStyle.chatHoverEvent
        }
        event.chatComponent = text
    }

    private fun addComponent(foundCommands: MutableList<IChatComponent>, message: IChatComponent) {
        val clickEvent = message.chatStyle.chatClickEvent
        if (clickEvent != null) {
            if (foundCommands.size == 1) {
                if (foundCommands[0].chatStyle.chatClickEvent.value == clickEvent.value) {
                    return
                }
            }
            foundCommands.add(message)
        }
    }

    private fun cutMessage(input: String): String {
        var string = input

        //all players same color in chat
        string = string.replace("§r§7: ", "§r§f: ")

        if (SkyHanniMod.feature.chat.chatFilter) {
            if (string.contains("§r§f: ")) {
                if (PlayerChatFilter.shouldChatFilter(string)) {
                    string = string.replace("§r§f: ", "§r§7: ")
                }
            }
        }

        if (SkyHanniMod.feature.chat.playerRankHider) {
            for (pattern in patterns) {
                string = string.replace(pattern, "§b$1")
            }
            string = string.replace("§(?:7|a|b|6)((?:\\w+){2,16})'s", "§b$1's")
            string = string.replace("§(?:7|a|b|6)((?:\\w+){2,16}) (§.)", "§b$1 $2")
        }

        if (SkyHanniMod.feature.markedPlayers.highlightInChat) {
            for (markedPlayer in MarkedPlayerManager.playerNamesToMark) {
                string = string.replace(markedPlayer, "§e$markedPlayer§r")
            }
        }

        return string
    }

//    private fun shouldChatFilter(input: String): Boolean {
//        val text = input.lowercase()
//
//        //Low baller
//        if (text.contains("lowballing")) return true
//        if (text.contains("lowballer")) return true
//
//        //Trade
//        if (text.contains("buy")) return true
//        if (text.contains("sell")) return true
//        if (text.contains("on my ah")) return true
//
//
//        return false
//    }
}