Skip to content

Commit 68992dd

Browse files
authored
Merge pull request #177 from simple-robot/dev/internal-interception-event
实现 OneBot 组件下的 InternalInteractionEvent 相关事件
2 parents a9fff4c + 70de708 commit 68992dd

File tree

39 files changed

+2990
-148
lines changed

39 files changed

+2990
-148
lines changed

.github/workflows/test-branch.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ jobs:
2828
os: [ macos-latest, windows-latest, ubuntu-latest ]
2929
runs-on: ${{ matrix.os }}
3030
steps:
31+
# https://github.com/actions/checkout/issues/242#issuecomment-627501270
32+
# fix `Filename too long` 👆
33+
- name: git configure long path
34+
run: git config --global core.longpaths true
3135
- uses: actions/checkout@v4
3236
- uses: actions/setup-java@v4
3337
with:

simbot-component-onebot-common/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ kotlin {
5151
sourceSets {
5252
commonMain.dependencies {
5353
implementation(libs.simbot.api)
54-
implementation(libs.simbot.common.annotations)
54+
api(libs.simbot.common.annotations)
5555
}
5656

5757
commonTest.dependencies {
@@ -61,6 +61,7 @@ kotlin {
6161

6262
jvmMain {
6363
dependencies {
64+
compileOnly(libs.simbot.api)
6465
}
6566
}
6667

simbot-component-onebot-common/src/commonMain/kotlin/love/forte/simbot/component/onebot/common/annotations/Marks.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,5 @@ package love.forte.simbot.component.onebot.common.annotations
2727
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
2828
@MustBeDocumented
2929
public annotation class OneBotInternalImplementationsOnly
30+
31+
// TODO be SubclassOptInRequired ?

simbot-component-onebot-v11/simbot-component-onebot-v11-core/api/simbot-component-onebot-v11-core.api

Lines changed: 201 additions & 0 deletions
Large diffs are not rendered by default.

simbot-component-onebot-v11/simbot-component-onebot-v11-core/build.gradle.kts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,12 @@ kotlin {
6060

6161
sourceSets {
6262
commonMain.dependencies {
63+
// JVM compileOnly
6364
implementation(libs.simbot.api)
64-
implementation(libs.simbot.common.annotations)
65+
implementation(libs.jetbrains.annotations)
66+
67+
api(libs.simbot.common.annotations)
68+
implementation(libs.simbot.common.atomic)
6569

6670
api(project(":simbot-component-onebot-common"))
6771
api(project(":simbot-component-onebot-v11:simbot-component-onebot-v11-common"))
@@ -88,7 +92,9 @@ kotlin {
8892

8993
jvmMain {
9094
dependencies {
95+
compileOnly(libs.simbot.api)
9196
compileOnly(libs.ktor.client.contentNegotiation)
97+
compileOnly(libs.jetbrains.annotations)
9298
}
9399
}
94100

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/*
2+
* Copyright (c) 2025. ForteScarlet.
3+
*
4+
* This file is part of simbot-component-onebot.
5+
*
6+
* simbot-component-onebot is free software: you can redistribute it and/or modify it under the terms
7+
* of the GNU Lesser General Public License as published by the Free Software Foundation,
8+
* either version 3 of the License, or (at your option) any later version.
9+
*
10+
* simbot-component-onebot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
11+
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12+
* See the GNU Lesser General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU Lesser General Public License along with simbot-component-onebot.
15+
* If not, see <https://www.gnu.org/licenses/>.
16+
*/
17+
18+
package love.forte.simbot.component.onebot.v11.core.actor.internal
19+
20+
import love.forte.simbot.ability.SendSupport
21+
import love.forte.simbot.component.onebot.v11.core.api.SendMsgResult
22+
import love.forte.simbot.component.onebot.v11.core.bot.internal.OneBotBotImpl
23+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.AbstractMessagePreSendEventImpl
24+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotInternalMessagePostSendEvent
25+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotSegmentsInteractionMessage
26+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.segmentsOrNull
27+
import love.forte.simbot.component.onebot.v11.core.internal.message.toReceipt
28+
import love.forte.simbot.component.onebot.v11.core.utils.emitMessagePreSendEventAndUseCurrentMessage
29+
import love.forte.simbot.component.onebot.v11.core.utils.resolveInteractionMessage
30+
import love.forte.simbot.component.onebot.v11.core.utils.resolveToOneBotSegmentList
31+
import love.forte.simbot.component.onebot.v11.message.OneBotMessageReceipt
32+
import love.forte.simbot.component.onebot.v11.message.segment.OneBotMessageSegment
33+
import love.forte.simbot.event.InteractionMessage
34+
import love.forte.simbot.message.Message
35+
import love.forte.simbot.message.MessageContent
36+
import love.forte.simbot.message.PlainText
37+
38+
39+
/**
40+
*
41+
* @author ForteScarlet
42+
*/
43+
internal abstract class AbstractSendSupport : SendSupport {
44+
protected abstract val bot: OneBotBotImpl
45+
46+
protected abstract fun preSendEvent(
47+
interactionMessage: OneBotSegmentsInteractionMessage
48+
): AbstractMessagePreSendEventImpl
49+
50+
protected abstract fun OneBotMessageReceipt.postSendEvent(
51+
interactionMessage: InteractionMessage
52+
): OneBotInternalMessagePostSendEvent
53+
54+
protected abstract suspend fun sendText(text: String): SendMsgResult
55+
56+
protected abstract suspend fun sendSegments(segments: List<OneBotMessageSegment>): SendMsgResult
57+
58+
protected suspend fun sendMessage(message: Message): SendMsgResult {
59+
return when (message) {
60+
is PlainText -> sendText(message.text)
61+
else -> sendSegments(message.resolveToOneBotSegmentList(bot))
62+
}
63+
}
64+
65+
override suspend fun send(text: String): OneBotMessageReceipt {
66+
val interactionMessage = OneBotSegmentsInteractionMessage(text = text)
67+
return interceptionAndSend(interactionMessage)
68+
}
69+
70+
override suspend fun send(messageContent: MessageContent): OneBotMessageReceipt {
71+
val interactionMessage = OneBotSegmentsInteractionMessage(content = messageContent)
72+
return interceptionAndSend(interactionMessage)
73+
}
74+
75+
override suspend fun send(message: Message): OneBotMessageReceipt {
76+
val interactionMessage = OneBotSegmentsInteractionMessage(message = message, bot = bot)
77+
return interceptionAndSend(interactionMessage)
78+
}
79+
80+
protected suspend fun interceptionAndSend(
81+
interactionMessage: OneBotSegmentsInteractionMessage
82+
): OneBotMessageReceipt {
83+
val event = preSendEvent(interactionMessage)
84+
85+
val currentMessage = bot.emitMessagePreSendEventAndUseCurrentMessage(event)
86+
val segments = currentMessage.segmentsOrNull
87+
if (segments != null) {
88+
return sendSegments(segments).toReceipt(bot).alsoPostSend(currentMessage)
89+
}
90+
91+
return sendByInteractionMessage(currentMessage).toReceipt(bot).alsoPostSend(currentMessage)
92+
}
93+
94+
/**
95+
* 解析一个 [InteractionMessage] 为一个 [OneBotMessageSegment] 的列表并发送。
96+
* 始终认为 `segments` 为 `null`。
97+
*/
98+
protected suspend fun sendByInteractionMessage(interactionMessage: InteractionMessage): SendMsgResult {
99+
return resolveInteractionMessage(
100+
interactionMessage = interactionMessage,
101+
onSegments = { sendSegments(it) },
102+
onMessage = { sendMessage(it) },
103+
onText = { sendText(it) },
104+
)
105+
}
106+
107+
protected fun OneBotMessageReceipt.alsoPostSend(
108+
interactionMessage: InteractionMessage
109+
): OneBotMessageReceipt = apply {
110+
val event = postSendEvent(interactionMessage)
111+
bot.pushEventAndLaunch(event)
112+
}
113+
}

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/actor/internal/OneBotFriendImpl.kt

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,50 +23,60 @@ import love.forte.simbot.component.onebot.v11.core.actor.OneBotStranger
2323
import love.forte.simbot.component.onebot.v11.core.api.GetFriendListResult
2424
import love.forte.simbot.component.onebot.v11.core.api.GetStrangerInfoApi
2525
import love.forte.simbot.component.onebot.v11.core.api.SendLikeApi
26+
import love.forte.simbot.component.onebot.v11.core.api.SendMsgResult
2627
import love.forte.simbot.component.onebot.v11.core.bot.internal.OneBotBotImpl
27-
import love.forte.simbot.component.onebot.v11.core.internal.message.toReceipt
28-
import love.forte.simbot.component.onebot.v11.core.utils.resolveToOneBotSegmentList
28+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.AbstractMessagePreSendEventImpl
29+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotFriendPostSendEventImpl
30+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotFriendPreSendEventImpl
31+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotInternalMessagePostSendEvent
32+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotSegmentsInteractionMessage
33+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.toOneBotSegmentsInteractionMessage
2934
import love.forte.simbot.component.onebot.v11.core.utils.sendPrivateMsgApi
3035
import love.forte.simbot.component.onebot.v11.core.utils.sendPrivateTextMsgApi
3136
import love.forte.simbot.component.onebot.v11.event.message.RawPrivateMessageEvent
32-
import love.forte.simbot.component.onebot.v11.message.OneBotMessageContent
3337
import love.forte.simbot.component.onebot.v11.message.OneBotMessageReceipt
34-
import love.forte.simbot.message.Message
35-
import love.forte.simbot.message.MessageContent
38+
import love.forte.simbot.component.onebot.v11.message.segment.OneBotMessageSegment
39+
import love.forte.simbot.event.InteractionMessage
3640
import kotlin.coroutines.CoroutineContext
3741

38-
internal abstract class OneBotFriendImpl : OneBotFriend {
39-
protected abstract val bot: OneBotBotImpl
42+
internal abstract class OneBotFriendImpl : AbstractSendSupport(), OneBotFriend {
43+
abstract override val bot: OneBotBotImpl
4044

41-
override suspend fun send(text: String): OneBotMessageReceipt {
45+
override fun preSendEvent(interactionMessage: OneBotSegmentsInteractionMessage): AbstractMessagePreSendEventImpl {
46+
return OneBotFriendPreSendEventImpl(
47+
this,
48+
bot,
49+
interactionMessage
50+
)
51+
}
52+
53+
override suspend fun sendText(text: String): SendMsgResult {
4254
return bot.executeData(
4355
sendPrivateTextMsgApi(
4456
target = id,
4557
text = text,
4658
)
47-
).toReceipt(bot)
48-
}
49-
50-
override suspend fun send(messageContent: MessageContent): OneBotMessageReceipt {
51-
if (messageContent is OneBotMessageContent) {
52-
return bot.executeData(
53-
sendPrivateMsgApi(
54-
target = id,
55-
message = messageContent.sourceSegments,
56-
)
57-
).toReceipt(bot)
58-
}
59-
60-
return send(messageContent.messages)
59+
)
6160
}
6261

63-
override suspend fun send(message: Message): OneBotMessageReceipt {
62+
override suspend fun sendSegments(segments: List<OneBotMessageSegment>): SendMsgResult {
6463
return bot.executeData(
6564
sendPrivateMsgApi(
6665
target = id,
67-
message = message.resolveToOneBotSegmentList(bot)
66+
message = segments,
6867
)
69-
).toReceipt(bot)
68+
)
69+
}
70+
71+
override fun OneBotMessageReceipt.postSendEvent(
72+
interactionMessage: InteractionMessage
73+
): OneBotInternalMessagePostSendEvent {
74+
return OneBotFriendPostSendEventImpl(
75+
content = this@OneBotFriendImpl,
76+
bot = bot,
77+
receipt = this,
78+
message = interactionMessage.toOneBotSegmentsInteractionMessage()
79+
)
7080
}
7181

7282
override suspend fun sendLike(times: Int) {

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/actor/internal/OneBotGroupImpl.kt

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,26 @@ import love.forte.simbot.component.onebot.v11.core.actor.OneBotGroupDeleteOption
2727
import love.forte.simbot.component.onebot.v11.core.actor.OneBotMember
2828
import love.forte.simbot.component.onebot.v11.core.api.*
2929
import love.forte.simbot.component.onebot.v11.core.bot.internal.OneBotBotImpl
30-
import love.forte.simbot.component.onebot.v11.core.internal.message.toReceipt
31-
import love.forte.simbot.component.onebot.v11.core.utils.resolveToOneBotSegmentList
30+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.AbstractMessagePreSendEventImpl
31+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotGroupPostSendEventImpl
32+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotGroupPreSendEventImpl
33+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotInternalMessagePostSendEvent
34+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotSegmentsInteractionMessage
35+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.toOneBotSegmentsInteractionMessage
3236
import love.forte.simbot.component.onebot.v11.core.utils.sendGroupMsgApi
3337
import love.forte.simbot.component.onebot.v11.core.utils.sendGroupTextMsgApi
34-
import love.forte.simbot.component.onebot.v11.message.OneBotMessageContent
3538
import love.forte.simbot.component.onebot.v11.message.OneBotMessageReceipt
36-
import love.forte.simbot.message.Message
37-
import love.forte.simbot.message.MessageContent
39+
import love.forte.simbot.component.onebot.v11.message.segment.OneBotMessageSegment
40+
import love.forte.simbot.event.InteractionMessage
3841
import kotlin.concurrent.Volatile
3942
import kotlin.coroutines.CoroutineContext
4043
import kotlin.jvm.JvmInline
4144

4245

4346
internal abstract class OneBotGroupImpl(
4447
initialName: String
45-
) : OneBotGroup {
46-
protected abstract val bot: OneBotBotImpl
48+
) : AbstractSendSupport(), OneBotGroup {
49+
abstract override val bot: OneBotBotImpl
4750

4851
@Volatile
4952
override var name: String = initialName
@@ -76,7 +79,6 @@ internal abstract class OneBotGroupImpl(
7679
return result.dataOrThrow.toMember(bot)
7780
}
7881

79-
8082
override suspend fun setAnonymous(enable: Boolean) {
8183
bot.executeData(
8284
SetGroupAnonymousApi.create(
@@ -86,35 +88,42 @@ internal abstract class OneBotGroupImpl(
8688
)
8789
}
8890

89-
override suspend fun send(text: String): OneBotMessageReceipt {
91+
override fun preSendEvent(interactionMessage: OneBotSegmentsInteractionMessage): AbstractMessagePreSendEventImpl {
92+
return OneBotGroupPreSendEventImpl(
93+
this,
94+
bot,
95+
interactionMessage
96+
)
97+
}
98+
99+
100+
override suspend fun sendText(text: String): SendMsgResult {
90101
return bot.executeData(
91102
sendGroupTextMsgApi(
92103
target = id,
93104
text = text,
94105
)
95-
).toReceipt(bot)
96-
}
97-
98-
override suspend fun send(messageContent: MessageContent): OneBotMessageReceipt {
99-
if (messageContent is OneBotMessageContent) {
100-
return bot.executeData(
101-
sendGroupMsgApi(
102-
target = id,
103-
message = messageContent.sourceSegments,
104-
)
105-
).toReceipt(bot)
106-
}
107-
108-
return send(messageContent.messages)
106+
)
109107
}
110108

111-
override suspend fun send(message: Message): OneBotMessageReceipt {
109+
override suspend fun sendSegments(segments: List<OneBotMessageSegment>): SendMsgResult {
112110
return bot.executeData(
113111
sendGroupMsgApi(
114112
target = id,
115-
message = message.resolveToOneBotSegmentList(bot)
113+
message = segments,
116114
)
117-
).toReceipt(bot)
115+
)
116+
}
117+
118+
override fun OneBotMessageReceipt.postSendEvent(
119+
interactionMessage: InteractionMessage
120+
): OneBotInternalMessagePostSendEvent {
121+
return OneBotGroupPostSendEventImpl(
122+
content = this@OneBotGroupImpl,
123+
bot = bot,
124+
receipt = this,
125+
message = interactionMessage.toOneBotSegmentsInteractionMessage()
126+
)
118127
}
119128

120129
override suspend fun delete(vararg options: DeleteOption) {
@@ -206,6 +215,23 @@ internal abstract class OneBotGroupImpl(
206215
bot.executeData(GetGroupHonorInfoApi.create(groupId = id, type = type))
207216

208217
override fun toString(): String = "OneBotGroup(id=$id, bot=${bot.id})"
218+
override fun equals(other: Any?): Boolean {
219+
if (this === other) return true
220+
if (other !is OneBotGroupImpl) return false
221+
222+
if (name != other.name) return false
223+
if (bot != other.bot) return false
224+
225+
return true
226+
}
227+
228+
override fun hashCode(): Int {
229+
var result = name.hashCode()
230+
result = 31 * result + bot.hashCode()
231+
return result
232+
}
233+
234+
209235
}
210236

211237
/**

0 commit comments

Comments
 (0)