Shamrock: fix: グループリクエストイベントの通知と処理ロジックを最適化する

This commit is contained in:
ikechan8370 2023-11-26 12:59:48 +08:00
parent 8c307c4f6e
commit 4932b36ee1
5 changed files with 67 additions and 57 deletions

View File

@ -13,11 +13,9 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import moe.fuqiuluo.qqinterface.servlet.BaseSvc
import moe.fuqiuluo.shamrock.tools.slice import moe.fuqiuluo.shamrock.tools.slice
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
import mqq.app.AppRuntime import mqq.app.AppRuntime
import mqq.app.MobileQQ
import tencent.mobileim.structmsg.`structmsg$FlagInfo` import tencent.mobileim.structmsg.`structmsg$FlagInfo`
import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew` import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew`
import tencent.mobileim.structmsg.`structmsg$RspSystemMsgNew` 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<StructMsg>? { suspend fun requestFriendSystemMsgNew(msgNum: Int, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 3): List<StructMsg>? {
if (retryCnt < 0) {
return ArrayList()
}
val req = `structmsg$ReqSystemMsgNew`() val req = `structmsg$ReqSystemMsgNew`()
req.msg_num.set(msgNum) req.msg_num.set(msgNum)
req.latest_friend_seq.set(latestFriendSeq) req.latest_friend_seq.set(latestFriendSeq)
@ -90,14 +91,17 @@ internal object FriendSvc: BaseSvc() {
req.uint32_req_msg_type.set(1) req.uint32_req_msg_type.set(1)
req.uint32_need_uid.set(1) req.uint32_need_uid.set(1)
val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Friend", true, req.toByteArray()) val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Friend", true, req.toByteArray())
return if (respBuffer == null && retryCnt >= 0) { return if (respBuffer == null) {
requestFriendSystemMsgNew(msgNum, latestFriendSeq, latestGroupSeq, retryCnt - 1)
} else if (respBuffer == null) {
ArrayList() ArrayList()
} else { } else {
val msg = `structmsg$RspSystemMsgNew`() try {
msg.mergeFrom(respBuffer.slice(4)) val msg = `structmsg$RspSystemMsgNew`()
return msg.friendmsgs.get() msg.mergeFrom(respBuffer.slice(4))
return msg.friendmsgs.get()
} catch (err: Throwable) {
requestFriendSystemMsgNew(msgNum, latestFriendSeq, latestGroupSeq, retryCnt - 1)
}
} }
} }

View File

@ -643,21 +643,6 @@ internal object GroupSvc: BaseSvc() {
notSee: Boolean? = false, notSee: Boolean? = false,
subType: String subType: String
): Result<String>{ ): Result<String>{
// 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吧 // 实在找不到接口了 发pb吧
val buffer: ByteArray val buffer: ByteArray
when (subType) { when (subType) {
@ -688,7 +673,9 @@ internal object GroupSvc: BaseSvc() {
7 to 1, 7 to 1,
8 to mapOf( 8 to mapOf(
1 to if (approve != false) 11 else 12, 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 9 to 1000
).toByteArray() ).toByteArray()
@ -704,14 +691,17 @@ internal object GroupSvc: BaseSvc() {
if (result[1, 1].asInt == 0) { if (result[1, 1].asInt == 0) {
Result.success(result[2].asUtf8String) Result.success(result[2].asUtf8String)
} else { } else {
Result.failure(Exception(result[2].asUtf8String)) Result.failure(Exception(result[1, 2].asUtf8String))
} }
} else { } else {
Result.failure(Exception("操作失败")) Result.failure(Exception("操作失败"))
} }
} }
suspend fun requestGroupSystemMsgNew(msgNum: Int, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 3): List<StructMsg>? { suspend fun requestGroupSystemMsgNew(msgNum: Int, reqMsgType: Int = 1, latestFriendSeq: Long = 0, latestGroupSeq: Long = 0, retryCnt: Int = 5): List<StructMsg> {
if (retryCnt < 0) {
return ArrayList()
}
val req = ReqSystemMsgNew() val req = ReqSystemMsgNew()
req.msg_num.set(msgNum) req.msg_num.set(msgNum)
req.latest_friend_seq.set(latestFriendSeq) req.latest_friend_seq.set(latestFriendSeq)
@ -740,17 +730,19 @@ internal object GroupSvc: BaseSvc() {
req.is_get_frd_ribbon.set(false) req.is_get_frd_ribbon.set(false)
req.is_get_grp_ribbon.set(false) req.is_get_grp_ribbon.set(false)
req.friend_msg_type_flag.set(1) 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) req.uint32_need_uid.set(1)
val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Group", true, req.toByteArray()) val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Group", true, req.toByteArray())
return if (respBuffer == null && retryCnt >= 0) { return if (respBuffer == null) {
requestGroupSystemMsgNew(msgNum, latestFriendSeq, latestGroupSeq, retryCnt - 1)
} else if (respBuffer == null) {
ArrayList() ArrayList()
} else { } else {
val msg = RspSystemMsgNew() try {
msg.mergeFrom(respBuffer.slice(4)) val msg = RspSystemMsgNew()
return msg.groupmsgs.get() msg.mergeFrom(respBuffer.slice(4))
return msg.groupmsgs.get().orEmpty()
} catch (err: Throwable) {
requestGroupSystemMsgNew(msgNum, reqMsgType, latestFriendSeq, latestGroupSeq, retryCnt - 1)
}
} }
} }

