Bläddra i källkod

Migrate to Kotlin 1.5.30 and review dependencies:
- Remove redundant atomicfu-common
- Do not expose kotlinx-io and atomicfu

Him188 4 år sedan
förälder
incheckning
66999aadaf
27 ändrade filer med 227 tillägg och 152 borttagningar
  1. 41 0
      binary-compatibility-validator/android/api/binary-compatibility-validator-android.api
  2. 41 0
      binary-compatibility-validator/api/binary-compatibility-validator.api
  3. 1 0
      build.gradle.kts
  4. 44 1
      buildSrc/src/main/kotlin/Mpp.kt
  5. 2 3
      buildSrc/src/main/kotlin/ProjectConfigure.kt
  6. 39 19
      buildSrc/src/main/kotlin/Versions.kt
  7. 9 35
      mirai-core-api/build.gradle.kts
  8. 1 1
      mirai-core-api/src/commonMain/kotlin/LowLevelApiAccessor.kt
  9. 0 1
      mirai-core-api/src/commonMain/kotlin/message/data/Dice.kt
  10. 1 1
      mirai-core-api/src/commonMain/kotlin/message/data/FileMessage.kt
  11. 1 2
      mirai-core-api/src/commonMain/kotlin/message/data/MusicShare.kt
  12. 0 1
      mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt
  13. 1 0
      mirai-core-api/src/commonMain/kotlin/message/data/impl.kt
  14. 2 2
      mirai-core-api/src/commonMain/kotlin/utils/Annotations.kt
  15. 4 23
      mirai-core-api/src/jvmMain/kotlin/utils/LoginSolver.jvm.kt
  16. 9 22
      mirai-core-utils/build.gradle.kts
  17. 0 1
      mirai-core-utils/src/commonMain/kotlin/Annotations.kt
  18. 0 2
      mirai-core-utils/src/commonMain/kotlin/MiraiPlatformUtils.kt
  19. 9 30
      mirai-core/build.gradle.kts
  20. 1 0
      mirai-core/src/androidMain/kotlin/utils/crypto/ECDHJvmDesktop.kt
  21. 4 8
      mirai-core/src/commonMain/kotlin/MiraiImpl.kt
  22. 2 0
      mirai-core/src/commonMain/kotlin/contact/announcement/AnnouncementsImpl.kt
  23. 4 0
      mirai-core/src/commonMain/kotlin/message/imagesImpl.kt
  24. 4 0
      mirai-core/src/commonMain/kotlin/message/incomingSourceImpl.kt
  25. 1 0
      mirai-core/src/commonMain/kotlin/message/offlineSourceImpl.kt
  26. 4 0
      mirai-core/src/commonMain/kotlin/message/outgoingSourceImpl.kt
  27. 2 0
      mirai-core/src/commonMain/kotlin/network/highway/Http.kt

+ 41 - 0
binary-compatibility-validator/android/api/binary-compatibility-validator-android.api

