diff --git a/UpdateLog.md b/UpdateLog.md index 23a8309b0..d640714d8 100644 --- a/UpdateLog.md +++ b/UpdateLog.md @@ -1,10 +1,18 @@ -# UpdateLog - -## Major version 0 +# Major version 0 开发版本. 频繁更新, 不保证高稳定性 -### `0.10.0` *2019/12/23* +## `0.10.1` 还未发布 +**Bot 构造** +`Bot` 构造时修改 `BotConfiguration` 而不是登录时. +移除 `CoroutineScope.Bot` +移除 `suspend Bot(...)` +添加 `Bot(..., BotConfiguration.() -> Unit)` + +**其他** +移动部分文件, 模块化 + +## `0.10.0` *2019/12/23* **事件优化** 更快的监听过程 现在监听不再是 `suspend`, 而必须显式指定 `CoroutineScope`. 详见 [`Subscribers.kt`](mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Subscribers.kt#L69) @@ -13,7 +21,7 @@ **其他** `Contact` 现在实现接口 `CoroutineScope` -### `0.9.0` *2019/12/20* +## `0.9.0` *2019/12/20* **协议模块独立** 现在 `mirai-core` 只提供基础的抽象类. 具体的各协议实现为 `mirai-core-PROTOCOL`. 这些模块都继承自 `mirai-core`. @@ -35,15 +43,15 @@ **此为 API 不兼容更新**, 请将所有无符号标志 `u` 删除即可. 如 `123456u` 改为 `123456` 另还有其他 API 的包名或签名修改. 请使用 IDE 自动修补 import 即可. -### `0.8.2` *2019/12/15* +## `0.8.2` *2019/12/15* - 修复 GroupId.toGroupInternalId 错误 - 修复解析群消息时小概率出现的一个错误 -### `0.8.1` *2019/12/15* +## `0.8.1` *2019/12/15* - 修复有时群资料无法获取的情况 - 现在 `At.qq`, `Long.qq` 等函数不再是 `suspend` -### `0.8.0` *2019/12/14* +## `0.8.0` *2019/12/14* 协议 - 现在查询群资料时可处理群号无效的情况 - 现在能正常分辨禁言事件包 @@ -56,28 +64,28 @@ 优化 - 日志中, 发送给服务器的包将会被以名字记录, 而不是 id -### `0.7.5` *2019/12/09* +## `0.7.5` *2019/12/09* - 修复验证码包发出后无回复 (错误的验证码包) -### `0.7.4` *2019/12/08* +## `0.7.4` *2019/12/08* - 修复 bug - 优化 JVM 平台上需要验证码时的提示 -### `0.7.3` *2019/12/07* +## `0.7.3` *2019/12/07* - 删除 klock 依赖, 添加 Time.kt. 待将来 kotlin Duration 稳定后替换为 Duration -### `0.7.2` *2019/12/07* +## `0.7.2` *2019/12/07* - 使所有协议相关类 `internal` - 去掉一些 `close` 的不应该有的 `suspend` - `QQ`, `Member`, `Group` 现在继承接口 `CoroutineScope` - 将 `LoginResult` 由 `inline class` 修改为 `enum class` - 添加和修改了 `BotAccount` 和 `Bot` 的构造器 -### `0.7.1` *2019/12/05* +## `0.7.1` *2019/12/05* - 修复禁言时间范围错误的问题 - 禁言的扩展函数现在会传递实际函数的返回值 -### `0.7.0` *2019/12/04* +## `0.7.0` *2019/12/04* 协议 - 重新分析验证码包, 解决一些无法解析的情况. (这可能会产生新的问题, 遇到后请提交 issue) - 重新分析提交密码包 @@ -97,11 +105,11 @@ - 2 个 Contact.sendMessage 重载改为内联扩展函数 **(需要添加 import)** - 其他小优化 -### `0.6.1` *2019/12/03* +## `0.6.1` *2019/12/03* - 新增: 无法解析密码包/验证码包时的调试输出. 以兼容更多的设备情况 - 新增: `MessagePacket` 下 `At.qq()` 捷径获取 QQ -### `0.6.0` *2019/12/02* +## `0.6.0` *2019/12/02* - 新增: 禁言群成员 (`Member.mute(TimeSpan|Duration|MonthsSpan|Int|UInt)`) - 新增: 解禁群成员 (`Member.unmute()`) - 修复: ContactList key 无法匹配 (Kotlin 内联类型泛型投影错误) diff --git a/mirai-core-timpc/build.gradle.kts b/mirai-core-timpc/build.gradle.kts index c06f791ca..5bd3ddc9d 100644 --- a/mirai-core-timpc/build.gradle.kts +++ b/mirai-core-timpc/build.gradle.kts @@ -104,7 +104,7 @@ kotlin { api(kotlin("test-junit", kotlinVersion)) implementation("org.pcap4j:pcap4j-distribution:1.8.2") - //runtimeOnly(files("build/classes/kotlin/jvm/test")) // classpath is not properly set by IDE + runtimeOnly(files("build/classes/kotlin/jvm/test")) // classpath is not properly set by IDE } } } diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/TIMPCBot.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/TIMPCBot.kt index 11b2a4140..396fe0171 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/TIMPCBot.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/TIMPCBot.kt @@ -11,9 +11,6 @@ import net.mamoe.mirai.data.Packet import net.mamoe.mirai.message.data.Image import net.mamoe.mirai.message.data.ImageId0x03 import net.mamoe.mirai.message.data.ImageId0x06 -import net.mamoe.mirai.network.packet.KnownPacketId -import net.mamoe.mirai.network.packet.OutgoingPacket -import net.mamoe.mirai.network.packet.SessionKey import net.mamoe.mirai.qqAccount import net.mamoe.mirai.timpc.internal.RawGroupInfo import net.mamoe.mirai.timpc.network.GroupImpl @@ -21,13 +18,15 @@ import net.mamoe.mirai.timpc.network.MemberImpl import net.mamoe.mirai.timpc.network.QQImpl import net.mamoe.mirai.timpc.network.TIMPCBotNetworkHandler import net.mamoe.mirai.timpc.network.handler.TemporaryPacketHandler +import net.mamoe.mirai.timpc.network.packet.KnownPacketId +import net.mamoe.mirai.timpc.network.packet.OutgoingPacket +import net.mamoe.mirai.timpc.network.packet.SessionKey import net.mamoe.mirai.timpc.network.packet.action.* import net.mamoe.mirai.timpc.network.packet.event.EventPacketFactory import net.mamoe.mirai.timpc.network.packet.event.FriendOnlineStatusChangedPacket import net.mamoe.mirai.timpc.network.packet.login.* import net.mamoe.mirai.timpc.utils.assertUnreachable import net.mamoe.mirai.utils.* -import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail import net.mamoe.mirai.utils.io.logStacktrace import kotlin.contracts.ExperimentalContracts import kotlin.contracts.InvocationKind diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/ContactImpl.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/ContactImpl.kt index 34cf17c6c..fcb31dea9 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/ContactImpl.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/ContactImpl.kt @@ -20,10 +20,14 @@ import net.mamoe.mirai.timpc.network.packet.action.* import net.mamoe.mirai.timpc.network.packet.event.MemberJoinEventPacket import net.mamoe.mirai.timpc.network.packet.event.MemberQuitEvent import net.mamoe.mirai.timpc.sendPacket +import net.mamoe.mirai.utils.OverFileSizeMaxException import net.mamoe.mirai.timpc.utils.assertUnreachable import net.mamoe.mirai.timpc.withTIMPCBot -import net.mamoe.mirai.utils.* +import net.mamoe.mirai.utils.ExternalImage +import net.mamoe.mirai.utils.Http +import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.io.toUHexString +import net.mamoe.mirai.utils.unsafeWeakRef import kotlin.coroutines.CoroutineContext internal sealed class ContactImpl : Contact { diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt index eb34395d1..64fbe77d9 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/TIMPCBotNetworkHandler.kt @@ -7,6 +7,7 @@ import kotlinx.io.core.* import kotlinx.io.pool.useInstance import net.mamoe.mirai.Bot import net.mamoe.mirai.data.LoginResult +import net.mamoe.mirai.data.OnlineStatus import net.mamoe.mirai.data.Packet import net.mamoe.mirai.event.BroadcastControllable import net.mamoe.mirai.event.Cancellable @@ -14,15 +15,17 @@ import net.mamoe.mirai.event.Subscribable import net.mamoe.mirai.event.broadcast import net.mamoe.mirai.event.events.BotLoginSucceedEvent import net.mamoe.mirai.network.BotNetworkHandler -import net.mamoe.mirai.network.packet.* import net.mamoe.mirai.qqAccount import net.mamoe.mirai.timpc.TIMPCBot import net.mamoe.mirai.timpc.network.handler.DataPacketSocketAdapter import net.mamoe.mirai.timpc.network.handler.TemporaryPacketHandler +import net.mamoe.mirai.timpc.network.packet.* import net.mamoe.mirai.timpc.network.packet.login.* import net.mamoe.mirai.utils.LockFreeLinkedList import net.mamoe.mirai.utils.LoginFailedException -import net.mamoe.mirai.utils.OnlineStatus +import net.mamoe.mirai.utils.NoLog +import net.mamoe.mirai.utils.cryptor.Decrypter +import net.mamoe.mirai.utils.cryptor.NoDecrypter import net.mamoe.mirai.utils.io.* import net.mamoe.mirai.utils.unsafeWeakRef import kotlin.coroutines.CoroutineContext diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/OutgoingPacket.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/OutgoingPacket.kt similarity index 93% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/OutgoingPacket.kt rename to mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/OutgoingPacket.kt index 24d65cf18..0b9f50697 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/OutgoingPacket.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/OutgoingPacket.kt @@ -1,13 +1,15 @@ @file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_UNSIGNED_LITERALS", "unused", "MemberVisibilityCanBePrivate") -package net.mamoe.mirai.network.packet +package net.mamoe.mirai.timpc.network.packet import kotlinx.io.core.* import kotlinx.serialization.SerializationStrategy import kotlinx.serialization.protobuf.ProtoBuf import net.mamoe.mirai.data.Packet import net.mamoe.mirai.network.BotNetworkHandler + import net.mamoe.mirai.utils.MiraiInternalAPI +import net.mamoe.mirai.utils.cryptor.encryptAndWrite import net.mamoe.mirai.utils.io.hexToBytes import net.mamoe.mirai.utils.io.writeQQ import kotlin.contracts.ExperimentalContracts @@ -63,17 +65,14 @@ inline fun PacketFactory<*, *>.buildOutgoingPacket0( callsInPlace(block, InvocationKind.EXACTLY_ONCE) } - BytePacketBuilder(headerSizeHint).use { - with(it) { - writeFully(head) - writeFully(ver) - writeUShort(id.value) - writeUShort(sequenceId) - block(this) - writeFully(tail) - } - return OutgoingPacket(name, id, sequenceId, it.build()) - } + return OutgoingPacket(name, id, sequenceId, buildPacket(headerSizeHint) { + writeFully(head) + writeFully(ver) + writeUShort(id.value.toUShort()) + writeUShort(sequenceId) + block(this) + writeFully(tail) + }) } diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/OutgoingPacketHelper.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/OutgoingPacketHelper.kt index e61bb9389..19cec0801 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/OutgoingPacketHelper.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/OutgoingPacketHelper.kt @@ -2,7 +2,7 @@ package net.mamoe.mirai.timpc.network.packet import kotlinx.io.core.BytePacketBuilder import kotlinx.serialization.SerializationStrategy -import net.mamoe.mirai.network.packet.* + import net.mamoe.mirai.timpc.network.TIMProtocol import net.mamoe.mirai.utils.MiraiInternalAPI import kotlin.contracts.ExperimentalContracts diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Packet.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/Packet.kt similarity index 93% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Packet.kt rename to mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/Packet.kt index 0eedef402..be1d6ca8d 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Packet.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/Packet.kt @@ -1,4 +1,4 @@ -package net.mamoe.mirai.network.packet +package net.mamoe.mirai.timpc.network.packet import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.readBytes diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/PacketFactory.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/PacketFactory.kt similarity index 83% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/PacketFactory.kt rename to mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/PacketFactory.kt index d20c98dda..fdfaefeda 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/PacketFactory.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/PacketFactory.kt @@ -1,7 +1,8 @@ @file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_UNSIGNED_LITERALS") -package net.mamoe.mirai.network.packet +package net.mamoe.mirai.timpc.network.packet +import kotlinx.atomicfu.AtomicInt import kotlinx.atomicfu.atomic import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact @@ -9,14 +10,16 @@ import kotlinx.io.core.readBytes import kotlinx.io.pool.useInstance import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.protobuf.ProtoBuf -import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.Packet -import net.mamoe.mirai.utils.MiraiInternalAPI +import net.mamoe.mirai.network.BotNetworkHandler +import net.mamoe.mirai.utils.cryptor.Decrypter +import net.mamoe.mirai.utils.cryptor.DecrypterType +import net.mamoe.mirai.utils.cryptor.readProtoMap import net.mamoe.mirai.utils.io.ByteArrayPool import net.mamoe.mirai.utils.io.debugPrint import net.mamoe.mirai.utils.io.read import net.mamoe.mirai.utils.io.toUHexString -import net.mamoe.mirai.utils.readProtoMap + /** * 一种数据包的处理工厂. 它可以解密解码服务器发来的这个包, 也可以编码加密要发送给服务器的这个包 @@ -40,7 +43,6 @@ abstract class PacketFactory(val d */ abstract suspend fun ByteReadPacket.decode(id: PacketId, sequenceId: UShort, handler: BotNetworkHandler): TPacket - @Suppress("DEPRECATION") fun ByteReadPacket.decodeProtoPacket( deserializer: DeserializationStrategy, debuggingTag: String? = null @@ -63,10 +65,16 @@ abstract class PacketFactory(val d } companion object { - private val sequenceIdInternal = atomic(1) + private val sequenceId: AtomicInt = atomic(1) - @MiraiInternalAPI - fun atomicNextSequenceId(): UShort = sequenceIdInternal.getAndIncrement().toUShort() + fun atomicNextSequenceId(): UShort { + val id = sequenceId.getAndAdd(1) + if (id > Short.MAX_VALUE.toInt() * 2) { + sequenceId.value = 0 + return atomicNextSequenceId() + } + return id.toUShort() + } } } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/PacketId.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/PacketId.kt similarity index 93% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/PacketId.kt rename to mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/PacketId.kt index ae651f4d3..2bee326eb 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/PacketId.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/PacketId.kt @@ -1,10 +1,19 @@ @file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_UNSIGNED_LITERALS") -package net.mamoe.mirai.network.packet +package net.mamoe.mirai.timpc.network.packet + import net.mamoe.mirai.utils.io.toUHexString +/** + * 包 ID. + */ +interface PacketId { + val value: UShort + val factory: PacketFactory<*, *> +} + /** * 通过 [value] 匹配一个 [IgnoredPacketId] 或 [KnownPacketId], 无匹配则返回一个 [UnknownPacketId]. */ @@ -13,13 +22,6 @@ fun matchPacketId(value: UShort): PacketId = ?: KnownPacketId.entries.firstOrNull { it.value.value == value }?.value ?: UnknownPacketId(value) -/** - * 包 ID. - */ -interface PacketId { - val value: UShort - val factory: PacketFactory<*, *> -} /** * 用于代表 `null`. 调用任何属性时都将会得到一个 [error] @@ -49,7 +51,8 @@ inline class IgnoredPacketId constructor(override val value: UShort) : PacketId override fun toString(): String = "IgnoredPacketId(${value.toUHexString()})" } -class KnownPacketId(override val value: UShort, override val factory: PacketFactory<*, *>) : PacketId { +class KnownPacketId(override val value: UShort, override val factory: PacketFactory<*, *>) : + PacketId { companion object : MutableMap by mutableMapOf() { operator fun set(key: UShort, factory: PacketFactory<*, *>) { this[key] = KnownPacketId(key, factory) @@ -65,7 +68,8 @@ class KnownPacketId(override val value: UShort, override val factory: PacketFact return null } - inline fun > get(): KnownPacketId = getOrNull() ?: throw NoSuchElementException() + inline fun > get(): KnownPacketId = getOrNull() + ?: throw NoSuchElementException() } override fun toString(): String = (factory::class.simpleName ?: factory::class.simpleName) + "(${value.toUHexString()})" diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/SessionKey.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/SessionKey.kt new file mode 100644 index 000000000..f4ab26b43 --- /dev/null +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/SessionKey.kt @@ -0,0 +1,11 @@ +package net.mamoe.mirai.timpc.network.packet + +import net.mamoe.mirai.utils.cryptor.DecrypterByteArray +import net.mamoe.mirai.utils.cryptor.DecrypterType + +/** + * 会话密匙 + */ +inline class SessionKey(override val value: ByteArray) : DecrypterByteArray { + companion object Type : DecrypterType +} diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/AddContact.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/AddContact.kt index 55d34a919..7c2052dce 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/AddContact.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/AddContact.kt @@ -8,9 +8,10 @@ import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.EventPacket import net.mamoe.mirai.data.Packet import net.mamoe.mirai.data.PreviousNameList -import net.mamoe.mirai.network.packet.* +import net.mamoe.mirai.utils.PacketVersion + import net.mamoe.mirai.timpc.network.TIMProtocol -import net.mamoe.mirai.timpc.network.packet.buildSessionPacket +import net.mamoe.mirai.timpc.network.packet.* import net.mamoe.mirai.utils.io.* diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/FriendImage.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/FriendImage.kt index 3d718c674..4e538b886 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/FriendImage.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/FriendImage.kt @@ -10,10 +10,10 @@ import net.mamoe.mirai.message.data.ImageId import net.mamoe.mirai.message.data.ImageId0x06 import net.mamoe.mirai.message.data.requireLength import net.mamoe.mirai.network.BotNetworkHandler -import net.mamoe.mirai.network.packet.* import net.mamoe.mirai.timpc.network.TIMProtocol -import net.mamoe.mirai.timpc.network.packet.buildSessionPacket +import net.mamoe.mirai.timpc.network.packet.* import net.mamoe.mirai.utils.ExternalImage +import net.mamoe.mirai.utils.PacketVersion import net.mamoe.mirai.utils.io.* diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/FriendList.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/FriendList.kt index 2079b68a4..cd67ecbc1 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/FriendList.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/FriendList.kt @@ -5,8 +5,9 @@ package net.mamoe.mirai.timpc.network.packet.action import kotlinx.io.core.ByteReadPacket import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.Packet -import net.mamoe.mirai.network.packet.PacketId -import net.mamoe.mirai.network.packet.SessionPacketFactory +import net.mamoe.mirai.timpc.network.packet.PacketId + +import net.mamoe.mirai.timpc.network.packet.SessionPacketFactory // 0001 diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GradeInfo.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GradeInfo.kt index 25bdb947d..db5ee3f8c 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GradeInfo.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GradeInfo.kt @@ -7,9 +7,11 @@ import kotlinx.io.core.writeFully import kotlinx.io.core.writeUByte import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.Packet -import net.mamoe.mirai.network.packet.* +import net.mamoe.mirai.utils.NoLog + import net.mamoe.mirai.timpc.network.TIMProtocol -import net.mamoe.mirai.timpc.network.packet.buildOutgoingPacket +import net.mamoe.mirai.timpc.network.packet.* +import net.mamoe.mirai.utils.cryptor.encryptAndWrite import net.mamoe.mirai.utils.io.writeQQ /** diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GroupImage.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GroupImage.kt index 0d4b2b844..3bcce8cc2 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GroupImage.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GroupImage.kt @@ -11,8 +11,9 @@ import net.mamoe.mirai.message.data.requireLength import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.EventPacket import net.mamoe.mirai.data.ImageLink -import net.mamoe.mirai.network.packet.* -import net.mamoe.mirai.timpc.network.packet.buildSessionProtoPacket +import net.mamoe.mirai.timpc.network.packet.* +import net.mamoe.mirai.utils.PacketVersion + import net.mamoe.mirai.timpc.utils.assertUnreachable import net.mamoe.mirai.utils.ExternalImage import net.mamoe.mirai.utils.io.toUHexString diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GroupPacket.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GroupPacket.kt index 62f369ed2..e717aa12d 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GroupPacket.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/GroupPacket.kt @@ -10,12 +10,13 @@ import net.mamoe.mirai.data.Packet import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.message.internal.toPacket import net.mamoe.mirai.network.BotNetworkHandler -import net.mamoe.mirai.network.packet.* import net.mamoe.mirai.timpc.internal.RawGroupInfo import net.mamoe.mirai.timpc.network.TIMProtocol -import net.mamoe.mirai.timpc.network.packet.buildSessionPacket +import net.mamoe.mirai.timpc.network.packet.* import net.mamoe.mirai.timpc.utils.unsupportedFlag import net.mamoe.mirai.timpc.utils.unsupportedType +import net.mamoe.mirai.utils.NoLog +import net.mamoe.mirai.utils.PacketVersion import net.mamoe.mirai.utils.io.* import kotlin.collections.set diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/Profile.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/Profile.kt index 5d0cf04bb..f9e980127 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/Profile.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/Profile.kt @@ -8,8 +8,9 @@ import net.mamoe.mirai.data.Gender import net.mamoe.mirai.data.Packet import net.mamoe.mirai.data.Profile import net.mamoe.mirai.network.BotNetworkHandler -import net.mamoe.mirai.network.packet.* -import net.mamoe.mirai.timpc.network.packet.buildSessionPacket +import net.mamoe.mirai.timpc.network.packet.* +import net.mamoe.mirai.utils.PacketVersion + import net.mamoe.mirai.utils.io.* inline class AvatarLink(val value: String) : Packet diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/Remark.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/Remark.kt index de6dd7178..a591d1549 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/Remark.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/Remark.kt @@ -6,8 +6,9 @@ import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.FriendNameRemark -import net.mamoe.mirai.network.packet.* -import net.mamoe.mirai.timpc.network.packet.buildSessionPacket +import net.mamoe.mirai.timpc.network.packet.* +import net.mamoe.mirai.utils.PacketVersion + import net.mamoe.mirai.utils.io.readUShortLVString import net.mamoe.mirai.utils.io.writeQQ import net.mamoe.mirai.utils.io.writeZero diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/RequestFriendListPacket.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/RequestFriendListPacket.kt index 0183ba262..2e36224a3 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/RequestFriendListPacket.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/RequestFriendListPacket.kt @@ -3,11 +3,11 @@ package net.mamoe.mirai.timpc.network.packet.action import kotlinx.io.core.ByteReadPacket -import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.Packet -import net.mamoe.mirai.network.packet.* +import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.timpc.network.TIMProtocol -import net.mamoe.mirai.timpc.network.packet.buildSessionPacket +import net.mamoe.mirai.timpc.network.packet.* +import net.mamoe.mirai.utils.PacketVersion import net.mamoe.mirai.utils.io.writeZero class FriendList : Packet diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/SendFriendMessagePacket.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/SendFriendMessagePacket.kt index 98c4220e9..81ce639ef 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/SendFriendMessagePacket.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/action/SendFriendMessagePacket.kt @@ -7,9 +7,11 @@ import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.message.internal.toPacket import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.Packet -import net.mamoe.mirai.network.packet.* +import net.mamoe.mirai.utils.NoLog +import net.mamoe.mirai.utils.PacketVersion + import net.mamoe.mirai.timpc.network.TIMProtocol -import net.mamoe.mirai.timpc.network.packet.buildSessionPacket +import net.mamoe.mirai.timpc.network.packet.* import net.mamoe.mirai.utils.io.* import net.mamoe.mirai.utils.md5 diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/AndroidOnlineStatusChange.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/AndroidOnlineStatusChange.kt index 73e21fc24..c40dc9aef 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/AndroidOnlineStatusChange.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/AndroidOnlineStatusChange.kt @@ -6,7 +6,7 @@ import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import net.mamoe.mirai.Bot import net.mamoe.mirai.data.Packet -import net.mamoe.mirai.network.packet.PacketVersion +import net.mamoe.mirai.utils.PacketVersion import net.mamoe.mirai.utils.io.readBoolean diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/EventPacketFactory.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/EventPacketFactory.kt index 5f958ee87..22a287afa 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/EventPacketFactory.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/EventPacketFactory.kt @@ -6,10 +6,10 @@ import kotlinx.io.core.* import net.mamoe.mirai.Bot import net.mamoe.mirai.network.BotNetworkHandler import net.mamoe.mirai.data.Packet -import net.mamoe.mirai.network.packet.* +import net.mamoe.mirai.utils.NoLog import net.mamoe.mirai.timpc.network.TIMPCBotNetworkHandler import net.mamoe.mirai.qqAccount -import net.mamoe.mirai.timpc.network.packet.buildSessionPacket +import net.mamoe.mirai.timpc.network.packet.* import net.mamoe.mirai.utils.io.readIoBuffer /** diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendAddRequestEventPacket.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendAddRequestEventPacket.kt index 886abab5a..25144fd80 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendAddRequestEventPacket.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendAddRequestEventPacket.kt @@ -6,7 +6,7 @@ import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import net.mamoe.mirai.Bot import net.mamoe.mirai.event.events.ReceiveFriendAddRequestEvent -import net.mamoe.mirai.network.packet.PacketVersion +import net.mamoe.mirai.utils.PacketVersion import net.mamoe.mirai.utils.io.readQQ import net.mamoe.mirai.utils.io.readUShortLVString diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendConversationIniliaze.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendConversationIniliaze.kt index 87b46ff5c..fb3e77a80 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendConversationIniliaze.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendConversationIniliaze.kt @@ -6,7 +6,7 @@ import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import net.mamoe.mirai.Bot import net.mamoe.mirai.data.EventPacket -import net.mamoe.mirai.network.packet.PacketVersion +import net.mamoe.mirai.utils.PacketVersion import net.mamoe.mirai.utils.io.readQQ diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendOnlineStatusChanged.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendOnlineStatusChanged.kt index f4c162898..587d93899 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendOnlineStatusChanged.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/packet/event/FriendOnlineStatusChanged.kt @@ -5,11 +5,12 @@ package net.mamoe.mirai.timpc.network.packet.event import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import kotlinx.io.core.readUByte +import net.mamoe.mirai.data.OnlineStatus import net.mamoe.mirai.event.events.FriendStatusChanged import net.mamoe.mirai.network.BotNetworkHandler -import net.mamoe.mirai.network.packet.PacketId -import net.mamoe.mirai.network.packet.SessionPacketFactory -import net.mamoe.mirai.utils.OnlineStatus +import net.mamoe.mirai.timpc.network.packet.PacketId + +import net.mamoe.mirai.timpc.network.packet.SessionPacketFactory import net.mamoe.mirai.utils.io.readQQ /** @@ -21,7 +22,8 @@ internal object FriendOnlineStatusChangedPacket : SessionPacketFactory( - NoDecrypter -) { +internal object ChangeOnlineStatusPacket : PacketFactory(NoDecrypter) { operator fun invoke( bot: Long, sessionKey: SessionKey, @@ -29,7 +28,7 @@ internal object ChangeOnlineStatusPacket : PacketFactory BytePacketBuilder.writeProto(serializer: SerializationStrategy, obj: T) = writeFully(ProtoBuf.dump(serializer, obj)) diff --git a/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt b/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt index 51ec13712..fddfd3318 100644 --- a/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt +++ b/mirai-core-timpc/src/jvmTest/kotlin/PacketDebugger.kt @@ -16,14 +16,17 @@ import kotlinx.serialization.internal.ArrayListSerializer import kotlinx.serialization.json.Json import net.mamoe.mirai.Bot import net.mamoe.mirai.network.BotNetworkHandler -import net.mamoe.mirai.network.packet.* + import net.mamoe.mirai.timpc.TIMPC import net.mamoe.mirai.timpc.network.TIMProtocol +import net.mamoe.mirai.timpc.network.packet.* import net.mamoe.mirai.timpc.network.packet.event.FriendOnlineStatusChangedPacket import net.mamoe.mirai.timpc.network.packet.event.IgnoredEventPacket import net.mamoe.mirai.timpc.network.packet.login.* -import net.mamoe.mirai.utils.DecryptionFailedException -import net.mamoe.mirai.utils.decryptBy +import net.mamoe.mirai.utils.cryptor.Decrypter +import net.mamoe.mirai.utils.cryptor.DecryptionFailedException +import net.mamoe.mirai.utils.cryptor.NoDecrypter +import net.mamoe.mirai.utils.cryptor.decryptBy import net.mamoe.mirai.utils.io.* import org.pcap4j.core.BpfProgram.BpfCompileMode import org.pcap4j.core.PacketListener @@ -181,13 +184,13 @@ internal object PacketDebugger { * 8. 查看内存, `eax` 到 `eax+10` 的 16 字节就是 `sessionKey` */ val sessionKey: SessionKey = - SessionKey("95 F3 24 8E 7B B6 62 AA 98 C0 EE 45 CE CE 2B 69".hexToBytes()) + SessionKey("D8 D0 B0 DE 37 53 9B 05 A5 E7 AB 96 B2 AC AD EC".hexToBytes()) // TODO: 2019/12/7 无法访问 internal 是 kotlin bug, KT-34849 /** * null 则不筛选 */ - val qq: Long? = 761025446 + val qq: Long? = null /** * 打开后则记录每一个包到文件. */ @@ -204,7 +207,7 @@ internal object PacketDebugger { //println("raw = " + data.toUHexString()) data.read { discardExact(3) - val id = net.mamoe.mirai.network.packet.matchPacketId(readUShort()) + val id = matchPacketId(readUShort()) val sequenceId = readUShort() val packetQQ = readQQ() if (id == KnownPacketId.get() || (qq != null && packetQQ != qq)) @@ -301,7 +304,7 @@ internal object PacketDebugger { // 3E 03 3F A2 02 00 00 00 01 2E 01 00 00 69 35 discardExact(3)//head - val id = net.mamoe.mirai.network.packet.matchPacketId(readUShort()) + val id = net.mamoe.mirai.timpc.network.packet.matchPacketId(readUShort()) val sequence = readUShort().toUHexString() if (IgnoredPacketIdList.contains(id)) { return diff --git a/mirai-core-timpc/src/jvmTest/kotlin/packetdebugger/PacketDecoder.kt b/mirai-core-timpc/src/jvmTest/kotlin/packetdebugger/PacketDecoder.kt index c65e401eb..92e7ec885 100644 --- a/mirai-core-timpc/src/jvmTest/kotlin/packetdebugger/PacketDecoder.kt +++ b/mirai-core-timpc/src/jvmTest/kotlin/packetdebugger/PacketDecoder.kt @@ -3,8 +3,9 @@ package packetdebugger import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.discardExact import kotlinx.io.core.readUShort -import net.mamoe.mirai.network.packet.PacketId -import net.mamoe.mirai.network.packet.matchPacketId +import net.mamoe.mirai.timpc.network.packet.PacketId + +import net.mamoe.mirai.timpc.network.packet.matchPacketId import kotlin.contracts.ExperimentalContracts import kotlin.contracts.InvocationKind import kotlin.contracts.contract diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotFactory.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotFactory.kt index 8e200c5fe..0fc6e9f15 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotFactory.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotFactory.kt @@ -3,7 +3,7 @@ package net.mamoe.mirai import kotlinx.coroutines.CoroutineScope -import net.mamoe.mirai.network.packet.NullPacketId.factory + import net.mamoe.mirai.utils.BotConfiguration import net.mamoe.mirai.utils.MiraiLogger import kotlin.coroutines.CoroutineContext diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt index 2f6f80eb6..96ed916fc 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt @@ -4,7 +4,7 @@ package net.mamoe.mirai.contact import kotlinx.coroutines.CoroutineScope import net.mamoe.mirai.data.GroupInfo -import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail +import net.mamoe.mirai.utils.coerceAtLeastOrFail /** diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/OnlineStatus.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/OnlineStatus.kt new file mode 100644 index 000000000..4ba89683b --- /dev/null +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/OnlineStatus.kt @@ -0,0 +1,44 @@ +package net.mamoe.mirai.data + +/** + * 在线状态 + */ +enum class OnlineStatus(val id: Int) { + /** + * 我在线上 + */ + ONLINE(11), // 0x0A + /** + * 离线 + */ + OFFLINE(21), // 0x02 + /** + * 离开 + */ + AWAY(31), + /** + * 隐身 + */ + INVISIABLE(41), + /** + * 忙碌 + */ + BUSY(50), // 0x32 + /** + * Q 我吧 + */ + Q_ME(60), + /** + * 请勿打扰 + */ + DND(70), + /** + * 离线但接收消息 + */ + RECEIVE_OFFLINE_MESSAGE(95); + + companion object { + fun ofId(id: Int): OnlineStatus = values().first { it.id == id } + fun ofIdOrNull(id: Int): OnlineStatus? = values().firstOrNull { it.id == id } + } +} \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/FriendStatusChanged.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/FriendStatusChanged.kt index b889aca96..1d5fc15ef 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/FriendStatusChanged.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/FriendStatusChanged.kt @@ -2,7 +2,7 @@ package net.mamoe.mirai.event.events import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.data.EventPacket -import net.mamoe.mirai.utils.OnlineStatus +import net.mamoe.mirai.data.OnlineStatus data class FriendStatusChanged( val qq: QQ, diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessagePacket.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessagePacket.kt index 9353d58b3..0387bb327 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessagePacket.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessagePacket.kt @@ -10,7 +10,7 @@ import net.mamoe.mirai.data.ImageLink import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.message.data.* import net.mamoe.mirai.utils.* -import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail +import net.mamoe.mirai.utils.coerceAtLeastOrFail import kotlin.jvm.JvmName /** diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Annotations.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Annotations.kt deleted file mode 100644 index 6b0dba502..000000000 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Annotations.kt +++ /dev/null @@ -1,18 +0,0 @@ -@file:Suppress("EXPERIMENTAL_API_USAGE", "unused") - -package net.mamoe.mirai.network.packet - -/** - * 包的最后一次修改时间, 和分析时使用的 TIM 版本 - */ -@MustBeDocumented -@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) -@Retention(AnnotationRetention.SOURCE) -annotation class PacketVersion(val date: String, val timVersion: String) - -/** - * 带有这个注解的 [Packet] 将不会被记录在 log 中. - */ -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.RUNTIME) -annotation class NoLog \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt index cc5473379..20bdce50f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt @@ -36,3 +36,18 @@ annotation class MiraiExperimentalAPI( @Retention(AnnotationRetention.BINARY) @MustBeDocumented annotation class SinceMirai(val version: String) + +/** + * 包的最后一次修改时间, 和分析时使用的 TIM 版本 + */ +@MustBeDocumented +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY) +@Retention(AnnotationRetention.SOURCE) +annotation class PacketVersion(val date: String, val timVersion: String) + +/** + * 带有这个注解的 [Packet] 将不会被记录在 log 中. + */ +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +annotation class NoLog \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Calculation.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Calculation.kt index e56c96a57..13f67f445 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Calculation.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Calculation.kt @@ -5,24 +5,4 @@ import kotlinx.io.core.toByteArray import kotlinx.io.core.writeFully import net.mamoe.mirai.utils.io.getRandomByteArray -private const val GTK_BASE_VALUE: Int = 5381 - -fun getGTK(sKey: String): Int { - var value = GTK_BASE_VALUE - for (c in sKey.toByteArray()) { - value += (value shl 5) + c.toInt() - } - - value = value and Int.MAX_VALUE - return value -} - -@Tested -fun BytePacketBuilder.writeCRC32() = writeCRC32(getRandomByteArray(16)) - -fun BytePacketBuilder.writeCRC32(key: ByteArray) { - writeFully(key)//key - writeInt(crc32(key)) -} - fun md5(str: String): ByteArray = md5(str.toByteArray()) \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/NumberUtils.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/NumberUtils.kt similarity index 95% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/NumberUtils.kt rename to mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/NumberUtils.kt index e75b91998..1db24b31f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/NumberUtils.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/NumberUtils.kt @@ -1,4 +1,4 @@ -package net.mamoe.mirai.utils.internal +package net.mamoe.mirai.utils /** * 要求 [this] 最小为 [min]. diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/OnlineStatus.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/OnlineStatus.kt deleted file mode 100644 index 65e421819..000000000 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/OnlineStatus.kt +++ /dev/null @@ -1,52 +0,0 @@ -@file:Suppress("EXPERIMENTAL_UNSIGNED_LITERALS", "EXPERIMENTAL_API_USAGE", "unused") - -package net.mamoe.mirai.utils - -import kotlin.jvm.JvmStatic - -/** - * QQ 在线状态 - * - * @author Him188moe - * @see net.mamoe.mirai.timpc.network.packet.login.ChangeOnlineStatusPacket - */ -inline class OnlineStatus( - inline val id: UByte -) { - companion object { - /** - * 我在线上 - */ - @JvmStatic - val ONLINE = OnlineStatus(0x0Au) - - /** - * 忙碌 - */ - @JvmStatic - val BUSY = OnlineStatus(0x32u) - - /** - * 离线 ? 也可能是被删好友 TODO confirm that - */ - @JvmStatic - val OFFLINE = OnlineStatus(0x02u) - - @JvmStatic - val UNKNOWN1 = OnlineStatus(0x20u) - @JvmStatic - val UNKNOWN2 = OnlineStatus(0x46u) - @JvmStatic - val UNKNOWN3 = OnlineStatus(0x14u) - @JvmStatic - val UNKNOWN4 = OnlineStatus(0xC9u) - @JvmStatic - val UNKNOWN5 = OnlineStatus(0x1Eu) - } - - // TODO: 2019/10/29 what is 0x20u - // TODO: 2019/11/11 what is 0x46u - // TODO: 2019/11/11 what is 0x14u - // TODO: 2019/11/11 0xC9u - // TODO: 2019/11/11 0x1Eu -} diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Decrypters.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Decrypters.kt similarity index 85% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Decrypters.kt rename to mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Decrypters.kt index bc8eb89ab..f7e6bcb4f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/packet/Decrypters.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Decrypters.kt @@ -1,19 +1,11 @@ -package net.mamoe.mirai.network.packet +package net.mamoe.mirai.utils.cryptor import kotlinx.io.core.BytePacketBuilder import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.IoBuffer -import net.mamoe.mirai.utils.decryptBy import net.mamoe.mirai.utils.io.encryptAndWrite -/** - * 会话密匙 - */ -inline class SessionKey(override val value: ByteArray) : DecrypterByteArray { - companion object Type : DecrypterType -} - /** * [ByteArray] 解密器 */ diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Proto.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Proto.kt similarity index 94% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Proto.kt rename to mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Proto.kt index 6df1a8bd1..bff3e23bf 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Proto.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/Proto.kt @@ -1,6 +1,6 @@ @file:Suppress("EXPERIMENTAL_API_USAGE", "unused") -package net.mamoe.mirai.utils +package net.mamoe.mirai.utils.cryptor import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.readBytes @@ -24,7 +24,11 @@ import kotlin.jvm.JvmStatic * * https://www.jianshu.com/p/f888907adaeb */ -fun ProtoFieldId(serializedId: UInt): ProtoFieldId = ProtoFieldId(protoFieldNumber(serializedId), protoType(serializedId)) +fun ProtoFieldId(serializedId: UInt): ProtoFieldId = + ProtoFieldId( + protoFieldNumber(serializedId), + protoType(serializedId) + ) data class ProtoFieldId( val fieldNumber: Int, @@ -78,7 +82,8 @@ enum class ProtoType(val value: Byte, private val typeName: String) { * * serializedId = (fieldNumber << 3) | wireType */ -fun protoType(number: UInt): ProtoType = ProtoType.valueOf(number.toInt().shl(29).ushr(29).toByte()) +fun protoType(number: UInt): ProtoType = + ProtoType.valueOf(number.toInt().shl(29).ushr(29).toByte()) /** * ProtoBuf 序列化后的 id 转为序列前标记的 id diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TEA.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt similarity index 97% rename from mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TEA.kt rename to mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt index 54b808afd..dba788b6e 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TEA.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/cryptor/TEA.kt @@ -1,4 +1,4 @@ -package net.mamoe.mirai.utils +package net.mamoe.mirai.utils.cryptor import kotlinx.io.core.ByteReadPacket import kotlinx.io.core.IoBuffer @@ -29,7 +29,8 @@ class DecryptionFailedException : Exception { * @param key 长度至少为 16 * @throws DecryptionFailedException 解密错误时 */ -fun ByteArray.encryptBy(key: ByteArray, length: Int = this.size): ByteArray = TEA.encrypt(this, key, sourceLength = length) +fun ByteArray.encryptBy(key: ByteArray, length: Int = this.size): ByteArray = + TEA.encrypt(this, key, sourceLength = length) /** * 在 [ByteArrayPool] 缓存 [this], 然后使用 [key] 加密. @@ -339,11 +340,13 @@ private object TEA { @PublishedApi @JvmStatic - internal fun encrypt(source: ByteArray, key: ByteArray, sourceLength: Int = source.size): ByteArray = doOption(source, key, sourceLength, true) + internal fun encrypt(source: ByteArray, key: ByteArray, sourceLength: Int = source.size): ByteArray = + doOption(source, key, sourceLength, true) @PublishedApi @JvmStatic - internal fun decrypt(source: ByteArray, key: ByteArray, sourceLength: Int = source.size): ByteArray = doOption(source, key, sourceLength, false) + internal fun decrypt(source: ByteArray, key: ByteArray, sourceLength: Int = source.size): ByteArray = + doOption(source, key, sourceLength, false) private fun ByteArray.pack(offset: Int, len: Int): Long { var result: Long = 0 diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/InlinedRemoveIf.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/InlinedRemoveIf.kt deleted file mode 100644 index 32ecd0223..000000000 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/internal/InlinedRemoveIf.kt +++ /dev/null @@ -1,15 +0,0 @@ -@file:JvmName("IterableUtil") - -package net.mamoe.mirai.utils.internal - -import kotlin.jvm.JvmName - -internal inline fun MutableIterable.inlinedRemoveIf(predicate: (T) -> Boolean) = iterator().inlinedRemoveIf(predicate) - -internal inline fun MutableIterator.inlinedRemoveIf(predicate: (T) -> Boolean) { - while (this.hasNext()) { - if (predicate(this.next())) { - this.remove() - } - } -} \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt index b5186aef2..ee1049c08 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/OutputUtils.kt @@ -4,15 +4,13 @@ package net.mamoe.mirai.utils.io import kotlinx.io.core.* import kotlinx.io.pool.useInstance -import kotlinx.serialization.SerializationStrategy -import kotlinx.serialization.protobuf.ProtoBuf import net.mamoe.mirai.contact.GroupId import net.mamoe.mirai.contact.GroupInternalId import net.mamoe.mirai.utils.Tested +import net.mamoe.mirai.utils.coerceAtMostOrFail +import net.mamoe.mirai.utils.cryptor.encryptBy import net.mamoe.mirai.utils.currentTime import net.mamoe.mirai.utils.deviceName -import net.mamoe.mirai.utils.encryptBy -import net.mamoe.mirai.utils.internal.coerceAtMostOrFail import kotlin.random.Random import kotlin.random.nextInt @@ -28,6 +26,18 @@ fun BytePacketBuilder.writeQQ(qq: Long) = this.writeUInt(qq.toUInt()) // same bi fun BytePacketBuilder.writeGroup(groupId: GroupId) = this.writeUInt(groupId.value.toUInt()) fun BytePacketBuilder.writeGroup(groupInternalId: GroupInternalId) = this.writeUInt(groupInternalId.value.toUInt()) +fun BytePacketBuilder.writeShortLVByteArrayLimitedLength(array: ByteArray, maxLength: Int) { + if (array.size <= maxLength) { + writeShort(array.size.toShort()) + writeFully(array) + } else { + writeShort(maxLength.toShort()) + repeat(maxLength) { + writeByte(array[it]) + } + } +} + fun BytePacketBuilder.writeShortLVByteArray(byteArray: ByteArray) { this.writeShort(byteArray.size.toShort()) this.writeFully(byteArray) @@ -63,8 +73,6 @@ fun BytePacketBuilder.writeHex(uHex: String) { } } -fun BytePacketBuilder.writeProto(serializer: SerializationStrategy, obj: T) = writeFully(ProtoBuf.dump(serializer, obj)) - fun BytePacketBuilder.writeTLV(tag: UByte, values: UByteArray) { writeUByte(tag) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/TypeConversion.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/TypeConversion.kt index 659e326cf..7d0c10f57 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/TypeConversion.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/TypeConversion.kt @@ -92,6 +92,12 @@ fun String.hexToBytes(): ByteArray = .map { s -> s.toUByte(16).toByte() } .toByteArray() +/** + * 每 2 char 为一组, 转换 Hex 为 [ByteArray] + */ +fun String.chunkedHexToBytes(): ByteArray = + this.chunked(2).map { it.toUByte(16).toByte() }.toByteArray() + /** * 将无符号 Hex 转为 [UByteArray], 有根据 hex 的 [hashCode] 建立的缓存. */ diff --git a/mirai-core/src/jvmTest/kotlin/mirai/test/testCaptchaPacket/TestCaptchaPacket.kt b/mirai-core/src/jvmTest/kotlin/mirai/test/testCaptchaPacket/TestCaptchaPacket.kt index b0ef6122f..52c712fa2 100644 --- a/mirai-core/src/jvmTest/kotlin/mirai/test/testCaptchaPacket/TestCaptchaPacket.kt +++ b/mirai-core/src/jvmTest/kotlin/mirai/test/testCaptchaPacket/TestCaptchaPacket.kt @@ -1,6 +1,6 @@ package mirai.test.testCaptchaPacket -import net.mamoe.mirai.utils.decryptBy +import net.mamoe.mirai.utils.cryptor.decryptBy import net.mamoe.mirai.utils.io.hexToBytes import net.mamoe.mirai.utils.io.toUHexString diff --git a/mirai-debug/build.gradle.kts b/mirai-debug/build.gradle.kts index 2ccfe8a02..3f8bebf1f 100644 --- a/mirai-debug/build.gradle.kts +++ b/mirai-debug/build.gradle.kts @@ -41,7 +41,7 @@ fun ktor(id: String, version: String) = "io.ktor:ktor-$id:$version" dependencies { - implementation(files("../mirai-core-timpc/build/classes/kotlin/jvm/main")) // IDE bug + runtimeOnly(files("../mirai-core-timpc/build/classes/kotlin/jvm/main")) // IDE bug implementation(project(":mirai-core-timpc")) // runtimeOnly(files("../mirai-core/build/classes/kotlin/jvm/main")) // classpath is not added correctly by IDE diff --git a/mirai-debug/src/main/kotlin/test/ProtoTest.kt b/mirai-debug/src/main/kotlin/test/ProtoTest.kt index 4324c2aad..6b81f94ff 100644 --- a/mirai-debug/src/main/kotlin/test/ProtoTest.kt +++ b/mirai-debug/src/main/kotlin/test/ProtoTest.kt @@ -7,10 +7,10 @@ import kotlinx.serialization.protobuf.ProtoBuf import kotlinx.serialization.protobuf.ProtoNumberType import kotlinx.serialization.protobuf.ProtoType import net.mamoe.mirai.utils.MiraiInternalAPI +import net.mamoe.mirai.utils.cryptor.readProtoMap import net.mamoe.mirai.utils.io.hexToBytes import net.mamoe.mirai.utils.io.read import net.mamoe.mirai.utils.io.toUHexString -import net.mamoe.mirai.utils.readProtoMap import kotlin.reflect.KClass @Serializable