From 4932b36ee12c9b3c07a4e8abfa1960e2f35d2df5 Mon Sep 17 00:00:00 2001 From: ikechan8370 Date: Sun, 26 Nov 2023 12:59:48 +0800 Subject: [PATCH] =?UTF-8?q?`Shamrock`:=20fix:=20=E3=82=B0=E3=83=AB?= =?UTF-8?q?=E3=83=BC=E3=83=97=E3=83=AA=E3=82=AF=E3=82=A8=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=A4=E3=83=99=E3=83=B3=E3=83=88=E3=81=AE=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E3=81=A8=E5=87=A6=E7=90=86=E3=83=AD=E3=82=B8=E3=83=83=E3=82=AF?= =?UTF-8?q?=E3=82=92=E6=9C=80=E9=81=A9=E5=8C=96=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fuqiuluo/qqinterface/servlet/FriendSvc.kt | 20 +++++---- .../fuqiuluo/qqinterface/servlet/GroupSvc.kt | 42 ++++++++----------- .../action/handlers/GetGroupSystemMsg.kt | 8 ++-- .../action/handlers/SetGroupAddRequest.kt | 26 ++++++++---- .../service/listener/PrimitiveListener.kt | 28 ++++++++----- 5 files changed, 67 insertions(+), 57 deletions(-) diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FriendSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FriendSvc.kt index bf99fd2..44b44e1 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FriendSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FriendSvc.kt @@ -13,11 +13,9 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine -import moe.fuqiuluo.qqinterface.servlet.BaseSvc import moe.fuqiuluo.shamrock.tools.slice import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher import mqq.app.AppRuntime -import mqq.app.MobileQQ import tencent.mobileim.structmsg.`structmsg$FlagInfo` import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew` import tencent.mobileim.structmsg.`structmsg$RspSystemMsgNew` @@ -59,6 +57,9 @@ internal object FriendSvc: BaseSvc() { } suspend fun requestFriendSystemMsgNew(msgNum: Int, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 3): List? { + if (retryCnt < 0) { + return ArrayList() + } val req = `structmsg$ReqSystemMsgNew`() req.msg_num.set(msgNum) req.latest_friend_seq.set(latestFriendSeq) @@ -90,14 +91,17 @@ internal object FriendSvc: BaseSvc() { req.uint32_req_msg_type.set(1) req.uint32_need_uid.set(1) val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Friend", true, req.toByteArray()) - return if (respBuffer == null && retryCnt >= 0) { - requestFriendSystemMsgNew(msgNum, latestFriendSeq, latestGroupSeq, retryCnt - 1) - } else if (respBuffer == null) { + return if (respBuffer == null) { ArrayList() } else { - val msg = `structmsg$RspSystemMsgNew`() - msg.mergeFrom(respBuffer.slice(4)) - return msg.friendmsgs.get() + try { + val msg = `structmsg$RspSystemMsgNew`() + msg.mergeFrom(respBuffer.slice(4)) + return msg.friendmsgs.get() + } catch (err: Throwable) { + requestFriendSystemMsgNew(msgNum, latestFriendSeq, latestGroupSeq, retryCnt - 1) + } + } } 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 c1b9dc0..43b1c96 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt @@ -643,21 +643,6 @@ internal object GroupSvc: BaseSvc() { notSee: Boolean? = false, subType: String ): Result{ -// val app = AppRuntimeFetcher.appRuntime -// if (app !is AppInterface) -// throw RuntimeException("AppRuntime cannot cast to AppInterface") -// val service = QRoute.api(IAddFriendTempApi::class.java) -// val action = `structmsg$SystemMsgActionInfo`() -// action.type.set(if (approve != false) 11 else 12) -// action.group_code.set(gid) -// action.msg.set(msg) -// val snInfo = `structmsg$AddFrdSNInfo`() -// snInfo.uint32_not_see_dynamic.set(if (notSee != false) 1 else 0) -//// snInfo.uint32_set_sn.set(0) -// action.addFrdSNInfo.set(snInfo) -// service.sendFriendSystemMsgAction(2, msgSeq * 1000, uin, 1, 2, 30024, 1, action, 0, `structmsg$StructMsg`(), false, -// app -// ) // 实在找不到接口了 发pb吧 val buffer: ByteArray when (subType) { @@ -688,7 +673,9 @@ internal object GroupSvc: BaseSvc() { 7 to 1, 8 to mapOf( 1 to if (approve != false) 11 else 12, - 2 to gid + 2 to gid, + 50 to msg, + 53 to if (notSee != false) 1 else 0 ), 9 to 1000 ).toByteArray() @@ -704,14 +691,17 @@ internal object GroupSvc: BaseSvc() { if (result[1, 1].asInt == 0) { Result.success(result[2].asUtf8String) } else { - Result.failure(Exception(result[2].asUtf8String)) + Result.failure(Exception(result[1, 2].asUtf8String)) } } else { Result.failure(Exception("操作失败")) } } - suspend fun requestGroupSystemMsgNew(msgNum: Int, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 3): List? { + suspend fun requestGroupSystemMsgNew(msgNum: Int, reqMsgType: Int = 1, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 5): List { + if (retryCnt < 0) { + return ArrayList() + } val req = ReqSystemMsgNew() req.msg_num.set(msgNum) req.latest_friend_seq.set(latestFriendSeq) @@ -740,17 +730,19 @@ internal object GroupSvc: BaseSvc() { req.is_get_frd_ribbon.set(false) req.is_get_grp_ribbon.set(false) req.friend_msg_type_flag.set(1) - req.uint32_req_msg_type.set(1) + req.uint32_req_msg_type.set(reqMsgType) req.uint32_need_uid.set(1) val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Group", true, req.toByteArray()) - return if (respBuffer == null && retryCnt >= 0) { - requestGroupSystemMsgNew(msgNum, latestFriendSeq, latestGroupSeq, retryCnt - 1) - } else if (respBuffer == null) { + return if (respBuffer == null) { ArrayList() } else { - val msg = RspSystemMsgNew() - msg.mergeFrom(respBuffer.slice(4)) - return msg.groupmsgs.get() + try { + val msg = RspSystemMsgNew() + msg.mergeFrom(respBuffer.slice(4)) + return msg.groupmsgs.get().orEmpty() + } catch (err: Throwable) { + requestGroupSystemMsgNew(msgNum, reqMsgType, latestFriendSeq, latestGroupSeq, retryCnt - 1) + } } } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSystemMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSystemMsg.kt index 35ef84a..d12c685 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSystemMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupSystemMsg.kt @@ -2,7 +2,6 @@ package moe.fuqiuluo.shamrock.remote.action.handlers import kotlinx.serialization.json.JsonElement import moe.fuqiuluo.qqinterface.servlet.GroupSvc -import moe.fuqiuluo.qqinterface.servlet.transfile.RichProtoSvc import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.service.data.GroupRequest @@ -16,11 +15,12 @@ internal object GetGroupSystemMsg: IActionHandler() { suspend operator fun invoke(echo: JsonElement = EmptyJsonString): String { val list = GroupSvc.requestGroupSystemMsgNew(20) + val riskList = GroupSvc.requestGroupSystemMsgNew(20, 2) val msgs = GroupSystemMessage( invited = mutableListOf(), join = mutableListOf() ) - list?.forEach { + (list + riskList).forEach { when(it.msg.group_msg_type.get()) { 22, 1 -> { // join 进群消息 @@ -42,8 +42,8 @@ internal object GetGroupSystemMsg: IActionHandler() { // invite 别人邀请我 msgs.invited += GroupRequest ( msgSeq = it.msg_seq.get(), - invitorUin = null, - invitorNick = null, + invitorUin = it.msg.action_uin.get(), + invitorNick = it.msg.action_uin_nick.get(), groupId = it.msg.group_code.get(), groupName = it.msg.group_name.get(), checked = it.msg.msg_decided.get().isNotBlank(), diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAddRequest.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAddRequest.kt index 21b0bad..0b4db41 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAddRequest.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SetGroupAddRequest.kt @@ -1,8 +1,9 @@ package moe.fuqiuluo.shamrock.remote.action.handlers import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.qqinterface.servlet.FriendSvc import moe.fuqiuluo.qqinterface.servlet.GroupSvc +import moe.fuqiuluo.shamrock.helper.Level +import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.tools.EmptyJsonString @@ -12,7 +13,7 @@ internal object SetGroupAddRequest: IActionHandler() { val flag = session.getString("flag") val approve = session.getBoolean("approve") val remark = session.getStringOrNull("reason") - val notSeen = session.getBoolean("notSeen") + val notSeen = session.getBoolean("not_seen") val subType = session.getString("sub_type") return invoke(flag, approve, subType, remark, notSeen, session.echo) } @@ -20,13 +21,20 @@ internal object SetGroupAddRequest: IActionHandler() { suspend operator fun invoke(flag: String, approve: Boolean? = true, subType: String, remark: String? = "", notSeen: Boolean? = false, echo: JsonElement = EmptyJsonString): String { val flags = flag.split(";") var ts = flags[0].toLong() - if (ts.toString().length < 13) { - // time but not seq, query seq again - val reqs = GroupSvc.requestGroupSystemMsgNew(20) - val req = reqs?.first { - it.msg_time.get() == ts + try { + if (ts.toString().length < 13) { + // time but not seq, query seq again + var reqs = GroupSvc.requestGroupSystemMsgNew(20, 1) + val riskReqs = GroupSvc.requestGroupSystemMsgNew(20, 2) + reqs = reqs + riskReqs + val req = reqs.first { + it.msg_time.get() == ts + } + ts = req.msg_seq?.get() ?: return error("失败:未找到该请求", echo) } - ts = req?.msg_seq?.get() ?: return error("失败:未找到该请求", echo) + } catch (err: Throwable) { + LogCenter.log(err.stackTraceToString(), Level.WARN) + return error("查找请求失败:${err.message}", echo) } val groupCode = flags[1].toLong() val uin = flags[2].toLong() @@ -35,7 +43,7 @@ internal object SetGroupAddRequest: IActionHandler() { if (result.isSuccess) { ok(result.getOrNull(), echo) } else { - logic(result.getOrNull() ?: "", echo) + logic(result.exceptionOrNull()?.message ?: "", echo) } } catch (err: Throwable) { err.printStackTrace() diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/PrimitiveListener.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/PrimitiveListener.kt index f655680..017fb84 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/PrimitiveListener.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/PrimitiveListener.kt @@ -402,14 +402,16 @@ internal object PrimitiveListener { LogCenter.log("入群申请($groupCode) $applier: \"$reason\"") val flag = try { - val reqs = requestGroupSystemMsgNew(10, 0, 0) - val req = reqs?.first { + var reqs = requestGroupSystemMsgNew(10, 1) + val riskReqs = requestGroupSystemMsgNew(10, 2) + reqs = reqs + riskReqs + val req = reqs.first { it.msg_time.get() == time } - val seq = req?.msg_seq?.get() - "$seq;$groupCode;$applierUid" + val seq = req.msg_seq?.get() + "$seq;$groupCode;$applier" } catch (err: Throwable) { - "$time;$groupCode;$applierUid" + "$time;$groupCode;$applier" } if(!GlobalEventTransmitter.RequestTransmitter .transGroupApply(time, applier, reason, groupCode, flag, RequestSubType.Add)) { @@ -426,11 +428,13 @@ internal object PrimitiveListener { } LogCenter.log("邀请入群申请($groupCode): $applier") val flag = try { - val reqs = requestGroupSystemMsgNew(10, 0, 0) - val req = reqs?.first { + var reqs = requestGroupSystemMsgNew(10, 1) + val riskReqs = requestGroupSystemMsgNew(10, 2) + reqs = reqs + riskReqs + val req = reqs.first { it.msg_time.get() == time } - val seq = req?.msg_seq?.get() + val seq = req.msg_seq?.get() "$seq;$groupCode;$applier" } catch (err: Throwable) { "$time;$groupCode;$applierUid" @@ -449,11 +453,13 @@ internal object PrimitiveListener { val uin = pb[1, 1, 5].asLong LogCenter.log("邀请入群$groupCode 邀请者: \"$invitor\"") val flag = try { - val reqs = requestGroupSystemMsgNew(10, 0, 0) - val req = reqs?.first { + var reqs = requestGroupSystemMsgNew(10, 1) + val riskReqs = requestGroupSystemMsgNew(10, 2) + reqs = reqs + riskReqs + val req = reqs.first { it.msg_time.get() == time } - val seq = req?.msg_seq?.get() + val seq = req.msg_seq?.get() "$seq;$groupCode;$uin" } catch (err: Throwable) { "$time;$groupCode;$uin"