@@ -601,6 +601,7 @@ public final class net/mamoe/mirai/contact/announcement/AnnouncementImage {
 	public final fun getWidth ()I
 	public final fun getWidth ()I
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/contact/announcement/AnnouncementImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/contact/announcement/AnnouncementImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -640,6 +641,7 @@ public final class net/mamoe/mirai/contact/announcement/AnnouncementParameters {
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public final fun isPinned ()Z
 	public final fun isPinned ()Z
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/contact/announcement/AnnouncementParameters$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/contact/announcement/AnnouncementParameters$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -811,6 +813,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo {
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public final fun isEnd ()Ljava/lang/Integer;
 	public final fun isEnd ()Ljava/lang/Integer;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -844,6 +847,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GActNum {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GActNum;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GActNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GActNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -877,6 +881,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GExitNum {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GExitNum;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GExitNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GExitNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -910,6 +915,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GJoinNum {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GJoinNum;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GJoinNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GJoinNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -943,6 +949,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMemNum {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GMemNum;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMemNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMemNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -980,6 +987,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMostAct {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GMostAct;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMostAct$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMostAct$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1013,6 +1021,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GSentence {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GSentence;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GSentence$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GSentence$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1067,6 +1076,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$Actor {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$Actor;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$Actor$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$Actor$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1110,6 +1120,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$CurrentTalkative {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$CurrentTalkative;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$CurrentTalkative$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$CurrentTalkative$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1156,6 +1167,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$Language {
 	public final fun getScript ()Ljava/lang/String;
 	public final fun getScript ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$Language;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$Language$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$Language$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1197,6 +1209,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$LevelName {
 	public final fun getLv6 ()Ljava/lang/String;
 	public final fun getLv6 ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$LevelName;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$LevelName$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$LevelName$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1240,6 +1253,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$Tag {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$Tag;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$Tag$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$Tag$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1281,6 +1295,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$Talkative {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$Talkative;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$Talkative$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$Talkative$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1356,6 +1371,7 @@ public abstract class net/mamoe/mirai/data/RequestEventData {
 	public abstract fun getEventId ()J
 	public abstract fun getEventId ()J
 	public fun reject (Lnet/mamoe/mirai/Bot;)V
 	public fun reject (Lnet/mamoe/mirai/Bot;)V
 	public abstract fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public abstract fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest : net/mamoe/mirai/data/RequestEventData {
 public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest : net/mamoe/mirai/data/RequestEventData {
@@ -1369,6 +1385,7 @@ public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequ
 	public final fun getInvitorNick ()Ljava/lang/String;
 	public final fun getInvitorNick ()Ljava/lang/String;
 	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1412,6 +1429,7 @@ public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest : net
 	public final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public static synthetic fun reject$default (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lnet/mamoe/mirai/Bot;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
 	public static synthetic fun reject$default (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lnet/mamoe/mirai/Bot;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1442,6 +1460,7 @@ public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest : net/
 	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -3244,6 +3263,7 @@ public final class net/mamoe/mirai/message/data/At : net/mamoe/mirai/message/cod
 	public final fun getTarget ()J
 	public final fun getTarget ()J
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/At;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/At$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/At$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -3308,6 +3328,7 @@ public final class net/mamoe/mirai/message/data/AudioCodec$Companion {
 	public final fun fromFormatNameOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromFormatNameOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromId (I)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromId (I)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromIdOrNull (I)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromIdOrNull (I)Lnet/mamoe/mirai/message/data/AudioCodec;
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
 }
 }
 
 
 public abstract interface class net/mamoe/mirai/message/data/ConstrainSingle : net/mamoe/mirai/message/data/SingleMessage {
 public abstract interface class net/mamoe/mirai/message/data/ConstrainSingle : net/mamoe/mirai/message/data/SingleMessage {
@@ -3364,6 +3385,7 @@ public final class net/mamoe/mirai/message/data/Dice : net/mamoe/mirai/message/c
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public static final fun random ()Lnet/mamoe/mirai/message/data/Dice;
 	public static final fun random ()Lnet/mamoe/mirai/message/data/Dice;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/Dice;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/Dice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/Dice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -3416,6 +3438,7 @@ public final class net/mamoe/mirai/message/data/EmptyMessageChain : java/util/Li
 	public fun replaceAll (Ljava/util/function/UnaryOperator;)V
 	public fun replaceAll (Ljava/util/function/UnaryOperator;)V
 	public fun retainAll (Ljava/util/Collection;)Z
 	public fun retainAll (Ljava/util/Collection;)Z
 	public fun serializeToMiraiCode ()Ljava/lang/String;
 	public fun serializeToMiraiCode ()Ljava/lang/String;
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
 	public synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;
 	public synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;
 	public fun set (ILnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/SingleMessage;
 	public fun set (ILnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/SingleMessage;
 	public final fun size ()I
 	public final fun size ()I
@@ -3947,6 +3970,7 @@ public final class net/mamoe/mirai/message/data/Face : net/mamoe/mirai/message/c
 	public final fun getName ()Ljava/lang/String;
 	public final fun getName ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/Face;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/Face$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/Face$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4012,6 +4036,7 @@ public final class net/mamoe/mirai/message/data/FlashImage : net/mamoe/mirai/mes
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun serializeToMiraiCode ()Ljava/lang/String;
 	public fun serializeToMiraiCode ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/FlashImage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/FlashImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/FlashImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4061,6 +4086,7 @@ public final class net/mamoe/mirai/message/data/ForwardMessage : net/mamoe/mirai
 	public final fun getTitle ()Ljava/lang/String;
 	public final fun getTitle ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/ForwardMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/ForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/ForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4109,6 +4135,7 @@ public final class net/mamoe/mirai/message/data/ForwardMessage$Node : net/mamoe/
 	public fun getTime ()I
 	public fun getTime ()I
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/ForwardMessage$Node;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/ForwardMessage$Node$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/ForwardMessage$Node$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4318,6 +4345,7 @@ public final class net/mamoe/mirai/message/data/LightApp : net/mamoe/mirai/messa
 	public fun getContent ()Ljava/lang/String;
 	public fun getContent ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/LightApp;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/LightApp$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/LightApp$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4741,6 +4769,7 @@ public final class net/mamoe/mirai/message/data/MusicShare : net/mamoe/mirai/mes
 	public final fun getTitle ()Ljava/lang/String;
 	public final fun getTitle ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/MusicShare;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/MusicShare$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/MusicShare$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4951,6 +4980,7 @@ public final class net/mamoe/mirai/message/data/PlainText : net/mamoe/mirai/mess
 	public final fun getContent ()Ljava/lang/String;
 	public final fun getContent ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/PlainText;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/PlainText$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/PlainText$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5003,6 +5033,7 @@ public final class net/mamoe/mirai/message/data/PokeMessage : net/mamoe/mirai/me
 	public final fun getPokeType ()I
 	public final fun getPokeType ()I
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/PokeMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/PokeMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/PokeMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5039,6 +5070,7 @@ public final class net/mamoe/mirai/message/data/QuoteReply : net/mamoe/mirai/mes
 	public final fun getSource ()Lnet/mamoe/mirai/message/data/MessageSource;
 	public final fun getSource ()Lnet/mamoe/mirai/message/data/MessageSource;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/QuoteReply;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/QuoteReply$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/QuoteReply$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5069,6 +5101,7 @@ public final class net/mamoe/mirai/message/data/RawForwardMessage {
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public final fun render (Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;
 	public final fun render (Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/RawForwardMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/RawForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/RawForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5089,6 +5122,7 @@ public final class net/mamoe/mirai/message/data/RawForwardMessage$Companion {
 
 
 public abstract interface class net/mamoe/mirai/message/data/RichMessage : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {
 public abstract interface class net/mamoe/mirai/message/data/RichMessage : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {
 	public static final field Key Lnet/mamoe/mirai/message/data/RichMessage$Key;
 	public static final field Key Lnet/mamoe/mirai/message/data/RichMessage$Key;
+	public fun contentToString ()Ljava/lang/String;
 	public abstract fun getContent ()Ljava/lang/String;
 	public abstract fun getContent ()Ljava/lang/String;
 	public fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
 	public fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
 }
 }
@@ -5115,6 +5149,7 @@ public final class net/mamoe/mirai/message/data/RichMessageOrigin : net/mamoe/mi
 	public final fun getResourceId ()Ljava/lang/String;
 	public final fun getResourceId ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/RichMessageOrigin;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/RichMessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/RichMessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5146,6 +5181,7 @@ public final class net/mamoe/mirai/message/data/ShowImageFlag : net/mamoe/mirai/
 	public static final field SERIAL_NAME Ljava/lang/String;
 	public static final field SERIAL_NAME Ljava/lang/String;
 	public synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
 	public synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
 	public fun getKey ()Lnet/mamoe/mirai/message/data/ShowImageFlag;
 	public fun getKey ()Lnet/mamoe/mirai/message/data/ShowImageFlag;
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
 }
 }
 
 
@@ -5227,6 +5263,7 @@ public final class net/mamoe/mirai/message/data/VipFace : net/mamoe/mirai/messag
 	public final fun getKind ()Lnet/mamoe/mirai/message/data/VipFace$Kind;
 	public final fun getKind ()Lnet/mamoe/mirai/message/data/VipFace$Kind;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/VipFace;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/VipFace$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/VipFace$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5258,6 +5295,7 @@ public final class net/mamoe/mirai/message/data/VipFace$Kind {
 	public final fun getName ()Ljava/lang/String;
 	public final fun getName ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/VipFace$Kind;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/VipFace$Kind$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/VipFace$Kind$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5292,6 +5330,7 @@ public class net/mamoe/mirai/message/data/Voice : net/mamoe/mirai/message/data/P
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public final fun toAudio ()Lnet/mamoe/mirai/message/data/Audio;
 	public final fun toAudio ()Lnet/mamoe/mirai/message/data/Audio;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/Voice;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/Voice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/Voice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5511,6 +5550,7 @@ public final class net/mamoe/mirai/utils/DeviceInfo {
 	public final fun getWifiBSSID ()[B
 	public final fun getWifiBSSID ()[B
 	public final fun getWifiSSID ()[B
 	public final fun getWifiSSID ()[B
 	public static final fun random ()Lnet/mamoe/mirai/utils/DeviceInfo;
 	public static final fun random ()Lnet/mamoe/mirai/utils/DeviceInfo;
+	public static final fun write$Self (Lnet/mamoe/mirai/utils/DeviceInfo;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/utils/DeviceInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/utils/DeviceInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5543,6 +5583,7 @@ public final class net/mamoe/mirai/utils/DeviceInfo$Version {
 	public final fun getIncremental ()[B
 	public final fun getIncremental ()[B
 	public final fun getRelease ()[B
 	public final fun getRelease ()[B
 	public final fun getSdk ()I
 	public final fun getSdk ()I
+	public static final fun write$Self (Lnet/mamoe/mirai/utils/DeviceInfo$Version;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/utils/DeviceInfo$Version$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/utils/DeviceInfo$Version$$serializer : kotlinx/serialization/internal/GeneratedSerializer {

+ 41 - 0
binary-compatibility-validator/api/binary-compatibility-validator.api

@@ -601,6 +601,7 @@ public final class net/mamoe/mirai/contact/announcement/AnnouncementImage {
 	public final fun getWidth ()I
 	public final fun getWidth ()I
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/contact/announcement/AnnouncementImage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/contact/announcement/AnnouncementImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/contact/announcement/AnnouncementImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -640,6 +641,7 @@ public final class net/mamoe/mirai/contact/announcement/AnnouncementParameters {
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public final fun isPinned ()Z
 	public final fun isPinned ()Z
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/contact/announcement/AnnouncementParameters;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/contact/announcement/AnnouncementParameters$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/contact/announcement/AnnouncementParameters$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -811,6 +813,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo {
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public final fun isEnd ()Ljava/lang/Integer;
 	public final fun isEnd ()Ljava/lang/Integer;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -844,6 +847,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GActNum {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GActNum;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GActNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GActNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -877,6 +881,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GExitNum {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GExitNum;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GExitNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GExitNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -910,6 +915,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GJoinNum {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GJoinNum;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GJoinNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GJoinNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -943,6 +949,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMemNum {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GMemNum;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMemNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMemNum$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -980,6 +987,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMostAct {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GMostAct;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMostAct$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GMostAct$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1013,6 +1021,7 @@ public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GSentence {
 	public final fun getNum ()Ljava/lang/Integer;
 	public final fun getNum ()Ljava/lang/Integer;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupActiveData$GInfo$GSentence;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GSentence$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupActiveData$GInfo$GSentence$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1067,6 +1076,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$Actor {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$Actor;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$Actor$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$Actor$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1110,6 +1120,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$CurrentTalkative {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$CurrentTalkative;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$CurrentTalkative$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$CurrentTalkative$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1156,6 +1167,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$Language {
 	public final fun getScript ()Ljava/lang/String;
 	public final fun getScript ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$Language;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$Language$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$Language$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1197,6 +1209,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$LevelName {
 	public final fun getLv6 ()Ljava/lang/String;
 	public final fun getLv6 ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$LevelName;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$LevelName$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$LevelName$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1240,6 +1253,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$Tag {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$Tag;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$Tag$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$Tag$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1281,6 +1295,7 @@ public final class net/mamoe/mirai/data/GroupHonorListData$Talkative {
 	public final fun getUin ()Ljava/lang/Long;
 	public final fun getUin ()Ljava/lang/Long;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/GroupHonorListData$Talkative;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/GroupHonorListData$Talkative$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/GroupHonorListData$Talkative$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1356,6 +1371,7 @@ public abstract class net/mamoe/mirai/data/RequestEventData {
 	public abstract fun getEventId ()J
 	public abstract fun getEventId ()J
 	public fun reject (Lnet/mamoe/mirai/Bot;)V
 	public fun reject (Lnet/mamoe/mirai/Bot;)V
 	public abstract fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public abstract fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest : net/mamoe/mirai/data/RequestEventData {
 public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest : net/mamoe/mirai/data/RequestEventData {
@@ -1369,6 +1385,7 @@ public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequ
 	public final fun getInvitorNick ()Ljava/lang/String;
 	public final fun getInvitorNick ()Ljava/lang/String;
 	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1412,6 +1429,7 @@ public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest : net
 	public final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public static synthetic fun reject$default (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lnet/mamoe/mirai/Bot;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
 	public static synthetic fun reject$default (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lnet/mamoe/mirai/Bot;ZLjava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -1442,6 +1460,7 @@ public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest : net/
 	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public final fun reject (Lnet/mamoe/mirai/Bot;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -3244,6 +3263,7 @@ public final class net/mamoe/mirai/message/data/At : net/mamoe/mirai/message/cod
 	public final fun getTarget ()J
 	public final fun getTarget ()J
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/At;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/At$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/At$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -3308,6 +3328,7 @@ public final class net/mamoe/mirai/message/data/AudioCodec$Companion {
 	public final fun fromFormatNameOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromFormatNameOrNull (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromId (I)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromId (I)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromIdOrNull (I)Lnet/mamoe/mirai/message/data/AudioCodec;
 	public final fun fromIdOrNull (I)Lnet/mamoe/mirai/message/data/AudioCodec;
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
 }
 }
 
 
 public abstract interface class net/mamoe/mirai/message/data/ConstrainSingle : net/mamoe/mirai/message/data/SingleMessage {
 public abstract interface class net/mamoe/mirai/message/data/ConstrainSingle : net/mamoe/mirai/message/data/SingleMessage {
@@ -3364,6 +3385,7 @@ public final class net/mamoe/mirai/message/data/Dice : net/mamoe/mirai/message/c
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public static final fun random ()Lnet/mamoe/mirai/message/data/Dice;
 	public static final fun random ()Lnet/mamoe/mirai/message/data/Dice;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/Dice;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/Dice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/Dice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -3416,6 +3438,7 @@ public final class net/mamoe/mirai/message/data/EmptyMessageChain : java/util/Li
 	public fun replaceAll (Ljava/util/function/UnaryOperator;)V
 	public fun replaceAll (Ljava/util/function/UnaryOperator;)V
 	public fun retainAll (Ljava/util/Collection;)Z
 	public fun retainAll (Ljava/util/Collection;)Z
 	public fun serializeToMiraiCode ()Ljava/lang/String;
 	public fun serializeToMiraiCode ()Ljava/lang/String;
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
 	public synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;
 	public synthetic fun set (ILjava/lang/Object;)Ljava/lang/Object;
 	public fun set (ILnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/SingleMessage;
 	public fun set (ILnet/mamoe/mirai/message/data/SingleMessage;)Lnet/mamoe/mirai/message/data/SingleMessage;
 	public final fun size ()I
 	public final fun size ()I
@@ -3947,6 +3970,7 @@ public final class net/mamoe/mirai/message/data/Face : net/mamoe/mirai/message/c
 	public final fun getName ()Ljava/lang/String;
 	public final fun getName ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/Face;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/Face$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/Face$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4012,6 +4036,7 @@ public final class net/mamoe/mirai/message/data/FlashImage : net/mamoe/mirai/mes
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun serializeToMiraiCode ()Ljava/lang/String;
 	public fun serializeToMiraiCode ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/FlashImage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/FlashImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/FlashImage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4061,6 +4086,7 @@ public final class net/mamoe/mirai/message/data/ForwardMessage : net/mamoe/mirai
 	public final fun getTitle ()Ljava/lang/String;
 	public final fun getTitle ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/ForwardMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/ForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/ForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4109,6 +4135,7 @@ public final class net/mamoe/mirai/message/data/ForwardMessage$Node : net/mamoe/
 	public fun getTime ()I
 	public fun getTime ()I
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/ForwardMessage$Node;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/ForwardMessage$Node$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/ForwardMessage$Node$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4318,6 +4345,7 @@ public final class net/mamoe/mirai/message/data/LightApp : net/mamoe/mirai/messa
 	public fun getContent ()Ljava/lang/String;
 	public fun getContent ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/LightApp;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/LightApp$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/LightApp$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4741,6 +4769,7 @@ public final class net/mamoe/mirai/message/data/MusicShare : net/mamoe/mirai/mes
 	public final fun getTitle ()Ljava/lang/String;
 	public final fun getTitle ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/MusicShare;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/MusicShare$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/MusicShare$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -4951,6 +4980,7 @@ public final class net/mamoe/mirai/message/data/PlainText : net/mamoe/mirai/mess
 	public final fun getContent ()Ljava/lang/String;
 	public final fun getContent ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/PlainText;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/PlainText$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/PlainText$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5003,6 +5033,7 @@ public final class net/mamoe/mirai/message/data/PokeMessage : net/mamoe/mirai/me
 	public final fun getPokeType ()I
 	public final fun getPokeType ()I
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/PokeMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/PokeMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/PokeMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5039,6 +5070,7 @@ public final class net/mamoe/mirai/message/data/QuoteReply : net/mamoe/mirai/mes
 	public final fun getSource ()Lnet/mamoe/mirai/message/data/MessageSource;
 	public final fun getSource ()Lnet/mamoe/mirai/message/data/MessageSource;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/QuoteReply;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/QuoteReply$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/QuoteReply$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5069,6 +5101,7 @@ public final class net/mamoe/mirai/message/data/RawForwardMessage {
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public final fun render (Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;
 	public final fun render (Lnet/mamoe/mirai/message/data/ForwardMessage$DisplayStrategy;)Lnet/mamoe/mirai/message/data/ForwardMessage;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/RawForwardMessage;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/RawForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/RawForwardMessage$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5089,6 +5122,7 @@ public final class net/mamoe/mirai/message/data/RawForwardMessage$Companion {
 
 
 public abstract interface class net/mamoe/mirai/message/data/RichMessage : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {
 public abstract interface class net/mamoe/mirai/message/data/RichMessage : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {
 	public static final field Key Lnet/mamoe/mirai/message/data/RichMessage$Key;
 	public static final field Key Lnet/mamoe/mirai/message/data/RichMessage$Key;
+	public fun contentToString ()Ljava/lang/String;
 	public abstract fun getContent ()Ljava/lang/String;
 	public abstract fun getContent ()Ljava/lang/String;
 	public fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
 	public fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
 }
 }
@@ -5115,6 +5149,7 @@ public final class net/mamoe/mirai/message/data/RichMessageOrigin : net/mamoe/mi
 	public final fun getResourceId ()Ljava/lang/String;
 	public final fun getResourceId ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/RichMessageOrigin;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/RichMessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/RichMessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5146,6 +5181,7 @@ public final class net/mamoe/mirai/message/data/ShowImageFlag : net/mamoe/mirai/
 	public static final field SERIAL_NAME Ljava/lang/String;
 	public static final field SERIAL_NAME Ljava/lang/String;
 	public synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
 	public synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
 	public fun getKey ()Lnet/mamoe/mirai/message/data/ShowImageFlag;
 	public fun getKey ()Lnet/mamoe/mirai/message/data/ShowImageFlag;
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
 }
 }
 
 
@@ -5227,6 +5263,7 @@ public final class net/mamoe/mirai/message/data/VipFace : net/mamoe/mirai/messag
 	public final fun getKind ()Lnet/mamoe/mirai/message/data/VipFace$Kind;
 	public final fun getKind ()Lnet/mamoe/mirai/message/data/VipFace$Kind;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/VipFace;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/VipFace$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/VipFace$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5258,6 +5295,7 @@ public final class net/mamoe/mirai/message/data/VipFace$Kind {
 	public final fun getName ()Ljava/lang/String;
 	public final fun getName ()Ljava/lang/String;
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/VipFace$Kind;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/VipFace$Kind$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/VipFace$Kind$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5292,6 +5330,7 @@ public class net/mamoe/mirai/message/data/Voice : net/mamoe/mirai/message/data/P
 	public fun hashCode ()I
 	public fun hashCode ()I
 	public final fun toAudio ()Lnet/mamoe/mirai/message/data/Audio;
 	public final fun toAudio ()Lnet/mamoe/mirai/message/data/Audio;
 	public fun toString ()Ljava/lang/String;
 	public fun toString ()Ljava/lang/String;
+	public static final fun write$Self (Lnet/mamoe/mirai/message/data/Voice;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/message/data/Voice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/message/data/Voice$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5511,6 +5550,7 @@ public final class net/mamoe/mirai/utils/DeviceInfo {
 	public final fun getWifiBSSID ()[B
 	public final fun getWifiBSSID ()[B
 	public final fun getWifiSSID ()[B
 	public final fun getWifiSSID ()[B
 	public static final fun random ()Lnet/mamoe/mirai/utils/DeviceInfo;
 	public static final fun random ()Lnet/mamoe/mirai/utils/DeviceInfo;
+	public static final fun write$Self (Lnet/mamoe/mirai/utils/DeviceInfo;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/utils/DeviceInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/utils/DeviceInfo$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
@@ -5543,6 +5583,7 @@ public final class net/mamoe/mirai/utils/DeviceInfo$Version {
 	public final fun getIncremental ()[B
 	public final fun getIncremental ()[B
 	public final fun getRelease ()[B
 	public final fun getRelease ()[B
 	public final fun getSdk ()I
 	public final fun getSdk ()I
+	public static final fun write$Self (Lnet/mamoe/mirai/utils/DeviceInfo$Version;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
 }
 }
 
 
 public final class net/mamoe/mirai/utils/DeviceInfo$Version$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
 public final class net/mamoe/mirai/utils/DeviceInfo$Version$$serializer : kotlinx/serialization/internal/GeneratedSerializer {

+ 1 - 0
build.gradle.kts

@@ -97,6 +97,7 @@ allprojects {
             configureFlattenSourceSets()
             configureFlattenSourceSets()
         }
         }
         configureJarManifest()
         configureJarManifest()
+        substituteDependenciesUsingExpectedVersion()
 
 
         if (System.getenv("MIRAI_IS_SNAPSHOTS_PUBLISHING") != null) {
         if (System.getenv("MIRAI_IS_SNAPSHOTS_PUBLISHING") != null) {
             project.tasks.filterIsInstance<ShadowJar>().forEach { shadow ->
             project.tasks.filterIsInstance<ShadowJar>().forEach { shadow ->

+ 44 - 1
buildSrc/src/main/kotlin/Mpp.kt

@@ -10,6 +10,9 @@
 import org.gradle.api.NamedDomainObjectCollection
 import org.gradle.api.NamedDomainObjectCollection
 import org.gradle.api.NamedDomainObjectProvider
 import org.gradle.api.NamedDomainObjectProvider
 import org.gradle.api.Project
 import org.gradle.api.Project
+import org.gradle.api.artifacts.DependencySubstitutions
+import org.gradle.api.artifacts.ResolutionStrategy
+import org.gradle.api.artifacts.component.ComponentSelector
 import java.util.*
 import java.util.*
 
 
 /*
 /*
@@ -73,4 +76,44 @@ fun Project.printAndroidNotInstalled() {
         """Android SDK might not be installed. Android target of $name will not be compiled. It does no influence on the compilation of other platforms.
         """Android SDK might not be installed. Android target of $name will not be compiled. It does no influence on the compilation of other platforms.
             """.trimIndent()
             """.trimIndent()
     )
     )
-}
+}
+
+inline fun forMppModules(action: (suffix: String) -> Unit) {
+    arrayOf(
+        "",
+        "-common",
+        "-metadata",
+        "-jvm",
+        "-jdk7",
+        "-jdk8"
+    ).forEach(action)
+}
+
+fun Project.substituteDependenciesUsingExpectedVersion() {
+    configurations.all {
+        resolutionStrategy.substituteDependencies {
+            forMppModules { suffix ->
+                module("org.jetbrains.kotlin:kotlin-stdlib$suffix") using module("org.jetbrains.kotlin:kotlin-stdlib$suffix:${Versions.kotlinStdlib}")
+                module("org.jetbrains.kotlin:kotlin-reflect$suffix") using module("org.jetbrains.kotlin:kotlin-reflect$suffix:${Versions.kotlinStdlib}")
+                module("org.jetbrains.kotlinx:kotlinx-coroutines-core$suffix") using
+                        module(kotlinx("coroutines-core$suffix", Versions.coroutines))
+                module("org.jetbrains.kotlinx:kotlinx-coroutines-debug$suffix") using
+                        module(kotlinx("coroutines-debug$suffix", Versions.coroutines))
+            }
+        }
+    }
+}
+
+class ResolutionStrategyDsl(
+    private val origin: DependencySubstitutions
+) : DependencySubstitutions by origin {
+    infix fun ComponentSelector.using(notation: ComponentSelector): DependencySubstitutions.Substitution {
+        return substitute(this).using(notation)
+    }
+}
+
+fun ResolutionStrategy.substituteDependencies(action: ResolutionStrategyDsl.() -> Unit) {
+    dependencySubstitution {
+        action(ResolutionStrategyDsl(this))
+    }
+}

+ 2 - 3
buildSrc/src/main/kotlin/ProjectConfigure.kt

@@ -159,13 +159,12 @@ fun Project.configureKotlinExperimentalUsages() {
 
 
 fun KotlinSourceSet.configureKotlinExperimentalUsages() {
 fun KotlinSourceSet.configureKotlinExperimentalUsages() {
     languageSettings.progressiveMode = true
     languageSettings.progressiveMode = true
-    languageSettings.enableLanguageFeature("InlineClasses")
     experimentalAnnotations.forEach { a ->
     experimentalAnnotations.forEach { a ->
-        languageSettings.useExperimentalAnnotation(a)
+        languageSettings.optIn(a)
     }
     }
     if (name.contains("test", ignoreCase = true)) {
     if (name.contains("test", ignoreCase = true)) {
         testExperimentalAnnotations.forEach { a ->
         testExperimentalAnnotations.forEach { a ->
-            languageSettings.useExperimentalAnnotation(a)
+            languageSettings.optIn(a)
         }
         }
     }
     }
 }
 }

+ 39 - 19
buildSrc/src/main/kotlin/Versions.kt

@@ -10,6 +10,8 @@
 @file:Suppress("ObjectPropertyName", "ObjectPropertyName", "unused", "MemberVisibilityCanBePrivate")
 @file:Suppress("ObjectPropertyName", "ObjectPropertyName", "unused", "MemberVisibilityCanBePrivate")
 
 
 import org.gradle.api.attributes.Attribute
 import org.gradle.api.attributes.Attribute
+import org.gradle.kotlin.dsl.*
+import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
 
 
 object Versions {
 object Versions {
     const val project = "2.8.0-M1"
     const val project = "2.8.0-M1"
@@ -18,13 +20,13 @@ object Versions {
     const val console = project
     const val console = project
     const val consoleTerminal = project
     const val consoleTerminal = project
 
 
-    const val kotlinCompiler = "1.5.10"
-    const val kotlinStdlib = "1.5.10"
+    const val kotlinCompiler = "1.5.30"
+    const val kotlinStdlib = "1.5.30"
     const val dokka = "1.4.32"
     const val dokka = "1.4.32"
 
 
-    const val coroutines = "1.5.0"
-    const val atomicFU = "0.16.1"
-    const val serialization = "1.2.1"
+    const val coroutines = "1.5.1"
+    const val atomicFU = "0.16.3"
+    const val serialization = "1.2.2"
     const val ktor = "1.5.4"
     const val ktor = "1.5.4"
 
 
     const val binaryValidator = "0.4.0"
     const val binaryValidator = "0.4.0"
@@ -32,7 +34,7 @@ object Versions {
     const val io = "0.1.16"
     const val io = "0.1.16"
     const val coroutinesIo = "0.1.16"
     const val coroutinesIo = "0.1.16"
 
 
-    const val blockingBridge = "1.10.3"
+    const val blockingBridge = "1.10.6-1530.2"
 
 
     const val androidGradlePlugin = "4.1.1"
     const val androidGradlePlugin = "4.1.1"
     const val android = "4.1.1.4"
     const val android = "4.1.1.4"
@@ -65,27 +67,46 @@ fun kotlinx(id: String, version: String) = "org.jetbrains.kotlinx:kotlinx-$id:$v
 fun ktor(id: String, version: String = Versions.ktor) = "io.ktor:ktor-$id:$version"
 fun ktor(id: String, version: String = Versions.ktor) = "io.ktor:ktor-$id:$version"
 
 
 
 
-val `kotlinx-coroutines-core` = kotlinx("coroutines-core", Versions.coroutines)
+// Why using `-jvm`?
+// All target platforms are JVM. Root modules like 'coroutines-core' will be resolved to 'coroutines-common' for commonMain,
+// which make IDE code analysis not working.
+
+val `kotlinx-coroutines-core-jvm` = kotlinx("coroutines-core-jvm", Versions.coroutines)
 val `kotlinx-coroutines-jdk8` = kotlinx("coroutines-jdk8", Versions.coroutines)
 val `kotlinx-coroutines-jdk8` = kotlinx("coroutines-jdk8", Versions.coroutines)
 val `kotlinx-coroutines-swing` = kotlinx("coroutines-swing", Versions.coroutines)
 val `kotlinx-coroutines-swing` = kotlinx("coroutines-swing", Versions.coroutines)
 val `kotlinx-coroutines-debug` = kotlinx("coroutines-debug", Versions.coroutines)
 val `kotlinx-coroutines-debug` = kotlinx("coroutines-debug", Versions.coroutines)
-val `kotlinx-serialization-core` = kotlinx("serialization-core", Versions.serialization)
-val `kotlinx-serialization-json` = kotlinx("serialization-json", Versions.serialization)
-val `kotlinx-serialization-protobuf` = kotlinx("serialization-protobuf", Versions.serialization)
-const val `kotlinx-atomicfu` = "org.jetbrains.kotlinx:atomicfu:${Versions.atomicFU}"
-val `kotlinx-io` = kotlinx("io", Versions.io)
+val `kotlinx-serialization-core-jvm` = kotlinx("serialization-core-jvm", Versions.serialization)
+val `kotlinx-serialization-json-jvm` = kotlinx("serialization-json-jvm", Versions.serialization)
+val `kotlinx-serialization-protobuf-jvm` = kotlinx("serialization-protobuf-jvm", Versions.serialization)
+const val `kotlinx-atomicfu-jvm` = "org.jetbrains.kotlinx:atomicfu-jvm:${Versions.atomicFU}"
 val `kotlinx-io-jvm` = kotlinx("io-jvm", Versions.io)
 val `kotlinx-io-jvm` = kotlinx("io-jvm", Versions.io)
-val `kotlinx-coroutines-io` = kotlinx("coroutines-io", Versions.coroutinesIo)
+
+fun KotlinDependencyHandler.implementationKotlinxIoJvm() {
+    implementation(`kotlinx-io-jvm`) {
+        /*
+                    |    +--- org.jetbrains.kotlinx:kotlinx-io-jvm:0.1.16
+                    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.60 -> 1.5.30 (*)
+                    |    |    +--- org.jetbrains.kotlinx:atomicfu:0.14.1
+                    |    |    +--- org.jetbrains.kotlinx:atomicfu-common:0.14.1
+                    |    |    \--- org.jetbrains.kotlinx:kotlinx-io:0.1.16
+                    |    |         \--- org.jetbrains.kotlinx:atomicfu-common:0.14.1
+                     */
+        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-common")
+        exclude("org.jetbrains.kotlinx", "atomicfu")
+        exclude("org.jetbrains.kotlinx", "atomicfu-common")
+    }
+}
+
 val `kotlinx-coroutines-io-jvm` = kotlinx("coroutines-io-jvm", Versions.coroutinesIo)
 val `kotlinx-coroutines-io-jvm` = kotlinx("coroutines-io-jvm", Versions.coroutinesIo)
 
 
 val `ktor-serialization` = ktor("serialization", Versions.ktor)
 val `ktor-serialization` = ktor("serialization", Versions.ktor)
 
 
-val `ktor-client-core` = ktor("client-core", Versions.ktor)
-val `ktor-client-cio` = ktor("client-cio", Versions.ktor)
+val `ktor-client-core-jvm` = ktor("client-core-jvm", Versions.ktor)
+val `ktor-client-cio-jvm` = ktor("client-cio-jvm", Versions.ktor)
 val `ktor-client-okhttp` = ktor("client-okhttp", Versions.ktor)
 val `ktor-client-okhttp` = ktor("client-okhttp", Versions.ktor)
 val `ktor-client-android` = ktor("client-android", Versions.ktor)
 val `ktor-client-android` = ktor("client-android", Versions.ktor)
-val `ktor-client-logging` = ktor("client-logging", Versions.ktor)
-val `ktor-network` = ktor("network", Versions.ktor)
+val `ktor-client-logging-jvm` = ktor("client-logging-jvm", Versions.ktor)
+val `ktor-network-jvm` = ktor("network-jvm", Versions.ktor)
 val `ktor-client-serialization-jvm` = ktor("client-serialization-jvm", Versions.ktor)
 val `ktor-client-serialization-jvm` = ktor("client-serialization-jvm", Versions.ktor)
 
 
 const val `logback-classic` = "ch.qos.logback:logback-classic:" + Versions.logback
 const val `logback-classic` = "ch.qos.logback:logback-classic:" + Versions.logback
@@ -103,7 +124,6 @@ val ATTRIBUTE_MIRAI_TARGET_PLATFORM: Attribute<String> = Attribute.of("mirai.tar
 
 
 const val `kotlin-compiler` = "org.jetbrains.kotlin:kotlin-compiler:${Versions.kotlinCompiler}"
 const val `kotlin-compiler` = "org.jetbrains.kotlin:kotlin-compiler:${Versions.kotlinCompiler}"
 
 
-const val `kotlin-stdlib` = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlinStdlib}"
 const val `kotlin-stdlib-jdk8` = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlinStdlib}"
 const val `kotlin-stdlib-jdk8` = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlinStdlib}"
 const val `kotlin-reflect` = "org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlinStdlib}"
 const val `kotlin-reflect` = "org.jetbrains.kotlin:kotlin-reflect:${Versions.kotlinStdlib}"
 const val `kotlin-test` = "org.jetbrains.kotlin:kotlin-test:${Versions.kotlinStdlib}"
 const val `kotlin-test` = "org.jetbrains.kotlin:kotlin-test:${Versions.kotlinStdlib}"
@@ -114,7 +134,7 @@ const val `mirai-core-api` = "net.mamoe:mirai-core-api:${Versions.core}"
 const val `mirai-core` = "net.mamoe:mirai-core:${Versions.core}"
 const val `mirai-core` = "net.mamoe:mirai-core:${Versions.core}"
 const val `mirai-core-utils` = "net.mamoe:mirai-core-utils:${Versions.core}"
 const val `mirai-core-utils` = "net.mamoe:mirai-core-utils:${Versions.core}"
 
 
-const val yamlkt = "net.mamoe.yamlkt:yamlkt:${Versions.yamlkt}"
+const val `yamlkt-jvm` = "net.mamoe.yamlkt:yamlkt:${Versions.yamlkt}"
 
 
 const val `jetbrains-annotations` = "org.jetbrains:annotations:19.0.0"
 const val `jetbrains-annotations` = "org.jetbrains:annotations:19.0.0"
 
 

+ 9 - 35
mirai-core-api/build.gradle.kts

@@ -52,28 +52,20 @@ kotlin {
     sourceSets {
     sourceSets {
         val commonMain by getting {
         val commonMain by getting {
             dependencies {
             dependencies {
-                implementation(project(":mirai-core-utils"))
                 api(kotlin("reflect"))
                 api(kotlin("reflect"))
-
-                api(`kotlinx-serialization-core`)
-                api(`kotlinx-serialization-json`)
-                implementation(`kotlinx-serialization-protobuf`)
+                api(`kotlinx-serialization-core-jvm`)
+                api(`kotlinx-serialization-json-jvm`)
                 api(`kotlinx-coroutines-jdk8`)
                 api(`kotlinx-coroutines-jdk8`)
-                implementation(`jetbrains-annotations`)
-                // api(`kotlinx-coroutines-jdk8`)
-
                 api(`ktor-client-okhttp`)
                 api(`ktor-client-okhttp`)
-                api(`ktor-client-core`)
-                api(`ktor-network`)
 
 
+                implementation(project(":mirai-core-utils"))
+                implementation(`kotlinx-serialization-protobuf-jvm`)
+                implementation(`jetbrains-annotations`)
                 implementation(`log4j-api`)
                 implementation(`log4j-api`)
-                compileOnly(`slf4j-api`)
+                implementation(`kotlinx-atomicfu-jvm`)
+                implementationKotlinxIoJvm()
 
 
-
-                // they use Kotlin 1.3 so we need to ignore transitive dependencies
-                api1(`kotlinx-io-jvm`)
-                api1(`kotlinx-coroutines-io-jvm`)
-                implementation1(`kotlinx-atomicfu`)
+                compileOnly(`slf4j-api`)
             }
             }
         }
         }
 
 
@@ -88,7 +80,7 @@ kotlin {
                 dependsOn(commonMain)
                 dependsOn(commonMain)
                 dependencies {
                 dependencies {
                     compileOnly(`android-runtime`)
                     compileOnly(`android-runtime`)
-                    api1(`ktor-client-android`)
+//                    api(`ktor-client-android`)
                 }
                 }
             }
             }
         }
         }
@@ -120,24 +112,6 @@ if (isAndroidSDKAvailable) {
     tasks.getByName("androidTest").dependsOn("checkAndroidApiLevel")
     tasks.getByName("androidTest").dependsOn("checkAndroidApiLevel")
 }
 }
 
 
-fun org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler.implementation1(dependencyNotation: String) =
-    implementation(dependencyNotation) {
-        exclude("org.jetbrains.kotlin", "kotlin-stdlib")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-common")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-metadata")
-    }
-
-fun org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler.api1(dependencyNotation: String) =
-    api(dependencyNotation) {
-        exclude("org.jetbrains.kotlin", "kotlin-stdlib")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-common")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-metadata")
-    }
-
 configureMppPublishing()
 configureMppPublishing()
 
 
 afterEvaluate {
 afterEvaluate {

+ 1 - 1
mirai-core-api/src/commonMain/kotlin/LowLevelApiAccessor.kt

@@ -30,7 +30,7 @@ import kotlin.annotation.AnnotationTarget.*
 @MiraiExperimentalApi
 @MiraiExperimentalApi
 @RequiresOptIn
 @RequiresOptIn
 @Retention(AnnotationRetention.BINARY)
 @Retention(AnnotationRetention.BINARY)
-@Target(CLASS, TYPE, FUNCTION, PROPERTY, CONSTRUCTOR)
+@Target(CLASS, FUNCTION, PROPERTY, CONSTRUCTOR)
 public annotation class LowLevelApi
 public annotation class LowLevelApi
 
 
 /**
 /**

+ 0 - 1
mirai-core-api/src/commonMain/kotlin/message/data/Dice.kt

@@ -41,7 +41,6 @@ public data class Dice(
         require(value in 1..6) { "Dice.value must be in 1 and 6 inclusive." }
         require(value in 1..6) { "Dice.value must be in 1 and 6 inclusive." }
     }
     }
 
 
-    @MiraiExperimentalApi
     override val name: String
     override val name: String
         get() = "[骰子:$value]"
         get() = "[骰子:$value]"
 
 

+ 1 - 1
mirai-core-api/src/commonMain/kotlin/message/data/FileMessage.kt

@@ -85,7 +85,7 @@ public interface FileMessage : MessageContent, ConstrainSingle, CodableMessage {
      * 注意, baseKey [MessageContent] 不稳定. 未来可能会有变更.
      * 注意, baseKey [MessageContent] 不稳定. 未来可能会有变更.
      */
      */
     public companion object Key :
     public companion object Key :
-        AbstractPolymorphicMessageKey<@MiraiExperimentalApi MessageContent, FileMessage>(
+        AbstractPolymorphicMessageKey<MessageContent, FileMessage>(
             MessageContent, { it.safeCast() }) {
             MessageContent, { it.safeCast() }) {
 
 
         public const val SERIAL_NAME: String = "FileMessage"
         public const val SERIAL_NAME: String = "FileMessage"

+ 1 - 2
mirai-core-api/src/commonMain/kotlin/message/data/MusicShare.kt

@@ -15,7 +15,6 @@ import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.Serializable
 import net.mamoe.mirai.message.code.CodableMessage
 import net.mamoe.mirai.message.code.CodableMessage
 import net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode
 import net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode
-import net.mamoe.mirai.utils.MiraiExperimentalApi
 import net.mamoe.mirai.utils.MiraiInternalApi
 import net.mamoe.mirai.utils.MiraiInternalApi
 import net.mamoe.mirai.utils.safeCast
 import net.mamoe.mirai.utils.safeCast
 
 
@@ -135,7 +134,7 @@ public data class MusicShare(
      * 注意, baseKey [MessageContent] 不稳定. 未来可能会有变更.
      * 注意, baseKey [MessageContent] 不稳定. 未来可能会有变更.
      */
      */
     public companion object Key :
     public companion object Key :
-        AbstractPolymorphicMessageKey<@MiraiExperimentalApi MessageContent, MusicShare>
+        AbstractPolymorphicMessageKey<MessageContent, MusicShare>
             (MessageContent, { it.safeCast() }) {
             (MessageContent, { it.safeCast() }) {
 
 
         /**
         /**

+ 0 - 1
mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt

@@ -41,7 +41,6 @@ public interface RichMessage : MessageContent, ConstrainSingle {
     /**
     /**
      * **注意**: 富文本消息的 [RichMessage.contentEquals] 和 [RichMessage.toString] 都不稳定. 将来可能在没有任何警告的情况下改变格式.
      * **注意**: 富文本消息的 [RichMessage.contentEquals] 和 [RichMessage.toString] 都不稳定. 将来可能在没有任何警告的情况下改变格式.
      */
      */
-    @MiraiExperimentalApi
     public override fun contentToString(): String = this.content
     public override fun contentToString(): String = this.content
 
 
     /**
     /**

+ 1 - 0
mirai-core-api/src/commonMain/kotlin/message/data/impl.kt

@@ -170,6 +170,7 @@ internal fun createMessageChainImplOptimized(delegate: List<SingleMessage>): Mes
 /**
 /**
  * 使用 [Collection] 作为委托的 [MessageChain]
  * 使用 [Collection] 作为委托的 [MessageChain]
  */
  */
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(MessageChain.Serializer::class)
 @Serializable(MessageChain.Serializer::class)
 internal data class MessageChainImpl constructor(
 internal data class MessageChainImpl constructor(
     @JvmField
     @JvmField

+ 2 - 2
mirai-core-api/src/commonMain/kotlin/utils/Annotations.kt

@@ -47,7 +47,7 @@ public annotation class MiraiInternalFile
  */
  */
 @Retention(AnnotationRetention.BINARY)
 @Retention(AnnotationRetention.BINARY)
 @RequiresOptIn(level = RequiresOptIn.Level.WARNING)
 @RequiresOptIn(level = RequiresOptIn.Level.WARNING)
-@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR, TYPE)
+@Target(CLASS, TYPEALIAS, FUNCTION, PROPERTY, FIELD, CONSTRUCTOR)
 @MustBeDocumented
 @MustBeDocumented
 public annotation class MiraiExperimentalApi(
 public annotation class MiraiExperimentalApi(
     public val message: String = ""
     public val message: String = ""
@@ -91,5 +91,5 @@ internal annotation class EventListenerLikeJava
  * 一般有一定的性能损失, 且不能在 JVM/Android 以外平台使用. 不要在 Kotlin 调用它.
  * 一般有一定的性能损失, 且不能在 JVM/Android 以外平台使用. 不要在 Kotlin 调用它.
  */
  */
 @RequiresOptIn(level = RequiresOptIn.Level.ERROR)
 @RequiresOptIn(level = RequiresOptIn.Level.ERROR)
-@Target(PROPERTY, FUNCTION, TYPE, CLASS)
+@Target(PROPERTY, FUNCTION, CLASS)
 internal annotation class JavaFriendlyAPI
 internal annotation class JavaFriendlyAPI

+ 4 - 23
mirai-core-api/src/jvmMain/kotlin/utils/LoginSolver.jvm.kt

@@ -10,17 +10,12 @@
 
 
 package net.mamoe.mirai.utils
 package net.mamoe.mirai.utils
 
 
-import io.ktor.client.*
-import kotlinx.coroutines.*
-import kotlinx.coroutines.io.ByteWriteChannel
-import kotlinx.coroutines.io.close
-import kotlinx.coroutines.io.jvm.nio.copyTo
-import kotlinx.coroutines.io.reader
-import kotlinx.coroutines.io.writeFully
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
 import kotlinx.coroutines.sync.withLock
+import kotlinx.coroutines.withContext
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.Bot
-import net.mamoe.mirai.Mirai
 import net.mamoe.mirai.internal.utils.SeleniumLoginSolver
 import net.mamoe.mirai.internal.utils.SeleniumLoginSolver
 import net.mamoe.mirai.internal.utils.isSliderCaptchaSupportKind
 import net.mamoe.mirai.internal.utils.isSliderCaptchaSupportKind
 import net.mamoe.mirai.network.LoginFailedException
 import net.mamoe.mirai.network.LoginFailedException
@@ -30,9 +25,7 @@ import net.mamoe.mirai.utils.StandardCharImageLoginSolver.Companion.createBlocki
 import java.awt.Image
 import java.awt.Image
 import java.awt.image.BufferedImage
 import java.awt.image.BufferedImage
 import java.io.File
 import java.io.File
-import java.io.RandomAccessFile
 import javax.imageio.ImageIO
 import javax.imageio.ImageIO
-import kotlin.coroutines.CoroutineContext
 import kotlin.coroutines.resume
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 import kotlin.coroutines.suspendCoroutine
 
 
@@ -150,7 +143,7 @@ public class StandardCharImageLoginSolver @JvmOverloads constructor(
             logger.info { "[PicCaptcha] 需要图片验证码登录, 验证码为 4 字母" }
             logger.info { "[PicCaptcha] 需要图片验证码登录, 验证码为 4 字母" }
             logger.info { "[PicCaptcha] Picture captcha required. Captcha consists of 4 letters." }
             logger.info { "[PicCaptcha] Picture captcha required. Captcha consists of 4 letters." }
             try {
             try {
-                tempFile.writeChannel().apply { writeFully(data); close() }
+                tempFile.writeBytes(data)
                 logger.info { "[PicCaptcha] 将会显示字符图片. 若看不清字符图片, 请查看文件 ${tempFile.absolutePath}" }
                 logger.info { "[PicCaptcha] 将会显示字符图片. 若看不清字符图片, 请查看文件 ${tempFile.absolutePath}" }
                 logger.info { "[PicCaptcha] Displaying char-image. If not clear, view file ${tempFile.absolutePath}" }
                 logger.info { "[PicCaptcha] Displaying char-image. If not clear, view file ${tempFile.absolutePath}" }
             } catch (e: Exception) {
             } catch (e: Exception) {
@@ -251,18 +244,6 @@ public class StandardCharImageLoginSolver @JvmOverloads constructor(
     }
     }
 }
 }
 
 
-// Copied from Ktor CIO
-@OptIn(DelicateCoroutinesApi::class)
-private fun File.writeChannel(
-    coroutineContext: CoroutineContext = Dispatchers.IO
-): ByteWriteChannel = GlobalScope.reader(CoroutineName("file-writer") + coroutineContext, autoFlush = true) {
-    @Suppress("BlockingMethodInNonBlockingContext")
-    RandomAccessFile(this@writeChannel, "rw").use { file ->
-        val copied = channel.copyTo(file.channel)
-        file.setLength(copied) // truncate tail that could remain from the previously written data
-    }
-}.channel
-
 private val loginSolverLock = Mutex()
 private val loginSolverLock = Mutex()
 
 
 /**
 /**

+ 9 - 22
mirai-core-utils/build.gradle.kts

@@ -26,10 +26,6 @@ kotlin {
     explicitApi()
     explicitApi()
 
 
     if (isAndroidSDKAvailable) {
     if (isAndroidSDKAvailable) {
-//        apply(from = rootProject.file("gradle/android.gradle"))
-//        android("android") {
-//            publishAllLibraryVariants()
-//        }
         jvm("android") {
         jvm("android") {
             attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.androidJvm)
             attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.androidJvm)
             //   publishAllLibraryVariants()
             //   publishAllLibraryVariants()
@@ -44,32 +40,23 @@ kotlin {
 
 
     jvm("jvm")
     jvm("jvm")
 
 
-//    jvm("android") {
-//        attributes.attribute(Attribute.of("mirai.target.platform", String::class.java), "android")
-//    }
-
     sourceSets {
     sourceSets {
         val commonMain by getting {
         val commonMain by getting {
             dependencies {
             dependencies {
                 api(kotlin("reflect"))
                 api(kotlin("reflect"))
+                api(`kotlinx-serialization-core-jvm`)
+                api(`kotlinx-serialization-json-jvm`)
+                api(`kotlinx-coroutines-core-jvm`)
 
 
-                api1(`kotlinx-serialization-core`)
-                api1(`kotlinx-serialization-json`)
-                implementation1(`kotlinx-serialization-protobuf`)
-                api1(`kotlinx-io-jvm`)
-                api1(`kotlinx-coroutines-io-jvm`)
-                api(`kotlinx-coroutines-core`)
-
-                implementation1(`kotlinx-atomicfu`)
-
-                api1(`ktor-client-core`)
-                api1(`ktor-network`)
+                implementation(`kotlinx-atomicfu-jvm`)
+                implementation(`kotlinx-serialization-protobuf-jvm`)
+                implementationKotlinxIoJvm()
             }
             }
         }
         }
 
 
         val commonTest by getting {
         val commonTest by getting {
             dependencies {
             dependencies {
-                api(yamlkt)
+                api(`yamlkt-jvm`)
             }
             }
         }
         }
 
 
@@ -78,7 +65,7 @@ kotlin {
                 //
                 //
                 dependencies {
                 dependencies {
                     compileOnly(`android-runtime`)
                     compileOnly(`android-runtime`)
-                    api1(`ktor-client-android`)
+//                    api1(`ktor-client-android`)
                 }
                 }
             }
             }
         }
         }
@@ -126,4 +113,4 @@ fun org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler.api1(dependencyNo
         exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-metadata")
         exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-metadata")
     }
     }
 
 
-configureMppPublishing()
+configureMppPublishing()

+ 0 - 1
mirai-core-utils/src/commonMain/kotlin/Annotations.kt

@@ -15,5 +15,4 @@ import kotlin.annotation.AnnotationTarget.*
 
 
 @RequiresOptIn("This can only be used in tests.", level = ERROR)
 @RequiresOptIn("This can only be used in tests.", level = ERROR)
 @Target(CLASS, FUNCTION, PROPERTY, CLASS, CONSTRUCTOR, FUNCTION)
 @Target(CLASS, FUNCTION, PROPERTY, CLASS, CONSTRUCTOR, FUNCTION)
-@Retention(AnnotationRetention.SOURCE)
 public annotation class TestOnly
 public annotation class TestOnly

+ 0 - 2
mirai-core-utils/src/commonMain/kotlin/MiraiPlatformUtils.kt

@@ -12,8 +12,6 @@
 
 
 package net.mamoe.mirai.utils
 package net.mamoe.mirai.utils
 
 
-import io.ktor.client.*
-import io.ktor.client.features.*
 import kotlinx.io.core.Input
 import kotlinx.io.core.Input
 import kotlinx.io.core.readAvailable
 import kotlinx.io.core.readAvailable
 import java.io.*
 import java.io.*

+ 9 - 30
mirai-core/build.gradle.kts

@@ -55,32 +55,29 @@ kotlin {
     jvm("android") {
     jvm("android") {
         attributes.attribute(ATTRIBUTE_MIRAI_TARGET_PLATFORM, "android")
         attributes.attribute(ATTRIBUTE_MIRAI_TARGET_PLATFORM, "android")
     }*/
     }*/
-
     sourceSets.apply {
     sourceSets.apply {
 
 
         val commonMain by getting {
         val commonMain by getting {
             dependencies {
             dependencies {
                 api(project(":mirai-core-api"))
                 api(project(":mirai-core-api"))
-                implementation(project(":mirai-core-utils"))
-                api1(`kotlinx-serialization-core`)
-                api1(`kotlinx-serialization-json`)
-                implementation1(`kotlinx-serialization-protobuf`)
+                api(`kotlinx-serialization-core-jvm`)
+                api(`kotlinx-serialization-json-jvm`)
+                api(`kotlinx-coroutines-core-jvm`)
 
 
-                api1(`kotlinx-atomicfu`)
-                api1(`kotlinx-coroutines-core`)
-
-                api1(`kotlinx-io-jvm`)
-                implementation1(`kotlinx-coroutines-io`)
+                implementation(project(":mirai-core-utils"))
+                implementation(`kotlinx-serialization-protobuf-jvm`)
+                implementation(`kotlinx-atomicfu-jvm`)
                 implementation(`netty-all`)
                 implementation(`netty-all`)
                 implementation(`log4j-api`)
                 implementation(`log4j-api`)
                 implementation(bouncycastle)
                 implementation(bouncycastle)
+                implementationKotlinxIoJvm()
             }
             }
         }
         }
 
 
         commonTest {
         commonTest {
             dependencies {
             dependencies {
                 implementation(kotlin("script-runtime"))
                 implementation(kotlin("script-runtime"))
-                api(yamlkt)
+                api(`yamlkt-jvm`)
             }
             }
         }
         }
 
 
@@ -111,7 +108,7 @@ kotlin {
 
 
         val jvmTest by getting {
         val jvmTest by getting {
             dependencies {
             dependencies {
-                api1(`kotlinx-coroutines-debug`)
+                api(`kotlinx-coroutines-debug`)
                 //  implementation("net.mamoe:mirai-login-solver-selenium:1.0-dev-14")
                 //  implementation("net.mamoe:mirai-login-solver-selenium:1.0-dev-14")
             }
             }
         }
         }
@@ -133,22 +130,4 @@ if (isAndroidSDKAvailable) {
     tasks.getByName("androidTest").dependsOn("checkAndroidApiLevel")
     tasks.getByName("androidTest").dependsOn("checkAndroidApiLevel")
 }
 }
 
 
-fun org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler.implementation1(dependencyNotation: String) =
-    implementation(dependencyNotation) {
-        exclude("org.jetbrains.kotlin", "kotlin-stdlib")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-common")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-metadata")
-    }
-
-fun org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler.api1(dependencyNotation: String) =
-    api(dependencyNotation) {
-        exclude("org.jetbrains.kotlin", "kotlin-stdlib")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-common")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-jvm")
-        exclude("org.jetbrains.kotlinx", "kotlinx-coroutines-core-metadata")
-    }
-
 configureMppPublishing()
 configureMppPublishing()

+ 1 - 0
mirai-core/src/androidMain/kotlin/utils/crypto/ECDHJvmDesktop.kt

@@ -38,6 +38,7 @@ internal actual class ECDHKeyPairImpl(
  * https://cs.android.com/android/platform/superproject/+/master:libcore/ojluni/src/main/java/sun/security/jca/Providers.java;l=371;bpv=1;bpt=1
  * https://cs.android.com/android/platform/superproject/+/master:libcore/ojluni/src/main/java/sun/security/jca/Providers.java;l=371;bpv=1;bpt=1
  * https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html
  * https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html
  * */
  * */
+@Suppress("DEPRECATION") // since JDK 9
 private class AndroidProvider : Provider("sbAndroid", 1.0, "") {
 private class AndroidProvider : Provider("sbAndroid", 1.0, "") {
     override fun getService(type: String?, algorithm: String?): Service? {
     override fun getService(type: String?, algorithm: String?): Service? {
         if (type == "KeyFactory" && algorithm == "EC") {
         if (type == "KeyFactory" && algorithm == "EC") {

+ 4 - 8
mirai-core/src/commonMain/kotlin/MiraiImpl.kt

@@ -14,7 +14,7 @@ import io.ktor.client.engine.okhttp.*
 import io.ktor.client.features.*
 import io.ktor.client.features.*
 import io.ktor.client.request.*
 import io.ktor.client.request.*
 import io.ktor.client.request.forms.*
 import io.ktor.client.request.forms.*
-import io.ktor.http.*
+import io.ktor.util.*
 import io.ktor.utils.io.core.*
 import io.ktor.utils.io.core.*
 import kotlinx.coroutines.currentCoroutineContext
 import kotlinx.coroutines.currentCoroutineContext
 import kotlinx.io.core.discardExact
 import kotlinx.io.core.discardExact
@@ -582,6 +582,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
                         parameter("page", page)
                         parameter("page", page)
                     }
                     }
                     headers {
                     headers {
+                        @OptIn(InternalAPI::class) // ktor bug
                         append(
                         append(
                             "cookie",
                             "cookie",
                             "uin=o${bot.id}; skey=${bot.sKey}; p_uin=o${bot.id};"
                             "uin=o${bot.id}; skey=${bot.sKey}; p_uin=o${bot.id};"
@@ -605,6 +606,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
                 parameter("gc", groupId)
                 parameter("gc", groupId)
                 parameter("type", type.value)
                 parameter("type", type.value)
                 headers {
                 headers {
+                    @OptIn(InternalAPI::class) // ktor bug
                     append(
                     append(
                         "cookie",
                         "cookie",
                         "uin=o${bot.id};" +
                         "uin=o${bot.id};" +
@@ -690,9 +692,6 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
         return resId
         return resId
     }
     }
 
 
-
-    @LowLevelApi
-    @MiraiExperimentalApi
     override suspend fun solveNewFriendRequestEvent(
     override suspend fun solveNewFriendRequestEvent(
         bot: Bot,
         bot: Bot,
         eventId: Long,
         eventId: Long,
@@ -717,8 +716,6 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
         }
         }
     }
     }
 
 
-    @LowLevelApi
-    @MiraiExperimentalApi
     override suspend fun solveBotInvitedJoinGroupRequestEvent(
     override suspend fun solveBotInvitedJoinGroupRequestEvent(
         bot: Bot,
         bot: Bot,
         eventId: Long,
         eventId: Long,
@@ -738,8 +735,6 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
         }
         }
     }
     }
 
 
-    @LowLevelApi
-    @MiraiExperimentalApi
     override suspend fun solveMemberJoinRequestEvent(
     override suspend fun solveMemberJoinRequestEvent(
         bot: Bot,
         bot: Bot,
         eventId: Long,
         eventId: Long,
@@ -797,6 +792,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
                 append("bkn", bot.client.wLoginSigInfo.bkn)
                 append("bkn", bot.client.wLoginSigInfo.bkn)
             })
             })
             headers {
             headers {
+                @OptIn(InternalAPI::class) // ktor bug
                 append(
                 append(
                     "cookie",
                     "cookie",
                     "uin=o${bot.id}; skey=${bot.sKey};"
                     "uin=o${bot.id}; skey=${bot.sKey};"

+ 2 - 0
mirai-core/src/commonMain/kotlin/contact/announcement/AnnouncementsImpl.kt

@@ -14,6 +14,7 @@ package net.mamoe.mirai.internal.contact.announcement
 import io.ktor.client.request.*
 import io.ktor.client.request.*
 import io.ktor.client.request.forms.*
 import io.ktor.client.request.forms.*
 import io.ktor.http.*
 import io.ktor.http.*
+import io.ktor.util.*
 import kotlinx.coroutines.flow.*
 import kotlinx.coroutines.flow.*
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.runBlocking
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.SerialName
@@ -166,6 +167,7 @@ internal object AnnouncementProtocol {
         bot: Bot,
         bot: Bot,
         resource: ExternalResource
         resource: ExternalResource
     ): AnnouncementImage = bot.asQQAndroidBot().run {
     ): AnnouncementImage = bot.asQQAndroidBot().run {
+        @OptIn(InternalAPI::class) // ktor bug
         val resp = Mirai.Http.post<String> {
         val resp = Mirai.Http.post<String> {
             url("https://web.qun.qq.com/cgi-bin/announce/upload_img")
             url("https://web.qun.qq.com/cgi-bin/announce/upload_img")
             body = MultiPartFormDataContent(formData {
             body = MultiPartFormDataContent(formData {

+ 4 - 0
mirai-core/src/commonMain/kotlin/message/imagesImpl.kt

@@ -28,6 +28,7 @@ import net.mamoe.mirai.message.data.Image.Key.IMAGE_ID_REGEX
 import net.mamoe.mirai.utils.*
 import net.mamoe.mirai.utils.*
 import net.mamoe.mirai.utils.ExternalResource.Companion.DEFAULT_FORMAT_NAME
 import net.mamoe.mirai.utils.ExternalResource.Companion.DEFAULT_FORMAT_NAME
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(with = OnlineGroupImageImpl.Serializer::class)
 @Serializable(with = OnlineGroupImageImpl.Serializer::class)
 internal class OnlineGroupImageImpl(
 internal class OnlineGroupImageImpl(
     internal val delegate: ImMsgBody.CustomFace,
     internal val delegate: ImMsgBody.CustomFace,
@@ -60,6 +61,7 @@ internal class OnlineGroupImageImpl(
 private val imageLogger: MiraiLogger by lazy { MiraiLogger.Factory.create(Image::class) }
 private val imageLogger: MiraiLogger by lazy { MiraiLogger.Factory.create(Image::class) }
 internal val Image.Key.logger get() = imageLogger
 internal val Image.Key.logger get() = imageLogger
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(with = OnlineFriendImageImpl.Serializer::class)
 @Serializable(with = OnlineFriendImageImpl.Serializer::class)
 internal class OnlineFriendImageImpl(
 internal class OnlineFriendImageImpl(
     internal val delegate: ImMsgBody.NotOnlineImage,
     internal val delegate: ImMsgBody.NotOnlineImage,
@@ -236,6 +238,7 @@ internal interface OfflineImage : Image
 /**
 /**
  * @param imageId 参考 [Image.imageId]
  * @param imageId 参考 [Image.imageId]
  */
  */
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(with = OfflineGroupImage.Serializer::class)
 @Serializable(with = OfflineGroupImage.Serializer::class)
 internal data class OfflineGroupImage(
 internal data class OfflineGroupImage(
     override val imageId: String,
     override val imageId: String,
@@ -277,6 +280,7 @@ internal val Image.friendImageId: String
  *
  *
  * @param imageId 参考 [Image.imageId]
  * @param imageId 参考 [Image.imageId]
  */
  */
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(with = OfflineFriendImage.Serializer::class)
 @Serializable(with = OfflineFriendImage.Serializer::class)
 internal data class OfflineFriendImage(
 internal data class OfflineFriendImage(
     override val imageId: String,
     override val imageId: String,

+ 4 - 0
mirai-core/src/commonMain/kotlin/message/incomingSourceImpl.kt

@@ -35,6 +35,7 @@ import net.mamoe.mirai.utils.encodeToString
 import net.mamoe.mirai.utils.mapToIntArray
 import net.mamoe.mirai.utils.mapToIntArray
 import java.util.concurrent.atomic.AtomicBoolean
 import java.util.concurrent.atomic.AtomicBoolean
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OnlineMessageSourceFromFriendImpl.Serializer::class)
 @Serializable(OnlineMessageSourceFromFriendImpl.Serializer::class)
 internal class OnlineMessageSourceFromFriendImpl(
 internal class OnlineMessageSourceFromFriendImpl(
     override val bot: Bot,
     override val bot: Bot,
@@ -59,6 +60,7 @@ internal class OnlineMessageSourceFromFriendImpl(
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
 }
 }
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OnlineMessageSourceFromStrangerImpl.Serializer::class)
 @Serializable(OnlineMessageSourceFromStrangerImpl.Serializer::class)
 internal class OnlineMessageSourceFromStrangerImpl(
 internal class OnlineMessageSourceFromStrangerImpl(
     override val bot: Bot,
     override val bot: Bot,
@@ -122,6 +124,7 @@ private fun List<MsgComm.Msg>.toJceDataPrivate(ids: IntArray): ImMsgBody.SourceM
     }
     }
 }
 }
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OnlineMessageSourceFromTempImpl.Serializer::class)
 @Serializable(OnlineMessageSourceFromTempImpl.Serializer::class)
 internal class OnlineMessageSourceFromTempImpl(
 internal class OnlineMessageSourceFromTempImpl(
     override val bot: Bot,
     override val bot: Bot,
@@ -150,6 +153,7 @@ internal class OnlineMessageSourceFromTempImpl(
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
 }
 }
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OnlineMessageSourceFromGroupImpl.Serializer::class)
 @Serializable(OnlineMessageSourceFromGroupImpl.Serializer::class)
 internal class OnlineMessageSourceFromGroupImpl(
 internal class OnlineMessageSourceFromGroupImpl(
     override val bot: Bot,
     override val bot: Bot,

+ 1 - 0
mirai-core/src/commonMain/kotlin/message/offlineSourceImpl.kt

@@ -24,6 +24,7 @@ import net.mamoe.mirai.utils.EMPTY_BYTE_ARRAY
 import net.mamoe.mirai.utils.mapToIntArray
 import net.mamoe.mirai.utils.mapToIntArray
 import java.util.concurrent.atomic.AtomicBoolean
 import java.util.concurrent.atomic.AtomicBoolean
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OfflineMessageSourceImplData.Serializer::class)
 @Serializable(OfflineMessageSourceImplData.Serializer::class)
 internal class OfflineMessageSourceImplData(
 internal class OfflineMessageSourceImplData(
     override val kind: MessageSourceKind,
     override val kind: MessageSourceKind,

+ 4 - 0
mirai-core/src/commonMain/kotlin/message/outgoingSourceImpl.kt

@@ -74,6 +74,7 @@ private fun <T> T.toJceDataImpl(subject: ContactOrBot?): ImMsgBody.SourceMsg
     )
     )
 }
 }
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OnlineMessageSourceToFriendImpl.Serializer::class)
 @Serializable(OnlineMessageSourceToFriendImpl.Serializer::class)
 internal class OnlineMessageSourceToFriendImpl(
 internal class OnlineMessageSourceToFriendImpl(
     override val sequenceIds: IntArray,
     override val sequenceIds: IntArray,
@@ -94,6 +95,7 @@ internal class OnlineMessageSourceToFriendImpl(
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
 }
 }
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OnlineMessageSourceToStrangerImpl.Serializer::class)
 @Serializable(OnlineMessageSourceToStrangerImpl.Serializer::class)
 internal class OnlineMessageSourceToStrangerImpl(
 internal class OnlineMessageSourceToStrangerImpl(
     override val sequenceIds: IntArray,
     override val sequenceIds: IntArray,
@@ -120,6 +122,7 @@ internal class OnlineMessageSourceToStrangerImpl(
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
 }
 }
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OnlineMessageSourceToTempImpl.Serializer::class)
 @Serializable(OnlineMessageSourceToTempImpl.Serializer::class)
 internal class OnlineMessageSourceToTempImpl(
 internal class OnlineMessageSourceToTempImpl(
     override val sequenceIds: IntArray,
     override val sequenceIds: IntArray,
@@ -145,6 +148,7 @@ internal class OnlineMessageSourceToTempImpl(
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
     override fun toJceData(): ImMsgBody.SourceMsg = jceData
 }
 }
 
 
+@Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
 @Serializable(OnlineMessageSourceToGroupImpl.Serializer::class)
 @Serializable(OnlineMessageSourceToGroupImpl.Serializer::class)
 internal class OnlineMessageSourceToGroupImpl(
 internal class OnlineMessageSourceToGroupImpl(
     coroutineScope: CoroutineScope,
     coroutineScope: CoroutineScope,

+ 2 - 0
mirai-core/src/commonMain/kotlin/network/highway/Http.kt

@@ -13,6 +13,7 @@ import io.ktor.client.*
 import io.ktor.client.request.*
 import io.ktor.client.request.*
 import io.ktor.http.*
 import io.ktor.http.*
 import io.ktor.http.content.*
 import io.ktor.http.content.*
+import io.ktor.util.*
 import io.ktor.utils.io.*
 import io.ktor.utils.io.*
 import io.ktor.utils.io.jvm.javaio.*
 import io.ktor.utils.io.jvm.javaio.*
 import net.mamoe.mirai.internal.network.protocol.packet.chat.voice.voiceCodec
 import net.mamoe.mirai.internal.network.protocol.packet.chat.voice.voiceCodec
@@ -38,6 +39,7 @@ internal fun ExternalResource.consumeAsWriteChannelContent(contentType: ContentT
 
 
 internal val FALLBACK_HTTP_SERVER = "htdata2.qq.com" to 0
 internal val FALLBACK_HTTP_SERVER = "htdata2.qq.com" to 0
 
 
+@OptIn(InternalAPI::class) // ktor bug
 @Suppress("SpellCheckingInspection")
 @Suppress("SpellCheckingInspection")
 internal suspend fun HttpClient.postImage(
 internal suspend fun HttpClient.postImage(
     serverIp: String,
     serverIp: String,