Skip to content
This repository has been archived by the owner on Apr 19, 2024. It is now read-only.

Commit

Permalink
Shamrock: fix get role by nt crash
Browse files Browse the repository at this point in the history
  • Loading branch information
whitechi73 committed Feb 16, 2024
1 parent 36f8b6e commit 63ce2d4
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 39 deletions.
51 changes: 31 additions & 20 deletions xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt
Expand Up @@ -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()
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -641,30 +650,32 @@ internal object GroupSvc: BaseSvc() {
qq: Long,
timeout: Long = 5000L
): Result<MemberInfo> {
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("获取群成员信息失败"))
}
}
}

Expand Down
20 changes: 11 additions & 9 deletions xposed/src/main/java/moe/fuqiuluo/shamrock/xposed/XposedEntry.kt
Expand Up @@ -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")
Expand Down
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -43,7 +36,7 @@ internal object NTServiceFetcher {
this.iKernelService = service


initNTKernelListener(msgService, groupService)
initNTKernelListener(msgService)
antiBackgroundMode(sessionService)
//hookGuildListener(sessionService)
}
Expand All @@ -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 {
Expand Down

0 comments on commit 63ce2d4

Please sign in to comment.