From 301c9a1351c1a52b904661aa97062620e8712bed Mon Sep 17 00:00:00 2001 From: ForteScarlet Date: Sun, 9 Jun 2024 14:36:39 +0800 Subject: [PATCH] =?UTF-8?q?OneBotRequestEvent=20=E7=9A=84=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E4=B8=8E=E6=8B=92=E7=BB=9D=E6=94=AF=E6=8C=81=E5=8F=AF?= =?UTF-8?q?=E9=80=89=E7=9A=84=E9=A2=9D=E5=A4=96=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/OneBotRequestEventImpl.kt | 56 +++++++++-- .../core/event/request/OneBotRequestEvent.kt | 94 +++++++++++++++++++ 2 files changed, 140 insertions(+), 10 deletions(-) diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/request/OneBotRequestEventImpl.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/request/OneBotRequestEventImpl.kt index 843f71bd..8283b4ec 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/request/OneBotRequestEventImpl.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/request/OneBotRequestEventImpl.kt @@ -17,6 +17,8 @@ package love.forte.simbot.component.onebot.v11.core.event.internal.request +import love.forte.simbot.ability.AcceptOption +import love.forte.simbot.ability.RejectOption import love.forte.simbot.common.id.ID import love.forte.simbot.common.id.UUID import love.forte.simbot.component.onebot.v11.core.actor.OneBotGroup @@ -29,9 +31,7 @@ import love.forte.simbot.component.onebot.v11.core.bot.OneBotBot import love.forte.simbot.component.onebot.v11.core.bot.internal.OneBotBotImpl import love.forte.simbot.component.onebot.v11.core.bot.requestDataBy import love.forte.simbot.component.onebot.v11.core.event.internal.eventToString -import love.forte.simbot.component.onebot.v11.core.event.request.OneBotFriendRequestEvent -import love.forte.simbot.component.onebot.v11.core.event.request.OneBotGroupRequestEvent -import love.forte.simbot.component.onebot.v11.core.event.request.OneBotRequestEvent +import love.forte.simbot.component.onebot.v11.core.event.request.* import love.forte.simbot.component.onebot.v11.event.request.FriendRequestEvent import love.forte.simbot.component.onebot.v11.event.request.GroupRequestEvent @@ -40,14 +40,23 @@ internal abstract class OneBotRequestEventImpl : OneBotRequestEvent { override val id: ID = UUID.random() override suspend fun accept() { - doSetRequest(true) + doAccept(emptyArray()) + } + + override suspend fun accept(vararg options: AcceptOption) { + doAccept(options) } override suspend fun reject() { - doSetRequest(false) + doReject(emptyArray()) } - protected abstract suspend fun doSetRequest(approve: Boolean) + override suspend fun reject(vararg options: RejectOption) { + doReject(options) + } + + protected abstract suspend fun doAccept(options: Array) + protected abstract suspend fun doReject(options: Array) } internal class OneBotFriendRequestEventImpl( @@ -55,10 +64,23 @@ internal class OneBotFriendRequestEventImpl( override val sourceEvent: FriendRequestEvent, override val bot: OneBotBot, ) : OneBotRequestEventImpl(), OneBotFriendRequestEvent { - override suspend fun doSetRequest(approve: Boolean) { + override suspend fun doAccept(options: Array) { + val remark: String? = ( + options.firstOrNull { it is OneBotFriendRequestAcceptOption.Remark } + as? OneBotFriendRequestAcceptOption.Remark + )?.remark + SetFriendAddRequestApi.create( flag = sourceEvent.flag, - approve = approve, + approve = true, + remark = remark + ).requestDataBy(bot) + } + + override suspend fun doReject(options: Array) { + SetFriendAddRequestApi.create( + flag = sourceEvent.flag, + approve = false, ).requestDataBy(bot) } @@ -71,11 +93,25 @@ internal class OneBotGroupRequestEventImpl( override val sourceEvent: GroupRequestEvent, override val bot: OneBotBotImpl, ) : OneBotRequestEventImpl(), OneBotGroupRequestEvent { - override suspend fun doSetRequest(approve: Boolean) { + override suspend fun doAccept(options: Array) { + SetGroupAddRequestApi.create( + flag = sourceEvent.flag, + subType = sourceEvent.subType, + approve = true + ).requestDataBy(bot) + } + + override suspend fun doReject(options: Array) { + val reason = ( + options.firstOrNull { it is OneBotGroupRequestRejectOption.Reason } + as? OneBotGroupRequestRejectOption.Reason + )?.reason + SetGroupAddRequestApi.create( flag = sourceEvent.flag, subType = sourceEvent.subType, - approve = approve + approve = false, + reason = reason ).requestDataBy(bot) } diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/request/OneBotRequestEvent.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/request/OneBotRequestEvent.kt index d821a8d5..7ccb58fd 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/request/OneBotRequestEvent.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/request/OneBotRequestEvent.kt @@ -17,6 +17,8 @@ package love.forte.simbot.component.onebot.v11.core.event.request +import love.forte.simbot.ability.AcceptOption +import love.forte.simbot.ability.RejectOption import love.forte.simbot.common.id.LongID import love.forte.simbot.component.onebot.v11.core.actor.OneBotGroup import love.forte.simbot.component.onebot.v11.core.actor.OneBotStranger @@ -26,6 +28,8 @@ import love.forte.simbot.component.onebot.v11.event.request.GroupRequestEvent import love.forte.simbot.event.OrganizationJoinRequestEvent import love.forte.simbot.event.RequestEvent import love.forte.simbot.suspendrunner.STP +import kotlin.jvm.JvmStatic +import kotlin.jvm.JvmSynthetic public typealias OBSourceRequestEvent = love.forte.simbot.component.onebot.v11.event.request.RequestEvent @@ -41,6 +45,30 @@ public typealias OBSourceRequestEvent = love.forte.simbot.component.onebot.v11.e */ public interface OneBotRequestEvent : OneBotBotEvent, RequestEvent { override val sourceEvent: OBSourceRequestEvent + + /** + * 接受请求 + */ + @JvmSynthetic + override suspend fun accept() + + /** + * 接受请求 + */ + @JvmSynthetic + override suspend fun accept(vararg options: AcceptOption) + + /** + * 拒绝请求 + */ + @JvmSynthetic + override suspend fun reject() + + /** + * 拒绝请求 + */ + @JvmSynthetic + override suspend fun reject(vararg options: RejectOption) } /** @@ -79,8 +107,41 @@ public interface OneBotFriendRequestEvent : OneBotRequestEvent { */ public val requesterId: LongID get() = sourceEvent.userId + + /** + * 接受申请。 + * + * @param options 好友申请中可使用的额外属性, + * 支持 [OneBotFriendRequestAcceptOption] 下的类型。 + * + * @see OneBotFriendRequestAcceptOption + */ + @JvmSynthetic + override suspend fun accept(vararg options: AcceptOption) +} + + +/** + * 可使用于 [OneBotFriendRequestEvent.accept] 中的额外属性 [AcceptOption] 实现。 + */ +public sealed class OneBotFriendRequestAcceptOption : AcceptOption { + /** + * 接受申请后为其设置一个备注 + */ + public data class Remark(val remark: String) : OneBotFriendRequestAcceptOption() + + + public companion object { + /** + * 接受申请后为其设置一个备注 + * @see Remark + */ + @JvmStatic + public fun remark(remark: String): Remark = Remark(remark) + } } + /** * 群添加申请事件 * @see GroupRequestEvent @@ -135,4 +196,37 @@ public interface OneBotGroupRequestEvent : OneBotRequestEvent, OrganizationJoinR */ @STP override suspend fun requester(): OneBotStranger + + /** + * 拒绝申请。 + * + * @param options 拒绝时可提供的额外选项。 + * 支持使用 [OneBotGroupRequestRejectOption] 下的类型。 + * + * @see OneBotGroupRequestRejectOption + */ + @JvmSynthetic + override suspend fun reject(vararg options: RejectOption) + +} + + +/** + * 可使用于 [OneBotGroupRequestEvent.reject] 中的额外属性 [RejectOption] 实现。 + */ +public sealed class OneBotGroupRequestRejectOption : RejectOption { + /** + * 拒绝的理由 + */ + public data class Reason(val reason: String) : OneBotGroupRequestRejectOption() + + public companion object { + /** + * 拒绝的理由 + * + * @see Reason + */ + @JvmStatic + public fun reason(reason: String): Reason = Reason(reason) + } }