From 0b667ba355e17f1e378831e675d4ac04f19efc4e Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 9 Oct 2019 20:22:53 +0800 Subject: [PATCH] Sealed messages --- .../kotlin/net/mamoe/mirai/contact/Contact.kt | 8 +- .../kotlin/net/mamoe/mirai/contact/Group.kt | 2 +- .../kotlin/net/mamoe/mirai/contact/QQ.kt | 4 +- .../net/mamoe/mirai/event/Subscribers.kt | 2 + .../mamoe/mirai/event/events/FriendEvents.kt | 2 +- .../mamoe/mirai/event/events/GroupEvents.kt | 2 +- .../event/internal/InternalEventListenres.kt | 5 +- .../kotlin/net/mamoe/mirai/message/FaceID.kt | 1 - .../kotlin/net/mamoe/mirai/message/Message.kt | 209 +++++++----------- .../net/mamoe/mirai/message/MessageKey.kt | 8 - .../net/mamoe/mirai/message/MessageType.kt | 18 ++ .../net/mamoe/mirai/message/Messages.kt | 16 ++ .../message/{defaults => }/UnsolvedImage.kt | 8 +- .../net/mamoe/mirai/message/defaults/At.kt | 34 --- .../net/mamoe/mirai/message/defaults/Face.kt | 68 ------ .../net/mamoe/mirai/message/defaults/Image.kt | 96 -------- .../mirai/message/defaults/MessageChain.kt | 168 -------------- .../mamoe/mirai/message/defaults/PlainText.kt | 48 ---- .../mirai/message/internal/MessageData.kt | 171 ++++++++++++++ .../tim/handler/MessagePacketHandler.kt | 2 +- .../protocol/tim/packet/ClientPacket.kt | 10 +- .../protocol/tim/packet/ServerEvent.kt | 4 +- .../action/ClientSendFriendMessagePacket.kt | 3 +- .../action/ClientSendGroupMessagePacket.kt | 3 +- .../kotlin/net/mamoe/mirai/utils/ECDH.kt | 42 ---- mirai-debug/src/main/java/PacketDebuger.kt | 4 +- mirai-debug/src/main/resources/packets.txt | 50 ----- .../mirai-demo-1/src/main/java/demo1/Main.kt | 12 +- 28 files changed, 325 insertions(+), 675 deletions(-) delete mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageKey.kt create mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageType.kt create mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/Messages.kt rename mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/{defaults => }/UnsolvedImage.kt (93%) delete mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/At.kt delete mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/Face.kt delete mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/Image.kt delete mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/MessageChain.kt delete mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/PlainText.kt create mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/internal/MessageData.kt delete mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ECDH.kt delete mode 100644 mirai-debug/src/main/resources/packets.txt diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/Contact.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/Contact.kt index d469dfb3a..09f75300c 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/Contact.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/Contact.kt @@ -2,10 +2,7 @@ package net.mamoe.mirai.contact import kotlinx.coroutines.CompletableDeferred import net.mamoe.mirai.Bot -import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.defaults.MessageChain -import net.mamoe.mirai.message.defaults.PlainText -import net.mamoe.mirai.message.defaults.UnsolvedImage +import net.mamoe.mirai.message.* import net.mamoe.mirai.network.LoginSession /** @@ -43,8 +40,5 @@ abstract class Contact internal constructor(val bot: Bot, val number: Long) { this.sendMessage(MessageChain(message)) } - /** - * Async - */ abstract suspend fun sendXMLMessage(message: String) } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/Group.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/Group.kt index 16c5a88f2..a96c51eee 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/Group.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/Group.kt @@ -2,7 +2,7 @@ package net.mamoe.mirai.contact import net.mamoe.mirai.Bot import net.mamoe.mirai.contact.Group.Companion.groupNumberToId -import net.mamoe.mirai.message.defaults.MessageChain +import net.mamoe.mirai.message.MessageChain import net.mamoe.mirai.utils.ContactList import java.io.Closeable diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/QQ.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/QQ.kt index e6e9c08ea..39c576eab 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/QQ.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/contact/QQ.kt @@ -1,9 +1,9 @@ package net.mamoe.mirai.contact import net.mamoe.mirai.Bot +import net.mamoe.mirai.message.At import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.defaults.At -import net.mamoe.mirai.message.defaults.MessageChain +import net.mamoe.mirai.message.MessageChain /** * QQ 账号. diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/Subscribers.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/Subscribers.kt index c24267f04..ee3b613ec 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/Subscribers.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/Subscribers.kt @@ -1,3 +1,5 @@ +@file:Suppress("unused") + package net.mamoe.mirai.event import net.mamoe.mirai.event.internal.Handler diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/FriendEvents.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/FriendEvents.kt index b65d99569..29ba2d365 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/FriendEvents.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/FriendEvents.kt @@ -3,7 +3,7 @@ package net.mamoe.mirai.event.events import net.mamoe.mirai.Bot import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.defaults.MessageChain +import net.mamoe.mirai.message.MessageChain /** * @author Him188moe diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/GroupEvents.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/GroupEvents.kt index 161d39b7b..486b54955 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/GroupEvents.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/events/GroupEvents.kt @@ -4,7 +4,7 @@ import net.mamoe.mirai.Bot import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.QQ import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.defaults.MessageChain +import net.mamoe.mirai.message.MessageChain /** * @author Him188moe diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/InternalEventListenres.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/InternalEventListenres.kt index 2d0aa7dad..6837f1593 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/InternalEventListenres.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/internal/InternalEventListenres.kt @@ -13,6 +13,7 @@ import net.mamoe.mirai.utils.BotAccount import net.mamoe.mirai.utils.Console import kotlin.reflect.KClass import kotlin.reflect.full.allSuperclasses +import kotlin.reflect.full.isSuperclassOf /** * 监听和广播实现 @@ -75,8 +76,8 @@ internal suspend fun E.broadcastInternal(): E { callListeners(this::class.listeners as EventListeners) this::class.allSuperclasses.forEach { //println("super: " + it.simpleName) - //todo multi platform - if (Event::class.java.isAssignableFrom(it.java)) { + + if (Event::class.isSuperclassOf(it)) { callListeners((it as KClass).listeners as EventListeners) } } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/FaceID.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/FaceID.kt index 7cf822298..46ca1f5a8 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/FaceID.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/FaceID.kt @@ -2,7 +2,6 @@ package net.mamoe.mirai.message /** * @author LamGC - * @author Him188moe */ @Suppress("EnumEntryName", "unused", "SpellCheckingInspection") enum class FaceID constructor(val id: Int) { diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/Message.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/Message.kt index bb7a5c445..f97a5c0a6 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/Message.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/Message.kt @@ -1,10 +1,10 @@ +@file:Suppress("MemberVisibilityCanBePrivate") + package net.mamoe.mirai.message import net.mamoe.mirai.contact.Contact import net.mamoe.mirai.contact.QQ -import net.mamoe.mirai.message.defaults.* import java.awt.image.BufferedImage -import java.io.File import java.util.* @@ -24,150 +24,109 @@ import java.util.* * qq.sendMessage(message + "world") * ``` * - * @author Him188moe + * 但注意: 不能 `String + Message`. 只能 `Message + String` + * * @see Contact.sendMessage */ -abstract class Message { - internal abstract val type: MessageKey +sealed class Message { + /** + * 易读的 [String] 值 + * 如: + * ``` + * [@123456789] + * [face123] + * ``` + */ + abstract val stringValue: String - private var toStringCache: String? = null - private val cacheLock = object : Any() {} + final override fun toString(): String = stringValue - internal abstract fun toStringImpl(): String + infix fun eq(other: Message): Boolean = this == other /** - * 得到用户层的文本消息. 如: - * - [PlainText] 得到 消息内容 - * - [Image] 得到 "{ID}.png" - * - [At] 得到 "[@qq]" + * 将 [stringValue] 与 [other] 比较 */ - final override fun toString(): String { - synchronized(cacheLock) { - if (toStringCache != null) { - return toStringCache!! - } + infix fun eq(other: String): Boolean = this.stringValue == other - this.toStringCache = toStringImpl() - return toStringCache!! - } - } - - internal fun clearToStringCache() { - synchronized(cacheLock) { - toStringCache = null - } - } - - /** - * 得到类似 "PlainText(内容)", "Image(ID)" - */ - open fun toObjectString(): String { - return this.javaClass.simpleName + String.format("(%s)", this.toString()) - } - - /** - * 转换为数据包使用的 byte array - */ - abstract fun toByteArray(): ByteArray - - - /** - * 比较两个 Message 的内容是否相等. 如: - * - [PlainText] 比较 [PlainText.text] - * - [Image] 比较 [Image.imageId] - */ - abstract infix fun eq(another: Message): Boolean - - /** - * 将这个消息的 [toString] 与 [another] 比较 - */ - infix fun eq(another: String): Boolean = this.toString() == another - - /** - * 判断 [sub] 是否存在于本消息中 - */ abstract operator fun contains(sub: String): Boolean /** - * 把这个消息连接到另一个消息的头部. 相当于字符串相加 - * - * - * Connects this Message to the head of another Message. - * That is, another message becomes the tail of this message. - * This method does similar to [String.concat] - * - * - * E.g.: - * PlainText a = new PlainText("Hello "); - * PlainText b = new PlainText("world"); - * PlainText c = a.concat(b); - * - * - * the text of c is "Hello world" - * - * @param tail tail - * @return message connected + * 把这个消息连接到另一个消息的头部. 类似于字符串相加 */ - open fun concat(tail: Message): MessageChain { - if (tail is MessageChain) { - return MessageChain(this).let { - tail.list.forEach { child -> it.concat(child) } - it - } - } - return MessageChain(this, Objects.requireNonNull(tail)) - } + open fun concat(tail: Message): MessageChain = + if (tail is MessageChain) MessageChain(this).also { tail.list.forEach { child -> it.concat(child) } } + else MessageChain(this, Objects.requireNonNull(tail)) - fun concat(tail: String): MessageChain { - return concat(PlainText(tail)) - } - - - infix fun withImage(imageId: String): MessageChain = this + Image(imageId) - fun withImage(filename: String, image: BufferedImage): MessageChain = this + UnsolvedImage(filename, image) - infix fun withImage(imageFile: File): MessageChain = this + UnsolvedImage(imageFile) - - infix fun withAt(target: QQ): MessageChain = this + target.at() - infix fun withAt(target: Long): MessageChain = this + At(target) - - - open fun toChain(): MessageChain { - return MessageChain(this) - } - - - /* For Kotlin */ - - /** - * 实现使用 '+' 操作符连接 [Message] 与 [Message] - */ infix operator fun plus(another: Message): MessageChain = this.concat(another) + infix operator fun plus(another: String): MessageChain = this.concat(another.toMessage()) + infix operator fun plus(another: Number): MessageChain = this.concat(another.toString().toMessage()) +} + +data class PlainText(override val stringValue: String) : Message() { + override operator fun contains(sub: String): Boolean = this.stringValue.contains(sub) +} + +/** + * 图片消息. + * 由接收消息时构建, 可直接发送 + * + * @param imageId 类似 `{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg`. 群的是大写id, 好友的是小写id + */ +data class Image(val imageId: String) : Message() { + override val stringValue: String = "[$imageId]" + override operator fun contains(sub: String): Boolean = false //No string can be contained in a image +} + +/** + * At 一个人 + */ +data class At(val target: Long) : Message() { + constructor(target: QQ) : this(target.number) + + override val stringValue: String = "[@$target]" + override operator fun contains(sub: String): Boolean = false +} + +/** + * QQ 自带表情 + */ +data class Face(val id: FaceID) : Message() { + override val stringValue: String = "[face${id.id}]" + override operator fun contains(sub: String): Boolean = false +} + +data class MessageChain( + /** + * Elements will not be instances of [MessageChain] + */ + val list: MutableList +) : Message(), Iterable { + constructor() : this(mutableListOf()) + constructor(vararg messages: Message) : this(mutableListOf(*messages)) + constructor(messages: Iterable) : this(messages.toMutableList()) + + val size: Int = list.size + + override val stringValue: String get() = this.list.joinToString("") { it.stringValue } + + override fun iterator(): Iterator = this.list.iterator() /** - * 实现使用 '+' 操作符连接 [Message] 与 [String] + * 获取第一个 [M] 类型的实例 + * @throws [NoSuchElementException] 如果找不到该类型的实例 */ - infix operator fun plus(another: String): MessageChain = this.concat(another) + inline fun first(): Message = this.list.first { M::class.isInstance(it) } /** - * 实现使用 '+' 操作符连接 [Message] 与 [Number] + * 获取第一个 [M] 类型的实例 */ - infix operator fun plus(another: Number): MessageChain = this.concat(another.toString()) + inline fun firstOrNull(): Message? = this.list.firstOrNull { M::class.isInstance(it) } - /** - * 连接 [String] 与 [Message] - */ - fun String.concat(another: Message): MessageChain = PlainText(this).concat(another) + override operator fun contains(sub: String): Boolean = list.any { it.contains(sub) } - override fun hashCode(): Int { - return javaClass.hashCode() - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is Message) return false - - if (type != other.type) return false - - return this.toString() == other.toString() + override fun concat(tail: Message): MessageChain { + if (tail is MessageChain) tail.list.forEach { child -> this.concat(child) } + else this.list.add(tail) + return this } } \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageKey.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageKey.kt deleted file mode 100644 index d42560334..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageKey.kt +++ /dev/null @@ -1,8 +0,0 @@ -package net.mamoe.mirai.message - -/** - * @author Him188moe - */ -open class MessageKey( - val intValue: Int -) \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageType.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageType.kt new file mode 100644 index 000000000..c64483965 --- /dev/null +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/MessageType.kt @@ -0,0 +1,18 @@ +@file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_UNSIGNED_LITERALS") + +package net.mamoe.mirai.message + +/** + * @author Him188moe + */ +@Suppress("unused") +enum class MessageType(private val value: UByte) { + PLAIN_TEXT(0x03u), + AT(0x06u), + FACE(0x02u), + IMAGE(0x03u),//may be 0x06? + ; + + + val intValue: Int = this.value.toInt() +} \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/Messages.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/Messages.kt new file mode 100644 index 000000000..000b48815 --- /dev/null +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/Messages.kt @@ -0,0 +1,16 @@ +package net.mamoe.mirai.message + +// Message 扩展方法 +/** + * 构造 [PlainText] + */ +fun String.toMessage(): PlainText = PlainText(this) + +/** + * 用 `this` 构造 [MessageChain] + */ +fun Message.toChain(): MessageChain = if (this is MessageChain) this else MessageChain(this) + +fun MessageChain.containsType(clazz: Class): Boolean = list.any { clazz.isInstance(it) } + +operator fun MessageChain.contains(sub: Class): Boolean = containsType(sub) \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/UnsolvedImage.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/UnsolvedImage.kt similarity index 93% rename from mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/UnsolvedImage.kt rename to mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/UnsolvedImage.kt index 88ba91ec3..83e3c7b1d 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/UnsolvedImage.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/UnsolvedImage.kt @@ -1,4 +1,4 @@ -package net.mamoe.mirai.message.defaults +package net.mamoe.mirai.message import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Dispatchers @@ -25,7 +25,7 @@ import javax.imageio.ImageIO * @suppress todo 重新设计 * @author Him188moe */ -class UnsolvedImage(filename: String, val image: BufferedImage) : Image(getImageId(filename)) { +class UnsolvedImage(private val filename: String, val image: BufferedImage) { constructor(imageFile: File) : this(imageFile.name, ImageIO.read(imageFile)) constructor(url: URL) : this(File(url.file)) @@ -52,6 +52,10 @@ class UnsolvedImage(filename: String, val image: BufferedImage) : Image(getImage } } + fun toImage(): Image { + return Image(getImageId(filename)) + } + companion object { @JvmStatic diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/At.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/At.kt deleted file mode 100644 index 95796949e..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/At.kt +++ /dev/null @@ -1,34 +0,0 @@ -package net.mamoe.mirai.message.defaults - -import net.mamoe.mirai.contact.QQ -import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.MessageKey - -/** - * At 一个人 - * - * @author Him188moe - */ -class At(val target: Long) : Message() { - companion object Key : MessageKey(0x06) - - override val type: MessageKey = Key - - constructor(target: QQ) : this(target.number) - - override fun toStringImpl(): String = "[@$target]" - - override fun toByteArray(): ByteArray { - TODO() - } - - override operator fun contains(sub: String): Boolean = false - - override fun eq(another: Message): Boolean { - if (another !is At) { - return false - } - - return another.target == this.target - } -} diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/Face.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/Face.kt deleted file mode 100644 index 0b5eecf33..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/Face.kt +++ /dev/null @@ -1,68 +0,0 @@ -package net.mamoe.mirai.message.defaults - -import net.mamoe.mirai.message.FaceID -import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.MessageKey -import net.mamoe.mirai.network.protocol.tim.packet.readLVNumber -import net.mamoe.mirai.network.protocol.tim.packet.writeHex -import net.mamoe.mirai.network.protocol.tim.packet.writeLVByteArray -import net.mamoe.mirai.utils.dataDecode -import net.mamoe.mirai.utils.dataEncode - -/** - * QQ 自带表情 - * - * @author Him188moe - */ -class Face(val id: FaceID) : Message() { - companion object Key : MessageKey(0x02) - - override val type: MessageKey = Key - - override fun toStringImpl(): String { - return "[face${id.id}]" - } - - override fun toObjectString(): String { - return "Face[$id]" - } - - override fun toByteArray(): ByteArray = dataEncode { section -> - section.writeByte(this.type.intValue) - - section.writeLVByteArray(dataEncode { child -> - child.writeShort(1) - child.writeByte(this.id.id) - - child.writeHex("0B 00 08 00 01 00 04 52 CC F5 D0 FF") - - child.writeShort(2) - child.writeByte(0x14)//?? - child.writeByte(this.id.id + 65) - }) - } - - - override fun eq(another: Message): Boolean { - if (another !is Face) { - return false - } - return this.id == another.id - } - - override operator fun contains(sub: String): Boolean = false - - object PacketHelper { - fun ofByteArray(data: ByteArray): Face = dataDecode(data) { - //00 01 AF 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 F0 - //00 01 0C 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 4D - it.skip(1) - - val id1 = FaceID.ofId(it.readLVNumber().toInt())//可能这个是id, 也可能下面那个 - it.skip(it.readByte().toLong()) - it.readLVNumber()//某id? - return@dataDecode Face(id1) - } - } -} - diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/Image.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/Image.kt deleted file mode 100644 index 459349e7b..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/Image.kt +++ /dev/null @@ -1,96 +0,0 @@ -package net.mamoe.mirai.message.defaults - -import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.MessageKey -import net.mamoe.mirai.network.protocol.tim.packet.* -import net.mamoe.mirai.utils.dataDecode -import net.mamoe.mirai.utils.dataEncode -import net.mamoe.mirai.utils.skip -import net.mamoe.mirai.utils.toUHexString - -/** - * 图片消息. - * 由接收消息时构建, 可直接发送 - * - * @param imageId 类似 `{7AA4B3AA-8C3C-0F45-2D9B-7F302A0ACEAA}.jpg`. 群的是大写id, 好友的是小写id - * - * @author Him188moe - */ -open class Image(val imageId: String) : Message() { - companion object Key : MessageKey(0x03) - - override val type: MessageKey = Key - - override fun toStringImpl(): String { - return "[$imageId]" - } - - override fun toObjectString(): String { - return "Image[$imageId]" - } - - override fun toByteArray(): ByteArray = dataEncode { section -> - section.writeByte(intValue) - - section.writeLVByteArray(dataEncode { child -> - child.writeByte(0x02) - child.writeLVString(this.imageId) - child.writeHex("04 00 " + - "04 9B 53 B0 08 " + - "05 00 " + - "04 D9 8A 5A 70 " + - "06 00 " + - "04 00 00 00 50 " + - "07 00 " + - "01 43 08 00 00 09 00 01 01 0B 00 00 14 00 04 11 00 00 00 15 00 04 00 00 02 BC 16 00 04 00 00 02 BC 18 00 04 00 00 7D 5E FF 00 5C 15 36 20 39 32 6B 41 31 43 39 62 35 33 62 30 30 38 64 39 38 61 35 61 37 30 20") - child.writeHex("20 20 20 20 20 35 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20") - child.writeBytes(this.imageId) - child.writeByte(0x41) - }) - } - - override fun eq(another: Message): Boolean { - if (another is Image) { - return this.imageId == another.imageId - } - - return false - } - - override operator fun contains(sub: String): Boolean = false //No string can be contained in a image - - object PacketHelper { - @JvmStatic - fun ofByteArray0x06(data: ByteArray): Image = dataDecode(data) { - it.skip(1) - println("好友的图片") - println(data.toUHexString()) - val filenameLength = it.readShort() - val suffix = it.readString(filenameLength).substringAfter(".") - it.skip(data.size - 37 - 1 - filenameLength - 2) - val imageId = String(it.readNBytes(36)) - println(imageId) - it.skip(1)//0x41 - return@dataDecode Image("{$imageId}.$suffix") - } - - @JvmStatic - fun ofByteArray0x03(data: ByteArray): Image = dataDecode(data) { - it.skip(1) - return@dataDecode Image(String(it.readLVByteArray())) - /* - println(String(it.readLVByteArray())) - it.readTLVMap() - return@dataDecode Image(String(it.readLVByteArray().cutTail(5).getRight(42))) - / - it.skip(data.size - 47) - val imageId = String(it.readNBytes(42)) - it.skip(1)//0x41 - it.skip(1)//0x42 - it.skip(1)//0x43 - it.skip(1)//0x41 - - return@dataDecode Image(imageId)*/ - } - } -} \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/MessageChain.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/MessageChain.kt deleted file mode 100644 index 8e7be7c4b..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/MessageChain.kt +++ /dev/null @@ -1,168 +0,0 @@ -package net.mamoe.mirai.message.defaults - -import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.MessageKey -import net.mamoe.mirai.network.protocol.tim.packet.readLVByteArray -import net.mamoe.mirai.network.protocol.tim.packet.readNBytes -import net.mamoe.mirai.utils.dataDecode -import net.mamoe.mirai.utils.dataEncode -import net.mamoe.mirai.utils.toUHexString -import java.io.DataInputStream -import java.util.* -import java.util.stream.Collectors -import java.util.stream.Stream -import kotlin.reflect.KClass - -class MessageChain : Message { - companion object Key : MessageKey(0xff)//only used to compare - - override val type: MessageKey = Key - - /** - * Elements will not be instances of [MessageChain] - */ - val list: MutableList = Collections.synchronizedList(LinkedList()) - - constructor(head: Message, tail: Message) { - Objects.requireNonNull(head) - Objects.requireNonNull(tail) - - list.add(head) - list.add(tail) - } - - constructor(message: Message) { - Objects.requireNonNull(message) - list.add(message) - } - - constructor(messages: Collection) { - list.addAll(messages) - } - - constructor() - - /** - * 获取第一个这个类型的消息 - */ - operator fun get(type: MessageKey): Message? = list.firstOrNull { it.type == type } - - fun size(): Int { - return list.size - } - - fun containsType(clazz: KClass): Boolean = list.any { clazz.isInstance(it) } - fun containsType(clazz: Class): Boolean = list.any { clazz.isInstance(it) } - operator fun contains(sub: KClass): Boolean = containsType(sub) - operator fun contains(sub: Class): Boolean = containsType(sub) - - fun stream(): Stream { - return list.stream() - } - - override fun toStringImpl(): String { - return this.list.stream().map { it.toString() }.collect(Collectors.joining("")) - } - - override fun toObjectString(): String { - return String.format("MessageChain(%s)", this.list.stream().map { it.toObjectString() }.collect(Collectors.joining(", "))) - } - - override fun concat(tail: Message): MessageChain { - if (tail is MessageChain) { - tail.list.forEach { child -> this.concat(child) } - return this - } - this.list.add(tail) - clearToStringCache() - return this - } - - override fun toChain(): MessageChain { - return this - } - - override fun toByteArray(): ByteArray = dataEncode { - stream().forEach { message -> - it.write(message.toByteArray()) - } - } - - override fun eq(another: Message): Boolean { - if (another !is MessageChain) { - return false - } - return this.list == another.list - } - - override operator fun contains(sub: String): Boolean = list.any { it.contains(sub) } - - operator fun component1(): Message = this.list[0] - operator fun component2(): Message = this.list[1] - operator fun component3(): Message = this.list[2] - - object PacketHelper { - @JvmStatic - fun ofByteArray(byteArray: ByteArray): MessageChain = dataDecode(byteArray) { - it.readMessageChain() - } - } -} - -fun DataInputStream.readMessage(): Message? { - val messageType = this.readByte().toInt() - val sectionLength = this.readShort().toLong()//sectionLength: short - val sectionData = this.readNBytes(sectionLength) - return when (messageType) { - 0x01 -> PlainText.PacketHelper.ofByteArray(sectionData) - 0x02 -> Face.PacketHelper.ofByteArray(sectionData) - 0x03 -> Image.PacketHelper.ofByteArray0x03(sectionData) - 0x06 -> Image.PacketHelper.ofByteArray0x06(sectionData) - - - 0x19 -> {//长文本 - val value = readLVByteArray() - //todo 未知压缩算法 - PlainText(String(value)) - - // PlainText(String(GZip.uncompress( value))) - } - - - 0x14 -> {//长文本 - val value = readLVByteArray() - println(value.size) - println(value.toUHexString()) - //todo 未知压缩算法 - this.skip(7)//几个TLV - return PlainText(String(value)) - } - - 0x0E -> { - //null - null - } - - else -> { - println("未知的messageType=0x${messageType.toByte().toUHexString()}") - println("后文=${this.readAllBytes().toUHexString()}") - null - } - } - -} - -fun DataInputStream.readMessageChain(): MessageChain { - val chain = MessageChain() - var got: Message? = null - do { - if (got != null) { - chain.concat(got) - } - if (this.available() == 0) { - return chain - } - got = this.readMessage() - } while (got != null) - return chain -} \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/PlainText.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/PlainText.kt deleted file mode 100644 index 86748f93e..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/defaults/PlainText.kt +++ /dev/null @@ -1,48 +0,0 @@ -package net.mamoe.mirai.message.defaults - -import net.mamoe.mirai.message.Message -import net.mamoe.mirai.message.MessageKey -import net.mamoe.mirai.network.protocol.tim.packet.readLVString -import net.mamoe.mirai.network.protocol.tim.packet.writeLVByteArray -import net.mamoe.mirai.network.protocol.tim.packet.writeLVString -import net.mamoe.mirai.utils.dataDecode -import net.mamoe.mirai.utils.dataEncode - -/** - * @author Him188moe - */ -class PlainText(private val text: String) : Message() { - companion object Key : MessageKey(0x01) - - override val type: MessageKey = Key - - override fun toStringImpl(): String { - return text - } - - override fun toByteArray(): ByteArray = dataEncode { section -> - section.writeByte(this.type.intValue) - - section.writeLVByteArray(dataEncode { child -> - child.writeByte(0x01) - child.writeLVString(this.text) - }) - } - - override fun eq(another: Message): Boolean { - if (another !is PlainText) { - return false - } - return this.text == another.text - } - - override operator fun contains(sub: String): Boolean = this.toString().contains(sub) - - object PacketHelper { - @JvmStatic - fun ofByteArray(data: ByteArray): PlainText = dataDecode(data) { - it.skip(1) - PlainText(it.readLVString()) - } - } -} diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/internal/MessageData.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/internal/MessageData.kt new file mode 100644 index 000000000..8e52305d6 --- /dev/null +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/message/internal/MessageData.kt @@ -0,0 +1,171 @@ +package net.mamoe.mirai.message.internal + +import net.mamoe.mirai.message.* +import net.mamoe.mirai.network.protocol.tim.packet.* +import net.mamoe.mirai.utils.* +import java.io.DataInputStream + +internal fun ByteArray.parseMessageFace(): Face = dataDecode(this) { + //00 01 AF 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 F0 + //00 01 0C 0B 00 08 00 01 00 04 52 CC F5 D0 FF 00 02 14 4D + it.skip(1) + + val id1 = FaceID.ofId(it.readLVNumber().toInt())//可能这个是id, 也可能下面那个 + it.skip(it.readByte().toLong()) + it.readLVNumber()//某id? + return@dataDecode Face(id1) +} + +internal fun ByteArray.parsePlainText(): PlainText = dataDecode(this) { + it.skip(1) + PlainText(it.readLVString()) +} + +internal fun ByteArray.parseMessageImage0x06(): Image = dataDecode(this) { + it.skip(1) + MiraiLogger.debug("好友的图片") + MiraiLogger.debug(this.toUHexString()) + val filenameLength = it.readShort() + val suffix = it.readString(filenameLength).substringAfter(".") + it.skip(this.size - 37 - 1 - filenameLength - 2) + val imageId = String(it.readNBytes(36)) + MiraiLogger.debug(imageId) + it.skip(1)//0x41 + return@dataDecode Image("{$imageId}.$suffix") +} + +internal fun ByteArray.parseMessageImage0x03(): Image = dataDecode(this) { + it.skip(1) + return@dataDecode Image(String(it.readLVByteArray())) + /* + println(String(it.readLVByteArray())) + it.readTLVMap() + return@dataDecode Image(String(it.readLVByteArray().cutTail(5).getRight(42))) + / + it.skip(data.size - 47) + val imageId = String(it.readNBytes(42)) + it.skip(1)//0x41 + it.skip(1)//0x42 + it.skip(1)//0x43 + it.skip(1)//0x41 + + return@dataDecode Image(imageId)*/ +} + +internal fun ByteArray.parseMessageChain(): MessageChain = dataDecode(this) { + it.readMessageChain() +} + +internal fun DataInputStream.readMessage(): Message? { + val messageType = this.readByte().toInt() + val sectionLength = this.readShort().toLong()//sectionLength: short + val sectionData = this.readNBytes(sectionLength) + return when (messageType) { + 0x01 -> sectionData.parsePlainText() + 0x02 -> sectionData.parseMessageFace() + 0x03 -> sectionData.parseMessageImage0x03() + 0x06 -> sectionData.parseMessageImage0x06() + + + 0x19 -> {//长文本 + val value = readLVByteArray() + //todo 未知压缩算法 + PlainText(String(value)) + + // PlainText(String(GZip.uncompress( value))) + } + + + 0x14 -> {//长文本 + val value = readLVByteArray() + println(value.size) + println(value.toUHexString()) + //todo 未知压缩算法 + this.skip(7)//几个TLV + return PlainText(String(value)) + } + + 0x0E -> { + //null + null + } + + else -> { + println("未知的messageType=0x${messageType.toByte().toUHexString()}") + println("后文=${this.readAllBytes().toUHexString()}") + null + } + } + +} + +fun DataInputStream.readMessageChain(): MessageChain { + val chain = MessageChain() + var got: Message? = null + do { + if (got != null) { + chain.concat(got) + } + if (this.available() == 0) { + return chain + } + got = this.readMessage() + } while (got != null) + return chain +} + +fun MessageChain.toByteArray(): ByteArray = dataEncode { result -> + this@toByteArray.list.forEach { message -> + result.write(with(message) { + when (this) { + is Face -> dataEncode { section -> + section.writeByte(MessageType.FACE.intValue) + + section.writeLVByteArray(dataEncode { child -> + child.writeShort(1) + child.writeByte(this.id.id) + + child.writeHex("0B 00 08 00 01 00 04 52 CC F5 D0 FF") + + child.writeShort(2) + child.writeByte(0x14)//?? + child.writeByte(this.id.id + 65) + }) + } + + is At -> throw UnsupportedOperationException("At is not supported now but is expecting to be supported") + + is Image -> dataEncode { section -> + section.writeByte(MessageType.IMAGE.intValue) + + section.writeLVByteArray(dataEncode { child -> + child.writeByte(0x02) + child.writeLVString(this.imageId) + child.writeHex("04 00 " + + "04 9B 53 B0 08 " + + "05 00 " + + "04 D9 8A 5A 70 " + + "06 00 " + + "04 00 00 00 50 " + + "07 00 " + + "01 43 08 00 00 09 00 01 01 0B 00 00 14 00 04 11 00 00 00 15 00 04 00 00 02 BC 16 00 04 00 00 02 BC 18 00 04 00 00 7D 5E FF 00 5C 15 36 20 39 32 6B 41 31 43 39 62 35 33 62 30 30 38 64 39 38 61 35 61 37 30 20") + child.writeHex("20 20 20 20 20 35 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20") + child.writeBytes(this.imageId) + child.writeByte(0x41) + }) + } + + is PlainText -> dataEncode { section -> + section.writeByte(MessageType.PLAIN_TEXT.intValue) + + section.writeLVByteArray(dataEncode { child -> + child.writeByte(0x01) + child.writeLVString(this.stringValue) + }) + } + + else -> throw UnsupportedOperationException("${this::class.simpleName} is not supported") + } + }) + } +} \ No newline at end of file diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/handler/MessagePacketHandler.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/handler/MessagePacketHandler.kt index 12e5242cb..060ed4248 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/handler/MessagePacketHandler.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/handler/MessagePacketHandler.kt @@ -7,7 +7,7 @@ import net.mamoe.mirai.event.events.FriendMessageEvent import net.mamoe.mirai.event.events.GroupMessageEvent import net.mamoe.mirai.getGroupByNumber import net.mamoe.mirai.getQQ -import net.mamoe.mirai.message.defaults.MessageChain +import net.mamoe.mirai.message.MessageChain import net.mamoe.mirai.network.LoginSession import net.mamoe.mirai.network.protocol.tim.packet.ServerFriendMessageEventPacket import net.mamoe.mirai.network.protocol.tim.packet.ServerGroupMessageEventPacket diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ClientPacket.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ClientPacket.kt index d90748552..63a1c8955 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ClientPacket.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ClientPacket.kt @@ -192,32 +192,30 @@ fun md5(str: String): ByteArray = MessageDigest.getInstance("MD5").digest(str.to fun md5(byteArray: ByteArray): ByteArray = MessageDigest.getInstance("MD5").digest(byteArray) - -@Throws(IOException::class) fun DataOutputStream.writeZero(count: Int) { repeat(count) { this.writeByte(0) } } -@Throws(IOException::class) fun DataOutputStream.writeRandom(length: Int) { repeat(length) { this.writeByte((Math.random() * 255).toInt()) } } - -@Throws(IOException::class) fun DataOutputStream.writeQQ(qq: Long) { this.write(qq.toUInt().toByteArray()) } -@Throws(IOException::class) fun DataOutputStream.writeGroup(groupIdOrGroupNumber: Long) { this.write(groupIdOrGroupNumber.toUInt().toByteArray()) } +fun DataOutputStream.writeUByte(uByte: UByte) { + this.write(uByte.toInt()) +} + fun DataOutputStream.writeLVByteArray(byteArray: ByteArray) { this.writeShort(byteArray.size) this.write(byteArray) diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ServerEvent.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ServerEvent.kt index 16f9dd36c..8637c89d1 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ServerEvent.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/ServerEvent.kt @@ -2,8 +2,8 @@ package net.mamoe.mirai.network.protocol.tim.packet -import net.mamoe.mirai.message.defaults.MessageChain -import net.mamoe.mirai.message.defaults.readMessageChain +import net.mamoe.mirai.message.MessageChain +import net.mamoe.mirai.message.internal.readMessageChain import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.utils.dataDecode import net.mamoe.mirai.utils.hexToBytes diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/action/ClientSendFriendMessagePacket.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/action/ClientSendFriendMessagePacket.kt index fbfcc095e..0507f24eb 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/action/ClientSendFriendMessagePacket.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/action/ClientSendFriendMessagePacket.kt @@ -1,6 +1,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.action -import net.mamoe.mirai.message.defaults.MessageChain +import net.mamoe.mirai.message.MessageChain +import net.mamoe.mirai.message.internal.toByteArray import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.packet.* import net.mamoe.mirai.utils.dataEncode diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/action/ClientSendGroupMessagePacket.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/action/ClientSendGroupMessagePacket.kt index ae39dfc53..97f22f044 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/action/ClientSendGroupMessagePacket.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/network/protocol/tim/packet/action/ClientSendGroupMessagePacket.kt @@ -1,6 +1,7 @@ package net.mamoe.mirai.network.protocol.tim.packet.action -import net.mamoe.mirai.message.defaults.MessageChain +import net.mamoe.mirai.message.MessageChain +import net.mamoe.mirai.message.internal.toByteArray import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.packet.* import net.mamoe.mirai.utils.dataEncode diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ECDH.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ECDH.kt deleted file mode 100644 index 818abb485..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/utils/ECDH.kt +++ /dev/null @@ -1,42 +0,0 @@ -@file:Suppress("EXPERIMENTAL_API_USAGE", "EXPERIMENTAL_UNSIGNED_LITERALS") - -package net.mamoe.mirai.utils - -import com.sun.jna.Library -import com.sun.jna.Native -import net.mamoe.mirai.network.protocol.tim.TIMProtocol -import sun.misc.Unsafe - -/** - * @author Him188moe - */ -object ECDH : IECDH by Native.load("ecdhdll64", IECDH::class.java) - -interface IECDH : Library { - //fun encrypt(publicKey: UByteArray, shaKey: UByteArray): UByteArray - fun encrypt(publicKey: Long, shaKey: Long): Long -} - -fun main() { - // - // ECDH.encrypt(TIMProtocol.publicKey.hexToUBytes(), TIMProtocol.key0836.hexToUBytes()) - val unsafe = Unsafe::class.java.getDeclaredField("theUnsafe").also { it.trySetAccessible() }.get(null) as Unsafe - - val publicKeyAddress = unsafe.allocateMemory(25) - TIMProtocol.publicKey.hexToUBytes().forEachIndexed { index, value -> - unsafe.setMemory(publicKeyAddress + index, 1, value.toByte()) - } - - val key0836Address = unsafe.allocateMemory(16) - TIMProtocol.key0836.hexToUBytes().forEachIndexed { index, value -> - unsafe.setMemory(key0836Address + index, 1, value.toByte()) - } - - val encrypt = ECDH.encrypt(publicKeyAddress, key0836Address) - // - val bytes = mutableListOf() - repeat(16) { - bytes += unsafe.getByte(encrypt + it) - } - println(bytes.toByteArray().toUHexString()) -} diff --git a/mirai-debug/src/main/java/PacketDebuger.kt b/mirai-debug/src/main/java/PacketDebuger.kt index e4f36a5e5..80afede1b 100644 --- a/mirai-debug/src/main/java/PacketDebuger.kt +++ b/mirai-debug/src/main/java/PacketDebuger.kt @@ -3,7 +3,7 @@ import jpcap.JpcapCaptor import jpcap.packet.IPPacket import jpcap.packet.UDPPacket -import net.mamoe.mirai.message.defaults.readMessageChain +import net.mamoe.mirai.message.internal.readMessageChain import net.mamoe.mirai.network.protocol.tim.TIMProtocol import net.mamoe.mirai.network.protocol.tim.packet.ServerEventPacket import net.mamoe.mirai.network.protocol.tim.packet.ServerPacket @@ -151,7 +151,7 @@ object Main { + 1 ) val chain = it.readMessageChain() - println(chain.toObjectString()) + println(chain) } } diff --git a/mirai-debug/src/main/resources/packets.txt b/mirai-debug/src/main/resources/packets.txt deleted file mode 100644 index 52e85d3d6..000000000 --- a/mirai-debug/src/main/resources/packets.txt +++ /dev/null @@ -1,50 +0,0 @@ -from epl - -TEA decrypted: FE 01 12 00 38 C2 3B BA 7D E2 EA B6 66 7D F1 F5 7E 8A 28 5E ED 45 16 37 AA C0 CD A0 0C 43 CC 27 48 EB 9B 86 EE F0 87 76 E6 B5 DE B4 16 C8 23 9C AE DD 6F EC AF B6 4A 23 4B 36 68 88 14 00 17 00 0E 00 01 5D 5E 8D 70 1B 12 55 CB B3 A5 00 00 00 0C 00 16 00 02 00 00 00 00 00 12 00 00 00 00 3D 97 B4 F0 00 00 00 00 00 00 -TEA encrypt: 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 01 00 00 03 09 00 0C 00 01 3D 97 B4 F0 01 6F A1 58 22 01 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 -Packet sent: 02 37 13 08 25 31 02 76 E4 B8 DD 03 00 00 00 01 2E 01 00 00 68 52 00 00 00 00 A8 F2 14 5F 58 12 60 AF 07 63 97 D6 76 B2 1A 3B BC 09 3B D1 C3 13 E7 1E B0 D4 B4 57 EC D7 E1 54 1C B9 C7 9B FF E2 86 31 79 98 08 F5 C5 36 7B F8 C2 AC 65 7B A2 25 D9 14 25 42 7A 89 BF AB 1D 3F D9 6A DD E8 45 2E 47 C1 D4 4E 0C 09 B5 16 FA A5 68 B1 86 E9 10 43 0A 3F 97 9C 17 59 27 38 04 82 49 A7 08 21 F6 DB DA 56 12 C2 5B F7 76 1A CD 49 23 4B 28 E0 73 3D 74 98 DB 07 B2 72 FE 32 AC EB 03 -TEA decrypted: 00 01 12 00 38 6E 42 D2 18 7A 9A D1 C0 E9 56 D3 64 16 4A 0D 46 40 EF 27 B9 79 25 2D 06 E0 28 C5 5B E5 77 3D 55 2D DC DE 13 ED 46 1E 90 2B B8 C9 13 60 39 53 53 01 A3 C1 A1 FC 44 07 E2 00 17 00 0E 00 01 5D 5E 8D 70 1B 12 55 CB B3 A5 00 00 03 10 00 04 3D 97 B4 F0 -TEA encrypt: 28 0C F3 77 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 5E 8D 70 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 12 55 CB 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 4E EB C9 19 82 AB 72 4E 9E 6A C9 A5 22 50 96 5D -TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B -TEA encrypt: 01 12 00 38 6E 42 D2 18 7A 9A D1 C0 E9 56 D3 64 16 4A 0D 46 40 EF 27 B9 79 25 2D 06 E0 28 C5 5B E5 77 3D 55 2D DC DE 13 ED 46 1E 90 2B B8 C9 13 60 39 53 53 01 A3 C1 A1 FC 44 07 E2 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 C9 DB 44 90 AF 8C E6 35 98 46 54 41 48 C1 86 BE DD 11 81 5E B5 E3 32 E2 00 60 B7 82 52 E3 FC 15 E0 18 BC 5F 93 5E 75 F9 E6 05 12 4E 3E 40 6F 65 A6 A3 E3 57 EC B2 8F 76 25 12 76 76 8C E9 88 6E 1C 26 03 55 EA A8 8A 02 3D 31 E6 E3 17 D3 BE 41 2C D0 05 F6 70 9B 34 9A 40 A6 A6 48 D8 65 A2 39 5D 8A 32 28 90 06 0D 29 9E 24 6E C4 92 87 D1 CB 2B E2 97 BA A0 EF 16 63 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 B2 DE B3 6A F2 64 C3 43 AA 9A CB BA 2B 22 24 BD C6 8A EA D0 37 8B 61 E0 C6 BB 62 68 A8 2D 22 79 F8 AD 39 6E 20 F6 D2 DD DD 39 E8 D2 BF 1A 58 E5 D3 99 D6 6F 72 1B 02 6D 9E B5 10 D0 C9 BC 37 27 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 7B 4F 8E 6D C9 26 F0 8A BB 27 B3 74 BC 55 50 95 DF 07 D6 A0 -TEA encrypt: AB C7 B2 DB 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 5E 8D 70 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 12 55 CB 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 4E EB C9 19 82 AB 72 4E 9E 6A C9 A5 22 50 96 5D -TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B -TEA encrypt: 01 12 00 38 6E 42 D2 18 7A 9A D1 C0 E9 56 D3 64 16 4A 0D 46 40 EF 27 B9 79 25 2D 06 E0 28 C5 5B E5 77 3D 55 2D DC DE 13 ED 46 1E 90 2B B8 C9 13 60 39 53 53 01 A3 C1 A1 FC 44 07 E2 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 9C 8B 87 A0 A6 42 5B E4 3E C2 D2 50 80 22 19 E3 60 5F 90 FA DF 4F 33 F5 26 24 9A 6C 0F F2 08 A4 91 42 C0 73 C6 D3 7F D9 FA F6 9E D4 9E B1 B7 64 51 B5 45 F3 5F D3 5E C1 7A C6 3D 19 5D 44 E3 75 EB 76 D3 A5 8B D8 0E 4B B2 7C 32 96 4C FF 52 18 81 A0 85 19 3D 4B A2 B4 3B 78 CD AA CE 9D E3 8D D5 B9 D3 6E ED B0 0F 02 96 57 3D DD C9 D4 8D 8B CC FA 1B 83 78 89 7C E1 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 23 6E 7B 0C 0E 31 31 E9 E1 5C 48 C4 4D 55 CF 2B 20 91 EE 24 CA D9 2D 9C 75 C5 D9 08 6A AE BB 61 DB 16 27 E0 AE A8 96 07 57 01 FC 24 E2 52 3F 69 AE DD BB 34 F4 85 B8 6D E6 B8 22 2C 79 52 BD A5 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 F4 96 24 B8 52 17 7B B8 F6 09 3C 4D 9E BC 86 F1 0A 68 B1 59 -Packet sent: 02 37 13 08 36 31 03 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA E8 C2 34 2F E3 2B 37 00 72 21 83 B7 11 D8 C9 9C 3E D2 16 75 72 AE E4 F2 E7 24 0D 87 7E FB 7D 83 64 22 6E 1F 97 01 44 36 9E A6 A8 68 4F 9F 81 F5 B3 F3 14 8C 7A 4D 79 FD 9C 03 DD B6 46 97 62 4E 39 8C 45 0A 43 8F 57 C8 11 28 EC 0D AF 87 B9 72 7A D9 F8 D3 99 C4 96 7B 26 B5 0B 3E 7A 61 2B 13 27 B4 14 A2 EE DC DB 5B 0E B3 9E 3C 92 1C 97 2E 48 10 4C 04 F0 FC 20 DF 77 BF 1A BC 77 81 3D EA 03 83 2D F5 14 61 C7 8A DA AC 72 C4 EF 47 75 48 8B 8A 9E 94 06 64 FB 12 C7 31 4D 64 89 11 D3 B8 60 AB BB 50 8C F1 EE B2 5B C7 B9 DB A3 7D F0 1A 17 75 0D 9F 9E 7B 79 0B 83 A0 89 53 4A C4 C7 8D 51 E4 1E 4A D0 73 D0 F7 01 03 C8 A7 10 6F A2 98 B1 33 78 E9 7F 02 96 80 00 E7 07 7F 3B DA CC C8 C7 F6 AD C3 D9 98 5B B6 75 C0 9F 6D 53 94 4A 18 78 C4 C3 A0 B3 E0 F3 C2 61 89 CC 15 A4 57 8B 7A B9 1B DE 48 4E 2F 83 25 46 45 2B 5C 6E 36 38 2E 92 5A A9 99 45 1D AA 97 64 F1 46 2A 1F 23 9F DD 9F 5E 9F 03 9F E0 0D A5 7F D6 12 A5 DD 2F FA 42 9C 4B A0 8B DD 31 95 BD 14 CD 0D 79 9D 1E 78 E5 07 E4 8C A2 53 59 9E A4 0F 37 B3 98 A3 C6 B4 08 FC 9E C7 F6 90 DF 31 8A 6E EA 98 4B 6D C9 6B 4D A2 92 D6 B7 6E 0D BD 82 04 5A 94 4F 1D 1E 8C CB 52 76 A0 95 63 27 15 70 E1 65 7D 1E 1A A3 14 E3 28 16 29 37 29 40 B2 82 9E 32 3C E6 62 88 95 E3 F2 4C F2 0C 7F 31 3D 70 88 A5 88 C2 A3 1F DB 82 E9 7F 16 56 EF 8C 64 86 B3 56 5E DB AC 5F 51 89 57 7E 62 17 20 A8 C2 CC F3 6E 38 3A 8B 35 EE F6 D0 3A FD 48 E7 D1 22 58 F4 8C EF E1 EC 61 F3 A6 6C 81 A9 1E 29 D2 8B 06 A3 78 24 10 F4 74 81 DF 44 C9 FA A0 64 A4 3F 35 D5 1E 56 C6 E0 3F 19 77 AB C1 2F C4 5E 69 5A E8 F1 8D 2F 92 B6 F1 BC 97 A4 65 A6 87 3B D6 A5 D1 EF 27 84 04 2D 6F D7 B8 05 05 B2 B5 97 7B 66 A9 B1 5E 53 63 96 FD B5 A4 03 -TEA decrypted: 01 DB C5 C7 48 9C 83 25 8A C4 9C 57 B1 57 28 22 B6 E3 4C 76 B9 91 67 D8 1B C2 45 70 21 59 F5 C0 A2 32 D0 9A E6 CD 20 C1 F7 AE 1F 8A 1E D7 6A 29 9C 5A 10 95 43 14 CB 3F AE 58 6F 9D 34 03 54 66 DE 32 8D 88 43 2E 95 F3 80 F7 B8 F3 7F 73 AC 37 E4 8C 8B 22 57 83 54 79 E9 E5 82 8E A7 17 C8 D8 69 67 CD 55 7F EF 07 EB D0 78 D5 55 AC 5A EC E1 FD 29 30 2D 73 D5 8E 10 12 49 A7 DB 0E B4 65 96 A3 8F A2 09 08 46 32 C2 E0 D6 C7 58 4B A1 82 B3 48 47 2D 41 37 FD FB E0 87 A3 18 DF F4 80 7F D5 44 73 A3 67 79 AC 22 86 99 A4 33 00 AE C9 AD 0E F2 5B 45 00 AA A0 B1 35 BE F2 5B 53 61 CD 97 46 B0 BB 35 13 BB 37 64 60 8F 96 84 A3 82 D0 27 9A 87 D3 43 3C 7C 51 EF 58 8C 7D 8E 9B F6 ED B0 66 36 1E 43 0B 86 49 DE E3 E1 4E 59 1C 3C A2 14 15 -TEA decrypted: 01 00 1E 00 10 53 6D 21 50 5A 42 76 74 7D 2D 7A 2E 3C 2D 2A 57 00 06 00 78 ED A3 A3 19 F1 99 59 44 47 79 93 39 00 23 3B 50 9C 2C 25 B8 EC AE 1B 2E 1F A4 0F 70 EE B5 74 80 5D B4 FB 58 0E 92 73 9F 6D BC 4A 65 59 52 FC 1F 38 07 16 A0 67 30 E4 E6 0B F4 AC 98 50 2C B3 51 2D 9E 79 5E B0 EB 15 F5 90 2C 1C 49 74 64 BA 42 8B 3D 9D B1 8F 9B B3 24 D5 7E 4D 93 19 62 58 13 3A FF 41 0C 0B BF AB AD 9A C6 C9 79 C7 A1 1D 8E 2E A3 D9 E6 A9 38 E2 F8 01 10 00 3C 00 01 00 38 ED 3A 44 E9 3F 24 3D F6 71 0F 50 2E 6B 7B 69 C6 02 AD BA 4C 0B AF CF 8E 1C 96 A8 08 A6 A6 DE 18 46 94 12 02 6A 8B CD 67 CB 4D 18 BB 2D F2 06 44 B8 1D 19 C8 14 4C A1 37 01 15 00 10 69 B7 6B EB 4D C0 6D E5 7C FB E4 6B 5D 6C 86 9A -TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B -TEA encrypt: 01 12 00 38 6E 42 D2 18 7A 9A D1 C0 E9 56 D3 64 16 4A 0D 46 40 EF 27 B9 79 25 2D 06 E0 28 C5 5B E5 77 3D 55 2D DC DE 13 ED 46 1E 90 2B B8 C9 13 60 39 53 53 01 A3 C1 A1 FC 44 07 E2 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 ED A3 A3 19 F1 99 59 44 47 79 93 39 00 23 3B 50 9C 2C 25 B8 EC AE 1B 2E 1F A4 0F 70 EE B5 74 80 5D B4 FB 58 0E 92 73 9F 6D BC 4A 65 59 52 FC 1F 38 07 16 A0 67 30 E4 E6 0B F4 AC 98 50 2C B3 51 2D 9E 79 5E B0 EB 15 F5 90 2C 1C 49 74 64 BA 42 8B 3D 9D B1 8F 9B B3 24 D5 7E 4D 93 19 62 58 13 3A FF 41 0C 0B BF AB AD 9A C6 C9 79 C7 A1 1D 8E 2E A3 D9 E6 A9 38 E2 F8 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 A1 2F CE 46 45 62 54 0A 21 9C 32 EA A9 B9 4E FC 90 86 1B 97 3D A9 3B 45 20 02 89 63 7D 14 B2 E4 E4 DF ED 5C 3F 82 63 B1 E6 23 61 65 C5 E2 32 11 69 4D 1E 8E 80 81 BF 76 4F 46 03 32 45 39 C9 2E 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 10 00 3C 00 01 00 38 ED 3A 44 E9 3F 24 3D F6 71 0F 50 2E 6B 7B 69 C6 02 AD BA 4C 0B AF CF 8E 1C 96 A8 08 A6 A6 DE 18 46 94 12 02 6A 8B CD 67 CB 4D 18 BB 2D F2 06 44 B8 1D 19 C8 14 4C A1 37 03 12 00 05 01 00 00 00 01 05 08 00 05 01 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 08 4D 8B 2A EE 77 E3 28 25 DB CF 94 F3 DF 1C 3F E0 88 0B E1 -Packet sent: 02 37 13 08 36 31 04 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA 10 54 F4 51 F3 3A 48 6E 76 ED BD 89 E3 0A AA 23 4D 82 81 7E C8 2A 36 22 D1 4E 2D 15 90 16 41 DA DD 9C C3 D3 22 4A 25 84 26 4B C0 68 71 03 90 99 E4 73 10 0D 82 38 1E 1A 5D 4E 99 0E 58 C2 C7 AD 31 0E C6 AA DC 0F 29 D7 38 E1 14 27 64 41 FC 50 4B 4B 84 31 F9 DE 20 7D 83 67 EA F2 69 89 D3 07 0C 62 9A E2 2C 59 58 CA A7 27 A1 7F 92 C6 6D DA 73 F6 7F F1 1E EF 94 20 81 A0 5B 5C 82 78 27 DE 81 FB D2 B5 4F 05 90 F4 60 7B F0 07 D2 9D 36 09 28 4A 6A 83 F3 52 08 2E C2 53 20 71 D8 F1 CD 57 7A ED 7C 6F 57 F5 89 50 A2 68 DD A6 32 0A 4A 3E F8 61 93 90 A7 B8 37 F4 C6 25 AF 76 04 E4 08 AD F1 3E 76 9F 14 25 24 6A C0 B3 21 54 70 37 55 70 C1 30 4B 50 4A E3 76 4B A3 93 D0 D3 46 67 51 92 2D D0 85 CB 6A F0 AC 16 F0 2B 41 3A 1A 29 E1 90 8F A3 8B 65 A1 61 54 6F 71 06 D2 8E CF 28 70 9E 4B 35 7A 56 C9 58 16 68 E5 44 3E EA 69 A3 0C C5 3C BD FC 7A 5A D4 28 9D 81 67 C1 A1 03 79 28 04 5D 66 B3 E3 A3 69 48 E0 4E 79 A7 3F AD F3 5F BB 2D 1C 3F FE A4 30 BE 7D 36 54 B1 B3 BB A4 F5 C4 A8 04 8B 68 DE 04 E8 FC FF DA 16 39 8B 7D F5 2B 25 B8 2E A5 08 2A FE 53 52 74 F5 99 B7 BF 34 C5 10 E1 A1 B4 DF 2C CA 2C E3 99 D1 97 88 95 D2 DF E6 1B 3F 28 5B B0 8F 66 F2 55 E7 7B 52 49 DE 7F FE B0 17 E1 C3 97 0A 38 00 4F 0A EA EF 5A 15 DE 09 47 AB C0 D5 B2 BF 08 28 37 2B 07 CA BF 7B A8 F7 3D 34 DD 12 52 C4 94 B2 B8 D7 C6 7E 99 FC 10 52 3D AE 31 93 01 51 2B C7 AC BE 06 76 7C 93 9B 50 E6 B3 42 A5 B8 B3 C1 7D 5C 65 73 81 53 D6 D6 1C 42 DA DB D4 78 D2 DA 76 A1 7D 5A 87 5A FB 9A C6 D6 B0 99 58 E2 F2 42 05 E0 7B A9 BD BA C7 D8 06 23 9D EE 2A E7 43 CC 96 CC 79 D0 18 40 36 4E 4B 3A BD F5 9D B9 E3 A0 06 7F AE F3 E0 D2 F9 87 30 2F 5C E0 D1 4E A9 81 A0 5B 63 39 FB FC 98 33 F7 06 32 27 B4 E4 BE BB 26 A4 92 72 BD 5C 12 2A F8 D5 89 A6 F9 8B 4D 19 C2 EC FB 99 ED F7 E9 5C 6E 25 49 F6 D5 48 23 08 C4 19 48 33 E6 73 F2 BD AD 37 95 CE 80 E1 7E 06 E9 A4 F6 1C F0 53 CE CF 03 -TEA decrypted: 20 D0 B5 46 30 25 73 7B 26 C5 7A A3 4B CA 3F CB 02 0C 7C 09 3F 90 F0 47 B4 A5 F9 3D 7A DF 53 2B 80 9D 9C F6 ED 77 88 CD A3 42 FF 7B 39 EB 05 D0 D6 18 C4 5E 7F 58 A9 2A 94 C8 FA 11 33 68 9A AC D0 5C 9D CE D4 10 59 AF 59 7F 49 A5 56 D9 35 07 36 25 31 DC 4F 64 FD A6 78 D9 31 DA 26 30 BE 4B 8D D3 92 0D B2 C7 FC 50 68 E6 D0 64 87 E9 8D 22 10 68 32 E2 50 9F 19 0A 5C C4 DB 04 A2 6B A5 D1 40 E5 67 B1 88 13 04 20 8F 92 F1 CF 8D C8 B1 BB 54 4D 1E A2 FA 7E 7B 65 67 8F 58 0D 97 88 92 69 D3 6C B6 67 70 B4 D8 54 A4 0B 01 B2 3A 88 89 32 C0 91 E1 10 16 0F 8B 61 D7 D6 8D D1 32 34 23 3A C6 79 95 79 E4 1C 0D BA CE DF A3 76 23 0F C5 9D AE 63 24 6D 79 76 4F BB F8 FE A7 DE 3D 0E 84 9E 28 5A 8F F7 9D BA FD F1 22 61 E3 20 93 AA FA 9D C6 69 13 A4 52 98 6D ED E6 9D 84 35 A8 50 90 5E 3A F8 28 36 ED C0 C1 40 A8 E4 FD 78 26 E2 52 F5 EB 89 C5 42 D9 AB A4 24 87 BD AB 07 F3 C5 F1 1A B0 87 78 20 85 3E B4 D9 D1 2E 01 5D 3A DB F0 56 AB 12 B1 37 98 FE EA 88 4C EB 5B 1B 29 0A 99 A5 54 CE F6 6A F7 12 5A EE 18 B4 4E 03 5E 36 33 29 6C E9 4F F7 FD F0 76 AE 0B 37 74 06 07 F5 E7 FC 1B AA C7 BA 4F 02 96 DA 83 B6 D0 33 08 71 EE 19 31 57 8C 57 F3 BA F2 CE F2 B7 73 77 E9 5B A3 A4 4D F9 80 2B 59 87 20 A2 FF AB 56 C5 D6 9F 5F 8C CA 13 3F CE 6B 95 42 B9 E1 A2 AE E8 FB E1 B3 A0 AA 80 8A C2 D6 CD FE 52 D4 2A 89 4B 36 8F 7B 0C FF 63 74 83 1C 2E C5 25 B7 F7 D3 D6 B9 71 00 8E 2C 69 88 23 5E 70 98 E7 A6 86 76 1D 6B E3 26 65 7C AC 40 CF 9E A8 A5 D4 3E 41 38 1A 27 06 4B 68 88 11 B3 D3 3C 70 88 AB 6F 50 FC F3 DC D7 C3 82 20 62 1B 3E 90 29 6E 0A 2A 42 26 EA 0E B2 7D 3D D6 25 C6 CE B0 BB 5F 09 09 10 56 EE DA EC 2A 95 53 BD ED 02 89 60 E5 25 0A 21 05 34 26 05 CF BE C5 EB 56 08 9A 83 D8 19 77 11 F5 6D 81 92 C6 F2 B9 06 4C D4 E4 10 78 1D 94 3E 41 72 9A 7B 26 3B FF 06 34 11 F8 8C FE 18 E1 95 BB A6 B1 52 60 EF EA 39 A6 B3 F9 48 63 6B 34 7C 69 4A 9E B5 FD A3 AE DD C0 51 8F 46 BB CC C9 E5 96 D4 3F 72 01 CA C1 92 D6 E9 28 44 15 6D D5 22 2E 7B 4E B2 42 A8 BC 13 18 C3 9A 4E B7 C0 A7 A8 F5 99 FB 07 27 48 00 90 B3 61 BE A2 60 41 24 14 B0 68 0C FD 59 22 2B CB 1D 3F 42 F8 9A 95 A5 05 D6 FF 63 E2 3E 51 -TEA decrypted: 00 01 09 00 70 00 01 19 43 F9 12 75 3F E9 C9 9C 79 33 02 E6 42 1D 35 00 38 6A EA FA 99 C2 BE CA 5A B1 8E 83 12 28 B2 CD 0D 6F F8 21 0A CA 62 8A BE AE 8B 01 9D 16 D4 7C 7E E7 FA 0C 83 16 5D 76 05 2C 74 88 C8 1C EB 99 B3 03 F8 66 E0 B0 A5 0C 63 00 20 B9 55 18 2D CB F3 19 1B 90 4D B6 D9 98 28 17 BE E2 5E 05 13 A2 03 93 20 62 52 B3 E1 45 C3 48 DD 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 07 01 D3 00 01 00 16 00 00 00 01 00 00 00 64 00 00 0D C6 00 09 3A 80 00 00 00 3C 00 02 27 50 57 6D 6A 7D 2B 34 29 64 23 3C 41 3E 34 6B 00 88 00 04 5D 5E 8D 71 1B 12 55 CB 00 00 00 00 00 78 4C 2C DD A9 01 1B DB BC 1D 74 C8 F2 5D 0C 3D 10 DF 68 9F 72 BE 2B CD C8 3E F1 00 7B FD DC 71 12 E6 3C EE C4 FE 7B 25 E2 72 0F 06 52 21 6D 44 B4 E7 61 0D A8 8E F3 3D E4 DD FE F5 12 84 0A EA A6 08 29 83 37 0B D5 F8 91 69 EB B5 D5 39 99 47 4C 42 E9 7A 40 A9 0B 0C 97 A7 E6 FA 78 88 DD C8 6F 5A 0D D2 31 E1 DC B3 73 8E 5A 9A 66 0E C5 80 A8 74 A8 E8 B4 D1 50 B2 C0 68 2B 74 3C 2D 3F 3B 34 3A 57 50 65 73 4D 69 4B 00 78 00 01 5D 5E 8D 71 00 70 52 5A 52 54 29 56 A0 32 31 61 06 C2 E4 4D 09 5B 81 28 F2 D0 7B 2B 3A F4 4F 54 CD 9A 3E E6 FC 80 F9 DC 1A 43 8A 8A 8B 09 89 3A C2 8B 41 68 A1 E8 07 98 19 9D 2E 56 98 0B 96 D8 0C D3 16 0A 37 76 65 D4 3C 47 9C 27 65 20 F3 DD 86 B9 F4 31 57 00 53 10 50 82 3F DF 74 08 01 50 83 0C DB 15 6D 68 23 CB 14 93 28 4A 0B CB 19 CC 90 B4 5F D4 63 C7 00 83 01 7E 4E 50 35 33 75 65 5D 27 23 44 50 4D 4B 50 2B 00 70 00 01 5D 5E 8D 71 00 68 7B AE 3D 10 36 2B EB 2C 78 42 03 09 C4 F6 D5 9D 54 11 D3 1B F6 1C 69 D5 00 CD 8B 36 02 35 2E F5 29 64 72 90 38 F2 AE 99 AE EE 23 CA 1C EC 3C 9A 1C C0 C2 B3 4B EE 26 C4 95 4D EF 14 B5 C3 E0 C2 0C 52 CF 49 6A 57 5E D2 33 1F D2 62 9A 00 40 6E 13 6E E9 A6 C5 00 DB 93 2D 21 58 22 DC AA DD E1 CE EE E0 7B A4 1E 01 21 6B 7E 4B 47 68 47 66 66 4E 33 7B 4D 74 23 3F 68 01 08 00 29 00 01 00 25 00 1D 02 5B 14 28 E0 B9 91 E2 80 A2 CC 80 CF 89 E2 80 A2 CC 81 E0 B9 91 29 02 13 80 02 00 05 00 04 00 00 00 01 01 15 00 10 CA E0 70 A0 99 E1 14 4E 74 20 46 74 9F 36 14 C0 -TEA encrypt: 00 07 00 88 00 04 5D 5E 8D 71 1B 12 55 CB 00 00 00 00 00 78 4C 2C DD A9 01 1B DB BC 1D 74 C8 F2 5D 0C 3D 10 DF 68 9F 72 BE 2B CD C8 3E F1 00 7B FD DC 71 12 E6 3C EE C4 FE 7B 25 E2 72 0F 06 52 21 6D 44 B4 E7 61 0D A8 8E F3 3D E4 DD FE F5 12 84 0A EA A6 08 29 83 37 0B D5 F8 91 69 EB B5 D5 39 99 47 4C 42 E9 7A 40 A9 0B 0C 97 A7 E6 FA 78 88 DD C8 6F 5A 0D D2 31 E1 DC B3 73 8E 5A 9A 66 0E C5 80 A8 74 A8 E8 B4 D1 50 B2 C0 00 0C 00 16 00 02 00 00 00 00 00 00 00 00 00 00 3D 97 B4 F0 1F 40 00 00 00 00 00 15 00 30 00 01 01 92 A5 D2 59 00 10 54 2D CF 9B 60 BF BB EC 0D D4 81 CE 36 87 DE 35 02 AE 6D ED DC 00 10 06 A9 12 97 B7 F8 76 25 AF AF D3 EA B4 C8 BC E7 00 36 00 12 00 02 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 00 1F 00 22 00 01 1A 68 73 66 E4 BA 79 92 CC C2 D4 EC 14 7C 8B AF 43 B0 62 FB 65 58 A9 EB 37 55 1D 26 13 A8 E5 3D 01 05 00 88 00 01 01 02 00 40 02 01 03 3C 01 03 00 00 C2 D9 3F A5 A0 1B 6C 03 A2 EF AB CB 42 92 44 8E 15 97 28 1F DE B6 E9 0A 5C 53 01 CE A2 CC 95 3F E0 CB 30 3F 5C 67 09 22 83 CC 8A 80 8F D6 26 F5 EF EC 24 15 95 8E CE 99 00 40 02 02 03 3C 01 03 00 00 A1 4D 57 52 9E 5B 1F BB 48 75 09 67 F8 C0 64 F6 9B 2A 44 61 78 29 C1 26 9C 3C 59 0E DF 9B D1 59 97 0B 0C 2B 09 27 C6 7C 20 63 11 02 E1 4E A4 DE E2 59 CF A7 A1 47 0A B6 01 0B 00 85 00 02 B9 ED EF D7 CD E5 47 96 7A B5 28 34 CA 93 6B 5C BB 10 00 00 00 00 00 00 00 02 00 63 3E 00 63 02 04 03 06 02 00 04 00 52 D9 00 00 00 00 A9 58 3E 6D 6D 49 AA F6 A6 D9 33 0A E7 7E 36 84 03 01 00 00 68 20 15 8B 00 00 01 02 00 00 03 00 07 DF 00 0A 00 0C 00 01 00 04 00 03 00 04 20 5C 00 46 FA 5E 5A 2D 7A 2F 2F BB 87 BB C3 BD 65 12 B6 C9 37 45 FD 2D D2 60 A9 64 E4 32 85 22 6E B0 8B 68 00 00 00 00 00 2D 00 06 00 01 C0 A8 89 01 -Packet sent: 02 37 13 08 28 04 34 76 E4 B8 DD 02 00 00 00 01 2E 01 00 00 68 52 00 30 00 3A 00 38 6A EA FA 99 C2 BE CA 5A B1 8E 83 12 28 B2 CD 0D 6F F8 21 0A CA 62 8A BE AE 8B 01 9D 16 D4 7C 7E E7 FA 0C 83 16 5D 76 05 2C 74 88 C8 1C EB 99 B3 03 F8 66 E0 B0 A5 0C 63 89 7E 03 26 34 DF 29 49 11 71 16 8E 8E 51 A4 9A B1 7F 0D D6 2A AD E7 69 43 69 9D C1 88 C0 CC 1B D9 4F 14 C0 CE 5B 0D F2 AA F6 72 7D 6E 50 93 B9 D0 D7 D8 B8 E3 AF E9 68 33 66 02 68 BD C1 43 D4 95 22 CE B9 16 0D 3B 7A D1 B4 CE 35 78 9F 67 8D 41 60 05 4F 89 6C B8 F5 BD CC 41 B8 5E 48 A1 28 8F 66 BC 4B 76 3A 8D 83 2E 1C A5 B5 26 69 EE 21 95 E5 1A 2F E7 DD CB BA 7F 87 F3 F5 69 A5 D7 E8 21 A7 E8 A2 FF E1 BB 7F 8D 89 91 5A D3 8D 72 9E D3 70 AB D4 F7 7E B2 5C C8 1E 5F FF F5 BC 9B 84 7F 3F 16 E1 6B 4C CD 6C D6 CD A2 58 C5 94 54 E9 1F CB 8A 43 D5 AE 9E C5 75 86 0C 3D 0F 8A 7D 72 DA AE 2D 66 81 DE E3 E1 16 40 BE 63 F6 99 C7 5C 7A 72 5A DD 35 41 69 76 3E 10 1C 7B DE C4 43 F4 EC 7C C5 98 ED 5E 06 0D B7 AF C9 7C F8 27 93 76 22 44 9A 32 F6 86 C3 84 EE AE C3 6B CE F4 FA 34 DA EA 68 D6 D0 39 8B 5B 8D 10 0D 9D BA 9C A3 F8 5A 86 56 A8 F6 5C 6A E4 31 FC 6E F8 95 49 4F 4D 49 E3 7F 74 75 8A DA 5D 7C C0 1F 03 9C 1C 69 1B 18 A0 63 B3 24 C4 AF 8C 64 2A 8A A0 E6 2E C3 3D 10 9E 08 EF 53 A4 11 2B 33 BA E8 92 BB 4B 25 B8 F2 79 12 0F F4 4C DB 0C BE BD 78 25 3C 8A 2B 66 B8 A7 34 8D F5 C9 D0 7E BE 35 E9 3F 3E 02 D3 43 AA 18 45 A7 00 B2 06 BF 5E 21 FA F5 28 A5 47 6A 0C AB 20 78 A5 EF 93 68 B7 7F DC 90 B1 F6 46 60 8A 16 BF F3 4B A2 2D 00 F0 72 68 CC 31 27 CE 84 4E 7B 4D ED 06 1C 3E ED F5 D0 EB DE 1F CC C2 CA 4C 98 76 E3 86 06 62 7D 04 07 84 A5 50 EF 6C 53 BD DA 80 1F 23 E3 1D CC F4 B2 33 74 A1 A2 C0 49 AB E4 9E 76 B7 4F B7 CD 9B 77 B5 DB 09 69 A1 F4 42 E3 88 D1 38 1A D2 92 B0 50 82 C6 97 BC A7 ED 99 5F F5 DD 21 B6 FF FB 3B 4D 2A 3B 73 67 92 BB CA 48 F8 D5 3C A8 DF B5 8B F3 17 21 47 42 E9 2F DB 53 77 CD 7C DA DE F3 76 EA A4 34 FD AD 58 E6 98 5A A4 D7 8B 6E 08 11 DE 5C 14 D9 A0 13 E0 8A 0C 4E 15 E8 09 59 F7 1A AF 0E 99 D9 22 73 81 63 21 54 D9 5C 29 D2 DB C0 59 72 D3 28 C6 27 B2 5C E0 A7 BF 13 02 38 8B 71 E1 75 A9 47 5C 66 A1 5B 03 -TEA decrypted: 00 00 0D 00 06 00 01 00 00 00 00 00 1F 00 22 00 01 A7 15 4D B7 2C 4E 36 31 5C A2 36 D4 2A 57 7A E9 E6 17 63 32 17 BD AA 14 21 82 BE F4 80 97 40 22 00 14 00 04 00 01 00 3C 01 0C 00 73 00 01 AE 21 31 3D 20 97 FE 61 C3 34 4F BA 8C DF D3 AC 76 E4 B8 DD 1B 12 55 CB B3 A5 5D 5E 8D 72 00 00 00 B4 03 3D 97 B4 F0 3D 97 B4 AA 00 00 00 07 00 30 C2 FB 5F 26 E7 98 02 F1 94 8F A4 88 03 F1 31 71 56 C9 7F DB 4E ED 5E DB AF 0D 0E 2E 9A C3 66 43 57 36 3E 60 80 8B 1A 9D 89 0A 2A 92 EF D7 5E 83 08 02 04 08 08 08 08 08 04 00 05 01 3A 3C 0A 22 01 0E 00 56 00 01 00 52 13 80 42 00 00 02 02 00 00 18 28 16 1D 6D 33 45 6D EE E7 AB 20 FF A2 69 CB 77 AA AE 5C AA 64 DD 5D 9B 00 20 A5 77 50 C4 8B 2F 5F 1C 4D CE 2D EC 48 A3 E4 EC 8D 05 3E E6 71 9C D7 6F 7F A5 59 B0 44 0D 95 DA 00 0C 00 00 00 01 00 00 00 00 00 00 00 40 00 2F 00 2A 00 01 8F FE 4F BB B2 63 C7 69 C3 F1 3C DC A1 E8 77 A3 DD 97 FA 00 36 04 40 EF 11 7A 31 02 4E 10 13 94 02 28 00 00 00 00 00 00 01 0D 00 2C 00 01 00 28 7C 2B 95 F9 A3 87 C0 B6 4D D0 C0 40 26 B7 EA 2B D9 B5 A9 A3 29 FD 38 E7 E4 80 68 70 AB 62 52 21 56 1B AF 3D 8D 01 58 16 01 05 00 32 00 01 02 02 00 15 02 00 01 03 10 AC 4B 56 16 B8 EB 07 2E 2F E7 EA F5 07 33 7C 3B 00 15 02 00 02 03 10 ED 62 2E 2A AF B1 3A ED C5 0B 98 D5 3F E2 48 11 -TEA encrypt: 01 00 0A00 01 00 01 00 04 00 00 00 00 -Packet sent: 02 37 13 00 EC 83 E4 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 A8 FE BA F9 5B 03 20 0E 85 1F 3E D9 41 75 33 F1 93 72 D9 BF F7 06 67 0E 03 -TEA encrypt: 33 00 05 00 08 74 2E 71 71 2E 63 6F 6D 00 0A 71 75 6E 2E 71 71 2E 63 6F 6D 00 0C 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 00 0C 6A 75 62 61 6F 2E 71 71 2E 63 6F 6D 00 09 6B 65 2E 71 71 2E 63 6F 6D -Packet sent: 02 37 13 00 1D 77 21 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 DA 9D 02 8E 4D A3 C7 37 73 BA 44 F9 BB 49 0E D0 13 87 D2 38 29 2D 6F 75 55 58 35 06 46 A3 31 50 8E 15 28 8A AB A4 EE B1 B7 96 8C 8A 23 F3 A4 18 D5 CB 50 34 04 C2 60 22 4B 4F 72 7D DC D1 EF 2C 28 84 07 C4 CF A1 1D 79 78 8D 90 47 50 E5 E5 ED 03 -TEA decrypted: 33 00 00 0A 5A 52 65 77 55 51 4C 6A 30 52 00 2C 53 78 44 6F 53 73 6E 61 56 66 36 76 4A 69 65 32 6A 76 76 56 49 51 2D 66 46 2D 62 46 6B 76 55 45 6D 78 4C 51 6E 47 69 4B 38 4A 59 5F 00 05 00 08 74 2E 71 71 2E 63 6F 6D 00 2C 6C 4A 41 4D 71 31 38 64 45 48 4F 53 45 74 35 49 75 52 58 42 66 49 45 37 75 46 79 52 71 5A 2A 6F 6D 30 65 77 57 6C 43 67 76 77 45 5F 00 0A 71 75 6E 2E 71 71 2E 63 6F 6D 00 2C 51 71 38 6C 71 73 51 6D 47 30 6F 6A 64 6D 35 57 4C 6F 44 63 62 78 36 38 36 51 56 36 7A 43 48 38 43 68 79 44 47 68 49 64 34 6B 41 5F 00 0C 71 7A 6F 6E 65 2E 71 71 2E 63 6F 6D 00 2C 49 76 31 30 69 67 31 6B 33 43 4F 64 31 74 42 6B 6D 71 64 49 32 38 72 45 66 6D 6F 5A 6F 65 41 31 48 42 77 4D 57 48 78 35 35 36 73 5F 00 0C 6A 75 62 61 6F 2E 71 71 2E 63 6F 6D 00 2C 67 6F 39 7A 49 58 74 71 74 71 67 7A 56 6B 6A 37 47 51 73 6F 41 62 30 6F 4D 67 6F 6C 2A 6F 53 52 41 79 67 33 34 4A 59 68 75 6E 34 5F 00 09 6B 65 2E 71 71 2E 63 6F 6D 00 2C 6C 51 6C 31 69 6A 59 68 69 67 62 72 51 57 46 39 62 51 6F 48 74 68 32 73 37 42 43 38 39 6A 52 71 72 6D 4F 48 52 35 66 53 75 44 6B 5F -TEA encrypt: 88 76 E4 B8 DD 00 -Packet sent: 02 37 13 00 5C B3 0F 76 E4 B8 DD 02 00 00 00 01 01 01 00 00 68 20 DD F0 A1 34 7C 49 67 B7 EB 22 C4 65 48 0F 69 C6 03 -TEA decrypted: 88 76 E4 B8 DD 00 00 00 03 00 15 02 13 00 00 00 29 00 33 E5 B0 9A E6 9C AA E5 BC 80 E9 80 9A E4 BC 9A E5 91 98 EF BC 8C E7 AB 8B E5 8D B3 E7 82 B9 E5 87 BB E4 BA 86 E8 A7 A3 E4 BC 9A E5 91 98 E7 89 B9 E6 9D 83 00 0A E7 AD 89 E7 BA A7 3A 20 32 31 00 13 51 51 E6 B4 BB E8 B7 83 E5 A4 A9 E6 95 B0 3A 20 35 33 31 00 1C E5 8D 87 E7 BA A7 E5 89 A9 E4 BD 99 E6 B4 BB E8 B7 83 E5 A4 A9 E6 95 B0 3A 20 34 31 00 1C E4 BC 9A E5 91 98 E6 88 90 E9 95 BF E9 98 B6 E6 AE B5 3A 20 56 49 50 24 56 49 50 24 00 10 E7 AD 89 E7 BA A7 3A 20 24 4C 45 56 45 4C 24 20 00 31 E7 AD 89 E7 BA A7 3A 20 24 4C 45 56 45 4C 24 EF BC 8C 51 51 E4 BC 9A E5 91 98 E5 8A A0 E9 80 9F E5 8D 87 E7 BA A7 51 51 E7 AD 89 E7 BA A7 E4 B8 AD - - -mirai -TEA decrypted: D2 FF 53 90 44 72 12 24 99 11 6F 49 BB 2B 2B 78 1B 96 AD 72 BB F1 B4 DA 7A FA F7 BF 23 5C 01 A1 C9 71 80 C5 F8 8D 6D 64 8F E1 AC AE 95 A8 7A AA 22 B2 C1 79 69 FF B9 64 CF 50 BB 3A BD 9C F5 50 AA 1C 2C F5 F7 7A 9B 5F E4 34 99 A2 27 B2 BC A3 F7 61 ED B4 09 73 CD D1 0B 1D A7 9A CB 57 EC 30 79 56 B8 C1 01 FF 79 B5 27 9F 67 32 C9 9A C1 22 FE 16 99 78 D8 93 D0 90 -TEA encrypt: 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 01 00 00 03 09 00 0C 00 01 3D 97 B4 F2 01 6F A1 58 22 01 00 36 00 12 00 02 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 14 00 1D 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 0 ,.3 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 -packet sent: 02 37 13 08 25 31 02 76 E4 B8 DD 03 00 00 00 01 2E 01 00 00 68 52 00 00 00 00 A8 F2 14 5F 58 12 60 AF 07 63 97 D6 76 B2 1A 3B DF 18 86 D0 60 19 3D 82 B7 82 89 81 B6 EA A6 E1 B1 31 C1 2F 24 1D A6 86 90 FE 54 E5 1D 6F F4 86 F4 01 CE 32 A0 C1 2C AD BA A3 28 53 A3 59 A9 07 72 96 7F D0 96 C2 5C 0E EC E6 A4 9D 7C C3 5F 7B 1C B5 9A ED F6 DE 5E 2F 9A B1 09 10 0B 80 6B C0 F8 C6 32 37 2F 41 9A B7 BA 8D C1 B6 01 F7 8D 50 E3 57 A6 33 C5 80 29 40 3C 30 84 08 5C 40 F7 C6 03 -TEA decrypted: F3 77 B0 EC 44 8E 39 B6 0B BF 8F 19 80 3C B3 AD 70 F8 80 D7 34 B9 EE 3A A1 5A 31 D0 19 70 1F 09 5D 41 76 6C 4E 47 E2 A5 81 CC 06 CF AD D4 07 74 59 EA 6C BC 55 00 F3 A9 B5 21 9B 1D FC 00 B4 05 13 26 01 F9 2F C7 16 E3 4F 17 CF 7A 86 63 88 2A 0C 89 6E E2 90 F4 72 DF 91 A5 13 17 7E 30 90 0F 7A BA 43 37 DD 46 17 46 -TEA encrypt: 13 94 07 50 00 02 76 E4 B8 DD 00 00 04 53 00 00 00 01 00 00 15 85 00 00 01 95 5B 96 CB 95 CF 1C A6 94 C4 B7 79 07 9A BB 15 5D 5E 8C 5B 00 00 00 00 00 00 00 00 00 00 00 00 00 1B 12 55 CB 00 00 00 00 00 00 00 00 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 8A 4B 77 4E E3 65 65 05 89 C3 82 8D 73 AA FC E8 -TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B -TEA encrypt: 01 12 00 38 3D E7 6E BB FC C4 A9 7E 1F AF 38 7D ED 3A 5F 9F 29 9C EA 88 BC E2 E9 99 79 76 C2 DC A7 C4 97 5F 94 EB 71 4D A6 E3 8E 6A B5 FD 2A D4 C6 9E C8 BA D2 ED CC D6 59 B3 5F C1 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 B6 AC C8 A4 11 59 5A 15 B4 65 5F DF ED 82 1D 4A F4 07 F9 3E B5 33 65 D8 04 C3 52 F9 58 02 6F 81 FF 96 5A 97 D8 2F 83 C7 6D 53 EA 30 67 CA C2 62 00 E5 83 67 31 C9 07 BE DC 94 17 A3 4E C7 44 D4 57 5C FA 37 ED B6 AF AD BA 01 93 2F 85 20 5D C1 B1 CA 78 33 38 F5 0B 37 EF 6B 7C 5D 66 D1 10 E5 46 67 74 86 A0 F4 3A CD 10 96 7D DC B8 79 5D 97 37 C3 FF E9 98 94 3C 4E 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 5A 0C 99 46 D3 7B 41 88 C5 46 2B B6 66 EA FD BD 90 8D C6 4D 6E 94 A6 30 B0 83 64 1B 70 56 67 84 53 62 79 BD 34 F7 A5 22 BC B5 96 65 46 0F 1A 54 8B 62 A3 B0 D5 C3 66 7B 27 71 1C B4 C5 11 EA 00 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 03 12 00 05 01 00 00 00 01 05 08 00 05 10 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 C1 57 54 04 89 B0 32 3C CE 59 15 3C DF 64 E8 79 BD 0C 0B 42 -packet sent: 02 37 13 08 36 31 03 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA 87 45 98 A8 AB FA F2 ED 86 95 5F 04 89 67 74 11 F6 61 AF D5 77 92 BE DA 1B 95 97 EA 46 29 E0 A7 57 DD 07 57 75 20 67 FB 09 BA A9 54 84 75 CE 1D FF 2B 7B 56 88 A8 43 DF 57 24 2A 08 4E 9A 81 1E 36 C6 F8 DB 95 44 E2 11 89 39 77 A6 DD D4 35 65 2A E7 02 73 B6 DC EA 76 27 91 04 E4 CF C4 47 F6 00 48 4F 63 C2 4B 37 CD 5A DF 34 6F 2F 14 6B 6B 39 AB 79 D5 47 C8 18 DC B9 3C 5A 36 15 89 D7 D5 FD EF 41 F0 68 42 A9 22 FA D5 90 B3 1B BE D6 4F 44 5D 70 4D BE 8E 7C 5F D5 1A 5D 11 C9 F9 F6 44 20 08 39 04 56 83 30 11 2F AE 81 85 55 A8 AA 99 68 E7 51 15 13 EF 7D E4 3F 0D E3 2B E3 52 A1 84 74 68 36 AF 17 01 49 5B 81 93 19 C8 77 9C 4C 3F C2 00 AD CB EF AC E1 20 85 57 11 36 96 94 42 2C 0D 2A 29 AA 0B 72 39 87 1E EA 36 D7 23 E2 40 07 99 DC CA 6A 9B DE 25 5A E5 05 C6 32 9C 98 8F D2 CD E0 D3 7D E1 E4 17 0D A1 DA 5B CC 53 F6 14 98 CF B2 23 EB 61 35 22 65 C2 A6 8D AC BA 4E D1 0D B1 58 BC ED 35 FC A7 DE A6 1A 2C AF 7B 06 DB 74 4E 81 E0 CE 05 EB 4A AB 9C 96 CC 96 F4 28 E7 B8 F5 95 9E 8D 6E 81 B0 6B 38 ED 29 BC 41 DE B0 3C 8E 4F 64 4B CD 5C F7 D8 24 95 81 BA F7 C0 44 F5 05 31 60 A3 B4 A9 FB D7 D5 E2 AC 8D F2 34 2D 6E 30 84 C3 0F DB 9D 4E 87 34 AE 23 11 47 50 B1 90 F1 9D 9E 9C BD 96 45 3C 60 68 7F 19 F0 F4 13 B2 8F 9A 4F C7 1B 82 C5 A3 DF 5D CF A6 E9 EA 17 46 57 69 81 52 D5 F2 82 B5 51 DF 39 35 39 70 BB 73 9A AA 0C B8 EF 1D DA 43 2A 6D 73 3E FD 6A CC 7C 60 E4 DF 0A A8 B0 B5 A2 E8 72 DC 7A 8F 87 F2 16 06 F6 0D 30 6A 12 F4 29 62 97 EB D8 41 5B 34 23 E0 CB 12 41 37 6D AD D7 34 24 38 C6 69 5E 94 11 D1 C1 48 68 64 B4 3B 5A 07 A9 BC 06 A0 15 6F EA A8 D4 48 14 5D 37 D7 1B 6E AE 51 1E ED 2C 07 86 D5 5D 3F 95 1E AE 25 F7 19 ED 68 E6 E5 C1 93 10 03 -TEA decrypted: 7B 77 D9 8C C0 93 52 8B 44 D5 FB B2 F7 2C 0B 86 C3 9B 8D 6D A2 53 5C C5 C5 B2 68 11 7D BF B7 02 55 0E 28 38 A9 B5 13 B4 9E 97 B4 6A 26 81 BE F6 A2 9E 5E F2 D5 E3 7E 7A 69 BB 3B 89 0C B5 7D 1C 11 E0 EF AA 4E 77 D5 ED A0 43 C3 E8 0E 73 5D FD 35 6D FE 2F B0 49 4F 02 9C 6F 13 5B 60 CE 52 A9 8C EC 42 57 2D 5A 47 7B 2E 8C EC 02 63 60 6E 20 1D D6 A7 15 89 27 92 0F 03 64 57 3A E8 20 6F 30 10 BF B4 A0 C1 95 BF 6C E4 25 74 30 81 9A C9 EB B2 AB 6F D4 98 FE 59 6C 0D 32 29 B3 91 68 F9 D2 96 B1 50 3F C3 CB 84 C3 E2 A2 D6 3B D5 3A E8 EA 10 52 4C 05 A9 B8 33 18 DA 52 EC B9 75 74 F5 BB 51 E8 FB D6 9B 17 CC A4 B4 FF C1 2B 41 CA 6A E0 E6 64 FF 06 C5 56 9C 8F E0 EF 45 52 53 69 A3 C4 26 42 4E 49 26 60 3D C5 03 90 61 CC 7B D0 CA 00 1A 2A B5 F6 37 90 A4 FF 15 6D 32 1A EC CA D7 5F -TEA decrypted: 21 0B EB 52 24 0A C0 42 7A 15 D7 4A C9 3B C7 F5 F4 F0 CC 68 A4 AF 37 39 5E FF 83 C4 A1 C7 A1 4B 20 2A F4 D5 62 D9 5F 1A 45 39 35 AF 7B 7E 7B 2F DE 29 05 55 CA 0F F7 12 40 50 64 CB 2F 93 AB F8 0C 7B 40 52 8C 4A 4E 8F 81 8C F2 33 57 E2 8E C3 71 78 17 03 B2 86 9C E6 F3 C9 DC C7 14 99 F4 9D D4 43 56 B3 79 29 80 14 77 7D 99 A1 35 B8 60 A2 A7 B0 70 31 81 25 87 73 06 41 00 91 D1 B1 A1 EB FC 28 2E 55 DA 63 2D 31 D1 48 E3 DB 6F 78 66 A5 4A 4C 7F 46 2B DE 7B 16 0E B1 C4 59 9D 02 15 45 8C C5 89 69 B5 BF D6 81 EA 66 52 02 0E 13 7F 7F EA 87 0C D4 B2 5E EF 76 2C 79 36 E1 1A AF B8 B9 CC 76 E7 91 E7 AE 2D F2 6E 3F 4B 05 0E 33 9F 56 04 18 CE 6B 23 6B 32 F6 25 48 DD 77 1B DB ED E8 E4 69 94 DD A3 74 08 0C 77 86 00 25 F2 9D 4A 34 -TEA encrypt: 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B -TEA encrypt: 01 12 00 38 3D E7 6E BB FC C4 A9 7E 1F AF 38 7D ED 3A 5F 9F 29 9C EA 88 BC E2 E9 99 79 76 C2 DC A7 C4 97 5F 94 EB 71 4D A6 E3 8E 6A B5 FD 2A D4 C6 9E C8 BA D2 ED CC D6 59 B3 5F C1 03 0F 00 11 00 0F 44 45 53 4B 54 4F 50 2D 4D 31 37 4A 52 45 55 00 05 00 06 00 02 76 E4 B8 DD 00 06 00 78 78 BC 24 30 D3 21 F7 8D 36 0D 1C 79 4E 75 5B 17 D1 54 A2 95 B8 E5 89 04 FC E1 CA 76 B0 01 8F 0C 9E 1C 98 04 2D D3 BA FE A0 7E 15 49 A3 04 46 E4 FE 37 E4 C2 09 D0 DA 89 3E E8 20 85 8F A9 D2 A2 A7 DF 7D 52 F1 9F 93 60 3C 58 63 D7 9E C3 6E 01 EF D5 32 98 FE 36 41 B3 E3 BB 22 AD C5 BF 2D 9F A1 91 D1 E6 11 94 5E 21 C9 98 C4 AE D8 A2 85 5F D7 2B D8 7D 93 1E BB EB 00 15 00 30 00 01 01 27 9B C7 F5 00 10 65 03 FD 8B 00 00 00 00 00 00 00 00 00 00 00 00 02 90 49 55 33 00 10 15 74 C4 89 85 7A 19 F5 5E A9 C9 A3 5E 8A 5A 9B 00 1A 00 40 2E C9 53 D6 3F 21 E6 6C 50 F4 20 6E 9D 71 7E 3F 2B 22 02 8B 80 AD 08 54 3A 9C DB 74 C0 F3 AE A3 1C FB 53 82 5B 75 7B 4E 6A C1 FC E8 85 51 42 3C EE 5C 73 DD 9A 13 95 A2 14 5A B7 F4 AE ED C8 6B 00 18 00 16 00 01 00 00 04 53 00 00 00 01 00 00 15 85 76 E4 B8 DD 00 00 00 00 01 03 00 14 00 01 00 10 60 C9 5D A7 45 70 04 7F 21 7D 84 50 5C 66 A5 C6 01 10 00 3C 00 01 00 38 D3 00 ED E1 26 79 8E 7A 24 6A C8 1D C3 77 66 E9 38 5A 74 65 E0 9A B9 3D F2 79 55 C8 30 EA 56 1C 4E 80 BF 92 28 5D C4 D9 47 CE 1D 50 38 6B 01 54 B8 33 87 C0 4A 17 74 76 03 12 00 05 01 00 00 00 01 05 08 00 05 10 00 00 00 00 03 13 00 19 01 01 02 00 10 04 EA 78 D1 A4 FF CD CC 7C B8 D4 12 7D BB 03 AA 00 00 00 00 01 02 00 62 00 01 04 EB B7 C1 86 F9 08 96 ED 56 84 AB 50 85 2E 48 00 38 E9 AA 2B 4D 26 4C 76 18 FE 59 D5 A9 82 6A 0C 04 B4 49 50 D7 9B B1 FE 5D 97 54 8D 82 F3 22 C2 48 B9 C9 22 69 CA 78 AD 3E 2D E9 C9 DF A8 9E 7D 8C 8D 6B DF 4C D7 34 D0 D3 00 14 8B 30 9B F0 F0 01 5E 66 B2 40 08 B6 91 07 9B 6E 00 FA B6 8C -packet sent: 02 37 13 08 36 31 04 76 E4 B8 DD 03 00 00 00 01 01 01 00 00 68 20 00 00 00 00 00 01 01 03 00 19 02 6D 28 41 D2 A5 6F D2 FC 3E 2A 1F 03 75 DE 6E 28 8F A8 19 3E 5F 16 49 D3 00 00 00 10 EF 4A 36 6A 16 A8 E6 3D 2E EA BD 1F 98 C1 3C DA 66 89 53 B3 E3 C3 81 2F 78 64 6E E9 04 73 47 F1 8D BB F5 5A 4C BF 85 89 E3 7D 87 68 98 20 7B D5 C6 E4 82 85 19 BF F9 27 8A B8 42 22 18 36 92 9D 0C 73 83 87 C3 A1 22 17 8D 3C 3A 86 3D F3 FF 9C A8 FB BC C0 02 D4 DC FE 55 45 BC 76 42 A6 13 87 82 25 3A 80 1D 78 A9 81 1E 2C B9 5D 72 EA CD CE EC D6 7A 12 4B 75 29 D7 D8 A2 88 52 CA 71 B6 9D F7 9A 0D 07 63 BD 29 C0 D8 0C E7 C8 2A FB F5 29 B3 84 86 07 99 0A 36 DE D3 CE 69 2C EC D6 B9 C1 5E ED 96 D4 98 CB 7C F2 70 22 C4 15 D5 B2 63 9D 98 E1 78 3F 70 43 48 50 A8 D1 FB E7 EC C4 D0 A7 8E FA 19 41 4F FB 95 75 A2 AA 9D E2 FE 8C 5D 08 60 8A C7 4B E1 53 62 72 0B 6C 6B 2F D8 38 B8 41 CA DD 09 E7 E1 32 F1 EE A8 73 99 14 EC F4 B9 E2 9F 8A 6D A8 2F AB FE 2B 8E 0D C7 07 02 FF C9 66 2D 67 0C 15 64 BE F1 C3 7F B2 60 E4 5A EB C3 25 49 02 52 6B 77 49 3E 58 15 69 E0 13 B7 53 F0 09 9F 31 D8 3C 88 9B 43 1C 0E DE 09 A1 35 8C 23 BC 3C 6C 6C 76 0F 69 99 12 CE 37 5B B8 E4 3F 16 C0 70 1E D0 03 1C 5E FD D6 7D 9A 20 25 4D E0 E1 91 CE 84 19 D5 5F 70 1A DC 1E 4C 7E 29 03 B7 DE 71 21 34 C0 0C 27 27 82 74 8F 91 54 F9 1C 53 B7 3E E3 A3 29 E9 FE 5B A8 CE FA D0 41 24 59 DD 17 38 A0 0E 63 12 96 0A 10 8F 96 20 26 C5 95 58 CE 67 A5 F6 34 37 F3 AD CE 2B 2B B3 4B 25 5E 17 98 95 60 C0 5E 26 FE 36 4F 2E 21 65 0F C6 AB BB C6 6A 7A 24 BE 92 3E 9E 83 56 FE D5 AA F4 25 6A 83 19 86 C1 04 84 36 20 B7 29 CA 42 AC 29 E9 A2 14 95 4C 6F 0F E5 17 D4 C8 0D 27 87 8A 8F E8 7D 44 EE 1C CE 98 3A 5D 73 FE 79 C1 44 67 FD DE 22 A3 73 85 57 37 06 F7 14 C1 53 F8 DE 0B 91 36 81 CD DE E8 51 8B 28 5F 24 54 F4 47 D3 40 51 E3 59 BB D2 EC 58 1B 4B CE 98 AC 4F 99 1A 85 1C 09 D1 17 16 98 B7 3A 97 CA AD FD 04 7B 63 04 51 66 31 BE 85 A4 CF 61 58 7D EA AD C0 62 84 83 35 94 8D 08 47 85 7C 55 E0 DD 0E 33 59 17 71 9A 9E F1 1A 9C 63 05 A7 9D FC B2 36 44 0D 18 21 B4 6F 66 6E 45 B3 04 91 5A B1 34 30 EC 6F 98 2C 02 C6 16 46 55 1B 03 - - - diff --git a/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt b/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt index 0e7d9f95b..62fc81329 100644 --- a/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt +++ b/mirai-demos/mirai-demo-1/src/main/java/demo1/Main.kt @@ -8,8 +8,8 @@ import net.mamoe.mirai.event.subscribeAll import net.mamoe.mirai.event.subscribeAlways import net.mamoe.mirai.event.subscribeUntilFalse import net.mamoe.mirai.login -import net.mamoe.mirai.message.defaults.Image -import net.mamoe.mirai.message.defaults.PlainText +import net.mamoe.mirai.message.Image +import net.mamoe.mirai.message.PlainText import net.mamoe.mirai.network.protocol.tim.packet.login.LoginState import net.mamoe.mirai.utils.BotAccount import net.mamoe.mirai.utils.Console @@ -26,7 +26,7 @@ suspend fun main() { ), Console()) bot.login().let { - if(it != LoginState.SUCCESS) { + if (it != LoginState.SUCCESS) { MiraiLogger.error("Login failed: " + it.name) exitProcess(0) } @@ -36,10 +36,10 @@ suspend fun main() { //提供泛型以监听事件 subscribeAlways { //获取第一个纯文本消息 - val firstText = it.message[PlainText] + val firstText = it.message.first() //获取第一个图片 - val firstImage = it.message[Image] + val firstImage = it.message.first<Image>() when { it.message eq "你好" -> it.reply("你好!") @@ -78,7 +78,7 @@ suspend fun main() { FriendMessageEvent::class.subscribeAll { always { //获取第一个纯文本消息 - val firstText = it.message[PlainText] + val firstText = it.message.first<PlainText>() } }