feat: unlimited conversation pinning
This commit is contained in:
@@ -5,6 +5,7 @@ import me.rhunk.snapenhance.common.data.RuleState
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.features.MessagingRuleFeature
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
import me.rhunk.snapenhance.core.util.hook.hookConstructor
|
||||
import me.rhunk.snapenhance.core.util.ktx.getObjectField
|
||||
@@ -13,10 +14,22 @@ import me.rhunk.snapenhance.core.wrapper.impl.SnapUUID
|
||||
|
||||
class PinConversations : MessagingRuleFeature("PinConversations", MessagingRuleType.PIN_CONVERSATION, loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC) {
|
||||
override fun onActivityCreate() {
|
||||
if (!context.config.messaging.unlimitedConversationPinning.get()) return
|
||||
|
||||
context.classCache.feedManager.hook("setPinnedConversationStatus", HookStage.BEFORE) { param ->
|
||||
val conversationUUID = SnapUUID(param.arg(0))
|
||||
val isPinned = param.arg<Any>(1).toString() == "PINNED"
|
||||
setState(conversationUUID.toString(), isPinned)
|
||||
val callback = param.arg<Any>(2)
|
||||
mutableSetOf<() -> Unit>().apply {
|
||||
addAll(Hooker.ephemeralHookObjectMethod(callback::class.java, callback,"onSuccess", HookStage.BEFORE) {
|
||||
forEach { it() }
|
||||
})
|
||||
addAll(Hooker.ephemeralHookObjectMethod(callback::class.java, callback,"onError", HookStage.BEFORE) { methodParam ->
|
||||
methodParam.setResult(null)
|
||||
callback::class.java.getDeclaredMethod("onSuccess").invoke(callback)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
context.classCache.conversation.hookConstructor(HookStage.AFTER) { param ->
|
||||
|
||||
@@ -109,13 +109,16 @@ object Hooker {
|
||||
methodName: String,
|
||||
stage: HookStage,
|
||||
crossinline hookConsumer: (HookAdapter) -> Unit
|
||||
) {
|
||||
val unhooks: MutableSet<XC_MethodHook.Unhook> = HashSet()
|
||||
): Set<() -> Unit> {
|
||||
val unhooks = mutableSetOf<XC_MethodHook.Unhook>()
|
||||
hook(clazz, methodName, stage) { param->
|
||||
if (param.nullableThisObject<Any>() != instance) return@hook
|
||||
unhooks.forEach { it.unhook() }
|
||||
hookConsumer(param)
|
||||
}.also { unhooks.addAll(it) }
|
||||
return unhooks.map {
|
||||
{ it.unhook() }
|
||||
}.toSet()
|
||||
}
|
||||
|
||||
inline fun ephemeralHookConstructor(
|
||||
|
||||
Reference in New Issue
Block a user