Skip to content

Commit 357d856

Browse files
committed
新增并实现 Interaction 相关的事件
1 parent f69dc04 commit 357d856

File tree

19 files changed

+912
-347
lines changed

19 files changed

+912
-347
lines changed

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: 71 additions & 22 deletions
Large diffs are not rendered by default.
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: 12 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -25,72 +25,32 @@ import love.forte.simbot.component.onebot.v11.core.api.GetStrangerInfoApi
2525
import love.forte.simbot.component.onebot.v11.core.api.SendLikeApi
2626
import love.forte.simbot.component.onebot.v11.core.api.SendMsgResult
2727
import love.forte.simbot.component.onebot.v11.core.bot.internal.OneBotBotImpl
28+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.AbstractMessagePreSendEventImpl
2829
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotFriendPostSendEventImpl
2930
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotFriendPreSendEventImpl
31+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotInternalMessagePostSendEvent
3032
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotSegmentsInteractionMessage
31-
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.segmentsOrNull
3233
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.toOneBotSegmentsInteractionMessage
33-
import love.forte.simbot.component.onebot.v11.core.internal.message.toReceipt
34-
import love.forte.simbot.component.onebot.v11.core.utils.*
34+
import love.forte.simbot.component.onebot.v11.core.utils.sendPrivateMsgApi
35+
import love.forte.simbot.component.onebot.v11.core.utils.sendPrivateTextMsgApi
3536
import love.forte.simbot.component.onebot.v11.event.message.RawPrivateMessageEvent
3637
import love.forte.simbot.component.onebot.v11.message.OneBotMessageReceipt
3738
import love.forte.simbot.component.onebot.v11.message.segment.OneBotMessageSegment
3839
import love.forte.simbot.event.InteractionMessage
39-
import love.forte.simbot.message.Message
40-
import love.forte.simbot.message.MessageContent
41-
import love.forte.simbot.message.PlainText
4240
import kotlin.coroutines.CoroutineContext
4341

