Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AntiSpam: Prevent heavy unicode & utf16/32 from lagging the game #425

Merged
merged 2 commits into from
Dec 12, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions src/main/kotlin/com/lambda/client/module/modules/chat/AntiSpam.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.lambda.client.module.modules.chat

import com.lambda.client.LambdaMod
import com.lambda.client.event.listener.listener
import com.lambda.client.module.Category
import com.lambda.client.module.Module
import com.lambda.client.util.text.MessageDetection
import com.lambda.client.util.text.MessageSendHelper
import com.lambda.client.util.text.SpamFilters
import com.lambda.client.util.threads.safeListener
import net.minecraft.util.text.TextComponentString
import net.minecraftforge.client.event.ClientChatReceivedEvent
import java.util.concurrent.ConcurrentHashMap
Expand All @@ -32,6 +32,8 @@ object AntiSpam : Module(
private val specialCharBegin = setting("Special Begin", true, { page == Page.TYPE })
private val greenText = setting("Green Text", false, { page == Page.TYPE })
private val fancyChat by setting("Fancy Chat", false, { page == Page.TYPE })
private val lagMessage by setting("Lag Message", true, { page == Page.TYPE })
private val thresholdLagMessage by setting("Threshold Lag", 256, 256..1024, 1, { page == Page.TYPE && lagMessage }) // Is 1024 the max?

/* Page Two */
private val aggressiveFiltering by setting("Aggressive Filtering", true, { page == Page.SETTINGS })
Expand Down Expand Up @@ -82,8 +84,10 @@ object AntiSpam : Module(
messageHistory.clear()
}

listener<ClientChatReceivedEvent> { event ->
if (mc.player == null) return@listener
safeListener<ClientChatReceivedEvent> { event ->
if (lagMessage && isLagMessage(event.message.unformattedText)) {
event.isCanceled = true
}

messageHistory.values.removeIf { System.currentTimeMillis() - it > 600000 }

Expand Down Expand Up @@ -131,6 +135,16 @@ object AntiSpam : Module(
}
}

private fun isLagMessage(message: String): Boolean {
return if (!filterOwn && isOwn(message)
|| !filterDMs && MessageDetection.Direct.ANY detect message
|| !filterServer && MessageDetection.Server.ANY detect message) {
false
} else {
message.getBytes() > thresholdLagMessage
}
}

private fun detectSpam(message: String): String? {
for ((key, value) in settingMap) {
findPatterns(value, message)?.let {
Expand Down Expand Up @@ -169,6 +183,9 @@ object AntiSpam : Module(
return isDuplicate
}

private fun String.getBytes(): Int {
return this.toByteArray().size
}

private fun isOwn(message: String): Boolean {
/* mc.player is null when the module is being registered, so this matcher isn't added alongside the other FilterPatterns */
Expand Down