aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x[-rw-r--r--]gradlew0
-rw-r--r--src/main/kotlin/cc/woverflow/chatting/Chatting.kt2
-rw-r--r--src/main/kotlin/cc/woverflow/chatting/chat/ChatSpamBlock.kt124
-rw-r--r--src/main/kotlin/cc/woverflow/chatting/config/ChattingConfig.kt26
-rw-r--r--src/main/resources/spamInfo.json6146
5 files changed, 6298 insertions, 0 deletions
diff --git a/gradlew b/gradlew
index 4f906e0..4f906e0 100644..100755
--- a/gradlew
+++ b/gradlew
diff --git a/src/main/kotlin/cc/woverflow/chatting/Chatting.kt b/src/main/kotlin/cc/woverflow/chatting/Chatting.kt
index 0fe85f9..5718f14 100644
--- a/src/main/kotlin/cc/woverflow/chatting/Chatting.kt
+++ b/src/main/kotlin/cc/woverflow/chatting/Chatting.kt
@@ -2,6 +2,7 @@ package cc.woverflow.chatting
import cc.woverflow.chatting.chat.ChatSearchingManager
import cc.woverflow.chatting.chat.ChatShortcuts
+import cc.woverflow.chatting.chat.ChatSpamBlock
import cc.woverflow.chatting.chat.ChatTabs
import cc.woverflow.chatting.config.ChattingConfig
import cc.woverflow.chatting.hook.GuiNewChatHook
@@ -80,6 +81,7 @@ object Chatting {
}
ClientRegistry.registerKeyBinding(keybind)
EVENT_BUS.register(this)
+ EVENT_BUS.register(ChatSpamBlock)
ChatTabs.initialize()
ChatShortcuts.initialize()
}
diff --git a/src/main/kotlin/cc/woverflow/chatting/chat/ChatSpamBlock.kt b/src/main/kotlin/cc/woverflow/chatting/chat/ChatSpamBlock.kt
new file mode 100644
index 0000000..224e614
--- /dev/null
+++ b/src/main/kotlin/cc/woverflow/chatting/chat/ChatSpamBlock.kt
@@ -0,0 +1,124 @@
+package cc.woverflow.chatting.chat
+
+import cc.woverflow.chatting.config.ChattingConfig
+import com.google.gson.JsonObject
+import com.google.gson.JsonParser
+import net.minecraft.util.ChatComponentText
+import net.minecraft.util.EnumChatFormatting
+import net.minecraftforge.client.event.ClientChatReceivedEvent
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import java.text.Normalizer
+
+object ChatSpamBlock {
+ /*
+ Made by @KTibow
+ Based off of Unspam (also by @KTibow)
+ Algorithm based off of https://paulgraham.com/spam.html
+ */
+ private val PLAYER_MESSAGE = Regex("^(\\[VIP\\+?\\] |\\[MVP\\+?\\+?\\] |)(\\w{2,16}): (.*)$")
+
+ @SubscribeEvent
+ fun onChat(event: ClientChatReceivedEvent) {
+ val message = event.message.unformattedText.replace(Regex("\u00A7."), "")
+ if (!PLAYER_MESSAGE.matches(message)) return
+ val (rank, player, content) = PLAYER_MESSAGE.matchEntire(message)!!.destructured
+ val tokens = tokenize(content)
+ val spamProb = findSpamProbability(tokens)
+ println("\n[CHATTING]$message")
+ if (spamProb * 100 > ChattingConfig.spamThreshold) {
+ if (ChattingConfig.showSpamInGray) {
+ var newMessage = EnumChatFormatting.DARK_GRAY.toString() + EnumChatFormatting.STRIKETHROUGH.toString()
+ if (!ChattingConfig.customFormatting) {
+ newMessage += rank
+ }
+ newMessage += "$player${EnumChatFormatting.DARK_GRAY.toString()}: $content"
+ event.message = ChatComponentText(newMessage)
+ } else {
+ event.isCanceled = true
+ }
+ return
+ }
+ if (ChattingConfig.customFormatting) {
+ val coloredPlayer = findRankColor(rank) + player + EnumChatFormatting.RESET.toString()
+ event.message = ChatComponentText("$coloredPlayer: $content")
+ }
+ }
+
+ private fun tokenize(message: String): MutableList<String> {
+ val strippedMessage =
+ Normalizer.normalize(message, Normalizer.Form.NFKC).replace(Regex("[^\\w\\s/]"), " ").lowercase().trim()
+ val tokens = strippedMessage.split(Regex("\\s+")).toMutableList()
+ if (tokens.size <= 2) {
+ tokens.add("TINY_LENGTH")
+ } else if (tokens.size <= 4) {
+ tokens.add("SMALL_LENGTH")
+ } else if (tokens.size <= 7) {
+ tokens.add("MEDIUM_LENGTH")
+ } else {
+ tokens.add("LONG_LENGTH")
+ }
+ if (message.replace(Regex("[\\w\\s]"), "").length > 2) {
+ tokens.add("SPECIAL_CHARS")
+ } else if (message.replace(Regex("[\\w\\s]"), "").length > 0) {
+ tokens.add("SPECIAL_CHAR")
+ } else {
+ tokens.add("LOW_SPECIAL_CHARS")
+ }
+ if (message.replace(Regex("[^A-Z]"), "").length >= message.length / 4) {
+ tokens.add("HIGH_CAPS")
+ } else {
+ tokens.add("LOW_CAPS")
+ }
+ return tokens
+ }
+
+ private fun findSpamProbability(tokens: MutableList<String>): Double {
+ val tokenProbs = mutableMapOf<String, Double>()
+ for (token in tokens) {
+ if (!spamInfoJson.has(token)) continue
+ val spamInToken = spamInfoJson.get(token).asJsonObject.get("spam").asDouble
+ val fineInToken = spamInfoJson.get(token).asJsonObject.get("fine").asDouble
+ tokenProbs[token] = (
+ (spamInToken / messageCountsJson.get("spam").asInt) /
+ (fineInToken / messageCountsJson.get("fine").asInt +
+ spamInToken / messageCountsJson.get("spam").asInt)
+ )
+ }
+ val spamProbs = tokenProbs.values.toMutableList()
+ val fineProbs = tokenProbs.values.map {
+ 1 - it
+ }.toMutableList()
+ val spamProbability = spamProbs.reduce { a, b ->
+ a * b
+ }
+ val fineProbability = fineProbs.reduce { a, b ->
+ a * b
+ }
+ return spamProbability / (spamProbability + fineProbability)
+ }
+
+ private fun findRankColor(rank: String): String {
+ println(rank)
+ return when (rank) {
+ "[VIP] ", "[VIP+] " -> EnumChatFormatting.GREEN.toString()
+ "[MVP] ", "[MVP+] " -> EnumChatFormatting.AQUA.toString()
+ "[MVP++] " -> EnumChatFormatting.GOLD.toString()
+ else -> EnumChatFormatting.GRAY.toString()
+ }
+ }
+
+ private fun getResourceAsText(path: String): String? = object {}.javaClass.getResource(path)?.readText()
+ private val spamInfoJson: JsonObject
+ private val messageCountsJson: JsonObject
+
+ init {
+ // Load the file spamInfo.json from resources/
+ val spamInfo = getResourceAsText("/spamInfo.json")
+ spamInfoJson = JsonParser().parse(spamInfo).asJsonObject
+ messageCountsJson = JsonParser().parse(" { \"fine\": 668, \"spam\": 230 }").asJsonObject
+ }
+}
+
+
+
+
diff --git a/src/main/kotlin/cc/woverflow/chatting/config/ChattingConfig.kt b/src/main/kotlin/cc/woverflow/chatting/config/ChattingConfig.kt
index e80fa94..d1a6ae9 100644
--- a/src/main/kotlin/cc/woverflow/chatting/config/ChattingConfig.kt
+++ b/src/main/kotlin/cc/woverflow/chatting/config/ChattingConfig.kt
@@ -79,6 +79,32 @@ object ChattingConfig :
var informForAlternatives = true
@Property(
+ type = PropertyType.SLIDER,
+ min = 0,
+ max = 100,
+ name = "Spam Threshold",
+ description = "If Chatting detects a player message seems like spam, and the probability is above this threshold, it will hide it. Set to 0 to disable.",
+ category = "Player Spam Blocker"
+ )
+ var spamThreshold = 95
+
+ @Property(
+ type = PropertyType.SWITCH,
+ name = "Show Spam (with styling)",
+ description = "Show messages Chatting detects as spam in gray, instead of hiding them.",
+ category = "Player Spam Blocker"
+ )
+ var showSpamInGray = true
+
+ @Property(
+ type = PropertyType.SWITCH,
+ name = "Custom Message Formatting",
+ description = "Hide ranks, and show messages in public chat from no-ranks as white.",
+ category = "Player Spam Blocker"
+ )
+ var customFormatting = false
+
+ @Property(
type = PropertyType.SWITCH,
name = "Show Timestamp",
description = "Show message timestamp on hover.",
diff --git a/src/main/resources/spamInfo.json b/src/main/resources/spamInfo.json
new file mode 100644
index 0000000..8f5d44d
--- /dev/null
+++ b/src/main/resources/spamInfo.json
@@ -0,0 +1,6146 @@
+{
+ "0": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "1": {
+ "fine": 5.668,
+ "spam": 14.23
+ },
+ "2": {
+ "fine": 9.668,
+ "spam": 3.23
+ },
+ "3": {
+ "fine": 4.668,
+ "spam": 9.23
+ },
+ "4": {
+ "fine": 0.668,
+ "spam": 7.23
+ },
+ "5": {
+ "fine": 3.668,
+ "spam": 14.23
+ },
+ "6": {
+ "fine": 3.668,
+ "spam": 2.23
+ },
+ "7": {
+ "fine": 4.668,
+ "spam": 5.23
+ },
+ "8": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "9": {
+ "fine": 2.668,
+ "spam": 1.23
+ },
+ "10": {
+ "fine": 1.6680000000000001,
+ "spam": 2.23
+ },
+ "11": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "12": {
+ "fine": 0.668,
+ "spam": 2.23
+ },
+ "15": {
+ "fine": 0.668,
+ "spam": 2.23
+ },
+ "16": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "18": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "20": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "25": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "29": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "30": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "32": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "36": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "50": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "85": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "92": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "99": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "100": {
+ "fine": 2.668,
+ "spam": 1.23
+ },
+ "108": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "123": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "280": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "345": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "350": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "374": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "500": {
+ "fine": 0.668,
+ "spam": 3.23
+ },
+ "553": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "4078": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "8945": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "34598": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "172000": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "1999999": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "84758934": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "then": {
+ "fine": 3.668,
+ "spam": 1.23
+ },
+ "report": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "in": {
+ "fine": 19.668,
+ "spam": 16.23
+ },
+ "the": {
+ "fine": 49.668,
+ "spam": 9.23
+ },
+ "skyblockz": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "discord": {
+ "fine": 1.6680000000000001,
+ "spam": 2.23
+ },
+ "MEDIUM_LENGTH": {
+ "fine": 137.668,
+ "spam": 66.23
+ },
+ "LOW_SPECIAL_CHARS": {
+ "fine": 531.668,
+ "spam": 57.230000000000004
+ },
+ "LOW_CAPS": {
+ "fine": 645.668,
+ "spam": 175.23000000000002
+ },
+ "money": {
+ "fine": 7.668,
+ "spam": 9.23
+ },
+ "at": {
+ "fine": 10.668,
+ "spam": 19.23
+ },
+ "least": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "50m": {
+ "fine": 0.668,
+ "spam": 3.23
+ },
+ "SMALL_LENGTH": {
+ "fine": 153.668,
+ "spam": 18.23
+ },
+ "SPECIAL_CHAR": {
+ "fine": 116.668,
+ "spam": 77.23
+ },
+ "im": {
+ "fine": 16.668,
+ "spam": 6.23
+ },
+ "on": {
+ "fine": 11.668,
+ "spam": 46.230000000000004
+ },
+ "ironman": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "just": {
+ "fine": 18.668,
+ "spam": 6.23
+ },
+ "check": {
+ "fine": 3.668,
+ "spam": 1.23
+ },
+ "ah": {
+ "fine": 5.668,
+ "spam": 45.230000000000004
+ },
+ "": {
+ "fine": 10.668,
+ "spam": 0.23
+ },
+ "TINY_LENGTH": {
+ "fine": 301.668,
+ "spam": 1.23
+ },
+ "no": {
+ "fine": 16.668,
+ "spam": 11.23
+ },
+ "comprende": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "let": {
+ "fine": 4.668,
+ "spam": 0.23
+ },
+ "me": {
+ "fine": 19.668,
+ "spam": 64.23
+ },
+ "recipe": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "anyone": {
+ "fine": 9.668,
+ "spam": 12.23
+ },
+ "selling": {
+ "fine": 2.668,
+ "spam": 41.230000000000004
+ },
+ "a": {
+ "fine": 35.668,
+ "spam": 28.23
+ },
+ "god": {
+ "fine": 2.668,
+ "spam": 1.23
+ },
+ "pot": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "sorry": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "bro": {
+ "fine": 4.668,
+ "spam": 0.23
+ },
+ "nonist": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "i": {
+ "fine": 76.668,
+ "spam": 25.23
+ },
+ "added": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "some": {
+ "fine": 6.668,
+ "spam": 3.23
+ },
+ "more": {
+ "fine": 7.668,
+ "spam": 1.23
+ },
+ "debug": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "get": {
+ "fine": 17.668,
+ "spam": 15.23
+ },
+ "new": {
+ "fine": 5.668,
+ "spam": 2.23
+ },
+ "pick": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "how": {
+ "fine": 16.668,
+ "spam": 2.23
+ },
+ "much": {
+ "fine": 8.668,
+ "spam": 1.23
+ },
+ "aight": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "neu": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "has": {
+ "fine": 4.668,
+ "spam": 1.23
+ },
+ "tons": {
+ "fine": 1.6680000000000001,
+ "spam": 2.23
+ },
+ "of": {
+ "fine": 18.668,
+ "spam": 16.23
+ },
+ "qol": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "features": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "and": {
+ "fine": 22.668,
+ "spam": 21.23
+ },
+ "my": {
+ "fine": 20.668,
+ "spam": 55.230000000000004
+ },
+ "raider": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "axe": {
+ "fine": 3.668,
+ "spam": 1.23
+ },
+ "k": {
+ "fine": 4.668,
+ "spam": 1.23
+ },
+ "when": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "tried": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "to": {
+ "fine": 40.668,
+ "spam": 22.23
+ },
+ "apply": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "it": {
+ "fine": 33.668,
+ "spam": 7.23
+ },
+ "HIGH_CAPS": {
+ "fine": 23.668,
+ "spam": 55.230000000000004
+ },
+ "minon": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "underpriced": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "lowest": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "bin": {
+ "fine": 0.668,
+ "spam": 3.23
+ },
+ "gemstone": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "container": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "/": {
+ "fine": 2.668,
+ "spam": 6.23
+ },
+ "1guana": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "easy": {
+ "fine": 0.668,
+ "spam": 3.23
+ },
+ "flip": {
+ "fine": 3.668,
+ "spam": 10.23
+ },
+ "LONG_LENGTH": {
+ "fine": 77.668,
+ "spam": 145.23000000000002
+ },
+ "SPECIAL_CHARS": {
+ "fine": 21.668,
+ "spam": 96.23
+ },
+ "cheap": {
+ "fine": 0.668,
+ "spam": 11.23
+ },
+ "bal": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "pet": {
+ "fine": 2.668,
+ "spam": 1.23
+ },
+ "its": {
+ "fine": 11.668,
+ "spam": 1.23
+ },
+ "high": {
+ "fine": 1.6680000000000001,
+ "spam": 3.23
+ },
+ "level": {
+ "fine": 0.668,
+ "spam": 5.23
+ },
+ "too": {
+ "fine": 6.668,
+ "spam": 1.23
+ },
+ "do": {
+ "fine": 23.668,
+ "spam": 5.23
+ },
+ "you": {
+ "fine": 47.668,
+ "spam": 14.23
+ },
+ "support": {
+ "fine": 0.668,
+ "spam": 2.23
+ },
+ "lgtbq": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "vote": {
+ "fine": 0.668,
+ "spam": 5.23
+ },
+ "_____________": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "freshest": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "cuts": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "island": {
+ "fine": 3.668,
+ "spam": 8.23
+ },
+ "/visit": {
+ "fine": 2.668,
+ "spam": 27.23
+ },
+ "benedeqn": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "buying": {
+ "fine": 1.6680000000000001,
+ "spam": 21.23
+ },
+ "sorrow": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "leggings": {
+ "fine": 0.668,
+ "spam": 3.23
+ },
+ "for": {
+ "fine": 22.668,
+ "spam": 48.230000000000004
+ },
+ "m": {
+ "fine": 6.668,
+ "spam": 3.23
+ },
+ "/p": {
+ "fine": 0.668,
+ "spam": 32.230000000000004
+ },
+ "smithmonger": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "nobody": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "ive": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "been": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "looking": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "exotic": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "squid": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "leather": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "books": {
+ "fine": 2.668,
+ "spam": 2.23
+ },
+ "not": {
+ "fine": 13.668,
+ "spam": 2.23
+ },
+ "lol": {
+ "fine": 19.668,
+ "spam": 1.23
+ },
+ "needs": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "cookie": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "oh": {
+ "fine": 9.668,
+ "spam": 0.23
+ },
+ "that": {
+ "fine": 17.668,
+ "spam": 4.23
+ },
+ "wynncraf": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "havent": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "done": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "dungeons": {
+ "fine": 2.668,
+ "spam": 2.23
+ },
+ "hello": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "fellow": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "santa": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "join": {
+ "fine": 2.668,
+ "spam": 4.23
+ },
+ "fro6": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "kat": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "lost": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "adventurer": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "does": {
+ "fine": 5.668,
+ "spam": 1.23
+ },
+ "make": {
+ "fine": 8.668,
+ "spam": 1.23
+ },
+ "people": {
+ "fine": 3.668,
+ "spam": 2.23
+ },
+ "notice": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "tho": {
+ "fine": 4.668,
+ "spam": 0.23
+ },
+ "hey": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "up": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "what": {
+ "fine": 22.668,
+ "spam": 2.23
+ },
+ "u": {
+ "fine": 21.668,
+ "spam": 5.23
+ },
+ "recommend": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "help": {
+ "fine": 3.668,
+ "spam": 2.23
+ },
+ "but": {
+ "fine": 10.668,
+ "spam": 1.23
+ },
+ "they": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "only": {
+ "fine": 5.668,
+ "spam": 6.23
+ },
+ "have": {
+ "fine": 26.668,
+ "spam": 8.23
+ },
+ "5k": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "durability": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "mine": {
+ "fine": 6.668,
+ "spam": 0.23
+ },
+ "prisma": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "pumps": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "/party": {
+ "fine": 0.668,
+ "spam": 2.23
+ },
+ "lowballing": {
+ "fine": 0.668,
+ "spam": 17.23
+ },
+ "160m": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "purse": {
+ "fine": 0.668,
+ "spam": 11.23
+ },
+ "can": {
+ "fine": 25.668,
+ "spam": 16.23
+ },
+ "30k": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "free": {
+ "fine": 4.668,
+ "spam": 5.23
+ },
+ "any": {
+ "fine": 4.668,
+ "spam": 4.23
+ },
+ "cobble": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "y": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "l": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "ol": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "sometimes": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "arguing": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "is": {
+ "fine": 34.668,
+ "spam": 5.23
+ },
+ "fun": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "wuts": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "dat": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "wait": {
+ "fine": 13.668,
+ "spam": 0.23
+ },
+ "starlight": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "this": {
+ "fine": 12.668,
+ "spam": 4.23
+ },
+ "ok": {
+ "fine": 10.668,
+ "spam": 0.23
+ },
+ "think": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "reason": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "bz": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "down": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "because": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "some1": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "did": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "huge": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "buy": {
+ "fine": 4.668,
+ "spam": 27.23
+ },
+ "order": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "broke": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "inst": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "biding": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "boi": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "getting": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "gold": {
+ "fine": 3.668,
+ "spam": 1.23
+ },
+ "griffin": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "upgrades": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "even": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "happened": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "be": {
+ "fine": 7.668,
+ "spam": 1.23
+ },
+ "sweatin": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "sugar": {
+ "fine": 1.6680000000000001,
+ "spam": 3.23
+ },
+ "rush": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "book": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "like": {
+ "fine": 12.668,
+ "spam": 2.23
+ },
+ "furfsky": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "reborn": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "active": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "texture": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "packs": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "alr": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "dilliondbomb": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "wc": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "ur": {
+ "fine": 7.668,
+ "spam": 4.23
+ },
+ "items": {
+ "fine": 1.6680000000000001,
+ "spam": 14.23
+ },
+ "100m": {
+ "fine": 0.668,
+ "spam": 5.23
+ },
+ "hoe/no": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "minions": {
+ "fine": 6.668,
+ "spam": 19.23
+ },
+ "tamasso": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "cheapest": {
+ "fine": 0.668,
+ "spam": 4.23
+ },
+ "barriers": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "tier": {
+ "fine": 1.6680000000000001,
+ "spam": 5.23
+ },
+ "xi": {
+ "fine": 0.668,
+ "spam": 2.23
+ },
+ "snow": {
+ "fine": 3.668,
+ "spam": 11.23
+ },
+ "minion": {
+ "fine": 2.668,
+ "spam": 11.23
+ },
+ "elartord": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "000": {
+ "fine": 0.668,
+ "spam": 4.23
+ },
+ "left": {
+ "fine": 3.668,
+ "spam": 3.23
+ },
+ "entry": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "giveaway": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "bl4ck": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "fr1day": {
+ "fine": 0.668,
+ "spam": 1.23
+ },
+ "fre3": {
+ "fine": 0.668,
+ "spam": 4.23
+ },
+ "c0ins": {
+ "fine": 0.668,
+ "spam": 2.23
+ },
+ "coinempires": {
+ "fine": 0.668,
+ "spam": 4.23
+ },
+ "com": {
+ "fine": 1.6680000000000001,
+ "spam": 18.23
+ },
+ "else": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "use": {
+ "fine": 4.668,
+ "spam": 1.23
+ },
+ "eyes": {
+ "fine": 2.668,
+ "spam": 1.23
+ },
+ "got": {
+ "fine": 7.668,
+ "spam": 2.23
+ },
+ "them": {
+ "fine": 6.668,
+ "spam": 0.23
+ },
+ "so": {
+ "fine": 14.668,
+ "spam": 4.23
+ },
+ "could": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "sword": {
+ "fine": 4.668,
+ "spam": 5.23
+ },
+ "9y": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "noice": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "plus": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "actually": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "productive": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "apparently": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "frags": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "protector": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "all": {
+ "fine": 9.668,
+ "spam": 4.23
+ },
+ "bought": {
+ "fine": 2.668,
+ "spam": 1.23
+ },
+ "costs": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "500m": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "insta": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "f6": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "comp": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "chat": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "p": {
+ "fine": 1.6680000000000001,
+ "spam": 9.23
+ },
+ "go": {
+ "fine": 7.668,
+ "spam": 11.23
+ },
+ "trade": {
+ "fine": 4.668,
+ "spam": 0.23
+ },
+ "one": {
+ "fine": 11.668,
+ "spam": 4.23
+ },
+ "qwe": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "duelin": {
+ "fine": 1.6680000000000001,
+ "spam": 0.23
+ },
+ "rn": {
+ "fine": 7.668,
+ "spam": 1.23
+ },
+ "wtf": {
+ "fine": 3.668,
+ "spam": 1.23
+ },
+ "thanks": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "helping": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "everyone": {
+ "fine": 3.668,
+ "spam": 0.23
+ },
+ "are": {
+ "fine": 19.668,
+ "spam": 2.23
+ },
+ "sacks": {
+ "fine": 2.668,
+ "spam": 0.23
+ },
+ "around": {
+ "fine": 1.6680000000000001,
+ "spam": 1.23
+ },
+ "60k": {
+ "fine": 2.668,
+ "spam": 0.23
+