diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt index 03ad7eb..a73d3f1 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt @@ -97,6 +97,8 @@ import java.nio.ByteBuffer import kotlin.coroutines.resume internal object GroupSvc: BaseSvc() { + private const val GET_MEMBER_ROLE_BY_NT = false + private val RefreshTroopMemberInfoLock by lazy { Mutex() } @@ -396,6 +398,13 @@ internal object GroupSvc: BaseSvc() { } 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) { com.tencent.qqnt.kernel.nativeinterface.MemberRole.STRANGER -> MemberRole.Stranger com.tencent.qqnt.kernel.nativeinterface.MemberRole.MEMBER -> MemberRole.Member @@ -641,30 +650,32 @@ internal object GroupSvc: BaseSvc() { qq: Long, timeout: Long = 5000L ): Result { - val kernelService = NTServiceFetcher.kernelService - val sessionService = kernelService.wrapperSession - val groupService = sessionService.groupService - val info = withTimeoutOrNull(timeout) { - suspendCancellableCoroutine { - groupService.getTransferableMemberInfo(groupId.toLong()) { code, _, data -> - if (code != 0) { - it.resume(null) - return@getTransferableMemberInfo - } - data.forEach { (_, info) -> - if (info.uin == qq) { - it.resume(info) - return@forEach + return runCatching { + val kernelService = NTServiceFetcher.kernelService + val sessionService = kernelService.wrapperSession + val groupService = sessionService.groupService + val info = withTimeoutOrNull(timeout) { + suspendCancellableCoroutine { + groupService.getTransferableMemberInfo(groupId.toLong()) { code, _, data -> + if (code != 0) { + it.resume(null) + return@getTransferableMemberInfo } + data.forEach { (_, info) -> + if (info.uin == qq) { + it.resume(info) + return@forEach + } + } + it.resume(null) } - it.resume(null) } } - } - return if (info != null) { - Result.success(info) - } else { - Result.failure(Exception("获取群成员信息失败")) + return if (info != null) { + Result.success(info) + } else { + Result.failure(Exception("获取群成员信息失败")) + } } } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt index 369e79d..abd45d2 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt @@ -138,16 +138,18 @@ internal class XposedEntry: IXposedHookLoadPackage { MMKVFetcher.initMMKV(ctx) } - if (ShamrockConfig.forbidUselessProcess()) { - if(uselessProcess.any { - processName.contains(it, ignoreCase = true) - }) { - log("[Shamrock] Useless process detected: $processName, exit.") - Process.killProcess(Process.myPid()) - exitProcess(0) + runCatching { + if (ShamrockConfig.forbidUselessProcess()) { + if(uselessProcess.any { + processName.contains(it, ignoreCase = true) + }) { + log("[Shamrock] Useless process detected: $processName, exit.") + 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") diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/helper/NTServiceFetcher.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/helper/NTServiceFetcher.kt index f5c6557..471a184 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/helper/NTServiceFetcher.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/helper/NTServiceFetcher.kt @@ -2,24 +2,17 @@ package moe.fuqiuluo.shamrock.xposed.helper import com.tencent.qqnt.kernel.api.IKernelService 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.IQQNTWrapperSession -import de.robv.android.xposed.XC_MethodHook -import de.robv.android.xposed.XposedBridge import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.remote.service.PacketReceiver 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.tools.hookMethod import moe.fuqiuluo.shamrock.utils.PlatformUtils -import kotlin.reflect.jvm.javaMethod internal object NTServiceFetcher { private lateinit var iKernelService: IKernelService @@ -30,7 +23,7 @@ internal object NTServiceFetcher { lock.withLock { val msgService = service.msgService ?: return val sessionService = service.wrapperSession ?: return - val groupService = sessionService.groupService ?: return + //val groupService = sessionService.groupService ?: return val curHash = service.hashCode() + msgService.hashCode() if (isInitForNt(curHash)) return @@ -43,7 +36,7 @@ internal object NTServiceFetcher { this.iKernelService = service - initNTKernelListener(msgService, groupService) + initNTKernelListener(msgService) antiBackgroundMode(sessionService) //hookGuildListener(sessionService) } @@ -66,7 +59,7 @@ internal object NTServiceFetcher { return hash == curKernelHash } - private fun initNTKernelListener(msgService: MsgService, groupService: IKernelGroupService) { + private fun initNTKernelListener(msgService: MsgService) { if (!PlatformUtils.isMainProcess()) return try {