Skip to content

Commit b60ffba

Browse files
committed
feat: OneBotMember.send 相关拦截事件
1 parent ebf6831 commit b60ffba

File tree

4 files changed

+347
-22
lines changed

4 files changed

+347
-22
lines changed

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

Lines changed: 76 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,21 @@ import love.forte.simbot.component.onebot.v11.core.actor.OneBotMemberRole
2727
import love.forte.simbot.component.onebot.v11.core.actor.OneBotStranger
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.OneBotMemberPostSendEventImpl
31+
import love.forte.simbot.component.onebot.v11.core.event.internal.messageinteraction.OneBotMemberPreSendEventImpl
32+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotSegmentsInteractionMessage
33+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.segmentsOrNull
34+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.toOneBotSegmentsInteractionMessage
3035
import love.forte.simbot.component.onebot.v11.core.internal.message.toReceipt
31-
import love.forte.simbot.component.onebot.v11.core.utils.resolveToOneBotSegmentList
32-
import love.forte.simbot.component.onebot.v11.core.utils.sendPrivateMsgApi
33-
import love.forte.simbot.component.onebot.v11.core.utils.sendPrivateTextMsgApi
36+
import love.forte.simbot.component.onebot.v11.core.utils.*
3437
import love.forte.simbot.component.onebot.v11.event.message.RawGroupMessageEvent
3538
import love.forte.simbot.component.onebot.v11.event.message.RawPrivateMessageEvent
36-
import love.forte.simbot.component.onebot.v11.message.OneBotMessageContent
3739
import love.forte.simbot.component.onebot.v11.message.OneBotMessageReceipt
40+
import love.forte.simbot.component.onebot.v11.message.segment.OneBotMessageSegment
41+
import love.forte.simbot.event.InteractionMessage
3842
import love.forte.simbot.message.Message
3943
import love.forte.simbot.message.MessageContent
44+
import love.forte.simbot.message.PlainText
4045
import kotlin.concurrent.Volatile
4146
import kotlin.coroutines.CoroutineContext
4247
import kotlin.jvm.JvmInline
@@ -61,34 +66,87 @@ internal abstract class OneBotMemberImpl(
6166
override var nick: String? = initialNick
6267

6368
override suspend fun send(text: String): OneBotMessageReceipt {
69+
val interactionMessage = OneBotSegmentsInteractionMessage(text = text)
70+
return interceptionAndSend(interactionMessage)
71+
}
72+
73+
override suspend fun send(messageContent: MessageContent): OneBotMessageReceipt {
74+
val interactionMessage = OneBotSegmentsInteractionMessage(content = messageContent)
75+
return interceptionAndSend(interactionMessage)
76+
}
77+
78+
override suspend fun send(message: Message): OneBotMessageReceipt {
79+
val interactionMessage = OneBotSegmentsInteractionMessage(message = message, bot = bot)
80+
return interceptionAndSend(interactionMessage)
81+
}
82+
83+
private suspend fun interceptionAndSend(
84+
interactionMessage: OneBotSegmentsInteractionMessage
85+
): OneBotMessageReceipt {
86+
val event = OneBotMemberPreSendEventImpl(
87+
this,
88+
bot,
89+
interactionMessage
90+
)
91+
92+
val currentMessage = bot.emitMessagePreSendEventAndUseCurrentMessage(event)
93+
val segments = currentMessage.segmentsOrNull
94+
if (segments != null) {
95+
return sendSegments(segments).toReceipt(bot).alsoPostSend(currentMessage)
96+
}
97+
98+
return sendByInteractionMessage(currentMessage).toReceipt(bot).alsoPostSend(currentMessage)
99+
}
100+
101+
/**
102+
* 解析一个 [InteractionMessage] 为一个 [OneBotMessageSegment] 的列表并发送。
103+
* 始终认为 `segments` 为 `null`。
104+
*/
105+
private suspend fun sendByInteractionMessage(interactionMessage: InteractionMessage): SendMsgResult {
106+
return resolveInteractionMessage(
107+
interactionMessage = interactionMessage,
108+
onSegments = { sendSegments(it) },
109+
onMessage = { sendMessage(it) },
110+
onText = { sendText(it) },
111+
)
112+
}
113+
114+
private suspend fun sendText(text: String): SendMsgResult {
64115
return bot.executeData(
65116
sendPrivateTextMsgApi(
66117
target = id,
67118
text = text,
68119
)
69-
).toReceipt(bot)
120+
)
70121
}
71122