44-
internal abstract class OneBotFriendImpl : OneBotFriend {
45-
protected abstract val bot: OneBotBotImpl
42+
internal abstract class OneBotFriendImpl : AbstractSendSupport(), OneBotFriend {
43+
abstract override val bot: OneBotBotImpl
4644

47-
override suspend fun send(text: String): OneBotMessageReceipt {
48-
val interactionMessage = OneBotSegmentsInteractionMessage(text = text)
49-
return interceptionAndSend(interactionMessage)
50-
}
51-
52-
override suspend fun send(messageContent: MessageContent): OneBotMessageReceipt {
53-
val interactionMessage = OneBotSegmentsInteractionMessage(content = messageContent)
54-
return interceptionAndSend(interactionMessage)
55-
}
56-
57-
override suspend fun send(message: Message): OneBotMessageReceipt {
58-
val interactionMessage = OneBotSegmentsInteractionMessage(message = message, bot = bot)
59-
return interceptionAndSend(interactionMessage)
60-
}
61-
62-
private suspend fun interceptionAndSend(
63-
interactionMessage: OneBotSegmentsInteractionMessage
64-
): OneBotMessageReceipt {
65-
val event = OneBotFriendPreSendEventImpl(
45+
override fun preSendEvent(interactionMessage: OneBotSegmentsInteractionMessage): AbstractMessagePreSendEventImpl {
46+
return OneBotFriendPreSendEventImpl(
6647
this,
6748
bot,
6849
interactionMessage
6950
)
70-
71-
val currentMessage = bot.emitMessagePreSendEventAndUseCurrentMessage(event)
72-
val segments = currentMessage.segmentsOrNull
73-
if (segments != null) {
74-
return sendSegments(segments).toReceipt(bot).alsoPostSend(currentMessage)
75-
}
76-
77-
return sendByInteractionMessage(currentMessage).toReceipt(bot).alsoPostSend(currentMessage)
78-
}
79-
80-
/**
81-
* 解析一个 [InteractionMessage] 为一个 [OneBotMessageSegment] 的列表并发送。
82-
* 始终认为 `segments` 为 `null`。
83-
*/
84-
private suspend fun sendByInteractionMessage(interactionMessage: InteractionMessage): SendMsgResult {
85-
return resolveInteractionMessage(
86-
interactionMessage = interactionMessage,
87-
onSegments = { sendSegments(it) },
88-
onMessage = { sendMessage(it) },
89-
onText = { sendText(it) },
90-
)
9151
}
9252

93-
private suspend fun sendText(text: String): SendMsgResult {
53+
override suspend fun sendText(text: String): SendMsgResult {
9454
return bot.executeData(
9555
sendPrivateTextMsgApi(
9656
target = id,
@@ -99,14 +59,7 @@ internal abstract class OneBotFriendImpl : OneBotFriend {
9959
)
10060
}
10161

102-
private suspend fun sendMessage(message: Message): SendMsgResult {
103-
return when (message) {
104-
is PlainText -> sendText(message.text)
105-
else -> sendSegments(message.resolveToOneBotSegmentList(bot))
106-
}
107-
}
108-
109-
private suspend fun sendSegments(segments: List<OneBotMessageSegment>): SendMsgResult {
62+
override suspend fun sendSegments(segments: List<OneBotMessageSegment>): SendMsgResult {
11063
return bot.executeData(
11164
sendPrivateMsgApi(
11265
target = id,
@@ -115,17 +68,13 @@ internal abstract class OneBotFriendImpl : OneBotFriend {
11568
)
11669
}
11770

118-
private fun OneBotMessageReceipt.alsoPostSend(
119-
interactionMessage: InteractionMessage
120-
): OneBotMessageReceipt = apply {
121-
val event = OneBotFriendPostSendEventImpl(
71+
override fun OneBotMessageReceipt.postSendEvent(interactionMessage: InteractionMessage): OneBotInternalMessagePostSendEvent {
72+
return OneBotFriendPostSendEventImpl(
12273
content = this@OneBotFriendImpl,
12374
bot = bot,
12475
receipt = this,
12576
message = interactionMessage.toOneBotSegmentsInteractionMessage()
12677
)
127-
128-
bot.pushEventAndLaunch(event)
12978
}
13079

13180
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: 11 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -27,32 +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.event.internal.messageinteraction.AbstractMessagePreSendEventImpl
3031
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotGroupPostSendEventImpl
3132
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotGroupPreSendEventImpl
33+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotInternalMessagePostSendEvent
3234
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotSegmentsInteractionMessage
33-
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.segmentsOrNull
3435
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.toOneBotSegmentsInteractionMessage
35-
import love.forte.simbot.component.onebot.v11.core.internal.message.toReceipt
36-
import love.forte.simbot.component.onebot.v11.core.utils.emitMessagePreSendEventAndUseCurrentMessage
37-
import love.forte.simbot.component.onebot.v11.core.utils.resolveInteractionMessage
38-
import love.forte.simbot.component.onebot.v11.core.utils.resolveToOneBotSegmentList
3936
import love.forte.simbot.component.onebot.v11.core.utils.sendGroupMsgApi
4037
import love.forte.simbot.component.onebot.v11.core.utils.sendGroupTextMsgApi
4138
import love.forte.simbot.component.onebot.v11.message.OneBotMessageReceipt
4239
import love.forte.simbot.component.onebot.v11.message.segment.OneBotMessageSegment
4340
import love.forte.simbot.event.InteractionMessage
44-
import love.forte.simbot.message.Message
45-
import love.forte.simbot.message.MessageContent
46-
import love.forte.simbot.message.PlainText
4741
import kotlin.concurrent.Volatile
4842
import kotlin.coroutines.CoroutineContext
4943
import kotlin.jvm.JvmInline
5044

5145

5246
internal abstract class OneBotGroupImpl(
5347
initialName: String
54-
) : OneBotGroup {
55-
protected abstract val bot: OneBotBotImpl
48+
) : AbstractSendSupport(), OneBotGroup {
49+
abstract override val bot: OneBotBotImpl
5650

5751
@Volatile
5852
override var name: String = initialName
@@ -85,7 +79,6 @@ internal abstract class OneBotGroupImpl(
8579
return result.dataOrThrow.toMember(bot)
8680
}
8781

88-
8982
override suspend fun setAnonymous(enable: Boolean) {
9083
bot.executeData(
9184
SetGroupAnonymousApi.create(
@@ -95,53 +88,16 @@ internal abstract class OneBotGroupImpl(
9588
)
9689
}
9790

98-
override suspend fun send(text: String): OneBotMessageReceipt {
99-
val interactionMessage = OneBotSegmentsInteractionMessage(text)
100-
return interceptionAndSend(interactionMessage)
101-
}
102-
103-
override suspend fun send(messageContent: MessageContent): OneBotMessageReceipt {
104-
val interactionMessage = OneBotSegmentsInteractionMessage(messageContent)
105-
return interceptionAndSend(interactionMessage)
106-
}
107-
108-
override suspend fun send(message: Message): OneBotMessageReceipt {
109-
val interactionMessage = OneBotSegmentsInteractionMessage(message = message, bot = bot)
110-
return interceptionAndSend(interactionMessage)
111-
}
112-
113-
private suspend fun interceptionAndSend(
114-
interactionMessage: OneBotSegmentsInteractionMessage
115-
): OneBotMessageReceipt {
116-
val event = OneBotGroupPreSendEventImpl(
91+
override fun preSendEvent(interactionMessage: OneBotSegmentsInteractionMessage): AbstractMessagePreSendEventImpl {
92+
return OneBotGroupPreSendEventImpl(
11793
this,
11894
bot,
11995
interactionMessage
12096
)
121-
122-
val currentMessage = bot.emitMessagePreSendEventAndUseCurrentMessage(event)
123-
val segments = currentMessage.segmentsOrNull
124-
if (segments != null) {
125-
return sendSegments(segments).toReceipt(bot).alsoPostSend(currentMessage)
126-
}
127-
128-
return sendByInteractionMessage(currentMessage).toReceipt(bot).alsoPostSend(currentMessage)
12997
}
13098

131-
/**
132-
* 解析一个 InteractionMessage 为一个 OneBotMessageSegment 的列表并发送。
133-
* 始终认为 `segments` 为 `null`。
134-
*/
135-
private suspend fun sendByInteractionMessage(interactionMessage: InteractionMessage): SendMsgResult {
136-
return resolveInteractionMessage(
137-
interactionMessage = interactionMessage,
138-
onSegments = { sendSegments(it) },
139-
onMessage = { sendMessage(it) },
140-
onText = { sendText(it) },
141-
)
142-
}
14399

144-
private suspend fun sendText(text: String): SendMsgResult {
100+
override suspend fun sendText(text: String): SendMsgResult {
145101
return bot.executeData(
146102
sendGroupTextMsgApi(
147103
target = id,
@@ -150,14 +106,7 @@ internal abstract class OneBotGroupImpl(
150106
)
151107
}
152108

153-
private suspend fun sendMessage(message: Message): SendMsgResult {
154-
return when (message) {
155-
is PlainText -> sendText(message.text)
156-
else -> sendSegments(message.resolveToOneBotSegmentList(bot))
157-
}
158-
}
159-
160-
private suspend fun sendSegments(segments: List<OneBotMessageSegment>): SendMsgResult {
109+
override suspend fun sendSegments(segments: List<OneBotMessageSegment>): SendMsgResult {
161110
return bot.executeData(
162111
sendGroupMsgApi(
163112
target = id,
@@ -166,17 +115,15 @@ internal abstract class OneBotGroupImpl(
166115
)
167116
}
168117

169-
private fun OneBotMessageReceipt.alsoPostSend(
118+
override fun OneBotMessageReceipt.postSendEvent(
170119
interactionMessage: InteractionMessage
171-
): OneBotMessageReceipt = apply {
172-
val event = OneBotGroupPostSendEventImpl(
120+
): OneBotInternalMessagePostSendEvent {
121+
return OneBotGroupPostSendEventImpl(
173122
content = this@OneBotGroupImpl,
174123
bot = bot,
175124
receipt = this,
176125
message = interactionMessage.toOneBotSegmentsInteractionMessage()
177126
)
178-
179-
bot.pushEventAndLaunch(event)
180127
}
181128

182129
override suspend fun delete(vararg options: DeleteOption) {

0 commit comments

Comments
 (0)