From 67b2c2220008735eb1eced0fe38ab10c320a7f5c Mon Sep 17 00:00:00 2001 From: Cilly Leang Date: Sat, 18 Oct 2025 01:12:20 +1100 Subject: [PATCH] feat(Scout): remove empty discriminator from user searches --- .../kotlin/moe/lava/awoocord/scout/Scout.kt | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/plugins/Scout/src/main/kotlin/moe/lava/awoocord/scout/Scout.kt b/plugins/Scout/src/main/kotlin/moe/lava/awoocord/scout/Scout.kt index 19272f7..e781360 100644 --- a/plugins/Scout/src/main/kotlin/moe/lava/awoocord/scout/Scout.kt +++ b/plugins/Scout/src/main/kotlin/moe/lava/awoocord/scout/Scout.kt @@ -12,7 +12,6 @@ import com.aliucord.patcher.* import com.aliucord.utils.DimenUtils.dp import com.aliucord.utils.ViewUtils.findViewById import com.aliucord.wrappers.ChannelWrapper.Companion.id -import com.aliucord.wrappers.ChannelWrapper.Companion.type import com.discord.BuildConfig import com.discord.api.channel.Channel import com.discord.api.channel.ChannelUtils @@ -38,6 +37,7 @@ import com.discord.utilities.search.query.node.QueryNode import com.discord.utilities.search.query.node.answer.ChannelNode import com.discord.utilities.search.query.node.answer.HasAnswerOption import com.discord.utilities.search.query.node.answer.HasNode +import com.discord.utilities.search.query.node.answer.UserNode import com.discord.utilities.search.query.node.content.ContentNode import com.discord.utilities.search.query.node.filter.FilterNode import com.discord.utilities.search.query.parsing.QueryParser @@ -53,7 +53,6 @@ import com.franmontiel.persistentcookiejar.PersistentCookieJar import com.franmontiel.persistentcookiejar.cache.SetCookieCache import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor import com.lytefast.flexinput.R -import de.robv.android.xposed.XposedBridge import moe.lava.awoocord.scout.api.SearchAPIInterface import moe.lava.awoocord.scout.parsing.* import moe.lava.awoocord.scout.ui.* @@ -82,6 +81,7 @@ class Scout : Plugin() { patchSearchUI(context) patchSearchPadding() patchThreadSupport() + patchUsernameDiscriminator() } override fun stop(context: Context) { @@ -609,6 +609,7 @@ class Scout : Plugin() { } } + // Adds support for searching in threads private fun patchThreadSupport() { // Patch query parser for in: to support names with spaces, by wrapping them in quotes // This enables searching for threads which can have spaces in their names @@ -626,8 +627,8 @@ class Scout : Plugin() { Map::class.java ) { ( param, - members: Map, - users: Map, + /* members */ _: Map, + /* users*/ _: Map, channels: Map, permissions: Map ) -> @@ -691,7 +692,7 @@ class Scout : Plugin() { "onConfigure", Int::class.javaPrimitiveType!!, MGRecyclerDataPayload::class.java - ) { (param, _: Int, payload: SingleTypePayload) -> + ) { (_, _: Int, payload: SingleTypePayload) -> StoreStream.getChannels().getChannel(payload.data.channelId)?.let { if (ChannelUtils.H(it)) { itemView.findViewById("search_suggestions_item_channel_icon") @@ -700,4 +701,27 @@ class Scout : Plugin() { } } } + + // Removes the #0000 discriminator from usernames when searching + private fun patchUsernameDiscriminator() { + // Change the regex for the user rule + // Previously it matches something like # + // Now it matches something like @[#] (bots still have discriminators) + // The @ is required unfortunately, to distinguish it from literally any other word + patcher.instead("getUserRule") { + val regex = Pattern.compile("^\\s*@(?:([^@#:]+)#([0-9]{4})|([a-z0-9._]{2,32}))", 64); + + // Returns a new rule to support our optional second group (discriminator) + return@instead SimpleParserRule(regex) { matcher, _, obj -> + val username = matcher.group(3) ?: matcher.group(1)!! + val discrim = matcher.group(2)?.toInt() ?: 0 + ParseSpec(UserNode(username, discrim), obj) + } + } + + // Patches the node's string representation to add an @ and remove empty discriminators + patcher.after("getText") { param -> + param.result = "@" + (param.result as String).replace("#0000", "") + } + } }