diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidAppInfo.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidAppInfo.kt new file mode 100644 index 00000000..959b2036 --- /dev/null +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidAppInfo.kt @@ -0,0 +1,114 @@ +package org.ntqqrev.acidify.common.android + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import org.ntqqrev.acidify.common.AppInfo + +@Serializable +class AndroidAppInfo( + @SerialName("Os") val os: String, + @SerialName("Kernel") val kernel: String = "", + @SerialName("VendorOs") val vendorOs: String, + @SerialName("Qua") val qua: String, + @SerialName("CurrentVersion") val currentVersion: String, + @SerialName("PtVersion") val ptVersion: String, + @SerialName("SsoVersion") val ssoVersion: Int, + @SerialName("PackageName") val packageName: String, + @SerialName("ApkSignatureMd5") val apkSignatureMd5: ByteArray, + @SerialName("SdkInfo") val sdkInfo: WtLoginSdkInfo, + @SerialName("AppId") val appId: Int, + @SerialName("SubAppId") val subAppId: Int, + @SerialName("AppClientVersion") val appClientVersion: Int, +) { + @Serializable + class WtLoginSdkInfo( + @SerialName("SdkBuildTime") val sdkBuildTime: Long, + @SerialName("SdkVersion") val sdkVersion: String, + @SerialName("MiscBitMap") val miscBitMap: Long, + @SerialName("SubSigMap") val subSigMap: Long, + @SerialName("MainSigMap") val mainSigMap: Long, + ) + + object Bundled { + val AndroidPhone = AndroidAppInfo( + os = "Android", + vendorOs = "android", + qua = "V1_AND_SQ_9.1.60_11520_YYB_D", + currentVersion = "9.1.60.045f5d19", + ptVersion = "9.1.60", + ssoVersion = 22, + packageName = "com.tencent.mobileqq", + apkSignatureMd5 = "a6b745bf24a2c277527716f6f36eb68d".hexToByteArray(), + sdkInfo = WtLoginSdkInfo( + sdkBuildTime = 1740483688, + sdkVersion = "6.0.0.2568", + miscBitMap = 150470524, + subSigMap = 66560, + mainSigMap = Sig.WLOGIN_A5 or Sig.WLOGIN_RESERVED or Sig.WLOGIN_STWEB or Sig.WLOGIN_A2 or Sig.WLOGIN_ST + or Sig.WLOGIN_LSKEY or Sig.WLOGIN_SKEY or Sig.WLOGIN_SIG64 or Sig.WLOGIN_VKEY or Sig.WLOGIN_D2 + or Sig.WLOGIN_SID or Sig.WLOGIN_PSKEY or Sig.WLOGIN_AQSIG or Sig.WLOGIN_LHSIG or Sig.WLOGIN_PAYTOKEN + or 65536L + ), + appId = 16, + subAppId = 537275636, + appClientVersion = 0 + ) + + val AndroidPad = AndroidAppInfo( + os = "ANDROID", + vendorOs = "android", + qua = "V1_AND_SQ_9.2.20_11650_YYB_D", + currentVersion = "9.2.20.777b5929", + ptVersion = "9.2.20", + ssoVersion = 22, + packageName = "com.tencent.mobileqq", + apkSignatureMd5 = "a6b745bf24a2c277527716f6f36eb68d".hexToByteArray(), + sdkInfo = WtLoginSdkInfo( + sdkBuildTime = 1757058014, + sdkVersion = "6.0.0.2589", + miscBitMap = 150470524, + subSigMap = 66560, + mainSigMap = Sig.WLOGIN_A5 or Sig.WLOGIN_RESERVED or Sig.WLOGIN_STWEB or Sig.WLOGIN_A2 or Sig.WLOGIN_ST + or Sig.WLOGIN_LSKEY or Sig.WLOGIN_SKEY or Sig.WLOGIN_SIG64 or Sig.WLOGIN_VKEY or Sig.WLOGIN_D2 + or Sig.WLOGIN_SID or Sig.WLOGIN_PSKEY or Sig.WLOGIN_AQSIG or Sig.WLOGIN_LHSIG or Sig.WLOGIN_PAYTOKEN + or 65536L + ), + appId = 16, + subAppId = 537315825, + appClientVersion = 0 + ) + } + + object Sig { + const val WLOGIN_A5: Long = 1 shl 1 + const val WLOGIN_RESERVED: Long = 1 shl 4 + const val WLOGIN_STWEB: Long = 1 shl 5 + const val WLOGIN_A2: Long = 1 shl 6 + const val WLOGIN_ST: Long = 1 shl 7 + const val WLOGIN_LSKEY: Long = 1 shl 9 + const val WLOGIN_SKEY: Long = 1 shl 12 + const val WLOGIN_SIG64: Long = 1 shl 13 + const val WLOGIN_OPENKEY: Long = 1 shl 14 + const val WLOGIN_TOKEN: Long = 1 shl 15 + const val WLOGIN_VKEY: Long = 1 shl 17 + const val WLOGIN_D2: Long = 1 shl 18 + const val WLOGIN_SID: Long = 1 shl 19 + const val WLOGIN_PSKEY: Long = 1 shl 20 + const val WLOGIN_AQSIG: Long = 1 shl 21 + const val WLOGIN_LHSIG: Long = 1 shl 22 + const val WLOGIN_PAYTOKEN: Long = 1 shl 23 + const val WLOGIN_PF: Long = 1 shl 24 + const val WLOGIN_DA2: Long = 1 shl 25 + const val WLOGIN_QRPUSH: Long = 1 shl 26 + const val WLOGIN_PT4Token: Long = 1 shl 27 + } + + companion object { + private val jsonModule = Json { ignoreUnknownKeys = true } + + fun fromJson(json: String): AppInfo = jsonModule.decodeFromString(json) + } + + fun toJson() = jsonModule.encodeToString(this) +} \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidSessionStore.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidSessionStore.kt new file mode 100644 index 00000000..eec1ad34 --- /dev/null +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidSessionStore.kt @@ -0,0 +1,102 @@ +package org.ntqqrev.acidify.common.android + +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import kotlin.random.Random + +@Serializable +class AndroidSessionStore( + var uin: Long, + var uid: String, + var state: State, + var wloginSigs: WLoginSigs, + var guid: ByteArray, + var androidId: String, + var qimei: String, + var deviceName: String, +) { + @Serializable + class WLoginSigs( + var a2: ByteArray, + var a2Key: ByteArray, + var d2: ByteArray, + var d2Key: ByteArray, + var a1: ByteArray, + var a1Key: ByteArray, + var noPicSig: ByteArray, + var tgtgtKey: ByteArray, + var ksid: ByteArray, + var superKey: ByteArray, + var stKey: ByteArray, + var stWeb: ByteArray, + var st: ByteArray, + var wtSessionTicket: ByteArray, + var wtSessionTicketKey: ByteArray, + var randomKey: ByteArray, + var sKey: ByteArray, + var psKey: Map, + ) { + fun clear() { + a2 = ByteArray(0) + d2 = ByteArray(0) + d2Key = ByteArray(16) + a1 = ByteArray(0) + tgtgtKey = ByteArray(0) + randomKey = ByteArray(16) + } + } + + @Serializable + class State( + var tlv104: ByteArray? = null, + var tlv547: ByteArray? = null, + var tlv174: ByteArray? = null, + var keyExchangeSession: KeyExchangeSession? = null, + var cookie: String? = null, + var qrSig: ByteArray? = null, + ) { + @Serializable + class KeyExchangeSession( + var sessionTicket: ByteArray, + var sessionKey: ByteArray, + ) + } + + companion object { + fun empty(): AndroidSessionStore { + return AndroidSessionStore( + uin = 0, + uid = "", + state = State(), + wloginSigs = WLoginSigs( + a2 = ByteArray(0), + a2Key = ByteArray(16), + d2 = ByteArray(0), + d2Key = ByteArray(16), + a1 = ByteArray(0), + a1Key = ByteArray(16), + noPicSig = ByteArray(0), + tgtgtKey = ByteArray(0), + ksid = ByteArray(0), + superKey = ByteArray(0), + stKey = ByteArray(0), + stWeb = ByteArray(0), + st = ByteArray(0), + wtSessionTicket = ByteArray(0), + wtSessionTicketKey = ByteArray(0), + randomKey = ByteArray(16), + sKey = ByteArray(0), + psKey = emptyMap(), + ), + guid = Random.nextBytes(16), + androidId = Random.nextBytes(8).toHexString(), + qimei = "", + deviceName = "Lagrange-${Random.nextBytes(3).toHexString()}", + ) + } + + fun fromJson(json: String): AndroidSessionStore = Json.decodeFromString(json) + } + + fun toJson() = Json.encodeToString(this) +} \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidSignProvider.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidSignProvider.kt new file mode 100644 index 00000000..458aa489 --- /dev/null +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidSignProvider.kt @@ -0,0 +1,18 @@ +package org.ntqqrev.acidify.common.android + +import org.ntqqrev.acidify.common.SignResult + +/** + * Android 签名提供者接口,实现 [sign] 方法以提供签名功能 + */ +fun interface AndroidSignProvider { + suspend fun sign( + uin: Long, + cmd: String, + buffer: ByteArray, + guid: String, + seq: Int, + version: String, + qua: String, + ): SignResult +} \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidUrlSignProvider.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidUrlSignProvider.kt new file mode 100644 index 00000000..3f20c2cd --- /dev/null +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/common/android/AndroidUrlSignProvider.kt @@ -0,0 +1,83 @@ +package org.ntqqrev.acidify.common.android + +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.engine.* +import io.ktor.client.plugins.contentnegotiation.* +import io.ktor.client.request.* +import io.ktor.http.* +import io.ktor.serialization.kotlinx.json.* +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import org.ntqqrev.acidify.common.SignResult + +/** + * 通过 HTTP 接口进行签名的 [AndroidSignProvider] 实现 + * @param url 签名服务的 URL 地址 + * @param httpProxy 可选的 HTTP 代理地址,例如 `http://127.0.0.1:7890` + */ +class AndroidUrlSignProvider(val url: String, val httpProxy: String? = null) : AndroidSignProvider { + private val client = HttpClient { + install(ContentNegotiation) { + json(Json { ignoreUnknownKeys = true }) + } + engine { + if (!httpProxy.isNullOrEmpty()) { + proxy = ProxyBuilder.http(httpProxy) + } + } + } + + override suspend fun sign( + uin: Long, + cmd: String, + buffer: ByteArray, + guid: String, + seq: Int, + version: String, + qua: String + ): SignResult { + val data = client.post(url) { + contentType(ContentType.Application.Json) + setBody( + AndroidUrlSignRequest( + uin = uin, + cmd = cmd, + buffer = buffer.toHexString(), + guid = guid, + seq = seq, + version = version, + qua = qua, + ) + ) + }.body().data + return SignResult( + sign = data.sign.hexToByteArray(), + token = data.token.hexToByteArray(), + extra = data.extra.hexToByteArray(), + ) + } +} + +@Serializable +private data class AndroidUrlSignRequest( + val uin: Long, + val cmd: String, + val buffer: String, + val guid: String, + val seq: Int, + val version: String, + val qua: String +) + +@Serializable +private data class AndroidUrlSignResponse( + val data: AndroidUrlSignValue +) + +@Serializable +private data class AndroidUrlSignValue( + val sign: String, + val token: String, + val extra: String +) \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/Contract.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/Contract.kt new file mode 100644 index 00000000..cd53b1de --- /dev/null +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/Contract.kt @@ -0,0 +1,30 @@ +package org.ntqqrev.acidify.internal + +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract + +/** + * Marks a service or operation as only supported for [LagrangeClient]. + */ +@OptIn(ExperimentalContracts::class) +internal fun IClient.ensureIsLagrange() { + contract { + returns() implies (this@ensureIsLagrange is LagrangeClient) + } + if (this !is LagrangeClient) { + throw IllegalStateException("This operation is only supported for LagrangeClient") + } +} + +/** + * Marks a service or operation as only supported for [KuromeClient]. + */ +@OptIn(ExperimentalContracts::class) +internal fun IClient.ensureIsKurome() { + contract { + returns() implies (this@ensureIsKurome is KuromeClient) + } + if (this !is KuromeClient) { + throw IllegalStateException("This operation is only supported for KuromeClient") + } +} \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/IClient.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/IClient.kt new file mode 100644 index 00000000..66415da9 --- /dev/null +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/IClient.kt @@ -0,0 +1,18 @@ +package org.ntqqrev.acidify.internal + +import kotlinx.coroutines.CoroutineScope +import org.ntqqrev.acidify.internal.service.Service +import org.ntqqrev.acidify.logging.Logger + +internal sealed interface IClient : CoroutineScope { + val os: String + val uin: Long + val uid: String + + fun createLogger(forObject: Any): Logger + suspend fun doPostOnlineLogic() + suspend fun doPreOfflineLogic() + suspend fun callService(service: Service, payload: T, timeout: Long = 10_000L): R + suspend fun callService(service: Service, timeout: Long = 10_000L): R = + callService(service, Unit, timeout) +} \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/KuromeClient.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/KuromeClient.kt new file mode 100644 index 00000000..ed74af54 --- /dev/null +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/KuromeClient.kt @@ -0,0 +1,43 @@ +package org.ntqqrev.acidify.internal + +import kotlinx.coroutines.CoroutineScope +import org.ntqqrev.acidify.common.android.AndroidAppInfo +import org.ntqqrev.acidify.common.android.AndroidSessionStore +import org.ntqqrev.acidify.common.android.AndroidSignProvider +import org.ntqqrev.acidify.internal.service.Service +import org.ntqqrev.acidify.logging.Logger + +internal class KuromeClient( + val appInfo: AndroidAppInfo, + val sessionStore: AndroidSessionStore, + val signProvider: AndroidSignProvider, + val loggerFactory: (Any) -> Logger, + scope: CoroutineScope, +) : IClient, CoroutineScope by scope { + override val os: String + get() = "Android" + + override val uin: Long + get() = sessionStore.uin + + override val uid: String + get() = sessionStore.uid + + override fun createLogger(forObject: Any): Logger = loggerFactory(forObject) + + override suspend fun doPostOnlineLogic() { + TODO("Not yet implemented") + } + + override suspend fun doPreOfflineLogic() { + TODO("Not yet implemented") + } + + override suspend fun callService( + service: Service, + payload: T, + timeout: Long + ): R { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/LagrangeClient.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/LagrangeClient.kt index 78346702..24f32408 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/LagrangeClient.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/LagrangeClient.kt @@ -19,15 +19,23 @@ internal class LagrangeClient( val appInfo: AppInfo, val sessionStore: SessionStore, val signProvider: SignProvider, - val createLogger: (Any) -> Logger, + val loggerFactory: (Any) -> Logger, scope: CoroutineScope, -) : CoroutineScope by scope { +) : IClient, CoroutineScope by scope { + override val os: String + get() = appInfo.os + + override val uin: Long + get() = sessionStore.uin + + override val uid: String + get() = sessionStore.uid + val loginContext = LoginContext(this) val packetContext = PacketContext(this) val ticketContext = TicketContext(this) val highwayContext = HighwayContext(this) val pushChannel = Channel(capacity = 15, onBufferOverflow = BufferOverflow.DROP_OLDEST) - val sendPacketDefaultTimeout = 10_000L val contextCollection = listOf( loginContext, packetContext, @@ -35,19 +43,21 @@ internal class LagrangeClient( highwayContext, ) - suspend fun doPostOnlineLogic() { + override fun createLogger(forObject: Any): Logger = loggerFactory(forObject) + + override suspend fun doPostOnlineLogic() { contextCollection.forEach { it.postOnline() } } - suspend fun doPreOfflineLogic() { + override suspend fun doPreOfflineLogic() { contextCollection.forEach { it.preOffline() } } - suspend fun callService(service: Service, payload: T, timeout: Long = sendPacketDefaultTimeout): R { + override suspend fun callService(service: Service, payload: T, timeout: Long): R { val byteArray = service.build(this, payload) val resp = packetContext.sendPacket(service.cmd, byteArray, timeout) if (resp.retCode != 0) { @@ -59,8 +69,4 @@ internal class LagrangeClient( } return service.parse(this, resp.response) } - - suspend fun callService(service: Service, timeout: Long = sendPacketDefaultTimeout): R { - return callService(service, Unit, timeout) - } } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/AbstractContext.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/AbstractContext.kt index ac26f371..674d1bd3 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/AbstractContext.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/AbstractContext.kt @@ -1,10 +1,8 @@ package org.ntqqrev.acidify.internal.context -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient -internal abstract class AbstractContext( - internal val client: LagrangeClient -) { +internal abstract class AbstractContext(internal open val client: IClient) { open suspend fun postOnline() {} open suspend fun preOffline() {} } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/HighwayContext.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/HighwayContext.kt index 38cc83a0..f76fe415 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/HighwayContext.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/HighwayContext.kt @@ -6,7 +6,7 @@ import io.ktor.client.statement.* import io.ktor.http.* import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.withTimeout -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.media.* import org.ntqqrev.acidify.internal.protobuf.PbObject import org.ntqqrev.acidify.internal.protobuf.invoke @@ -15,7 +15,7 @@ import org.ntqqrev.acidify.internal.util.md5 import org.ntqqrev.acidify.internal.util.toIpString import org.ntqqrev.acidify.message.MessageScene -internal class HighwayContext(client: LagrangeClient) : AbstractContext(client) { +internal class HighwayContext(client: IClient) : AbstractContext(client) { private var highwayHost: String = "" private var highwayPort: Int = 0 private var sigSession: ByteArray = ByteArray(0) @@ -198,7 +198,7 @@ internal class HighwayContext(client: LagrangeClient) : AbstractContext(client) it[unknown3] = 0 it[entry] = FileUploadEntry { it[busiBuff] = ExcitingBusiInfo { - it[senderUin] = client.sessionStore.uin + it[senderUin] = client.uin it[this.receiverUin] = receiverUin } it[fileEntry] = ExcitingFileEntry { @@ -299,7 +299,7 @@ internal class HighwayContext(client: LagrangeClient) : AbstractContext(client) } private class HttpSession( - private val client: LagrangeClient, + private val client: IClient, private val httpClient: HttpClient, private val highwayHost: String, private val highwayPort: Int, @@ -329,7 +329,7 @@ internal class HighwayContext(client: LagrangeClient) : AbstractContext(client) val frame = packFrame(head, block) val serverUrl = - "http://$highwayHost:$highwayPort/cgi-bin/httpconn?htcmd=0x6FF0087&uin=${client.sessionStore.uin}" + "http://$highwayHost:$highwayPort/cgi-bin/httpconn?htcmd=0x6FF0087&uin=${client.uin}" val response = httpClient.post(serverUrl) { headers { @@ -354,7 +354,7 @@ internal class HighwayContext(client: LagrangeClient) : AbstractContext(client) return ReqDataHighwayHead { it[msgBaseHead] = DataHighwayHead { it[version] = 1 - it[uin] = client.sessionStore.uin.toString() + it[uin] = client.uin.toString() it[command] = "PicUp.DataUp" it[seq] = 0 it[retryTimes] = 0 diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/LoginContext.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/LoginContext.kt index 0abb03d9..09f66b34 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/LoginContext.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/LoginContext.kt @@ -13,7 +13,7 @@ import org.ntqqrev.acidify.internal.util.reader import org.ntqqrev.acidify.internal.util.writeBytes import kotlin.random.Random -internal class LoginContext(client: LagrangeClient) : AbstractContext(client) { +internal class LoginContext(override val client: LagrangeClient) : AbstractContext(client) { private val ecdhKey = "04928D8850673088B343264E0C6BACB8496D697799F37211DEB25BB73906CB089FEA9639B4E0260498B51A992D50813DA8".hexToByteArray() private val ecdhProvider = Ecdh.generateKeyPair(Ecdh.Secp192K1) diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/PacketContext.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/PacketContext.kt index 2ec7206d..8e80d366 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/PacketContext.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/PacketContext.kt @@ -25,7 +25,7 @@ import org.ntqqrev.acidify.internal.service.system.Heartbeat import org.ntqqrev.acidify.internal.util.* import kotlin.random.Random -internal class PacketContext(client: LagrangeClient) : AbstractContext(client) { +internal class PacketContext(override val client: LagrangeClient) : AbstractContext(client) { private var sequence = Random.nextInt(0x10000, 0x20000) private val host = "msfwifi.3g.qq.com" private val port = 8080 @@ -162,7 +162,6 @@ internal class PacketContext(client: LagrangeClient) : AbstractContext(client) { private fun buildService(sso: ByteArray): Buffer { val packet = Buffer() - packet.barrier(Prefix.UINT_32 or Prefix.INCLUDE_PREFIX) { writeInt(12) writeByte(if (client.sessionStore.d2.isEmpty()) 2 else 1) @@ -171,7 +170,6 @@ internal class PacketContext(client: LagrangeClient) : AbstractContext(client) { writeString(client.sessionStore.uin.toString(), Prefix.UINT_32 or Prefix.INCLUDE_PREFIX) writeBytes(TeaProvider.encrypt(sso, client.sessionStore.d2Key)) } - return packet } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/TicketContext.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/TicketContext.kt index cbc8a60a..e22d84ca 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/TicketContext.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/context/TicketContext.kt @@ -7,13 +7,13 @@ import io.ktor.client.plugins.cookies.* import io.ktor.client.request.* import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.service.system.FetchClientKey import org.ntqqrev.acidify.internal.service.system.FetchPSKey import kotlin.time.Clock import kotlin.time.ExperimentalTime -internal class TicketContext(client: LagrangeClient) : AbstractContext(client) { +internal class TicketContext(client: IClient) : AbstractContext(client) { internal class KeyWithLifetime(var value: String, var expireTime: Long) { companion object { fun dummy() = KeyWithLifetime("", 0L) @@ -54,7 +54,7 @@ internal class TicketContext(client: LagrangeClient) : AbstractContext(client) { "https%3A%2F%2Fh5.qzone.qq.com%2Fqqnt%2Fqzoneinpcqq%2Ffriend%3Frefresh%3D0%26clientuin%3D0%26darkMode%3D0&keyindex=19&random=2599" val urlString = "https://ssl.ptlogin2.qq.com/jump" + "?ptlang=1033" + - "&clientuin=${client.sessionStore.uin}" + + "&clientuin=${client.uin}" + "&clientkey=$clientKey" + "&u1=$jump" httpClient.get(urlString) diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/OidbServiceBase.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/OidbServiceBase.kt index 4e36bb5e..8daa6388 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/OidbServiceBase.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/OidbServiceBase.kt @@ -1,7 +1,7 @@ package org.ntqqrev.acidify.internal.service import org.ntqqrev.acidify.exception.OidbException -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb import org.ntqqrev.acidify.internal.protobuf.invoke @@ -10,17 +10,17 @@ internal abstract class OidbService( val oidbService: Int, val isReserved: Boolean = false ) : Service("OidbSvcTrpcTcp.0x${oidbCommand.toString(16)}_$oidbService") { - abstract fun buildOidb(client: LagrangeClient, payload: T): ByteArray - abstract fun parseOidb(client: LagrangeClient, payload: ByteArray): R + abstract fun buildOidb(client: IClient, payload: T): ByteArray + abstract fun parseOidb(client: IClient, payload: ByteArray): R - override fun build(client: LagrangeClient, payload: T): ByteArray = Oidb { + override fun build(client: IClient, payload: T): ByteArray = Oidb { it[command] = oidbCommand it[service] = oidbService it[body] = buildOidb(client, payload) it[reserved] = isReserved }.toByteArray() - override fun parse(client: LagrangeClient, payload: ByteArray): R { + override fun parse(client: IClient, payload: ByteArray): R { val response = Oidb(payload) val oidbResult = response.get { result } if (oidbResult != 0) { @@ -41,5 +41,5 @@ internal abstract class NoOutputOidbService( oidbSubCmd: Int, useReserved: Boolean = false ) : OidbService(oidbCmd, oidbSubCmd, useReserved) { - override fun parseOidb(client: LagrangeClient, payload: ByteArray) = Unit + override fun parseOidb(client: IClient, payload: ByteArray) = Unit } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/ServiceBase.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/ServiceBase.kt index 1cebc194..6919a76b 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/ServiceBase.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/ServiceBase.kt @@ -1,14 +1,14 @@ package org.ntqqrev.acidify.internal.service -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient internal abstract class Service(val cmd: String) { - abstract fun build(client: LagrangeClient, payload: T): ByteArray - abstract fun parse(client: LagrangeClient, payload: ByteArray): R + abstract fun build(client: IClient, payload: T): ByteArray + abstract fun parse(client: IClient, payload: ByteArray): R } internal abstract class NoInputService(cmd: String) : Service(cmd) internal abstract class NoOutputService(cmd: String) : Service(cmd) { - override fun parse(client: LagrangeClient, payload: ByteArray) = Unit + override fun parse(client: IClient, payload: ByteArray) = Unit } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/BroadcastGroupFile.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/BroadcastGroupFile.kt index ee07efee..00a037a7 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/BroadcastGroupFile.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/BroadcastGroupFile.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.file -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.BroadcastGroupFileReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -12,7 +12,7 @@ internal object BroadcastGroupFile : NoOutputOidbService val fileId: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = BroadcastGroupFileReq { it[body] = BroadcastGroupFileReq.Body { it[groupUin] = payload.groupUin diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/BroadcastPrivateFile.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/BroadcastPrivateFile.kt index 85563ad1..24aba65e 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/BroadcastPrivateFile.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/BroadcastPrivateFile.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.file -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.* import org.ntqqrev.acidify.internal.packet.message.action.PbSendMsgReq import org.ntqqrev.acidify.internal.packet.message.action.PbSendMsgResp @@ -31,7 +31,7 @@ internal object BroadcastPrivateFile : ) @OptIn(ExperimentalTime::class) - override fun build(client: LagrangeClient, payload: Req): ByteArray = + override fun build(client: IClient, payload: Req): ByteArray = PbSendMsgReq { it[routingHead] = SendRoutingHead { it[trans211] = Trans211 { @@ -61,7 +61,7 @@ internal object BroadcastPrivateFile : it[random] = Random.nextInt() }.toByteArray() - override fun parse(client: LagrangeClient, payload: ByteArray): Resp { + override fun parse(client: IClient, payload: ByteArray): Resp { val resp = PbSendMsgResp(payload) return Resp( result = resp.get { result }, diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/CreateGroupFolder.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/CreateGroupFolder.kt index 0c9118a0..d524ed2b 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/CreateGroupFolder.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/CreateGroupFolder.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.file -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D7Req import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D7Resp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -16,7 +16,7 @@ internal object CreateGroupFolder : OidbService(0x6d6, val fileId: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = Oidb0x6D6Req { it[deleteFile] = Oidb0x6D6Req.DeleteFile { it[groupUin] = payload.groupUin @@ -23,7 +23,7 @@ internal object DeleteGroupFile : OidbService(0x6d6, } }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray) { + override fun parseOidb(client: IClient, payload: ByteArray) { val resp = Oidb0x6D6Resp(payload).get { deleteFile } val retCode = resp.get { retCode } if (retCode != 0) { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/DeleteGroupFolder.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/DeleteGroupFolder.kt index 9db882ee..75450407 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/DeleteGroupFolder.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/DeleteGroupFolder.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.file -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D7Req import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D7Resp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -12,7 +12,7 @@ internal object DeleteGroupFolder : OidbService(0x6 val folderId: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = Oidb0x6D7Req { it[deleteFolder] = Oidb0x6D7Req.DeleteFolder { it[groupUin] = payload.groupUin @@ -20,7 +20,7 @@ internal object DeleteGroupFolder : OidbService(0x6 } }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray) { + override fun parseOidb(client: IClient, payload: ByteArray) { val resp = Oidb0x6D7Resp(payload).get { deleteFolder } val retCode = resp.get { retCode } if (retCode != 0) { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/GetGroupFileDownloadUrl.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/GetGroupFileDownloadUrl.kt index 7a2bcec0..95c486d0 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/GetGroupFileDownloadUrl.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/GetGroupFileDownloadUrl.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.file -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D6Req import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D6Resp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -12,7 +12,7 @@ internal object GetGroupFileDownloadUrl : OidbService(0x6d6, 5, t val targetFolderId: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = Oidb0x6D6Req { it[moveFile] = Oidb0x6D6Req.MoveFile { it[groupUin] = payload.groupUin @@ -26,7 +26,7 @@ internal object MoveGroupFile : OidbService(0x6d6, 5, t } }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray) { + override fun parseOidb(client: IClient, payload: ByteArray) { val resp = Oidb0x6D6Resp(payload).get { moveFile } val retCode = resp.get { retCode } if (retCode != 0) { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/RenameGroupFile.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/RenameGroupFile.kt index 90ac42fe..b4919456 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/RenameGroupFile.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/RenameGroupFile.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.file -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D6Req import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D6Resp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -14,7 +14,7 @@ internal object RenameGroupFile : OidbService(0x6d6, val newFileName: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = Oidb0x6D6Req { it[renameFile] = Oidb0x6D6Req.RenameFile { it[groupUin] = payload.groupUin @@ -26,7 +26,7 @@ internal object RenameGroupFile : OidbService(0x6d6, } }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray) { + override fun parseOidb(client: IClient, payload: ByteArray) { val resp = Oidb0x6D6Resp(payload).get { renameFile } val retCode = resp.get { retCode } if (retCode != 0) { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/RenameGroupFolder.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/RenameGroupFolder.kt index 669173a0..79ec51ed 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/RenameGroupFolder.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/RenameGroupFolder.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.file -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D7Req import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D7Resp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -13,7 +13,7 @@ internal object RenameGroupFolder : OidbService(0x6 val newFolderName: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = Oidb0x6D7Req { it[renameFolder] = Oidb0x6D7Req.RenameFolder { it[groupUin] = payload.groupUin @@ -22,7 +22,7 @@ internal object RenameGroupFolder : OidbService(0x6 } }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray) { + override fun parseOidb(client: IClient, payload: ByteArray) { val resp = Oidb0x6D7Resp(payload).get { renameFolder } val retCode = resp.get { retCode } if (retCode != 0) { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/UploadGroupFile.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/UploadGroupFile.kt index 6ad031cb..2dda17c8 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/UploadGroupFile.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/file/UploadGroupFile.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.file -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D6Req import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x6D6Resp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -26,7 +26,7 @@ internal object UploadGroupFile : OidbService(0x126b, 0) val block: Boolean, ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = DeleteFriendReq { + override fun buildOidb(client: IClient, payload: Req): ByteArray = DeleteFriendReq { it[body] = DeleteFriendReq.Body { it[targetUid] = payload.friendUid it[field2] = DeleteFriendReq.Body.Field2 { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/FetchFriendRequests.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/FetchFriendRequests.kt index 7ed60747..124c82e7 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/FetchFriendRequests.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/FetchFriendRequests.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.friend -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.* import org.ntqqrev.acidify.internal.protobuf.PbObject import org.ntqqrev.acidify.internal.protobuf.invoke @@ -9,11 +9,11 @@ import org.ntqqrev.acidify.internal.service.OidbService internal abstract class FetchFriendRequests(oidbCommand: Int, oidbService: Int, val isFiltered: Boolean) : OidbService(oidbCommand, oidbService) { object Normal : FetchFriendRequests>>(0x5cf, 11, false) { - override fun buildOidb(client: LagrangeClient, payload: Int): ByteArray = + override fun buildOidb(client: IClient, payload: Int): ByteArray = FetchFriendRequestsReq { it[version] = 1 it[type] = 6 - it[selfUid] = client.sessionStore.uid + it[selfUid] = client.uid it[startIndex] = 0 it[reqNum] = payload it[getFlag] = 2 @@ -22,7 +22,7 @@ internal abstract class FetchFriendRequests(oidbCommand: Int, oidbService: In it[field22] = 1 }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): List> { + override fun parseOidb(client: IClient, payload: ByteArray): List> { val resp = FetchFriendRequestsResp(payload) val info = resp.get { info } return info.get { requests } @@ -30,7 +30,7 @@ internal abstract class FetchFriendRequests(oidbCommand: Int, oidbService: In } object Filtered : FetchFriendRequests>>(0xd69, 0, true) { - override fun buildOidb(client: LagrangeClient, payload: Int): ByteArray = + override fun buildOidb(client: IClient, payload: Int): ByteArray = FetchFilteredFriendRequestsReq { it[field1] = 1 it[field2] = FilteredRequestCount { @@ -38,7 +38,7 @@ internal abstract class FetchFriendRequests(oidbCommand: Int, oidbService: In } }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): List> { + override fun parseOidb(client: IClient, payload: ByteArray): List> { val resp = FetchFilteredFriendRequestsResp(payload) val info = resp.get { info } return info.get { requests } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/FetchFriends.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/FetchFriends.kt index c2971d6e..adf95026 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/FetchFriends.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/FetchFriends.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.friend -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.misc.UserInfoKey import org.ntqqrev.acidify.internal.packet.oidb.FetchFriendsCookie import org.ntqqrev.acidify.internal.packet.oidb.IncPull @@ -17,7 +17,7 @@ internal object FetchFriends : OidbService( val friendDataList: List, ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = IncPull { + override fun buildOidb(client: IClient, payload: Req): ByteArray = IncPull { it[reqCount] = 300 it[cookie] = FetchFriendsCookie { it[nextUin] = payload.nextUin @@ -46,7 +46,7 @@ internal object FetchFriends : OidbService( ) }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): Resp { + override fun parseOidb(client: IClient, payload: ByteArray): Resp { val resp = IncPullResp(payload) val categories = resp.get { category }.associate { it.get { categoryId } to it.get { categoryName } } return Resp( diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SendProfileLike.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SendProfileLike.kt index 5fe52699..95767867 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SendProfileLike.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SendProfileLike.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.friend -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.ProfileLikeReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -11,7 +11,7 @@ internal object SendProfileLike : NoOutputOidbService(0x7e5 val count: Int ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = ProfileLikeReq { it[targetUid] = payload.targetUid it[field2] = 71 diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SetFilteredFriendRequest.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SetFilteredFriendRequest.kt index 297fbeff..e2fa77a9 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SetFilteredFriendRequest.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SetFilteredFriendRequest.kt @@ -1,14 +1,14 @@ package org.ntqqrev.acidify.internal.service.friend -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetFilteredFriendRequestReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService internal object SetFilteredFriendRequest : NoOutputOidbService(0xd72, 0) { - override fun buildOidb(client: LagrangeClient, payload: String): ByteArray = + override fun buildOidb(client: IClient, payload: String): ByteArray = SetFilteredFriendRequestReq { - it[selfUid] = client.sessionStore.uid + it[selfUid] = client.uid it[requestUid] = payload }.toByteArray() } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SetNormalFriendRequest.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SetNormalFriendRequest.kt index 2787c8a6..5845bb89 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SetNormalFriendRequest.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/friend/SetNormalFriendRequest.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.friend -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetFriendRequestReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -11,7 +11,7 @@ internal object SetNormalFriendRequest : NoOutputOidbService(0x88d, 0) { class Resp(val latestMessageSeq: Long) - override fun buildOidb(client: LagrangeClient, payload: Long): ByteArray = FetchGroupExtraInfoReq { + override fun buildOidb(client: IClient, payload: Long): ByteArray = FetchGroupExtraInfoReq { it[random] = Random.nextInt() it[config] = FetchGroupExtraInfoReq.Config { it[groupUin] = payload @@ -20,7 +20,7 @@ internal object FetchGroupExtraInfo : OidbService, ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = FetchGroupMembersReq { + override fun buildOidb(client: IClient, payload: Req): ByteArray = FetchGroupMembersReq { it[groupUin] = payload.groupUin it[field2] = 5 it[field3] = 2 @@ -36,7 +36,7 @@ internal object FetchGroupMembers : OidbService> ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = FetchGroupNotificationsReq { it[startSeq] = payload.startSequence it[count] = payload.count }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): Resp { + override fun parseOidb(client: IClient, payload: ByteArray): Resp { val resp = FetchGroupNotificationsResp(payload) return Resp( nextSequence = resp.get { nextStartSeq }, diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/FetchGroups.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/FetchGroups.kt index 60ad812d..e2968b6c 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/FetchGroups.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/FetchGroups.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.FetchGroupsReq import org.ntqqrev.acidify.internal.packet.oidb.FetchGroupsResp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -8,7 +8,7 @@ import org.ntqqrev.acidify.internal.service.NoInputOidbService import org.ntqqrev.acidify.struct.BotGroupData internal object FetchGroups : NoInputOidbService>(0xfe5, 2) { - override fun buildOidb(client: LagrangeClient, payload: Unit): ByteArray = FetchGroupsReq { + override fun buildOidb(client: IClient, payload: Unit): ByteArray = FetchGroupsReq { it[config] = FetchGroupsReq.Config { it[config1] = FetchGroupsReq.Config.Config1 { c1 -> listOf( @@ -65,7 +65,7 @@ internal object FetchGroups : NoInputOidbService>(0xfe5, 2) { } }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): List { + override fun parseOidb(client: IClient, payload: ByteArray): List { val resp = FetchGroupsResp(payload) return resp.get { groups }.map { group -> diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/KickMember.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/KickMember.kt index eb7de445..cf8eef36 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/KickMember.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/KickMember.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.KickMemberReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -13,7 +13,7 @@ internal object KickMember : NoOutputOidbService(0x8a0, 1) { val reason: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = KickMemberReq { it[groupCode] = payload.groupUin it[kickFlag] = 0 diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/QuitGroup.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/QuitGroup.kt index 04bba850..140e1cb9 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/QuitGroup.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/QuitGroup.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.QuitGroupReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -10,7 +10,7 @@ internal object QuitGroup : NoOutputOidbService(0x1097, 1) { val groupUin: Long ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = QuitGroupReq { it[groupCode] = payload.groupUin }.toByteArray() diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SendGroupNudge.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SendGroupNudge.kt index 88308ac5..68cdea6b 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SendGroupNudge.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SendGroupNudge.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.PokeReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -11,7 +11,7 @@ internal object SendGroupNudge : NoOutputOidbService(0xed3, val targetUin: Long ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = PokeReq { it[targetUin] = payload.targetUin it[groupUin] = payload.groupUin diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupEssenceMessage.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupEssenceMessage.kt index 74347126..1d2aeaef 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupEssenceMessage.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupEssenceMessage.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetGroupEssenceMessageReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -13,7 +13,7 @@ internal abstract class SetGroupEssenceMessage(isSet: Boolean) : val random: Int ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetGroupEssenceMessageReq { it[groupCode] = payload.groupUin it[sequence] = payload.sequence diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupMessageReaction.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupMessageReaction.kt index 6fe34646..5a292f5f 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupMessageReaction.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupMessageReaction.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetGroupMessageReactionReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -14,7 +14,7 @@ internal abstract class SetGroupMessageReaction(isAdd: Boolean) : val type: Int, ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetGroupMessageReactionReq { it[groupCode] = payload.groupUin it[sequence] = payload.sequence diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupName.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupName.kt index 0854798c..f04ea2df 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupName.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupName.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetGroupNameReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -11,7 +11,7 @@ internal object SetGroupName : NoOutputOidbService(0x89a, 15) val groupName: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetGroupNameReq { it[groupCode] = payload.groupUin it[targetName] = payload.groupName diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupRequest.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupRequest.kt index 98252d38..42572b84 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupRequest.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupRequest.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetGroupRequestBody import org.ntqqrev.acidify.internal.packet.oidb.SetGroupRequestReq import org.ntqqrev.acidify.internal.protobuf.invoke @@ -17,7 +17,7 @@ internal abstract class SetGroupRequest(isFiltered: Boolean) : val reason: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetGroupRequestReq { it[accept] = payload.accept it[body] = SetGroupRequestBody { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupWholeMute.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupWholeMute.kt index 6a97d289..c2850a1c 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupWholeMute.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetGroupWholeMute.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetGroupWholeMuteReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -11,7 +11,7 @@ internal object SetGroupWholeMute : NoOutputOidbService(0 val isMute: Boolean ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetGroupWholeMuteReq { it[groupCode] = payload.groupUin it[state] = SetGroupWholeMuteReq.State { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberAdmin.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberAdmin.kt index 094a6dce..22419b3f 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberAdmin.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberAdmin.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetMemberAdminReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -12,7 +12,7 @@ internal object SetMemberAdmin : NoOutputOidbService(0x1096, val isAdmin: Boolean ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetMemberAdminReq { it[groupCode] = payload.groupUin it[targetUid] = payload.memberUid diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberCard.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberCard.kt index 78d82c34..d23848c2 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberCard.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberCard.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x8FCReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -12,7 +12,7 @@ internal object SetMemberCard : NoOutputOidbService(0x8fc, 3) val card: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = Oidb0x8FCReq { it[groupCode] = payload.groupUin it[memLevelInfo] = listOf( diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberMute.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberMute.kt index 38d2d9a3..bd47bf7a 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberMute.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberMute.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetMemberMuteReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -12,7 +12,7 @@ internal object SetMemberMute : NoOutputOidbService(0x1253, 1 val duration: Int ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetMemberMuteReq { it[groupCode] = payload.groupUin it[type] = 1 diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberTitle.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberTitle.kt index 5e19f72a..b823fb08 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberTitle.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/group/SetMemberTitle.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.group -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.Oidb0x8FCReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService @@ -12,7 +12,7 @@ internal object SetMemberTitle : NoOutputOidbService(0x8fc, val specialTitle: String ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = Oidb0x8FCReq { it[groupCode] = payload.groupUin it[memLevelInfo] = listOf( diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/FetchFriendMessages.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/FetchFriendMessages.kt index ab5a8590..cc080cac 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/FetchFriendMessages.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/FetchFriendMessages.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.CommonMessage import org.ntqqrev.acidify.internal.packet.message.action.SsoGetC2cMsgReq import org.ntqqrev.acidify.internal.packet.message.action.SsoGetC2cMsgResp @@ -16,7 +16,7 @@ internal object FetchFriendMessages : val endSequence: Long ) - override fun build(client: LagrangeClient, payload: Req): ByteArray { + override fun build(client: IClient, payload: Req): ByteArray { return SsoGetC2cMsgReq { it[peerUid] = payload.peerUid it[startSequence] = payload.startSequence @@ -24,7 +24,7 @@ internal object FetchFriendMessages : }.toByteArray() } - override fun parse(client: LagrangeClient, payload: ByteArray): List> { + override fun parse(client: IClient, payload: ByteArray): List> { val resp = SsoGetC2cMsgResp(payload) val retcode = resp.get { retcode } val errorMsg = resp.get { errorMsg } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/FetchGroupMessages.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/FetchGroupMessages.kt index f4993397..fa14766b 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/FetchGroupMessages.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/FetchGroupMessages.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.CommonMessage import org.ntqqrev.acidify.internal.packet.message.action.SsoGetGroupMsgReq import org.ntqqrev.acidify.internal.packet.message.action.SsoGetGroupMsgResp @@ -17,7 +17,7 @@ internal object FetchGroupMessages : val filter: Int = 1 ) - override fun build(client: LagrangeClient, payload: Req): ByteArray { + override fun build(client: IClient, payload: Req): ByteArray { return SsoGetGroupMsgReq { it[groupInfo] = SsoGetGroupMsgReq.GroupInfo { it[groupUin] = payload.groupUin @@ -28,7 +28,7 @@ internal object FetchGroupMessages : }.toByteArray() } - override fun parse(client: LagrangeClient, payload: ByteArray): List> { + override fun parse(client: IClient, payload: ByteArray): List> { val resp = SsoGetGroupMsgResp(payload) val retcode = resp.get { retcode } val errorMsg = resp.get { errorMsg } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/GetFriendLatestSequence.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/GetFriendLatestSequence.kt index ddbed99f..a4823201 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/GetFriendLatestSequence.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/GetFriendLatestSequence.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.action.SsoGetPeerSeqReq import org.ntqqrev.acidify.internal.packet.message.action.SsoGetPeerSeqResp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -8,13 +8,13 @@ import org.ntqqrev.acidify.internal.service.Service import kotlin.math.max internal object GetFriendLatestSequence : Service("trpc.msg.msg_svc.MsgService.SsoGetPeerSeq") { - override fun build(client: LagrangeClient, payload: String): ByteArray { + override fun build(client: IClient, payload: String): ByteArray { return SsoGetPeerSeqReq { it[peerUid] = payload }.toByteArray() } - override fun parse(client: LagrangeClient, payload: ByteArray): Long { + override fun parse(client: IClient, payload: ByteArray): Long { val resp = SsoGetPeerSeqResp(payload) val seq1 = resp.get { seq1 } val seq2 = resp.get { seq2 } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecallFriendMessage.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecallFriendMessage.kt index f4cc4d05..b52af040 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecallFriendMessage.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecallFriendMessage.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.action.C2CRecallMsg import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputService @@ -15,7 +15,7 @@ internal object RecallFriendMessage : val timestamp: Long ) - override fun build(client: LagrangeClient, payload: Req): ByteArray { + override fun build(client: IClient, payload: Req): ByteArray { return C2CRecallMsg { it[type] = 1 it[targetUid] = payload.targetUid diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecallGroupMessage.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecallGroupMessage.kt index b59c6c4b..eb8995da 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecallGroupMessage.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecallGroupMessage.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.action.GroupRecallMsg import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputService @@ -12,7 +12,7 @@ internal object RecallGroupMessage : val sequence: Long ) - override fun build(client: LagrangeClient, payload: Req): ByteArray { + override fun build(client: IClient, payload: Req): ByteArray { return GroupRecallMsg { it[type] = 1 it[groupUin] = payload.groupUin diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecvLongMsg.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecvLongMsg.kt index 789816d7..74058b4a 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecvLongMsg.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RecvLongMsg.kt @@ -2,7 +2,7 @@ package org.ntqqrev.acidify.internal.service.message import korlibs.io.compression.deflate.GZIP import korlibs.io.compression.uncompress -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.CommonMessage import org.ntqqrev.acidify.internal.packet.message.action.* import org.ntqqrev.acidify.internal.protobuf.PbObject @@ -13,11 +13,11 @@ internal object RecvLongMsg : Service>>("trpc.group.long_msg_interface.MsgService.SsoRecvLongMsg") { class Req(val resId: String, val isGroup: Boolean = false) - override fun build(client: LagrangeClient, payload: Req): ByteArray { + override fun build(client: IClient, payload: Req): ByteArray { return LongMsgInterfaceReq { it[recvReq] = LongMsgRecvReq { it[peerInfo] = LongMsgPeerInfo { - it[peerUid] = client.sessionStore.uid + it[peerUid] = client.uid } it[resId] = payload.resId it[msgType] = if (payload.isGroup) 1 else 3 @@ -25,7 +25,7 @@ internal object RecvLongMsg : it[attr] = LongMsgAttr { it[subCmd] = 2 it[clientType] = 1 - it[platform] = when (client.appInfo.os) { + it[platform] = when (client.os) { "Windows" -> 3 "Linux" -> 6 "Mac" -> 7 @@ -36,7 +36,7 @@ internal object RecvLongMsg : }.toByteArray() } - override fun parse(client: LagrangeClient, payload: ByteArray): List> { + override fun parse(client: IClient, payload: ByteArray): List> { val resp = PbObject(LongMsgInterfaceResp, payload) val compressedPayload = resp.get { recvResp }?.get { this.payload } ?: throw IllegalStateException("No payload in LongMsgInterfaceResp") diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/ReportMessageRead.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/ReportMessageRead.kt index 657b0767..6a97d7e8 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/ReportMessageRead.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/ReportMessageRead.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.action.SsoReadedReportC2C import org.ntqqrev.acidify.internal.packet.message.action.SsoReadedReportGroup import org.ntqqrev.acidify.internal.packet.message.action.SsoReadedReportReq @@ -16,7 +16,7 @@ internal object ReportMessageRead : val time: Long, ) - override fun build(client: LagrangeClient, payload: Req): ByteArray { + override fun build(client: IClient, payload: Req): ByteArray { return if (payload.targetUid != null) { // Friend message SsoReadedReportReq { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RichMediaDownload.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RichMediaDownload.kt index 2cdb1883..ad628d98 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RichMediaDownload.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RichMediaDownload.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.media.* import org.ntqqrev.acidify.internal.protobuf.PbObject import org.ntqqrev.acidify.internal.protobuf.invoke @@ -14,7 +14,7 @@ internal abstract class RichMediaDownload( val businessType: Int, val scene: MessageScene, ) : OidbService, String>(oidbCommand, oidbService) { - override fun buildOidb(client: LagrangeClient, payload: PbObject): ByteArray = NTV2RichMediaReq { + override fun buildOidb(client: IClient, payload: PbObject): ByteArray = NTV2RichMediaReq { it[reqHead] = MultiMediaReqHead { it[common] = CommonHead { it[requestId] = 1 @@ -27,7 +27,7 @@ internal abstract class RichMediaDownload( MessageScene.FRIEND -> { it[sceneType] = 1 it[c2C] = C2CUserInfo { - it[targetUid] = client.sessionStore.uid + it[targetUid] = client.uid it[accountType] = 2 } } @@ -48,7 +48,7 @@ internal abstract class RichMediaDownload( } }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): String = + override fun parseOidb(client: IClient, payload: ByteArray): String = NTV2RichMediaResp(payload).let { val download = it.get { download } val downloadInfo = download.get { info } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RichMediaUpload.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RichMediaUpload.kt index c2ff9e64..a416fad7 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RichMediaUpload.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/RichMediaUpload.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.media.* import org.ntqqrev.acidify.internal.protobuf.PbObject import org.ntqqrev.acidify.internal.protobuf.invoke @@ -53,7 +53,7 @@ internal abstract class RichMediaUpload( ) protected fun buildBaseUploadReq( - client: LagrangeClient, + client: IClient, uploadInfoList: List>, compatQMsgSceneType: Int, extBizInfo: PbObject, @@ -72,7 +72,7 @@ internal abstract class RichMediaUpload( it[sceneType] = 1 it[c2C] = C2CUserInfo { it[accountType] = 2 - it[targetUid] = client.sessionStore.uid + it[targetUid] = client.uid } } @@ -269,13 +269,13 @@ internal abstract class RichMediaUpload( businessType = 1, scene = MessageScene.FRIEND ) { - override fun buildOidb(client: LagrangeClient, payload: ImageUploadRequest): ByteArray { + override fun buildOidb(client: IClient, payload: ImageUploadRequest): ByteArray { val uploadInfoList = listOf(buildImageUploadInfo(payload)) val extBizInfo = buildImageExtBizInfo(MessageScene.FRIEND, payload.subType, payload.textSummary) return buildBaseUploadReq(client, uploadInfoList, 1, extBizInfo) } - override fun parseOidb(client: LagrangeClient, payload: ByteArray): PbObject = + override fun parseOidb(client: IClient, payload: ByteArray): PbObject = NTV2RichMediaResp(payload).get { upload } } @@ -287,13 +287,13 @@ internal abstract class RichMediaUpload( businessType = 1, scene = MessageScene.GROUP ) { - override fun buildOidb(client: LagrangeClient, payload: ImageUploadRequest): ByteArray { + override fun buildOidb(client: IClient, payload: ImageUploadRequest): ByteArray { val uploadInfoList = listOf(buildImageUploadInfo(payload)) val extBizInfo = buildImageExtBizInfo(MessageScene.GROUP, payload.subType, payload.textSummary) return buildBaseUploadReq(client, uploadInfoList, 2, extBizInfo, payload.groupUin) } - override fun parseOidb(client: LagrangeClient, payload: ByteArray): PbObject = + override fun parseOidb(client: IClient, payload: ByteArray): PbObject = NTV2RichMediaResp(payload).get { upload } } @@ -305,13 +305,13 @@ internal abstract class RichMediaUpload( businessType = 3, scene = MessageScene.FRIEND ) { - override fun buildOidb(client: LagrangeClient, payload: RecordUploadRequest): ByteArray { + override fun buildOidb(client: IClient, payload: RecordUploadRequest): ByteArray { val uploadInfoList = listOf(buildRecordUploadInfo(payload)) val extBizInfo = buildPrivateRecordExtBizInfo() return buildBaseUploadReq(client, uploadInfoList, 1, extBizInfo) } - override fun parseOidb(client: LagrangeClient, payload: ByteArray): PbObject = + override fun parseOidb(client: IClient, payload: ByteArray): PbObject = NTV2RichMediaResp(payload).get { upload } } @@ -323,13 +323,13 @@ internal abstract class RichMediaUpload( businessType = 3, scene = MessageScene.GROUP ) { - override fun buildOidb(client: LagrangeClient, payload: RecordUploadRequest): ByteArray { + override fun buildOidb(client: IClient, payload: RecordUploadRequest): ByteArray { val uploadInfoList = listOf(buildRecordUploadInfo(payload)) val extBizInfo = buildGroupRecordExtBizInfo() return buildBaseUploadReq(client, uploadInfoList, 2, extBizInfo, payload.groupUin) } - override fun parseOidb(client: LagrangeClient, payload: ByteArray): PbObject = + override fun parseOidb(client: IClient, payload: ByteArray): PbObject = NTV2RichMediaResp(payload).get { upload } } @@ -341,13 +341,13 @@ internal abstract class RichMediaUpload( businessType = 2, scene = MessageScene.FRIEND ) { - override fun buildOidb(client: LagrangeClient, payload: VideoUploadRequest): ByteArray { + override fun buildOidb(client: IClient, payload: VideoUploadRequest): ByteArray { val uploadInfoList = buildVideoUploadInfoList(payload) val extBizInfo = buildVideoExtBizInfo() return buildBaseUploadReq(client, uploadInfoList, 2, extBizInfo) } - override fun parseOidb(client: LagrangeClient, payload: ByteArray): PbObject = + override fun parseOidb(client: IClient, payload: ByteArray): PbObject = NTV2RichMediaResp(payload).get { upload } } @@ -359,13 +359,13 @@ internal abstract class RichMediaUpload( businessType = 2, scene = MessageScene.GROUP ) { - override fun buildOidb(client: LagrangeClient, payload: VideoUploadRequest): ByteArray { + override fun buildOidb(client: IClient, payload: VideoUploadRequest): ByteArray { val uploadInfoList = buildVideoUploadInfoList(payload) val extBizInfo = buildVideoExtBizInfo() return buildBaseUploadReq(client, uploadInfoList, 2, extBizInfo, payload.groupUin) } - override fun parseOidb(client: LagrangeClient, payload: ByteArray): PbObject = + override fun parseOidb(client: IClient, payload: ByteArray): PbObject = NTV2RichMediaResp(payload).get { upload } } } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/SendFriendMessage.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/SendFriendMessage.kt index 9969f5c0..894f891a 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/SendFriendMessage.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/SendFriendMessage.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.* import org.ntqqrev.acidify.internal.packet.message.action.PbSendMsgReq import org.ntqqrev.acidify.internal.packet.message.action.PbSendMsgResp @@ -24,7 +24,7 @@ internal object SendFriendMessage : Service(0xed3 val isSelf: Boolean = false ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = + override fun buildOidb(client: IClient, payload: Req): ByteArray = PokeReq { - it[targetUin] = if (payload.isSelf) client.sessionStore.uin else payload.friendUin + it[targetUin] = if (payload.isSelf) client.uin else payload.friendUin it[groupUin] = 0 it[friendUin] = payload.friendUin it[ext] = 0 diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/SendGroupMessage.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/SendGroupMessage.kt index 3ec1c8f4..7be6251e 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/SendGroupMessage.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/message/SendGroupMessage.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.message -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.message.* import org.ntqqrev.acidify.internal.packet.message.action.PbSendMsgReq import org.ntqqrev.acidify.internal.packet.message.action.PbSendMsgResp @@ -23,7 +23,7 @@ internal object SendGroupMessage : Service>> ) - override fun build(client: LagrangeClient, payload: Req): ByteArray { + override fun build(client: IClient, payload: Req): ByteArray { val content = PbMultiMsgTransmit { it[items] = buildList { this.add(PbMultiMsgItem { @@ -54,7 +54,7 @@ internal object SendLongMsg : it[attr] = LongMsgAttr { it[subCmd] = 4 it[clientType] = 1 - it[platform] = when (client.appInfo.os) { + it[platform] = when (client.os) { "Windows" -> 3 "Linux" -> 6 "Mac" -> 7 @@ -67,7 +67,7 @@ internal object SendLongMsg : return longMsg.toByteArray() } - override fun parse(client: LagrangeClient, payload: ByteArray): String { + override fun parse(client: IClient, payload: ByteArray): String { val rsp = PbObject(LongMsgInterfaceResp, payload) return rsp.get { sendResp }?.get { this.resId } ?: throw IllegalStateException("No resId in LongMsgInterfaceResp") diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/BotOffline.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/BotOffline.kt index 63434c92..63cbf488 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/BotOffline.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/BotOffline.kt @@ -1,6 +1,7 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient +import org.ntqqrev.acidify.internal.ensureIsLagrange import org.ntqqrev.acidify.internal.packet.system.RegisterInfoResponse import org.ntqqrev.acidify.internal.packet.system.UnRegisterInfo import org.ntqqrev.acidify.internal.protobuf.invoke @@ -8,10 +9,11 @@ import org.ntqqrev.acidify.internal.service.NoInputService import org.ntqqrev.acidify.internal.util.generateDeviceInfo internal object BotOffline : NoInputService("trpc.qq_new_tech.status_svc.StatusService.UnRegister") { - override fun build(client: LagrangeClient, payload: Unit): ByteArray = UnRegisterInfo { + override fun build(client: IClient, payload: Unit): ByteArray = UnRegisterInfo { + client.ensureIsLagrange() it[device] = client.generateDeviceInfo() }.toByteArray() - override fun parse(client: LagrangeClient, payload: ByteArray): String = + override fun parse(client: IClient, payload: ByteArray): String = RegisterInfoResponse(payload).get { message } } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/BotOnline.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/BotOnline.kt index 0ec78a32..967aa8ee 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/BotOnline.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/BotOnline.kt @@ -1,6 +1,7 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient +import org.ntqqrev.acidify.internal.ensureIsLagrange import org.ntqqrev.acidify.internal.packet.system.OnlineBusinessInfo import org.ntqqrev.acidify.internal.packet.system.RegisterInfo import org.ntqqrev.acidify.internal.packet.system.RegisterInfoResponse @@ -9,7 +10,8 @@ import org.ntqqrev.acidify.internal.service.NoInputService import org.ntqqrev.acidify.internal.util.generateDeviceInfo internal object BotOnline : NoInputService("trpc.qq_new_tech.status_svc.StatusService.Register") { - override fun build(client: LagrangeClient, payload: Unit): ByteArray = RegisterInfo { + override fun build(client: IClient, payload: Unit): ByteArray = RegisterInfo { + client.ensureIsLagrange() it[guid] = client.sessionStore.guid.toHexString() it[currentVersion] = client.appInfo.currentVersion it[device] = client.generateDeviceInfo() @@ -19,6 +21,6 @@ internal object BotOnline : NoInputService("trpc.qq_new_tech.status_svc. } }.toByteArray() - override fun parse(client: LagrangeClient, payload: ByteArray): String = + override fun parse(client: IClient, payload: ByteArray): String = RegisterInfoResponse(payload).get { message } } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchClientKey.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchClientKey.kt index 326b33b2..aad2eb9a 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchClientKey.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchClientKey.kt @@ -1,14 +1,14 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.FetchClientKeyResp import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoInputOidbService internal object FetchClientKey : NoInputOidbService(0x102a, 1) { // It's actually empty! - override fun buildOidb(client: LagrangeClient, payload: Unit): ByteArray = ByteArray(0) + override fun buildOidb(client: IClient, payload: Unit): ByteArray = ByteArray(0) - override fun parseOidb(client: LagrangeClient, payload: ByteArray): String = + override fun parseOidb(client: IClient, payload: ByteArray): String = FetchClientKeyResp(payload).get { clientKey } } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchCustomFace.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchCustomFace.kt index 259adb95..ec1002a1 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchCustomFace.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchCustomFace.kt @@ -1,6 +1,7 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient +import org.ntqqrev.acidify.internal.ensureIsLagrange import org.ntqqrev.acidify.internal.packet.misc.FaceRoamRequest import org.ntqqrev.acidify.internal.packet.misc.FaceRoamResponse import org.ntqqrev.acidify.internal.protobuf.invoke @@ -9,7 +10,8 @@ import org.ntqqrev.acidify.internal.service.NoInputService internal object FetchCustomFace : NoInputService>("Faceroam.OpReq") { private const val DEFAULT_KERNEL_VERSION = "10.0.19042.0" - override fun build(client: LagrangeClient, payload: Unit): ByteArray = FaceRoamRequest { + override fun build(client: IClient, payload: Unit): ByteArray = FaceRoamRequest { + client.ensureIsLagrange() it[comm] = FaceRoamRequest.PlatInfo { plat -> plat[imPlat] = 1 plat[osVersion] = DEFAULT_KERNEL_VERSION @@ -20,7 +22,7 @@ internal object FetchCustomFace : NoInputService>("Faceroam.OpReq") it[field6] = 1 }.toByteArray() - override fun parse(client: LagrangeClient, payload: ByteArray): List { + override fun parse(client: IClient, payload: ByteArray): List { val resp = FaceRoamResponse(payload) val retCode = resp.get { retCode } if (retCode != 0) { @@ -30,7 +32,7 @@ internal object FetchCustomFace : NoInputService>("Faceroam.OpReq") val userInfo = resp.get { userInfo } val bid = userInfo.get { bid } - val uin = client.sessionStore.uin + val uin = client.uin return userInfo.get { fileName }.map { fileName -> "https://p.qpic.cn/$bid/$uin/$fileName/0" } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchFaceDetails.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchFaceDetails.kt index bf4f4b30..b88d5606 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchFaceDetails.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchFaceDetails.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.FetchFaceDetailsReq import org.ntqqrev.acidify.internal.packet.oidb.FetchFaceDetailsResp import org.ntqqrev.acidify.internal.protobuf.PbObject @@ -9,13 +9,13 @@ import org.ntqqrev.acidify.internal.service.NoInputOidbService import org.ntqqrev.acidify.struct.BotFaceDetail internal object FetchFaceDetails : NoInputOidbService>(0x9154, 1) { - override fun buildOidb(client: LagrangeClient, payload: Unit): ByteArray = FetchFaceDetailsReq { + override fun buildOidb(client: IClient, payload: Unit): ByteArray = FetchFaceDetailsReq { it[field1] = 0 it[field2] = 7 it[field3] = "0" }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): List { + override fun parseOidb(client: IClient, payload: ByteArray): List { val resp = FetchFaceDetailsResp(payload) val common = resp.get { commonFace } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchHighwayInfo.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchHighwayInfo.kt index 046d66e9..08079d67 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchHighwayInfo.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchHighwayInfo.kt @@ -1,6 +1,7 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient +import org.ntqqrev.acidify.internal.ensureIsLagrange import org.ntqqrev.acidify.internal.packet.message.media.FetchHighwayInfoReq import org.ntqqrev.acidify.internal.packet.message.media.FetchHighwayInfoResp import org.ntqqrev.acidify.internal.protobuf.invoke @@ -13,7 +14,8 @@ internal object FetchHighwayInfo : NoInputService("HttpCo val servers: Map>> ) - override fun build(client: LagrangeClient, payload: Unit): ByteArray = FetchHighwayInfoReq { + override fun build(client: IClient, payload: Unit): ByteArray = FetchHighwayInfoReq { + client.ensureIsLagrange() it[reqBody] = FetchHighwayInfoReq.Body { it[uin] = client.sessionStore.uin it[idcId] = 0 @@ -30,7 +32,7 @@ internal object FetchHighwayInfo : NoInputService("HttpCo } }.toByteArray() - override fun parse(client: LagrangeClient, payload: ByteArray): Resp { + override fun parse(client: IClient, payload: ByteArray): Resp { val rsp = FetchHighwayInfoResp(payload).get { rspBody } val sigSession = rsp.get { sigSession } val servers = mutableMapOf>>() diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchPSKey.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchPSKey.kt index 6f404a92..735fc76e 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchPSKey.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchPSKey.kt @@ -1,18 +1,18 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.FetchPsKeyReq import org.ntqqrev.acidify.internal.packet.oidb.FetchPsKeyResp import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.OidbService internal object FetchPSKey : OidbService, Map>(0x102a, 0) { - override fun buildOidb(client: LagrangeClient, payload: List): ByteArray = + override fun buildOidb(client: IClient, payload: List): ByteArray = FetchPsKeyReq { it[domains] = payload }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): Map = + override fun parseOidb(client: IClient, payload: ByteArray): Map = FetchPsKeyResp(payload) .get { psKeyEntries } .associate { it.get { domain } to it.get { key } } diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchPins.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchPins.kt index 5c185cec..2903aac7 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchPins.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchPins.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.FetchPinsResp import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoInputOidbService @@ -11,9 +11,9 @@ internal object FetchPins : NoInputOidbService(0x12b3, 0) { val groupUins: List ) - override fun buildOidb(client: LagrangeClient, payload: Unit): ByteArray = ByteArray(0) + override fun buildOidb(client: IClient, payload: Unit): ByteArray = ByteArray(0) - override fun parseOidb(client: LagrangeClient, payload: ByteArray): Resp { + override fun parseOidb(client: IClient, payload: ByteArray): Resp { val resp = FetchPinsResp(payload) return Resp( friendUids = resp.get { friends }.map { it.get { uid } }, diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchQRCode.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchQRCode.kt index 8b545adc..28a0e559 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchQRCode.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchQRCode.kt @@ -1,7 +1,8 @@ package org.ntqqrev.acidify.internal.service.system import kotlinx.io.* -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient +import org.ntqqrev.acidify.internal.ensureIsLagrange import org.ntqqrev.acidify.internal.packet.login.TlvQRCode import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoInputService @@ -11,7 +12,8 @@ import org.ntqqrev.acidify.internal.util.reader import org.ntqqrev.acidify.internal.util.writeBytes internal object FetchQRCode : NoInputService("wtlogin.trans_emp") { - override fun build(client: LagrangeClient, payload: Unit): ByteArray { + override fun build(client: IClient, payload: Unit): ByteArray { + client.ensureIsLagrange() val tlvPack = TlvQRCode(client).apply { tlv16() tlv1b() @@ -33,7 +35,8 @@ internal object FetchQRCode : NoInputService("wtlogin.trans_ return client.loginContext.buildCode2DPacket(packet.readByteArray(), 0x31u) } - override fun parse(client: LagrangeClient, payload: ByteArray): Result { + override fun parse(client: IClient, payload: ByteArray): Result { + client.ensureIsLagrange() val wtLogin = client.loginContext.parseWtLogin(payload) val code2d = client.loginContext.parseCode2DPacket(wtLogin) val reader = code2d.reader() diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchUserInfo.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchUserInfo.kt index fd731f51..53056fbf 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchUserInfo.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/FetchUserInfo.kt @@ -1,6 +1,7 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient +import org.ntqqrev.acidify.internal.packet.misc.UserInfoKey import org.ntqqrev.acidify.internal.packet.oidb.FetchUserInfoByUidReq import org.ntqqrev.acidify.internal.packet.oidb.FetchUserInfoByUinReq import org.ntqqrev.acidify.internal.packet.oidb.FetchUserInfoReqKey @@ -9,7 +10,6 @@ import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.OidbService import org.ntqqrev.acidify.struct.BotUserInfo import org.ntqqrev.acidify.struct.UserInfoGender -import org.ntqqrev.acidify.internal.packet.misc.UserInfoKey internal object FetchUserInfo { private val fetchKeys = listOf( @@ -49,22 +49,22 @@ internal object FetchUserInfo { } internal object ByUin : OidbService(0xfe1, 2, true) { - override fun buildOidb(client: LagrangeClient, payload: Long): ByteArray = FetchUserInfoByUinReq { + override fun buildOidb(client: IClient, payload: Long): ByteArray = FetchUserInfoByUinReq { it[uin] = payload it[keys] = fetchKeys }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): BotUserInfo = + override fun parseOidb(client: IClient, payload: ByteArray): BotUserInfo = parseUserInfo(payload) } internal object ByUid : OidbService(0xfe1, 2) { - override fun buildOidb(client: LagrangeClient, payload: String): ByteArray = FetchUserInfoByUidReq { + override fun buildOidb(client: IClient, payload: String): ByteArray = FetchUserInfoByUidReq { it[uid] = payload it[keys] = fetchKeys }.toByteArray() - override fun parseOidb(client: LagrangeClient, payload: ByteArray): BotUserInfo = + override fun parseOidb(client: IClient, payload: ByteArray): BotUserInfo = parseUserInfo(payload) } } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/Heartbeat.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/Heartbeat.kt index 6d5f0269..c96263fd 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/Heartbeat.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/Heartbeat.kt @@ -1,14 +1,14 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.system.SsoHeartBeat import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoInputService internal object Heartbeat : NoInputService("trpc.qq_new_tech.status_svc.StatusService.SsoHeartBeat") { - override fun build(client: LagrangeClient, payload: Unit): ByteArray = SsoHeartBeat { + override fun build(client: IClient, payload: Unit): ByteArray = SsoHeartBeat { it[type] = 1 }.toByteArray() - override fun parse(client: LagrangeClient, payload: ByteArray) = Unit + override fun parse(client: IClient, payload: ByteArray) = Unit } \ No newline at end of file diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/QueryQRCodeState.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/QueryQRCodeState.kt index 986ea18a..1e8be53a 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/QueryQRCodeState.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/QueryQRCodeState.kt @@ -1,7 +1,8 @@ package org.ntqqrev.acidify.internal.service.system import kotlinx.io.* -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient +import org.ntqqrev.acidify.internal.ensureIsLagrange import org.ntqqrev.acidify.internal.service.NoInputService import org.ntqqrev.acidify.internal.util.Prefix import org.ntqqrev.acidify.internal.util.readTlv @@ -10,7 +11,8 @@ import org.ntqqrev.acidify.internal.util.writeBytes import org.ntqqrev.acidify.struct.QRCodeState internal object QueryQRCodeState : NoInputService("wtlogin.trans_emp") { - override fun build(client: LagrangeClient, payload: Unit): ByteArray { + override fun build(client: IClient, payload: Unit): ByteArray { + client.ensureIsLagrange() val packet = Buffer().apply { writeUShort(0u) writeUInt(client.appInfo.appId.toUInt()) @@ -23,7 +25,8 @@ internal object QueryQRCodeState : NoInputService("wtlogin.trans_em return client.loginContext.buildCode2DPacket(packet.readByteArray(), 0x12u) } - override fun parse(client: LagrangeClient, payload: ByteArray): QRCodeState { + override fun parse(client: IClient, payload: ByteArray): QRCodeState { + client.ensureIsLagrange() val wtlogin = client.loginContext.parseWtLogin(payload) val reader = client.loginContext.parseCode2DPacket(wtlogin).reader() val state = QRCodeState.fromByte(reader.readByte()) diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetFriendPin.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetFriendPin.kt index f608abf1..c9985e80 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetFriendPin.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetFriendPin.kt @@ -2,11 +2,11 @@ package org.ntqqrev.acidify.internal.service.system import kotlinx.io.Buffer import kotlinx.io.readByteArray -import kotlin.time.Clock -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetFriendPinReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService +import kotlin.time.Clock internal object SetFriendPin : NoOutputOidbService(0x5d6, 18) { class Req( @@ -14,7 +14,7 @@ internal object SetFriendPin : NoOutputOidbService(0x5d6, 18) val isPinned: Boolean ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = SetFriendPinReq { + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetFriendPinReq { it[field1] = 0 it[field3] = 1 it[info] = SetFriendPinReq.Info { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetGroupPin.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetGroupPin.kt index 387caa27..bfd7637b 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetGroupPin.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetGroupPin.kt @@ -2,11 +2,11 @@ package org.ntqqrev.acidify.internal.service.system import kotlinx.io.Buffer import kotlinx.io.readByteArray -import kotlin.time.Clock -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.oidb.SetGroupPinReq import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoOutputOidbService +import kotlin.time.Clock internal object SetGroupPin : NoOutputOidbService(0x5d6, 1) { class Req( @@ -14,7 +14,7 @@ internal object SetGroupPin : NoOutputOidbService(0x5d6, 1) { val isPinned: Boolean ) - override fun buildOidb(client: LagrangeClient, payload: Req): ByteArray = SetGroupPinReq { + override fun buildOidb(client: IClient, payload: Req): ByteArray = SetGroupPinReq { it[field1] = 0 it[field3] = 11 it[info] = SetGroupPinReq.Info { diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetUserProfile.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetUserProfile.kt index e7bd2791..7fcaca9f 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetUserProfile.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/SetUserProfile.kt @@ -1,6 +1,6 @@ package org.ntqqrev.acidify.internal.service.system -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.packet.misc.UserInfoKey import org.ntqqrev.acidify.internal.packet.oidb.SetUserProfileReq import org.ntqqrev.acidify.internal.protobuf.invoke @@ -12,8 +12,8 @@ internal object SetUserProfile : NoOutputOidbService(0x112a, val numberProps: Map = mapOf(), ) - override fun buildOidb(client: LagrangeClient, payload: Req) = SetUserProfileReq { - it[uin] = client.sessionStore.uin + override fun buildOidb(client: IClient, payload: Req) = SetUserProfileReq { + it[uin] = client.uin it[stringProps] = payload.stringProps.map { (key, value) -> SetUserProfileReq.StringProp { it[this.key] = key.number diff --git a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/WtLogin.kt b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/WtLogin.kt index d5d939ae..934c293f 100644 --- a/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/WtLogin.kt +++ b/acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/internal/service/system/WtLogin.kt @@ -5,8 +5,9 @@ import kotlinx.io.Buffer import kotlinx.io.readByteArray import kotlinx.io.writeUShort import org.ntqqrev.acidify.exception.WtLoginException -import org.ntqqrev.acidify.internal.LagrangeClient +import org.ntqqrev.acidify.internal.IClient import org.ntqqrev.acidify.internal.crypto.tea.TeaProvider +import org.ntqqrev.acidify.internal.ensureIsLagrange import org.ntqqrev.acidify.internal.packet.login.Tlv import org.ntqqrev.acidify.internal.protobuf.invoke import org.ntqqrev.acidify.internal.service.NoInputService @@ -16,7 +17,8 @@ import org.ntqqrev.acidify.internal.util.readTlv import org.ntqqrev.acidify.internal.util.reader internal object WtLogin : NoInputService("wtlogin.login") { - override fun build(client: LagrangeClient, payload: Unit): ByteArray { + override fun build(client: IClient, payload: Unit): ByteArray { + client.ensureIsLagrange() val tlvPack = Tlv(client).apply { tlv106A2() tlv144() @@ -41,10 +43,8 @@ internal object WtLogin : NoInputService("wtlogin.login") { return client.loginContext.buildWtLogin(packet.readByteArray(), 2064u) } - override fun parse( - client: LagrangeClient, - payload: ByteArray - ): Boolean { + override fun parse(client: IClient, payload: ByteArray): Boolean { + client.ensureIsLagrange() val reader = client.loginContext.parseWtLogin(payload).reader() val command = reader.readUShort()