View File

@ -2,7 +2,6 @@ package moe.fuqiuluo.shamrock.remote.action.handlers
import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.GroupSvc 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.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.action.IActionHandler
import moe.fuqiuluo.shamrock.remote.service.data.GroupRequest import moe.fuqiuluo.shamrock.remote.service.data.GroupRequest
@ -16,11 +15,12 @@ internal object GetGroupSystemMsg: IActionHandler() {
suspend operator fun invoke(echo: JsonElement = EmptyJsonString): String { suspend operator fun invoke(echo: JsonElement = EmptyJsonString): String {
val list = GroupSvc.requestGroupSystemMsgNew(20) val list = GroupSvc.requestGroupSystemMsgNew(20)
val riskList = GroupSvc.requestGroupSystemMsgNew(20, 2)
val msgs = GroupSystemMessage( val msgs = GroupSystemMessage(
invited = mutableListOf(), invited = mutableListOf(),
join = mutableListOf() join = mutableListOf()
) )
list?.forEach { (list + riskList).forEach {
when(it.msg.group_msg_type.get()) { when(it.msg.group_msg_type.get()) {
22, 1 -> { 22, 1 -> {
// join 进群消息 // join 进群消息
@ -42,8 +42,8 @@ internal object GetGroupSystemMsg: IActionHandler() {
// invite 别人邀请我 // invite 别人邀请我
msgs.invited += GroupRequest ( msgs.invited += GroupRequest (
msgSeq = it.msg_seq.get(), msgSeq = it.msg_seq.get(),
invitorUin = null, invitorUin = it.msg.action_uin.get(),
invitorNick = null, invitorNick = it.msg.action_uin_nick.get(),
groupId = it.msg.group_code.get(), groupId = it.msg.group_code.get(),
groupName = it.msg.group_name.get(), groupName = it.msg.group_name.get(),
checked = it.msg.msg_decided.get().isNotBlank(), checked = it.msg.msg_decided.get().isNotBlank(),

View File

@ -1,8 +1,9 @@
package moe.fuqiuluo.shamrock.remote.action.handlers package moe.fuqiuluo.shamrock.remote.action.handlers
import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.FriendSvc
import moe.fuqiuluo.qqinterface.servlet.GroupSvc 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.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.action.IActionHandler
import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.tools.EmptyJsonString
@ -12,7 +13,7 @@ internal object SetGroupAddRequest: IActionHandler() {
val flag = session.getString("flag") val flag = session.getString("flag")
val approve = session.getBoolean("approve") val approve = session.getBoolean("approve")
val remark = session.getStringOrNull("reason") val remark = session.getStringOrNull("reason")
val notSeen = session.getBoolean("notSeen") val notSeen = session.getBoolean("not_seen")
val subType = session.getString("sub_type") val subType = session.getString("sub_type")
return invoke(flag, approve, subType, remark, notSeen, session.echo) 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 { suspend operator fun invoke(flag: String, approve: Boolean? = true, subType: String, remark: String? = "", notSeen: Boolean? = false, echo: JsonElement = EmptyJsonString): String {
val flags = flag.split(";") val flags = flag.split(";")
var ts = flags[0].toLong() var ts = flags[0].toLong()
if (ts.toString().length < 13) { try {
// time but not seq, query seq again if (ts.toString().length < 13) {
val reqs = GroupSvc.requestGroupSystemMsgNew(20) // time but not seq, query seq again
val req = reqs?.first { var reqs = GroupSvc.requestGroupSystemMsgNew(20, 1)
it.msg_time.get() == ts 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 groupCode = flags[1].toLong()
val uin = flags[2].toLong() val uin = flags[2].toLong()
@ -35,7 +43,7 @@ internal object SetGroupAddRequest: IActionHandler() {
if (result.isSuccess) { if (result.isSuccess) {
ok(result.getOrNull(), echo) ok(result.getOrNull(), echo)
} else { } else {
logic(result.getOrNull() ?: "", echo) logic(result.exceptionOrNull()?.message ?: "", echo)
} }
} catch (err: Throwable) { } catch (err: Throwable) {
err.printStackTrace() err.printStackTrace()

View File

@ -402,14 +402,16 @@ internal object PrimitiveListener {
LogCenter.log("入群申请($groupCode) $applier: \"$reason\"") LogCenter.log("入群申请($groupCode) $applier: \"$reason\"")
val flag = try { val flag = try {
val reqs = requestGroupSystemMsgNew(10, 0, 0) var reqs = requestGroupSystemMsgNew(10, 1)
val req = reqs?.first { val riskReqs = requestGroupSystemMsgNew(10, 2)
reqs = reqs + riskReqs
val req = reqs.first {
it.msg_time.get() == time it.msg_time.get() == time
} }
val seq = req?.msg_seq?.get() val seq = req.msg_seq?.get()
"$seq;$groupCode;$applierUid" "$seq;$groupCode;$applier"
} catch (err: Throwable) { } catch (err: Throwable) {
"$time;$groupCode;$applierUid" "$time;$groupCode;$applier"
} }
if(!GlobalEventTransmitter.RequestTransmitter if(!GlobalEventTransmitter.RequestTransmitter
.transGroupApply(time, applier, reason, groupCode, flag, RequestSubType.Add)) { .transGroupApply(time, applier, reason, groupCode, flag, RequestSubType.Add)) {
@ -426,11 +428,13 @@ internal object PrimitiveListener {
} }
LogCenter.log("邀请入群申请($groupCode): $applier") LogCenter.log("邀请入群申请($groupCode): $applier")
val flag = try { val flag = try {
val reqs = requestGroupSystemMsgNew(10, 0, 0) var reqs = requestGroupSystemMsgNew(10, 1)
val req = reqs?.first { val riskReqs = requestGroupSystemMsgNew(10, 2)
reqs = reqs + riskReqs
val req = reqs.first {
it.msg_time.get() == time it.msg_time.get() == time
} }
val seq = req?.msg_seq?.get() val seq = req.msg_seq?.get()
"$seq;$groupCode;$applier" "$seq;$groupCode;$applier"
} catch (err: Throwable) { } catch (err: Throwable) {
"$time;$groupCode;$applierUid" "$time;$groupCode;$applierUid"
@ -449,11 +453,13 @@ internal object PrimitiveListener {
val uin = pb[1, 1, 5].asLong val uin = pb[1, 1, 5].asLong
LogCenter.log("邀请入群$groupCode 邀请者: \"$invitor\"") LogCenter.log("邀请入群$groupCode 邀请者: \"$invitor\"")
val flag = try { val flag = try {
val reqs = requestGroupSystemMsgNew(10, 0, 0) var reqs = requestGroupSystemMsgNew(10, 1)
val req = reqs?.first { val riskReqs = requestGroupSystemMsgNew(10, 2)
reqs = reqs + riskReqs
val req = reqs.first {
it.msg_time.get() == time it.msg_time.get() == time
} }
val seq = req?.msg_seq?.get() val seq = req.msg_seq?.get()
"$seq;$groupCode;$uin" "$seq;$groupCode;$uin"
} catch (err: Throwable) { } catch (err: Throwable) {
"$time;$groupCode;$uin" "$time;$groupCode;$uin"