Sealed messages

This commit is contained in:
Him188 2019-10-09 20:22:53 +08:00
parent 47e3570702
commit 0b667ba355
28 changed files with 325 additions and 675 deletions

View File

@ -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)
}

View File

@ -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

View File

@ -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 账号.

View File

@ -1,3 +1,5 @@
@file:Suppress("unused")
package net.mamoe.mirai.event
import net.mamoe.mirai.event.internal.Handler

View File

@ -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

View File

@ -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

View File

@ -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 : Event> E.broadcastInternal(): E {
callListeners(this::class.listeners as EventListeners<in E>)
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<out Event>).listeners as EventListeners<in E>)
}
}

View File

@ -2,7 +2,6 @@ package net.mamoe.mirai.message
/**
* @author LamGC
* @author Him188moe
*/
@Suppress("EnumEntryName", "unused", "SpellCheckingInspection")
enum class FaceID constructor(val id: Int) {

View File

@ -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>
) : Message(), Iterable<Message> {
constructor() : this(mutableListOf())
constructor(vararg messages: Message) : this(mutableListOf(*messages))
constructor(messages: Iterable<Message>) : this(messages.toMutableList())
val size: Int = list.size
override val stringValue: String get() = this.list.joinToString("") { it.stringValue }
override fun iterator(): Iterator<Message> = this.list.iterator()
/**
* 实现使用 '+' 操作符连接 [Message] [String]
* 获取第一个 [M] 类型的实例
* @throws [NoSuchElementException] 如果找不到该类型的实例
*/
infix operator fun plus(another: String): MessageChain = this.concat(another)
inline fun <reified M : Message> 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 <reified M : Message> 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
}
}

View File

@ -1,8 +0,0 @@
package net.mamoe.mirai.message
/**
* @author Him188moe
*/
open class MessageKey(
val intValue: Int
)

View File

@ -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()
}

View File

@ -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<out Message>): Boolean = list.any { clazz.isInstance(it) }
operator fun MessageChain.contains(sub: Class<out Message>): Boolean = containsType(sub)

View File

@ -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

View File

@ -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
}
}

View File

@ -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)
}
}
}

View File

@ -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)*/
}
}
}

View File

@ -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<Message> = Collections.synchronizedList(LinkedList<Message>())
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<Message>) {
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<out Message>): Boolean = list.any { clazz.isInstance(it) }
fun containsType(clazz: Class<out Message>): Boolean = list.any { clazz.isInstance(it) }
operator fun contains(sub: KClass<out Message>): Boolean = containsType(sub)
operator fun contains(sub: Class<out Message>): Boolean = containsType(sub)
fun stream(): Stream<Message> {
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
}

View File

@ -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())
}
}
}

View File

@ -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")
}
})
}
}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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<Byte>()
repeat(16) {
bytes += unsafe.getByte(encrypt + it)
}
println(bytes.toByteArray().toUHexString())
}

View File

@ -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)
}
}

View File

@ -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

View File

@ -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<FriendMessageEvent> {
//获取第一个纯文本消息
val firstText = it.message[PlainText]
val firstText = it.message.first<PlainText>()
//获取第一个图片
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>()
}
}