Shamrock: fix get role by nt crash

This commit is contained in:
白池 2024-02-16 10:50:00 +08:00
parent 36f8b6e54b
commit 63ce2d40bd
3 changed files with 45 additions and 39 deletions

View File

@ -97,6 +97,8 @@ import java.nio.ByteBuffer
import kotlin.coroutines.resume import kotlin.coroutines.resume
internal object GroupSvc: BaseSvc() { internal object GroupSvc: BaseSvc() {
private const val GET_MEMBER_ROLE_BY_NT = false
private val RefreshTroopMemberInfoLock by lazy { private val RefreshTroopMemberInfoLock by lazy {
Mutex() Mutex()
} }
@ -396,6 +398,13 @@ internal object GroupSvc: BaseSvc() {
} }
suspend fun getMemberRole(groupId: Long, memberUin: Long): MemberRole { suspend fun getMemberRole(groupId: Long, memberUin: Long): MemberRole {
if (!GET_MEMBER_ROLE_BY_NT) {
return when (memberUin) {
getOwner(groupId.toString()) -> MemberRole.Owner
in getAdminList(groupId.toString()) -> MemberRole.Admin
else -> MemberRole.Member
}
}
return when(getTroopMemberInfoByUinViaNt(groupId.toString(), memberUin, 3000).getOrNull()?.role) { return when(getTroopMemberInfoByUinViaNt(groupId.toString(), memberUin, 3000).getOrNull()?.role) {
com.tencent.qqnt.kernel.nativeinterface.MemberRole.STRANGER -> MemberRole.Stranger com.tencent.qqnt.kernel.nativeinterface.MemberRole.STRANGER -> MemberRole.Stranger
com.tencent.qqnt.kernel.nativeinterface.MemberRole.MEMBER -> MemberRole.Member com.tencent.qqnt.kernel.nativeinterface.MemberRole.MEMBER -> MemberRole.Member
@ -641,30 +650,32 @@ internal object GroupSvc: BaseSvc() {
qq: Long, qq: Long,
timeout: Long = 5000L timeout: Long = 5000L
): Result<MemberInfo> { ): Result<MemberInfo> {
val kernelService = NTServiceFetcher.kernelService return runCatching {
val sessionService = kernelService.wrapperSession val kernelService = NTServiceFetcher.kernelService
val groupService = sessionService.groupService val sessionService = kernelService.wrapperSession
val info = withTimeoutOrNull(timeout) { val groupService = sessionService.groupService
suspendCancellableCoroutine { val info = withTimeoutOrNull(timeout) {
groupService.getTransferableMemberInfo(groupId.toLong()) { code, _, data -> suspendCancellableCoroutine {
if (code != 0) { groupService.getTransferableMemberInfo(groupId.toLong()) { code, _, data ->
it.resume(null) if (code != 0) {
return@getTransferableMemberInfo it.resume(null)
} return@getTransferableMemberInfo
data.forEach { (_, info) ->
if (info.uin == qq) {
it.resume(info)
return@forEach
} }
data.forEach { (_, info) ->
if (info.uin == qq) {
it.resume(info)
return@forEach
}
}
it.resume(null)
} }
it.resume(null)
} }
} }
} return if (info != null) {
return if (info != null) { Result.success(info)
Result.success(info) } else {
} else { Result.failure(Exception("获取群成员信息失败"))
Result.failure(Exception("获取群成员信息失败")) }
} }
} }

View File

@ -138,16 +138,18 @@ internal class XposedEntry: IXposedHookLoadPackage {
MMKVFetcher.initMMKV(ctx) MMKVFetcher.initMMKV(ctx)
} }
if (ShamrockConfig.forbidUselessProcess()) { runCatching {
if(uselessProcess.any { if (ShamrockConfig.forbidUselessProcess()) {
processName.contains(it, ignoreCase = true) if(uselessProcess.any {
}) { processName.contains(it, ignoreCase = true)
log("[Shamrock] Useless process detected: $processName, exit.") }) {
Process.killProcess(Process.myPid()) log("[Shamrock] Useless process detected: $processName, exit.")
exitProcess(0) Process.killProcess(Process.myPid())
exitProcess(0)
}
} else {
log("[Shamrock] Useless process detection is disabled.")
} }
} else {
log("[Shamrock] Useless process detection is disabled.")
} }
log("Process Name = $processName") log("Process Name = $processName")

View File

@ -2,24 +2,17 @@ package moe.fuqiuluo.shamrock.xposed.helper
import com.tencent.qqnt.kernel.api.IKernelService import com.tencent.qqnt.kernel.api.IKernelService
import com.tencent.qqnt.kernel.api.impl.MsgService import com.tencent.qqnt.kernel.api.impl.MsgService
import com.tencent.qqnt.kernel.nativeinterface.IKernelGroupService
import com.tencent.qqnt.kernel.nativeinterface.IKernelGuildService
import com.tencent.qqnt.kernel.nativeinterface.IOperateCallback import com.tencent.qqnt.kernel.nativeinterface.IOperateCallback
import com.tencent.qqnt.kernel.nativeinterface.IQQNTWrapperSession import com.tencent.qqnt.kernel.nativeinterface.IQQNTWrapperSession
import de.robv.android.xposed.XC_MethodHook
import de.robv.android.xposed.XposedBridge
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.remote.service.PacketReceiver import moe.fuqiuluo.shamrock.remote.service.PacketReceiver
import moe.fuqiuluo.shamrock.remote.service.listener.AioListener import moe.fuqiuluo.shamrock.remote.service.listener.AioListener
import moe.fuqiuluo.shamrock.remote.service.listener.GroupEventListener
import moe.fuqiuluo.shamrock.remote.service.listener.KernelGuildListener
import moe.fuqiuluo.shamrock.remote.service.listener.PrimitiveListener import moe.fuqiuluo.shamrock.remote.service.listener.PrimitiveListener
import moe.fuqiuluo.shamrock.tools.hookMethod import moe.fuqiuluo.shamrock.tools.hookMethod
import moe.fuqiuluo.shamrock.utils.PlatformUtils import moe.fuqiuluo.shamrock.utils.PlatformUtils
import kotlin.reflect.jvm.javaMethod
internal object NTServiceFetcher { internal object NTServiceFetcher {
private lateinit var iKernelService: IKernelService private lateinit var iKernelService: IKernelService
@ -30,7 +23,7 @@ internal object NTServiceFetcher {
lock.withLock { lock.withLock {
val msgService = service.msgService ?: return val msgService = service.msgService ?: return
val sessionService = service.wrapperSession ?: return val sessionService = service.wrapperSession ?: return
val groupService = sessionService.groupService ?: return //val groupService = sessionService.groupService ?: return
val curHash = service.hashCode() + msgService.hashCode() val curHash = service.hashCode() + msgService.hashCode()
if (isInitForNt(curHash)) return if (isInitForNt(curHash)) return
@ -43,7 +36,7 @@ internal object NTServiceFetcher {
this.iKernelService = service this.iKernelService = service
initNTKernelListener(msgService, groupService) initNTKernelListener(msgService)
antiBackgroundMode(sessionService) antiBackgroundMode(sessionService)
//hookGuildListener(sessionService) //hookGuildListener(sessionService)
} }
@ -66,7 +59,7 @@ internal object NTServiceFetcher {
return hash == curKernelHash return hash == curKernelHash
} }
private fun initNTKernelListener(msgService: MsgService, groupService: IKernelGroupService) { private fun initNTKernelListener(msgService: MsgService) {
if (!PlatformUtils.isMainProcess()) return if (!PlatformUtils.isMainProcess()) return
try { try {