aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/cc/woverflow/chattils/chat/ChatTab.kt
blob: 87f28a18a9aa6bbc47c78d93d9afecaafd9e42f0 (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
package cc.woverflow.chattils.chat

import cc.woverflow.chattils.gui.components.TabButton
import com.google.gson.annotations.SerializedName
import kotlinx.coroutines.runBlocking
import net.minecraft.client.Minecraft
import net.minecraft.util.EnumChatFormatting
import net.minecraft.util.IChatComponent

data class ChatTab(
    val enabled: Boolean,
    val name: String,
    val unformatted: Boolean,
    @SerializedName("starts") val startsWith: List<String>?,
    val contains: List<String>?,
    @SerializedName("ends") val endsWith: List<String>?,
    val equals: List<String>?,
    @SerializedName("regex") val uncompiledRegex: List<String>?,
    val prefix: String
) {
    lateinit var button: TabButton
    lateinit var compiledRegex: ChatRegexes

    //Ugly hack to make GSON not make button / regex null
    fun initialize() {
        compiledRegex = ChatRegexes(uncompiledRegex)
        val width = Minecraft.getMinecraft().fontRendererObj.getStringWidth(name)
        button = TabButton(653452, runBlocking {
            val returnValue = x - 2
            x += 6 + width
            return@runBlocking returnValue
        }, width + 4, 12, this)
    }

    fun shouldRender(chatComponent: IChatComponent): Boolean {
        if (startsWith == null && equals == null && endsWith == null && contains == null && uncompiledRegex == null) {
            return true
        }
        val message =
            if (unformatted) EnumChatFormatting.getTextWithoutFormattingCodes(chatComponent.unformattedText) else chatComponent.formattedText
        equals?.forEach {
            if (message == it) {
                return true
            }
        }
        startsWith?.forEach {
            if (message.startsWith(it)) {
                return true
            }
        }
        endsWith?.forEach {
            if (message.endsWith(it)) {
                return true
            }
        }
        contains?.forEach {
            if (message.contains(it)) {
                return true
            }
        }
        compiledRegex.compiledRegexList.forEach {
            if (it.matches(message)) {
                return true
            }
        }
        return false
    }

    override fun equals(other: Any?): Boolean {
        return other is ChatTab && name == other.name && startsWith == other.startsWith && contains == other.contains && endsWith == other.endsWith && equals == other.equals && compiledRegex == other.compiledRegex
    }

    override fun hashCode(): Int {
        var result = name.hashCode()
        result = 31 * result + (startsWith?.hashCode() ?: 0)
        result = 31 * result + (contains?.hashCode() ?: 0)
        result = 31 * result + (endsWith?.hashCode() ?: 0)
        result = 31 * result + (equals?.hashCode() ?: 0)
        result = 31 * result + (uncompiledRegex?.hashCode() ?: 0)
        result = 31 * result + prefix.hashCode()
        result = 31 * result + button.hashCode()
        return result
    }

    companion object {
        private var x = 4
    }
}