72-
override suspend fun send(messageContent: MessageContent): OneBotMessageReceipt {
73-
if (messageContent is OneBotMessageContent) {
74-
return bot.executeData(
75-
sendPrivateMsgApi(
76-
target = id,
77-
message = messageContent.sourceSegments,
78-
)
79-
).toReceipt(bot)
123+
private suspend fun sendMessage(message: Message): SendMsgResult {
124+
return when (message) {
125+
is PlainText -> sendText(message.text)
126+
else -> sendSegments(message.resolveToOneBotSegmentList(bot))
80127
}
81-
82-
return send(messageContent.messages)
83128
}
84129

85-
override suspend fun send(message: Message): OneBotMessageReceipt {
130+
private suspend fun sendSegments(segments: List<OneBotMessageSegment>): SendMsgResult {
86131
return bot.executeData(
87132
sendPrivateMsgApi(
88133
target = id,
89-
message = message.resolveToOneBotSegmentList(bot)
134+
message = segments,
90135
)
91-
).toReceipt(bot)
136+
)
137+
}
138+
139+
private fun OneBotMessageReceipt.alsoPostSend(
140+
interactionMessage: InteractionMessage
141+
): OneBotMessageReceipt = apply {
142+
val event = OneBotMemberPostSendEventImpl(
143+
content = this@OneBotMemberImpl,
144+
bot = bot,
145+
receipt = this,
146+
message = interactionMessage.toOneBotSegmentsInteractionMessage()
147+
)
148+
149+
bot.pushEventAndLaunch(event)
92150
}
93151

94152
override suspend fun delete(vararg options: DeleteOption) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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.event.internal.messageinteraction
19+
20+
import love.forte.simbot.component.onebot.v11.core.actor.OneBotMember
21+
import love.forte.simbot.component.onebot.v11.core.bot.OneBotBot
22+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotMemberPostSendEvent
23+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotMemberPreSendEvent
24+
import love.forte.simbot.component.onebot.v11.core.event.messageinteraction.OneBotSegmentsInteractionMessage
25+
import love.forte.simbot.component.onebot.v11.message.OneBotMessageReceipt
26+
27+
28+
internal class OneBotMemberPreSendEventImpl(
29+
override val content: OneBotMember,
30+
override val bot: OneBotBot,
31+
message: OneBotSegmentsInteractionMessage
32+
) : AbstractMessagePreSendEventImpl(message), OneBotMemberPreSendEvent
33+
34+
internal class OneBotMemberPostSendEventImpl(
35+
override val content: OneBotMember,
36+
override val bot: OneBotBot,
37+
override val receipt: OneBotMessageReceipt,
38+
override val message: OneBotSegmentsInteractionMessage,
39+
) : AbstractMessagePostSendEventImpl(), OneBotMemberPostSendEvent

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/messageinteraction/OneBotSendSupportInteractionEvent.kt

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package love.forte.simbot.component.onebot.v11.core.event.messageinteraction
2020
import love.forte.simbot.ability.SendSupport
2121
import love.forte.simbot.component.onebot.v11.core.actor.OneBotFriend
2222
import love.forte.simbot.component.onebot.v11.core.actor.OneBotGroup
23+
import love.forte.simbot.component.onebot.v11.core.actor.OneBotMember
2324
import love.forte.simbot.component.onebot.v11.core.bot.OneBotBot
2425
import love.forte.simbot.event.*
2526

@@ -166,9 +167,39 @@ public interface OneBotFriendPostSendEvent :
166167
//endregion
167168

168169
//region OneBotMember
169-
// TODO
170-
//endregion
170+
@OptIn(FuzzyEventTypeImplementation::class)
171+
public interface OneBotMemberInteractionEvent : OneBotSendSupportInteractionEvent, MemberInteractionEvent {
172+
override val content: OneBotMember
173+
}
171174

172-
//region OneBotMember
173-
// TODO
175+
@OptIn(FuzzyEventTypeImplementation::class)
176+
public interface OneBotMemberPreSendEvent :
177+
OneBotSendSupportPreSendEvent,
178+
OneBotMemberInteractionEvent,
179+
MemberPreSendEvent {
180+
override val content: OneBotMember
181+
182+
/**
183+
* 拦截事件中的消息内容。
184+
*/
185+
override val message: OneBotSegmentsInteractionMessage
186+
187+
/**
188+
* 可修改的 [message],初始为 [message],
189+
* 修改后会在事件处理完成后被替换为原本的参数。
190+
*
191+
* 如果被设置为 [OneBotSegmentsInteractionMessage]
192+
* 之外的类型,效果同设置了一个 [OneBotSegmentsInteractionMessage.segments] 为 `null` 的值,
193+
* 最终都会在需要的情况下重新解析 [OneBotSegmentsInteractionMessage.segments]。
194+
*/
195+
override var currentMessage: InteractionMessage
196+
}
197+
198+
@OptIn(FuzzyEventTypeImplementation::class)
199+
public interface OneBotMemberPostSendEvent :
200+
OneBotSendSupportPostSendEvent,
201+
OneBotMemberInteractionEvent,
202+
MemberPostSendEvent {
203+
override val content: OneBotMember
204+
}
174205
//endregion

0 commit comments

Comments
 (0)