fix: GagInfoDisclosure: fix bug and optimize

This commit is contained in:
hd
2024-07-01 20:02:53 +08:00
parent e93e484b4e
commit 4118400779

View File

@@ -28,21 +28,18 @@ import io.github.qauxv.base.annotation.FunctionHookEntry
import io.github.qauxv.base.annotation.UiItemAgentEntry
import io.github.qauxv.bridge.AppRuntimeHelper
import io.github.qauxv.bridge.ContactUtils
import io.github.qauxv.bridge.GreyTipBuilder
import io.github.qauxv.bridge.QQMessageFacade
import io.github.qauxv.bridge.kernelcompat.ContactCompat
import io.github.qauxv.bridge.ntapi.ChatTypeConstants
import io.github.qauxv.bridge.ntapi.NtGrayTipHelper
import io.github.qauxv.bridge.ntapi.RelationNTUinAndUidApi
import io.github.qauxv.dsl.FunctionEntryRouter
import io.github.qauxv.hook.CommonSwitchFunctionHook
import io.github.qauxv.util.Initiator
import io.github.qauxv.util.Log
import io.github.qauxv.util.QQVersion
import io.github.qauxv.util.SyncUtils
import io.github.qauxv.util.dexkit.CMessageRecordFactory
import io.github.qauxv.util.dexkit.NContactUtils_getBuddyName
import io.github.qauxv.util.dexkit.NContactUtils_getDiscussionMemberShowName
import io.github.qauxv.util.requireMinQQVersion
import xyz.nextalone.util.get
@FunctionHookEntry
@UiItemAgentEntry
@@ -52,13 +49,13 @@ object GagInfoDisclosure : CommonSwitchFunctionHook(
targets = arrayOf(
CMessageRecordFactory,
NContactUtils_getDiscussionMemberShowName,
NContactUtils_getBuddyName,
)
) {
override val name = "显示设置禁言的管理"
override val description = "总是显示哪个管理员设置了禁言"
override val uiItemLocation = FunctionEntryRouter.Locations.Auxiliary.CHAT_CATEGORY
override val isAvailable = QAppUtils.isQQnt()
private fun getSecStr(sec: Long): String {
val (min, hour, day) = Triple("", "", "")
@@ -72,183 +69,62 @@ object GagInfoDisclosure : CommonSwitchFunctionHook(
return ret.toString()
}
private fun addTroopGrayTipMsg(troopUin: String, jsonStr: String) {
NtGrayTipHelper.addLocalJsonGrayTipMsg(
AppRuntimeHelper.getAppRuntime()!!,
ContactCompat(ChatTypeConstants.GROUP, troopUin, ""),
NtGrayTipHelper.createLocalJsonElement(NtGrayTipHelper.AIO_AV_GROUP_NOTICE.toLong(), jsonStr, ""),
true,
true
) { result, uin ->
if (result != 0) {
Log.e("GagInfoDisclosure error: addLocalJsonGrayTipMsg failed, result=$result, uin=$uin")
}
}
private fun NtGrayTipHelper.NtGrayTipJsonBuilder.appendUserItem(uin: String, name: String) {
val uid = RelationNTUinAndUidApi.getUidFromUin(uin).takeIf { it.isNullOrEmpty() } ?: "u_0000000000000000000000"
this.append(NtGrayTipHelper.NtGrayTipJsonBuilder.UserItem(uin, uid, name))
}
override fun initOnce(): Boolean {
val clzGagMgr = Initiator._TroopGagMgr()
if (requireMinQQVersion(QQVersion.QQ_9_0_25)) {
val method = clzGagMgr.declaredMethods.single { method ->
val params = method.parameterTypes; params.size == 5
&& params[0] == Int::class.java
&& params[1] == Long::class.java
&& params[2] == Long::class.java
&& params[3] == Long::class.java
&& params[4] == ArrayList::class.java
&& method.returnType == Void.TYPE
}
hookBeforeIfEnabled(method) { param ->
val selfUin = AppRuntimeHelper.getAccount()
val troopUin = param.args[1] as Long
val opUin = param.args[2] as Long
val opName = ContactUtils.getDiscussionMemberShowName(AppRuntimeHelper.getAppRuntime()!!, troopUin.toString(), opUin.toString())
val builder = NtGrayTipHelper.NtGrayTipJsonBuilder()
builder.appendText("操作者: ")
if (opUin.toString() == selfUin) {
builder.appendText("")
} else {
builder.appendText("$opName[$opUin]")
val method = clzGagMgr.declaredMethods.single { method ->
val params = method.parameterTypes; params.size == 5
&& params[0] == Int::class.java
&& params[1] == Long::class.java
&& params[2] == Long::class.java
&& params[3] == Long::class.java
&& params[4] == ArrayList::class.java
&& method.returnType == Void.TYPE
}
hookBeforeIfEnabled(method) { param ->
val selfUin = AppRuntimeHelper.getAccount()
val troopUin = param.args[1].toString()
val opUin = param.args[2].toString()
val opName = ContactUtils.getDiscussionMemberShowName(AppRuntimeHelper.getAppRuntime()!!, troopUin, opUin)
val pushParams = param.args[4] as ArrayList<*>
val victimUin = pushParams[0].get("uin") as String
val victimName = ContactUtils.getDiscussionMemberShowName(AppRuntimeHelper.getAppRuntime()!!, troopUin, victimUin)
val victimTime = pushParams[0].get("gagLength") as Long
val builder = NtGrayTipHelper.NtGrayTipJsonBuilder()
when (victimUin) {
"0" -> {
if (opUin == selfUin) builder.appendUserItem(selfUin, "") else builder.appendUserItem(opUin, "$opName")
builder.appendText(if (victimTime == 0L) " 关闭了全员禁言 " else " 开启了全员禁言 ")
}
addTroopGrayTipMsg(troopUin.toString(), builder.build().toString())
}
} else {
val method1 = clzGagMgr.declaredMethods.single { method ->
val params = method.parameterTypes; params.size == 7
&& params[0] == String::class.java
&& params[1] == Long::class.java
&& params[2] == Long::class.java
&& params[3] == Int::class.java
&& params[4] == String::class.java
&& params[4] == String::class.java
&& params[4] == Boolean::class.java
&& method.returnType == Void.TYPE
}
hookBeforeIfEnabled(method1) { param ->
val selfUin = AppRuntimeHelper.getAccount()
val troopUin = param.args[0] as String
val time = param.args[1] as Long
val interval = param.args[2] as Long
val msgSeq = param.args[3] as Int
val opUin = param.args[4] as String
val victimUin = param.args[5] as String
val victimName = ContactUtils.getTroopMemberNick(troopUin, victimUin)
val opName = ContactUtils.getTroopMemberNick(troopUin, opUin)
if (!QAppUtils.isQQnt()) {
val builder = GreyTipBuilder.create(GreyTipBuilder.MSG_TYPE_TROOP_GAP_GRAY_TIPS)
if (victimUin == selfUin) {
builder.append("")
} else {
builder.appendTroopMember(victimUin, victimName)
}
builder.append("")
if (opUin == selfUin) {
builder.append("")
} else {
builder.appendTroopMember(opUin, opName)
}
if (interval == 0L) {
builder.append(" 解除禁言 ")
} else {
builder.append(" 禁言${getSecStr(interval)} ")
}
val msg = builder.build(troopUin, 1, opUin, time, msgSeq.toLong())
val list = ArrayList<Any>() + msg
QQMessageFacade.commitMessageRecordList(list)
} else {
val builder = NtGrayTipHelper.NtGrayTipJsonBuilder()
if (victimUin == selfUin) {
builder.appendText("")
} else {
builder.appendText("$victimName[$victimUin]")
}
selfUin -> {
builder.appendUserItem(selfUin, "")
builder.appendText("")
if (opUin == selfUin) {
builder.appendText("")
} else {
builder.appendText("$opName[$opUin]")
}
if (interval == 0L) {
builder.appendText(" 解除禁言 ")
} else {
builder.appendText(" 禁言${getSecStr(interval)} ")
}
addTroopGrayTipMsg(troopUin, builder.build().toString())
builder.appendUserItem(opUin, "$opName")
builder.appendText(if (victimTime == 0L) "解除禁言" else "禁言${getSecStr(victimTime)}")
}
param.setResult(null)
}
val method2 = clzGagMgr.declaredMethods.single { method ->
val params = method.parameterTypes; params.size == 7
&& params[0] == String::class.java
&& params[1] == String::class.java
&& params[2] == Long::class.java
&& params[3] == Long::class.java
&& params[4] == Int::class.java
&& params[4] == Boolean::class.java
&& params[4] == Boolean::class.java
&& method.returnType == Void.TYPE
}
hookBeforeIfEnabled(method2) { param ->
val selfUin = AppRuntimeHelper.getAccount()
val troopUin = param.args[0] as String
val opUin = param.args[1] as String
val time = param.args[2] as Long
val interval = param.args[3] as Long
val msgSeq = param.args[4] as Int
val gagTroop = param.args[5] as Boolean
val opName = ContactUtils.getTroopMemberNick(troopUin, opUin)
if (!QAppUtils.isQQnt()) {
val builder = GreyTipBuilder.create(GreyTipBuilder.MSG_TYPE_TROOP_GAP_GRAY_TIPS)
if (gagTroop) {
if (opUin == selfUin) {
builder.append("")
} else {
builder.appendTroopMember(opUin, opName)
}
if (interval == 0L) {
builder.append(" 关闭了全员禁言 ")
} else {
builder.append(" 开启了全员禁言 ")
}
} else {
builder.append("")
builder.append("")
builder.appendTroopMember(opUin, opName)
if (interval == 0L) {
builder.append(" 解除禁言 ")
} else {
builder.append(" 禁言${getSecStr(interval)} ")
}
}
val msg = builder.build(troopUin, 1, opUin, time, msgSeq.toLong())
val list = ArrayList<Any>() + msg
QQMessageFacade.commitMessageRecordList(list)
} else {
val builder = NtGrayTipHelper.NtGrayTipJsonBuilder()
if (gagTroop) {
if (opUin == selfUin) {
builder.appendText("")
} else {
builder.appendText("$opName[$opUin]")
}
if (interval == 0L) {
builder.appendText(" 关闭了全员禁言 ")
} else {
builder.appendText(" 开启了全员禁言 ")
}
} else {
builder.appendText("")
builder.appendText("")
builder.appendText("$opName[$opUin]")
if (interval == 0L) {
builder.appendText(" 解除禁言 ")
} else {
builder.appendText(" 禁言${getSecStr(interval)} ")
}
}
addTroopGrayTipMsg(troopUin, builder.build().toString())
else -> {
builder.appendUserItem(victimUin, "$victimName")
builder.appendText("")
if (opUin == selfUin) builder.appendUserItem(selfUin, "") else builder.appendUserItem(opUin, "$opName")
builder.appendText(if (victimTime == 0L) "解除禁言" else "禁言${getSecStr(victimTime)}")
}
}
NtGrayTipHelper.addLocalJsonGrayTipMsg(
AppRuntimeHelper.getAppRuntime()!!,
ContactCompat(ChatTypeConstants.GROUP, troopUin, ""),
NtGrayTipHelper.createLocalJsonElement(NtGrayTipHelper.AIO_AV_GROUP_NOTICE.toLong(), builder.build().toString(), ""),
true,
true
) { result, uin ->
if (result != 0) {
Log.e("GagInfoDisclosure error: addLocalJsonGrayTipMsg failed, result=$result, uin=$uin")
}
param.setResult(null)
}
}
return true