Skip to content

Commit baabe64

Browse files
committed
allow retrieving message exception in callback closes #18
1 parent 7810c4f commit baabe64

5 files changed

Lines changed: 87 additions & 15 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ kotlin.incremental.native=true
66
org.gradle.test.skip=true
77
kotlin.native.enableKlibsCrossCompilation=true
88
SONATYPE_AUTOMATIC_RELEASE=true
9-
libVersion=3.3.3-alpha1
9+
libVersion=3.3.3
1010
#systemProp.http.proxyHost=127.0.0.1
1111
#systemProp.http.proxyPort=12334
1212
#systemProp.https.proxyHost=127.0.0.1
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright © 2026 RTAkland
3+
* Date: 2026/2/12 16:02
4+
* Open Source Under Apache-2.0 License
5+
* https://www.apache.org/licenses/LICENSE-2.0
6+
*/
7+
8+
9+
package cn.rtast.rob.event.packed
10+
11+
import cn.rtast.rob.actionable.MessageActionable
12+
import cn.rtast.rob.event.OneBotEvent
13+
import cn.rtast.rob.event.raw.message.BaseMessage
14+
import cn.rtast.rob.event.raw.message.GroupMessage
15+
import cn.rtast.rob.event.raw.message.PrivateMessage
16+
import cn.rtast.rob.onebot.OneBotAction
17+
18+
public sealed interface MessageErrorEvent<T : BaseMessage> {
19+
public val message: T
20+
public val exception: Exception
21+
}
22+
23+
/**
24+
* 精确到某一条群聊消息的错误事件
25+
*/
26+
public data class GroupMessageErrorEvent(
27+
override val action: OneBotAction,
28+
override val message: GroupMessage,
29+
override val exception: Exception,
30+
) : OneBotEvent, MessageErrorEvent<GroupMessage>, MessageActionable by message
31+
32+
/**
33+
* 精确到某一条私聊消息的错误事件
34+
*/
35+
public data class PrivateMessageErrorEvent(
36+
override val action: OneBotAction,
37+
override val message: PrivateMessage,
38+
override val exception: Exception,
39+
) : OneBotEvent, MessageErrorEvent<PrivateMessage>, MessageActionable by message

ronebot-onebot-v11/src/commonMain/kotlin/cn/rtast/rob/onebot/OneBotListener.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
package cn.rtast.rob.onebot
99

10+
import cn.rtast.rob.event.packed.GroupMessageErrorEvent
1011
import cn.rtast.rob.event.packed.MessageTimeoutEvent
12+
import cn.rtast.rob.event.packed.PrivateMessageErrorEvent
1113
import cn.rtast.rob.event.raw.file.RawFileEvent
1214
import cn.rtast.rob.event.raw.group.*
1315
import cn.rtast.rob.event.raw.internal.RawWebsocketCloseEvent
@@ -23,7 +25,6 @@ import cn.rtast.rob.event.raw.onebot.RawHeartBeatEvent
2325
import cn.rtast.rob.event.raw.request.AddFriendRequestEvent
2426
import cn.rtast.rob.event.raw.request.BeInviteGroupRequestEvent
2527
import cn.rtast.rob.event.raw.request.JoinGroupRequestEvent
26-
import kotlin.jvm.JvmSynthetic
2728

2829
public interface OneBotListener {
2930

@@ -206,4 +207,14 @@ public interface OneBotListener {
206207
* Bot在私聊中被戳一戳触发此事件
207208
*/
208209
public suspend fun onPrivatePokeSelf(event: RawPokeEvent) {}
210+
211+
/**
212+
* 精确到某一条群聊消息的错误事件
213+
*/
214+
public suspend fun onGroupMessageError(event: GroupMessageErrorEvent) {}
215+
216+
/**
217+
* 精确到某一条私聊消息的错误事件
218+
*/
219+
public suspend fun onPrivateMessageError(event: PrivateMessageErrorEvent) {}
209220
}

ronebot-onebot-v11/src/commonMain/kotlin/cn/rtast/rob/util/MessageHandler.kt

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,24 +107,39 @@ internal class MessageHandler(
107107
).apply { action = botInstance.action }
108108
msg.sender = newSenderWithGroupId
109109
if (msg.groupId !in botInstance.listenedGroups && botInstance.listenedGroups.isNotEmpty()) return
110-
botInstance.dispatchEvent(GroupMessageEvent(botInstance.action, msg))
111-
listener.onGroupMessage(msg)
112-
OneBotFactory.commandManager.handleGroup(msg)
110+
try {
111+
botInstance.dispatchEvent(GroupMessageEvent(botInstance.action, msg))
112+
listener.onGroupMessage(msg)
113+
OneBotFactory.commandManager.handleGroup(msg)
114+
} catch (e: Exception) {
115+
@Suppress("LocalVariableName")
116+
val _event = GroupMessageErrorEvent(botInstance.action, msg, e)
117+
botInstance.dispatchEvent(_event)
118+
listener.onGroupMessageError(_event)
119+
}
113120
}
114121

