From 502956e3ec6da19602f14098cc4064d6b940bc11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E6=B1=A0?= Date: Thu, 15 Feb 2024 13:01:34 +0800 Subject: [PATCH] =?UTF-8?q?`Shamrock`:=20=E3=82=A8=E3=82=A4=E3=83=88?= =?UTF-8?q?=E3=83=BB=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=81=AB?= =?UTF-8?q?=E3=83=8B=E3=83=83=E3=82=AF=E3=83=8D=E3=83=BC=E3=83=A0=E3=81=AE?= =?UTF-8?q?=E8=BF=85=E9=80=9F=E3=81=AA=E3=82=AF=E3=82=A8=E3=83=AA=E3=82=92?= =?UTF-8?q?=E8=A8=B1=E5=8F=AF=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fuqiuluo/qqinterface/servlet/GroupSvc.kt | 85 ++++++++++++++++--- .../qqinterface/servlet/msg/MessageMaker.kt | 2 +- 2 files changed, 74 insertions(+), 13 deletions(-) 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 9ae7798..ed14a7b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt @@ -566,23 +566,84 @@ internal object GroupSvc: BaseSvc() { } } - private suspend fun getTroopMemberInfoByUinViaNt(groupId: String, qq: Long): Result { + suspend fun getTroopMemberInfoByUinV2( + groupId: String, + uin: String, + refresh: Boolean = false + ): Result { + val service = app.getRuntimeService(ITroopMemberInfoService::class.java, "all") + var info = service.getTroopMember(groupId, uin) + if (refresh || !service.isMemberInCache(groupId, uin) || info == null || info.troopnick == null) { + info = requestTroopMemberInfo(service, groupId.toLong(), uin.toLong()).getOrNull() + } + if (info == null) { + info = getTroopMemberInfoByUinViaNt(groupId, uin.toLong(), timeout = 2000L).getOrNull()?.let { + TroopMemberInfo().apply { + troopnick = it.cardName + friendnick = it.nick + } + } + } + try { + if (info != null && (info.alias == null || info.alias.isBlank())) { + val req = group_member_info.ReqBody() + req.uint64_group_code.set(groupId.toLong()) + req.uint64_uin.set(uin.toLong()) + req.bool_new_client.set(true) + req.uint32_client_type.set(1) + req.uint32_rich_card_name_ver.set(1) + val respBuffer = sendBufferAW("group_member_card.get_group_member_card_info", true, req.toByteArray(), timeout = 2000) + if (respBuffer != null) { + val rsp = group_member_info.RspBody() + rsp.mergeFrom(respBuffer.slice(4)) + if (rsp.msg_meminfo.str_location.has()) { + info.alias = rsp.msg_meminfo.str_location.get().toStringUtf8() + } + if (rsp.msg_meminfo.uint32_age.has()) { + info.age = rsp.msg_meminfo.uint32_age.get().toByte() + } + if (rsp.msg_meminfo.bytes_group_honor.has()) { + val honorBytes = rsp.msg_meminfo.bytes_group_honor.get().toByteArray() + val honor = troop_honor.GroupUserCardHonor() + honor.mergeFrom(honorBytes) + info.level = honor.level.get() + // 10315: medal_id not real group level + } + } + } + } catch (err: Throwable) { + LogCenter.log(err.stackTraceToString(), Level.WARN) + } + return if (info != null) { + Result.success(info) + } else { + Result.failure(Exception("获取群成员信息失败")) + } + } + + private suspend fun getTroopMemberInfoByUinViaNt( + groupId: String, + qq: Long, + timeout: Long = 5000L + ): Result { val kernelService = NTServiceFetcher.kernelService val sessionService = kernelService.wrapperSession val groupService = sessionService.groupService - val info = 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 + 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) { diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt index d47a783..9e999e4 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt @@ -670,7 +670,7 @@ internal object MessageMaker { at.atNtUid = "0" } else -> { - val info = GroupSvc.getTroopMemberInfoByUin(peerId, qq, true).onFailure { + val info = GroupSvc.getTroopMemberInfoByUinV2(peerId, qq, true).onFailure { LogCenter.log("无法获取群成员信息: $qq", Level.ERROR) }.getOrNull() if (info != null) {