diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/bot/internal/OneBotBotImpl.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/bot/internal/OneBotBotImpl.kt index 7f760d17..c11c68ca 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/bot/internal/OneBotBotImpl.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/bot/internal/OneBotBotImpl.kt @@ -84,11 +84,17 @@ import love.forte.simbot.component.onebot.v11.core.event.internal.message.OneBot import love.forte.simbot.component.onebot.v11.core.event.internal.message.OneBotGroupPrivateMessageEventImpl import love.forte.simbot.component.onebot.v11.core.event.internal.message.OneBotNormalGroupMessageEventImpl import love.forte.simbot.component.onebot.v11.core.event.internal.message.OneBotNoticeGroupMessageEventImpl +import love.forte.simbot.component.onebot.v11.core.event.internal.meta.OneBotDefaultMetaEventImpl +import love.forte.simbot.component.onebot.v11.core.event.internal.meta.OneBotHeartbeatEventImpl +import love.forte.simbot.component.onebot.v11.core.event.internal.meta.OneBotLifecycleEventImpl import love.forte.simbot.component.onebot.v11.core.event.internal.stage.OneBotBotStartedEventImpl import love.forte.simbot.component.onebot.v11.core.utils.onEachErrorLog import love.forte.simbot.component.onebot.v11.event.UnknownEvent import love.forte.simbot.component.onebot.v11.event.message.GroupMessageEvent import love.forte.simbot.component.onebot.v11.event.message.PrivateMessageEvent +import love.forte.simbot.component.onebot.v11.event.meta.HeartbeatEvent +import love.forte.simbot.component.onebot.v11.event.meta.LifecycleEvent +import love.forte.simbot.component.onebot.v11.event.meta.MetaEvent import love.forte.simbot.component.onebot.v11.event.resolveEventSerializer import love.forte.simbot.component.onebot.v11.event.resolveEventSubTypeFieldName import love.forte.simbot.event.Event @@ -449,7 +455,7 @@ internal class OneBotBotImpl( resolveRawEvent(eventRaw) }.getOrElse { e -> val exMsg = "Failed to resolve raw event $eventRaw, " + - "session and bot will be closed exceptionally" + "session and bot will be closed exceptionally" val ex = IllegalStateException( exMsg, @@ -547,7 +553,28 @@ internal class OneBotBotImpl( ) } - // TODO meta events + //region Meta events + is MetaEvent -> when (event) { + is LifecycleEvent -> OneBotLifecycleEventImpl( + raw, + event, + bot, + ) + + is HeartbeatEvent -> OneBotHeartbeatEventImpl( + raw, + event, + bot, + ) + + else -> OneBotDefaultMetaEventImpl( + raw, + event, + bot + ) + } + //endregion + // TODO notice events is UnknownEvent -> OneBotUnknownEvent(raw, event) diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/OneBotEventImpls.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/OneBotEventImpls.kt new file mode 100644 index 00000000..991e736c --- /dev/null +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/OneBotEventImpls.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024. ForteScarlet. + * + * This file is part of simbot-component-onebot. + * + * simbot-component-onebot is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * simbot-component-onebot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with simbot-component-onebot. + * If not, see . + */ + +package love.forte.simbot.component.onebot.v11.core.event.internal + +import love.forte.simbot.component.onebot.v11.core.event.OneBotEvent + +internal fun OneBotEvent.eventToString( + eventName: String +): String = + "$eventName(source=$sourceEvent, raw='$sourceEventRaw')" diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotGroupMessageEventImpl.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotGroupMessageEventImpl.kt index 01e1332c..d13e5257 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotGroupMessageEventImpl.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotGroupMessageEventImpl.kt @@ -25,6 +25,7 @@ import love.forte.simbot.component.onebot.v11.core.actor.internal.toGroup import love.forte.simbot.component.onebot.v11.core.actor.internal.toMember 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.message.OneBotAnonymousGroupMessageEvent import love.forte.simbot.component.onebot.v11.core.event.message.OneBotGroupMessageEvent import love.forte.simbot.component.onebot.v11.core.event.message.OneBotNormalGroupMessageEvent @@ -101,6 +102,8 @@ internal class OneBotNormalGroupMessageEventImpl( override suspend fun author(): OneBotMember { return sourceEvent.sender.toMember(bot) } + + override fun toString(): String = eventToString("OneBotNormalGroupMessageEvent") } @@ -113,6 +116,8 @@ internal class OneBotAnonymousGroupMessageEventImpl( override suspend fun author(): OneBotMember { return sourceEvent.sender.toMember(bot) } + + override fun toString(): String = eventToString("OneBotAnonymousGroupMessageEvent") } internal class OneBotNoticeGroupMessageEventImpl( @@ -120,11 +125,15 @@ internal class OneBotNoticeGroupMessageEventImpl( override val sourceEvent: GroupMessageEvent, bot: OneBotBotImpl, ) : OneBotGroupMessageEventImpl(sourceEvent, bot), - OneBotNoticeGroupMessageEvent + OneBotNoticeGroupMessageEvent { + override fun toString(): String = eventToString("OneBotNoticeGroupMessageEvent") +} internal class OneBotDefaultGroupMessageEventImpl( override val sourceEventRaw: String?, override val sourceEvent: GroupMessageEvent, bot: OneBotBotImpl, -) : OneBotGroupMessageEventImpl(sourceEvent, bot) +) : OneBotGroupMessageEventImpl(sourceEvent, bot) { + override fun toString(): String = eventToString("OneBotDefaultGroupMessageEvent") +} diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotPrivateMessageEventImpl.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotPrivateMessageEventImpl.kt index 4def09b4..8f454418 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotPrivateMessageEventImpl.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotPrivateMessageEventImpl.kt @@ -26,6 +26,7 @@ import love.forte.simbot.component.onebot.v11.core.actor.internal.toFriend import love.forte.simbot.component.onebot.v11.core.actor.internal.toMember 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.message.OneBotFriendMessageEvent import love.forte.simbot.component.onebot.v11.core.event.message.OneBotGroupPrivateMessageEvent import love.forte.simbot.component.onebot.v11.core.event.message.OneBotPrivateMessageEvent @@ -94,6 +95,9 @@ internal class OneBotFriendMessageEventImpl( override suspend fun content(): OneBotFriend { return sourceEvent.sender.toFriend(bot) } + + override fun toString(): String = + eventToString("OneBotFriendMessageEvent") } internal class OneBotGroupPrivateMessageEventImpl( @@ -111,10 +115,17 @@ internal class OneBotGroupPrivateMessageEventImpl( // 无法得知群号 throw UnsupportedOperationException("Don't know how to get the group number from PrivateMessageEvent") } + + override fun toString(): String = + eventToString("OneBotGroupPrivateMessageEvent") } internal class OneBotDefaultPrivateMessageEventImpl( override val sourceEventRaw: String?, sourceEvent: PrivateMessageEvent, bot: OneBotBotImpl, -) : OneBotPrivateMessageEventImpl(sourceEvent, bot) +) : OneBotPrivateMessageEventImpl(sourceEvent, bot) { + + override fun toString(): String = + eventToString("OneBotDefaultPrivateMessageEvent") +} diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/meta/OneBotMetaEventImpl.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/meta/OneBotMetaEventImpl.kt new file mode 100644 index 00000000..c64cb9c0 --- /dev/null +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/meta/OneBotMetaEventImpl.kt @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2024. ForteScarlet. + * + * This file is part of simbot-component-onebot. + * + * simbot-component-onebot is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * simbot-component-onebot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with simbot-component-onebot. + * If not, see . + */ + +package love.forte.simbot.component.onebot.v11.core.event.internal.meta + +import love.forte.simbot.common.id.ID +import love.forte.simbot.common.id.UUID +import love.forte.simbot.common.time.Timestamp +import love.forte.simbot.component.onebot.v11.core.bot.OneBotBot +import love.forte.simbot.component.onebot.v11.core.event.internal.eventToString +import love.forte.simbot.component.onebot.v11.core.event.meta.OneBotHeartbeatEvent +import love.forte.simbot.component.onebot.v11.core.event.meta.OneBotLifecycleEvent +import love.forte.simbot.component.onebot.v11.core.event.meta.OneBotMetaEvent +import love.forte.simbot.component.onebot.v11.core.utils.timestamp +import love.forte.simbot.component.onebot.v11.event.meta.HeartbeatEvent +import love.forte.simbot.component.onebot.v11.event.meta.LifecycleEvent +import love.forte.simbot.component.onebot.v11.event.meta.MetaEvent + +/** + * OneBot中的元事件类型。 + * @author ForteScarlet + */ +internal abstract class OneBotMetaEventImpl : OneBotMetaEvent { + override val id: ID = UUID.random() + + override val time: Timestamp + get() = sourceEvent.timestamp() +} + +internal class OneBotHeartbeatEventImpl( + override val sourceEventRaw: String?, + override val sourceEvent: HeartbeatEvent, + override val bot: OneBotBot, +) : OneBotHeartbeatEvent, OneBotMetaEventImpl() { + override fun toString(): String = + eventToString("OneBotHeartbeatEvent") +} + +internal class OneBotLifecycleEventImpl( + override val sourceEventRaw: String?, + override val sourceEvent: LifecycleEvent, + override val bot: OneBotBot, +) : OneBotLifecycleEvent, OneBotMetaEventImpl() { + override fun toString(): String = + eventToString("OneBotLifecycleEvent") +} + +internal class OneBotDefaultMetaEventImpl( + override val sourceEventRaw: String?, + override val sourceEvent: MetaEvent, + override val bot: OneBotBot, +) : OneBotMetaEventImpl() { + override fun toString(): String = + eventToString("OneBotDefaultMetaEvent") +} diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/stage/OneBotBotStageEventImpl.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/stage/OneBotBotStageEventImpl.kt index b13e8ed8..312a0b99 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/stage/OneBotBotStageEventImpl.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/stage/OneBotBotStageEventImpl.kt @@ -32,6 +32,9 @@ internal class OneBotBotRegisteredEventImpl( @OptIn(ExperimentalSimbotAPI::class) override val time: Timestamp = Timestamp.now() + + override fun toString(): String = + "OneBotBotRegisteredEvent(bot=$bot)" } internal class OneBotBotStartedEventImpl( @@ -41,4 +44,7 @@ internal class OneBotBotStartedEventImpl( @OptIn(ExperimentalSimbotAPI::class) override val time: Timestamp = Timestamp.now() + + override fun toString(): String = + "OneBotBotStartedEvent(bot=$bot)" } diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/meta/OneBotMetaEvent.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/meta/OneBotMetaEvent.kt index 843b82e8..621d8467 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/meta/OneBotMetaEvent.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/meta/OneBotMetaEvent.kt @@ -17,7 +17,7 @@ package love.forte.simbot.component.onebot.v11.core.event.meta -import love.forte.simbot.component.onebot.v11.core.event.OneBotEvent +import love.forte.simbot.component.onebot.v11.core.event.OneBotBotEvent import love.forte.simbot.component.onebot.v11.event.meta.MetaEvent @@ -25,6 +25,6 @@ import love.forte.simbot.component.onebot.v11.event.meta.MetaEvent * OneBot中的元事件类型。 * @author ForteScarlet */ -public interface OneBotMetaEvent : OneBotEvent { +public interface OneBotMetaEvent : OneBotBotEvent { override val sourceEvent: MetaEvent } 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 4e0cf1f8..35fb67ad 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 @@ -18,12 +18,16 @@ package love.forte.simbot.component.onebot.v11.core.event.request import love.forte.simbot.component.onebot.v11.core.event.OneBotBotEvent +import love.forte.simbot.event.RequestEvent +public typealias OBSourceRequestEvent = love.forte.simbot.component.onebot.v11.event.request.RequestEvent /** + * OneBot组件中的 [事件请求][love.forte.simbot.component.onebot.v11.event.request.RequestEvent] + * 的组件事件类型。 * * @author ForteScarlet */ -public interface OneBotRequestEvent : OneBotBotEvent { - // TODO +public interface OneBotRequestEvent : OneBotBotEvent, RequestEvent { + override val sourceEvent: OBSourceRequestEvent } diff --git a/simbot-component-onebot-v11/simbot-component-onebot-v11-event/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/event/meta/LifecycleEvent.kt b/simbot-component-onebot-v11/simbot-component-onebot-v11-event/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/event/meta/LifecycleEvent.kt index b6e02216..eb437679 100644 --- a/simbot-component-onebot-v11/simbot-component-onebot-v11-event/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/event/meta/LifecycleEvent.kt +++ b/simbot-component-onebot-v11/simbot-component-onebot-v11-event/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/event/meta/LifecycleEvent.kt @@ -32,7 +32,7 @@ import love.forte.simbot.component.onebot.v11.event.ExpectEventType * 只有正向 WebSocket 和反向 WebSocket 可以收到 `connect`。 */ @Serializable -@ExpectEventType(postType = MetaEvent.POST_TYPE, subType = "private") +@ExpectEventType(postType = MetaEvent.POST_TYPE, subType = "lifecycle") public data class LifecycleEvent( override val time: Long, @SerialName("self_id")