From 1aafe78b779523c8c2f9eed7ebe321c0e0f05783 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sun, 15 Dec 2019 15:53:29 +0800
Subject: [PATCH 1/3] Fix java.nio.BufferUnderflowException

---
 .../commonMain/kotlin/net.mamoe.mirai/utils/io/InputUtils.kt  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/InputUtils.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/InputUtils.kt
index 9a0917bd9..49a78aa06 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/InputUtils.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/io/InputUtils.kt
@@ -67,7 +67,7 @@ fun Input.readTLVMap(expectingEOF: Boolean = false, tagSize: Int = 1): MutableMa
                     2 -> readUShort()
                     else -> error("Unsupported tag size: $tagSize")
                 }
-            } catch (e: EOFException) {
+            } catch (e: Exception) { // java.nio.BufferUnderflowException is not a EOFException...
                 if (expectingEOF) {
                     return map
                 }
@@ -79,7 +79,7 @@ fun Input.readTLVMap(expectingEOF: Boolean = false, tagSize: Int = 1): MutableMa
         check(!map.containsKey(type.toUInt())) {
             "Count not readTLVMap: duplicated key 0x${type.toUInt().toUHexString("")}. " +
                     "map=$map" +
-                    ", duplicating value=${this.readUShortLVByteArray()}" +
+                    ", duplicating value=${this.readUShortLVByteArray().toUHexString()}" +
                     ", remaining=" + if (expectingEOF) this.readBytes().toUHexString() else "[Not expecting EOF]"
         }
         try {

From 1dda46d34c255afb0444e6b99aad5cdc3082e4ae Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sun, 15 Dec 2019 15:54:39 +0800
Subject: [PATCH 2/3] Add debugging prints for failed decodes

---
 .../network/protocol/tim/packet/event/MemberMute.kt            | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/event/MemberMute.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/event/MemberMute.kt
index bc472a2d5..ceb838afb 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/event/MemberMute.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/event/MemberMute.kt
@@ -11,6 +11,7 @@ import net.mamoe.mirai.contact.Group
 import net.mamoe.mirai.contact.Member
 import net.mamoe.mirai.getGroup
 import net.mamoe.mirai.qqAccount
+import net.mamoe.mirai.utils.io.debugPrintIfFail
 import net.mamoe.mirai.utils.io.toUHexString
 
 // region mute
@@ -126,7 +127,7 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl
                 Unknown0x02DCPacketFlag0x0EMaybeMutePacket
             }
 
-            0x11u -> {
+            0x11u -> debugPrintIfFail("解析禁言包(0x02DC)时"){ // 猜测这个失败是撤回??
                 discardExact(15)
                 discardExact(2)
                 val group = bot.getGroup(readUInt())

From 2812f2c1d366f21bacdd4f087087bbcab250d241 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sun, 15 Dec 2019 15:56:05 +0800
Subject: [PATCH 3/3] Add remaining for debugging

---
 .../network/protocol/tim/packet/event/MemberMute.kt      | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/event/MemberMute.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/event/MemberMute.kt
index ceb838afb..c929d9cbb 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/event/MemberMute.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/network/protocol/tim/packet/event/MemberMute.kt
@@ -12,6 +12,7 @@ import net.mamoe.mirai.contact.Member
 import net.mamoe.mirai.getGroup
 import net.mamoe.mirai.qqAccount
 import net.mamoe.mirai.utils.io.debugPrintIfFail
+import net.mamoe.mirai.utils.io.readRemainingBytes
 import net.mamoe.mirai.utils.io.toUHexString
 
 // region mute
@@ -77,10 +78,12 @@ sealed class UnmuteEvent : EventOfMute() {
 
 // endregion
 
-internal object Unknown0x02DCPacketFlag0x0EMaybeMutePacket : EventOfMute() {
+internal class Unknown0x02DCPacketFlag0x0EMaybeMutePacket(
+    val remaining: ByteArray
+) : EventOfMute() {
     override val operator: Member get() = error("Getting a field from Unknown0x02DCPacketFlag0x0EMaybeMutePacket")
     override val group: Group get() = error("Getting a field from Unknown0x02DCPacketFlag0x0EMaybeMutePacket")
-    override fun toString(): String = "Unknown0x02DCPacketFlag0x0EMaybeMutePacket"
+    override fun toString(): String = "Unknown0x02DCPacketFlag0x0EMaybeMutePacket(remaining=${remaining.toUHexString()})"
 }
 
 sealed class EventOfMute : EventPacket {
@@ -124,7 +127,7 @@ internal object MemberMuteEventPacketParserAndHandler : KnownEventParserAndHandl
             0x0Eu -> {
                 //00 00 00 0E 00 08 00 02 00 01 00
                 // 0A 00 04 01 00 00 00 35 DB 60 A2 11 00 3E 08 07 20 A2 C1 ED AE 03 5A 34 08 A2 FF 8C F0 03 1A 19 08 F4 0E 10 FE 8C D3 EF 05 18 84 A1 F8 F9 06 20 00 28 00 30 A2 FF 8C F0 03 2A 0D 08 00 12 09 08 F4 0E 10 00 18 01 20 00 30 00 38 00
-                Unknown0x02DCPacketFlag0x0EMaybeMutePacket
+                Unknown0x02DCPacketFlag0x0EMaybeMutePacket(readRemainingBytes())
             }
 
             0x11u -> debugPrintIfFail("解析禁言包(0x02DC)时"){ // 猜测这个失败是撤回??