115122
InboundMessageType.private -> {
116123
val msg = message.fromJson<PrivateMessage>()
117124
msg.sessionId = Uuid.random()
118125
msg.action = botInstance.action
119126
msg.sender.action = botInstance.action
120-
botInstance.dispatchEvent(PrivateMessageEvent(botInstance.action, msg))
121-
listener.onPrivateMessage(msg)
122-
OneBotFactory.commandManager.handlePrivate(msg)
127+
try {
128+
botInstance.dispatchEvent(PrivateMessageEvent(botInstance.action, msg))
129+
listener.onPrivateMessage(msg)
130+
OneBotFactory.commandManager.handlePrivate(msg)
131+
} catch (e: Exception) {
132+
@Suppress("LocalVariableName")
133+
val _event = PrivateMessageErrorEvent(botInstance.action, msg, e)
134+
botInstance.dispatchEvent(_event)
135+
listener.onPrivateMessageError(_event)
136+
}
123137
}
124138

125139
null -> listener.onRawMessage(botInstance.action, message)
126140
}
127141
return
142+
128143
}
129144

130145
if (serializedMessage.postType == PostType.request) {

ronebot-onebot-v11/src/jvmTest/kotlin/test/TestClient.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@ import cn.rtast.rob.OneBotFactory
1111
import cn.rtast.rob.annotations.ExperimentalROneBotApi
1212
import cn.rtast.rob.command.BaseCommand
1313
import cn.rtast.rob.entity.toResource
14-
import cn.rtast.rob.event.packed.GroupMessageEvent
14+
import cn.rtast.rob.event.packed.GroupMessageErrorEvent
15+
import cn.rtast.rob.event.packed.PrivateMessageErrorEvent
1516
import cn.rtast.rob.event.raw.internal.RawWebsocketErrorEvent
1617
import cn.rtast.rob.event.raw.message.GroupMessage
1718
import cn.rtast.rob.event.raw.message.PrivateMessage
1819
import cn.rtast.rob.event.raw.message.text
19-
import cn.rtast.rob.event.subscribe
20-
import cn.rtast.rob.hooking.Hookable
2120
import cn.rtast.rob.onebot.OneBotListener
2221
import cn.rtast.rob.onebot.dsl.image
2322
import cn.rtast.rob.onebot.dsl.text
@@ -81,14 +80,22 @@ class TestClient {
8180
throw RuntimeException("test exception")
8281
}
8382

83+
override suspend fun onPrivateMessage(message: PrivateMessage) {
84+
throw RuntimeException("priv ex")
85+
}
86+
8487
override suspend fun onWebsocketErrorEvent(event: RawWebsocketErrorEvent) {
8588
println(event.exception)
8689
}
90+
91+
override suspend fun onGroupMessageError(event: GroupMessageErrorEvent) {
92+
println("msg err ${event.message} ${event.exception}")
93+
}
94+
95+
override suspend fun onPrivateMessageError(event: PrivateMessageErrorEvent) {
96+
println("priv msg err ${event.message} ${event.exception}")
97+
}
8798
}, logLevel = LogLevel.DEBUG)
88-
instance1.subscribe<GroupMessageEvent> {
89-
println("sub")
90-
}
91-
instance1.action.setGroupRequest("1770816695582896", "invite")
9299
instance1.addListeningGroup(qqGroupId)
93100
OneBotFactory.commandManager.register(TestCommand())
94101
while (true) {

0 commit comments

Comments
 (0)