From 8a607eddafe46924865f1fd2de54baafeef215a9 Mon Sep 17 00:00:00 2001
From: Karlatemp <karlatemp@vip.qq.com>
Date: Thu, 12 Aug 2021 14:18:25 +0800
Subject: [PATCH] Add `RequestEventData` for saving request events (#1309)

* Add `RequestEventData` for saving request events

* typo

* Remove `data`; Add `@SerialName`
---
 ...binary-compatibility-validator-android.api | 115 ++++++++++
 .../api/binary-compatibility-validator.api    | 115 ++++++++++
 .../kotlin/data/RequestEventData.kt           | 216 ++++++++++++++++++
 3 files changed, 446 insertions(+)
 create mode 100644 mirai-core-api/src/commonMain/kotlin/data/RequestEventData.kt

diff --git a/binary-compatibility-validator/android/api/binary-compatibility-validator-android.api b/binary-compatibility-validator/android/api/binary-compatibility-validator-android.api
index f2dfdc70f..d84f6e447 100644
--- a/binary-compatibility-validator/android/api/binary-compatibility-validator-android.api
+++ b/binary-compatibility-validator/android/api/binary-compatibility-validator-android.api
@@ -1345,6 +1345,121 @@ public final class net/mamoe/mirai/data/OnlineStatus$Companion {
 	public final fun ofIdOrNull (I)Lnet/mamoe/mirai/data/OnlineStatus;
 }
 
+public abstract class net/mamoe/mirai/data/RequestEventData {
+	public static final field Factory Lnet/mamoe/mirai/data/RequestEventData$Factory;
+	public synthetic fun <init> (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V
+	public fun accept (Lnet/mamoe/mirai/Bot;)V
+	public abstract fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public static final fun from (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;
+	public static final fun from (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;
+	public static final fun from (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;
+	public abstract fun getEventId ()J
+	public fun reject (Lnet/mamoe/mirai/Bot;)V
+	public abstract fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest : net/mamoe/mirai/data/RequestEventData {
+	public static final field Companion Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$Companion;
+	public synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
+	public fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun getEventId ()J
+	public final fun getGroupId ()J
+	public final fun getGroupName ()Ljava/lang/String;
+	public final fun getInvitor ()J
+	public final fun getInvitorNick ()Ljava/lang/String;
+	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun toString ()Ljava/lang/String;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
+	public static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer;
+	public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
+	public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
+	public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;
+	public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
+	public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;)V
+	public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$Companion {
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$Factory {
+	public final fun from (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;
+	public final fun from (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;
+	public final fun from (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest : net/mamoe/mirai/data/RequestEventData {
+	public static final field Companion Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest$Companion;
+	public synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
+	public synthetic fun <init> (JJLjava/lang/String;JLjava/lang/String;JLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+	public fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun getEventId ()J
+	public final fun getGroupId ()J
+	public final fun getGroupName ()Ljava/lang/String;
+	public final fun getInvitor ()J
+	public final fun getMessage ()Ljava/lang/String;
+	public final fun getRequester ()J
+	public final fun getRequesterNick ()Ljava/lang/String;
+	public final fun reject (Lnet/mamoe/mirai/Bot;Ljava/lang/String;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;ZLjava/lang/String;Lkotlin/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 fun toString ()Ljava/lang/String;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
+	public static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer;
+	public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
+	public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
+	public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;
+	public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
+	public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;)V
+	public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$Companion {
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest : net/mamoe/mirai/data/RequestEventData {
+	public static final field Companion Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest$Companion;
+	public synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
+	public fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun getEventId ()J
+	public final fun getFromGroupId ()J
+	public final fun getMessage ()Ljava/lang/String;
+	public final fun getRequester ()J
+	public final fun getRequesterNick ()Ljava/lang/String;
+	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 fun toString ()Ljava/lang/String;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
+	public static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer;
+	public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
+	public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
+	public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;
+	public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
+	public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;)V
+	public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$Companion {
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
+}
+
 public abstract interface class net/mamoe/mirai/data/StrangerInfo : net/mamoe/mirai/data/UserInfo {
 	public abstract fun getFromGroup ()J
 	public abstract fun getNick ()Ljava/lang/String;
diff --git a/binary-compatibility-validator/api/binary-compatibility-validator.api b/binary-compatibility-validator/api/binary-compatibility-validator.api
index c03f9e2f1..6c1484329 100644
--- a/binary-compatibility-validator/api/binary-compatibility-validator.api
+++ b/binary-compatibility-validator/api/binary-compatibility-validator.api
@@ -1345,6 +1345,121 @@ public final class net/mamoe/mirai/data/OnlineStatus$Companion {
 	public final fun ofIdOrNull (I)Lnet/mamoe/mirai/data/OnlineStatus;
 }
 
+public abstract class net/mamoe/mirai/data/RequestEventData {
+	public static final field Factory Lnet/mamoe/mirai/data/RequestEventData$Factory;
+	public synthetic fun <init> (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V
+	public fun accept (Lnet/mamoe/mirai/Bot;)V
+	public abstract fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public static final fun from (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;
+	public static final fun from (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;
+	public static final fun from (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;
+	public abstract fun getEventId ()J
+	public fun reject (Lnet/mamoe/mirai/Bot;)V
+	public abstract fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest : net/mamoe/mirai/data/RequestEventData {
+	public static final field Companion Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$Companion;
+	public synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
+	public fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun getEventId ()J
+	public final fun getGroupId ()J
+	public final fun getGroupName ()Ljava/lang/String;
+	public final fun getInvitor ()J
+	public final fun getInvitorNick ()Ljava/lang/String;
+	public fun reject (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun toString ()Ljava/lang/String;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
+	public static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$$serializer;
+	public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
+	public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
+	public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;
+	public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
+	public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;)V
+	public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest$Companion {
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$Factory {
+	public final fun from (Lnet/mamoe/mirai/event/events/BotInvitedJoinGroupRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$BotInvitedJoinGroupRequest;
+	public final fun from (Lnet/mamoe/mirai/event/events/MemberJoinRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;
+	public final fun from (Lnet/mamoe/mirai/event/events/NewFriendRequestEvent;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest : net/mamoe/mirai/data/RequestEventData {
+	public static final field Companion Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest$Companion;
+	public synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
+	public synthetic fun <init> (JJLjava/lang/String;JLjava/lang/String;JLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+	public fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun getEventId ()J
+	public final fun getGroupId ()J
+	public final fun getGroupName ()Ljava/lang/String;
+	public final fun getInvitor ()J
+	public final fun getMessage ()Ljava/lang/String;
+	public final fun getRequester ()J
+	public final fun getRequesterNick ()Ljava/lang/String;
+	public final fun reject (Lnet/mamoe/mirai/Bot;Ljava/lang/String;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;ZLjava/lang/String;Lkotlin/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 fun toString ()Ljava/lang/String;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
+	public static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest$$serializer;
+	public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
+	public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
+	public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;
+	public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
+	public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$MemberJoinRequest;)V
+	public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$MemberJoinRequest$Companion {
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest : net/mamoe/mirai/data/RequestEventData {
+	public static final field Companion Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest$Companion;
+	public synthetic fun <init> (IJJLjava/lang/String;JLjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
+	public fun accept (Lnet/mamoe/mirai/Bot;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun getEventId ()J
+	public final fun getFromGroupId ()J
+	public final fun getMessage ()Ljava/lang/String;
+	public final fun getRequester ()J
+	public final fun getRequesterNick ()Ljava/lang/String;
+	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 fun toString ()Ljava/lang/String;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
+	public static final field INSTANCE Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest$$serializer;
+	public static final synthetic field descriptor Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
+	public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
+	public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;
+	public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
+	public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
+	public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/data/RequestEventData$NewFriendRequest;)V
+	public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
+}
+
+public final class net/mamoe/mirai/data/RequestEventData$NewFriendRequest$Companion {
+	public final fun serializer ()Lkotlinx/serialization/KSerializer;
+}
+
 public abstract interface class net/mamoe/mirai/data/StrangerInfo : net/mamoe/mirai/data/UserInfo {
 	public abstract fun getFromGroup ()J
 	public abstract fun getNick ()Ljava/lang/String;
diff --git a/mirai-core-api/src/commonMain/kotlin/data/RequestEventData.kt b/mirai-core-api/src/commonMain/kotlin/data/RequestEventData.kt
new file mode 100644
index 000000000..517ef364f
--- /dev/null
+++ b/mirai-core-api/src/commonMain/kotlin/data/RequestEventData.kt
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2019-2021 Mamoe Technologies and contributors.
+ *
+ * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
+ * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
+ *
+ * https://github.com/mamoe/mirai/blob/dev/LICENSE
+ */
+
+@file:Suppress("unused")
+
+package net.mamoe.mirai.data
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+import net.mamoe.kjbb.JvmBlockingBridge
+import net.mamoe.mirai.Bot
+import net.mamoe.mirai.Mirai
+import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
+import net.mamoe.mirai.event.events.MemberJoinRequestEvent
+import net.mamoe.mirai.event.events.NewFriendRequestEvent
+import net.mamoe.mirai.utils.MiraiExperimentalApi
+
+@Serializable
+@SerialName("RequestEventData")
+public sealed class RequestEventData {
+    public abstract val eventId: Long
+
+    @JvmBlockingBridge
+    public abstract suspend fun accept(bot: Bot)
+
+    @JvmBlockingBridge
+    public abstract suspend fun reject(bot: Bot)
+
+    @Serializable
+    @SerialName("NewFriendRequest")
+    public class NewFriendRequest
+    @MiraiExperimentalApi public constructor(
+        override val eventId: Long,
+
+        public val requester: Long,
+        public val requesterNick: String,
+
+        public val fromGroupId: Long,
+
+        public val message: String,
+    ) : RequestEventData() {
+        override suspend fun accept(bot: Bot) {
+            Mirai.solveNewFriendRequestEvent(
+                bot,
+                eventId = eventId,
+                fromId = requester,
+                fromNick = requesterNick,
+                accept = true,
+                blackList = false,
+            )
+        }
+
+        override suspend fun reject(bot: Bot) {
+            reject(bot, false)
+        }
+
+        @JvmBlockingBridge
+        public suspend fun reject(bot: Bot, blackList: Boolean) {
+            Mirai.solveNewFriendRequestEvent(
+                bot,
+                eventId = eventId,
+                fromId = requester,
+                fromNick = requesterNick,
+                accept = false,
+                blackList = blackList,
+            )
+        }
+
+        override fun toString(): String {
+            return "NewFriendRequest(eventId=$eventId, fromGroupId=$fromGroupId, message=$message, requester=$requester, requesterNick=$requesterNick)"
+        }
+    }
+
+    @Serializable
+    @SerialName("BotInvitedJoinGroupRequest")
+    public class BotInvitedJoinGroupRequest
+    @MiraiExperimentalApi public constructor(
+        override val eventId: Long,
+
+        public val invitor: Long,
+        public val invitorNick: String,
+
+        public val groupId: Long,
+        public val groupName: String,
+    ) : RequestEventData() {
+        override suspend fun accept(bot: Bot) {
+            Mirai.solveBotInvitedJoinGroupRequestEvent(
+                bot,
+                eventId = eventId,
+                invitorId = invitor,
+                groupId = groupId,
+                accept = true,
+            )
+        }
+
+        override suspend fun reject(bot: Bot) {
+            Mirai.solveBotInvitedJoinGroupRequestEvent(
+                bot,
+                eventId = eventId,
+                invitorId = invitor,
+                groupId = groupId,
+                accept = false,
+            )
+        }
+
+        override fun toString(): String {
+            return "BotInvitedJoinGroupRequest(eventId=$eventId, invitor=$invitor, invitorNick='$invitorNick', groupId=$groupId, groupName='$groupName')"
+        }
+
+    }
+
+    @Serializable
+    @SerialName("MemberJoinRequest")
+    public class MemberJoinRequest
+    @MiraiExperimentalApi public constructor(
+        override val eventId: Long,
+
+        public val requester: Long,
+        public val requesterNick: String,
+
+        public val groupId: Long,
+        public val groupName: String,
+        public val invitor: Long = 0L, // 如果不为 0 则为邀请入群
+
+        public val message: String,
+    ) : RequestEventData() {
+        override suspend fun accept(bot: Bot) {
+            Mirai.solveMemberJoinRequestEvent(
+                bot,
+                eventId = eventId,
+                fromId = requester,
+                fromNick = requesterNick,
+                groupId = groupId,
+                accept = true,
+                blackList = false,
+                message = "",
+            )
+        }
+
+        override suspend fun reject(bot: Bot) {
+            reject(bot, false)
+        }
+
+        @JvmBlockingBridge
+        public suspend fun reject(bot: Bot, message: String) {
+            reject(bot, false, message)
+        }
+
+        @JvmBlockingBridge
+        @JvmOverloads
+        public suspend fun reject(bot: Bot, blackList: Boolean, message: String = "") {
+            Mirai.solveMemberJoinRequestEvent(
+                bot,
+                eventId = eventId,
+                fromId = requester,
+                fromNick = requesterNick,
+                groupId = groupId,
+                accept = false,
+                blackList = blackList,
+                message = message,
+            )
+        }
+
+        override fun toString(): String {
+            return "MemberJoinRequest(eventId=$eventId, groupId=$groupId, groupName=$groupName, invitor=$invitor, message=$message, requester=$requester, requesterNick=$requesterNick)"
+        }
+
+    }
+
+
+    public companion object Factory {
+        @JvmStatic
+        @JvmName("from")
+        public fun NewFriendRequestEvent.toRequestEventData(): NewFriendRequest {
+            return NewFriendRequest(
+                eventId = eventId,
+                message = message,
+                requester = fromId,
+                requesterNick = fromNick,
+                fromGroupId = fromGroupId,
+            )
+        }
+
+        @JvmStatic
+        @JvmName("from")
+        public fun BotInvitedJoinGroupRequestEvent.toRequestEventData(): BotInvitedJoinGroupRequest {
+            return BotInvitedJoinGroupRequest(
+                eventId = eventId,
+                invitor = invitorId,
+                invitorNick = invitorNick,
+                groupId = groupId,
+                groupName = groupName,
+            )
+        }
+
+        @JvmStatic
+        @JvmName("from")
+        public fun MemberJoinRequestEvent.toRequestEventData(): MemberJoinRequest {
+            return MemberJoinRequest(
+                eventId = eventId,
+                requester = fromId,
+                requesterNick = fromNick,
+                groupId = groupId,
+                groupName = groupName,
+                invitor = invitorId ?: 0L,
+                message = message,
+            )
+        }
+    }
+}