Shamrock/xposed/src/main/java/moe/fuqiuluo/remote/action/handlers/GetTroopList.kt

84 lines
3.1 KiB
Kotlin
Raw Normal View History

2023-08-11 16:45:28 +02:00
@file:OptIn(DelicateCoroutinesApi::class)
2023-08-26 15:12:33 +02:00
package moe.fuqiuluo.remote.action.handlers
2023-08-11 16:45:28 +02:00
import com.tencent.common.app.AppInterface
2023-08-12 09:25:10 +02:00
import com.tencent.mobileqq.data.troop.TroopInfo
2023-08-11 16:45:28 +02:00
import com.tencent.mobileqq.troop.api.ITroopInfoService
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
2023-08-26 15:12:33 +02:00
import moe.fuqiuluo.remote.action.ActionSession
import moe.fuqiuluo.remote.action.IActionHandler
2023-08-24 07:22:15 +02:00
import com.tencent.mobileqq.data.SimpleTroopInfo
2023-08-24 11:03:57 +02:00
import com.tencent.qqnt.protocol.GroupSvc
2023-08-11 16:45:28 +02:00
import mqq.app.MobileQQ
import kotlin.coroutines.resume
internal object GetTroopList: IActionHandler() {
override suspend fun handle(session: ActionSession): String {
val runtime = MobileQQ.getMobileQQ().waitAppRuntime()
if (runtime !is AppInterface)
return logic("AppRuntime cannot cast to AppInterface")
2023-08-12 09:25:10 +02:00
val refresh = session.getBooleanOrDefault("refresh", false)
2023-08-11 16:45:28 +02:00
val service = runtime
.getRuntimeService(ITroopInfoService::class.java, "all")
var troopList = service.allTroopList
2023-08-12 09:25:10 +02:00
if(refresh || !service.isTroopCacheInited || troopList == null) {
if(!requestGroupList(service, troopList)) {
2023-08-11 16:45:28 +02:00
return logic("Unable to obtain group list")
} else {
troopList = service.allTroopList
}
}
return ok(arrayListOf<SimpleTroopInfo>().apply {
troopList?.forEach { groupInfo ->
add(SimpleTroopInfo(
groupId = groupInfo.troopuin,
groupUin = groupInfo.troopcode,
groupName = groupInfo.troopname ?: groupInfo.newTroopName ?: groupInfo.oldTroopName,
groupRemark = groupInfo.troopRemark,
adminList = GroupSvc.getAdminList(groupInfo.troopuin, true),
2023-08-11 16:45:28 +02:00
classText = groupInfo.mGroupClassExtText,
isFrozen = groupInfo.mIsFreezed != 0,
maxMember = groupInfo.wMemberMax,
memNum = groupInfo.wMemberNum
))
}
})
}
2023-08-12 09:25:10 +02:00
private suspend fun requestGroupList(
service: ITroopInfoService,
troopList: List<TroopInfo>?
): Boolean {
//if (!troopList.isNullOrEmpty()) {
// // 删除缓存 重新获取
// service.deleteTroopList(troopList.map { it.troopuin })
//}
2023-08-24 11:03:57 +02:00
GroupSvc.refreshTroopList()
2023-08-12 09:25:10 +02:00
2023-08-11 16:45:28 +02:00
return suspendCancellableCoroutine { continuation ->
val waiter = GlobalScope.launch {
2023-08-11 18:51:27 +02:00
do {
delay(1000)
2023-08-12 09:25:10 +02:00
} while (
!service.isTroopCacheInited
// || (!troopList.isNullOrEmpty() && service.hasNoTroop()) 判断不合理
)
2023-08-11 16:45:28 +02:00
continuation.resume(true)
}
continuation.invokeOnCancellation {
waiter.cancel()
continuation.resume(false)
}
}
}
override fun path(): String = "get_group_list"
}