Skip to content

Commit 90b0e05

Browse files
committed
#20 fixed forward message decoding error when replying
1 parent 816fec4 commit 90b0e05

7 files changed

Lines changed: 73 additions & 50 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.4
9+
libVersion=3.3.5
1010
#systemProp.http.proxyHost=127.0.0.1
1111
#systemProp.http.proxyPort=12334
1212
#systemProp.https.proxyHost=127.0.0.1

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ import cn.rtast.rob.onebot.OneBotListener
1717
import cn.rtast.rob.scheduler.GlobalCoroutineScheduler
1818
import cn.rtast.rob.session.SessionManager
1919
import cn.rtast.rob.util.BotManager
20-
import kotlin.jvm.JvmOverloads
21-
import kotlin.jvm.JvmStatic
2220
import kotlin.time.Duration
2321
import kotlin.time.Duration.Companion.seconds
2422

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
package cn.rtast.rob.actionable
1010

1111
import cn.rtast.rob.enums.QQFace
12+
import cn.rtast.rob.event.raw.message.ForwardMessage
1213
import cn.rtast.rob.event.raw.message.ForwardMessageId
1314
import cn.rtast.rob.onebot.MessageChain
1415
import cn.rtast.rob.onebot.NodeMessageChain
16+
import cn.rtast.rob.segment.MessageSegment
1517
import cn.rtast.rob.segment.Segment
1618
import kotlin.time.Duration
1719

@@ -170,6 +172,16 @@ public interface MessageActionable {
170172
*/
171173
public suspend fun replyAsync(message: MessageChain.Builder.() -> Unit): Unit =
172174
replyAsync(MessageChain.Builder().apply(message).build())
175+
176+
/**
177+
* 将复杂的消息序列化
178+
*/
179+
public fun serialize(): List<MessageSegment>
180+
181+
/**
182+
* 将这条消息转换为合并转发消息解析
183+
*/
184+
public suspend fun resolveForwardMessage(): ForwardMessage.ForwardMessage?
173185
}
174186

175187
/**

ronebot-onebot-v11/src/commonMain/kotlin/cn/rtast/rob/event/raw/message/ArrayMessage.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import cn.rtast.rob.enums.SegmentType
1212
import cn.rtast.rob.segment.*
1313
import kotlinx.serialization.SerialName
1414
import kotlinx.serialization.Serializable
15+
import kotlinx.serialization.json.JsonElement
16+
import kotlinx.serialization.json.JsonPrimitive
1517
import kotlin.reflect.KClass
1618

1719
@Serializable
1820
public data class ArrayMessage(
1921
val type: SegmentType,
20-
val data: Data
22+
val data: Data,
2123
) {
2224
@Serializable
2325
public data class Data(
@@ -77,7 +79,7 @@ public data class ArrayMessage(
7779
/**
7880
* 内容/通用
7981
*/
80-
val content: String? = null,
82+
val content: JsonElement? = null,
8183
/**
8284
* 音频链接
8385
*/
@@ -157,7 +159,8 @@ public fun List<ArrayMessage>.serialize(): List<MessageSegment> {
157159
it.data.lat.toString(),
158160
it.data.lon.toString(),
159161
it.data.title!!,
160-
it.data.content!!
162+
// fix
163+
(it.data.content!! as JsonPrimitive).content
161164
)
162165

163166
SegmentType.music -> null

ronebot-onebot-v11/src/commonMain/kotlin/cn/rtast/rob/event/raw/message/ForwardMessage.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package cn.rtast.rob.event.raw.message
99

10+
import cn.rtast.rob.enums.MessageType
1011
import cn.rtast.rob.enums.SegmentType
1112
import kotlinx.serialization.SerialName
1213
import kotlinx.serialization.Serializable
@@ -17,21 +18,24 @@ public data class ForwardMessage(
1718
) {
1819
@Serializable
1920
public data class ForwardMessage(
20-
val message: List<ForwardArrayMessage>
21+
val messages: List<MessageContent>
2122
)
2223

2324
@Serializable
24-
public data class ForwardArrayMessage(
25-
val type: SegmentType,
26-
val data: ArrayMessage
25+
public data class MessageContent(
26+
val content: List<Content>,
27+
val sender: Sender,
28+
@SerialName("message_format")
29+
val messageFormat: String?,
30+
@SerialName("message_type")
31+
val messageType: MessageType
2732
)
2833

2934
@Serializable
30-
public data class ArrayMessage(
31-
@SerialName("user_id")
32-
val userId: Long,
35+
public data class Sender(
3336
val nickname: String,
34-
val content: List<Content>
37+
@SerialName("user_id")
38+
val userId: Long
3539
)
3640

3741
@Serializable

ronebot-onebot-v11/src/commonMain/kotlin/cn/rtast/rob/event/raw/message/Message.kt

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -79,25 +79,6 @@ public sealed class BaseMessage {
7979
*/
8080
@SerialName("message_style")
8181
public val messageStyle: MessageStyle? = null
82-
83-
/**
84-
* 下面的方法都是推荐仅在Java中使用
85-
*/
86-
public fun getTexts(): List<String> = this.texts
87-
88-
public fun getText(): String = this.text
89-
90-
public fun getImages(): List<ImageSegment> = this.images
91-
92-
public fun getMFaces(): List<MFaceSegment> = this.mFaces
93-
94-
public fun getMFace(): MFaceSegment? = this.mFace
95-
96-
public fun getFaces(): List<FaceSegment> = this.faces
97-
98-
public fun filterAndSerializeJvm(type: SegmentType): List<MessageSegment> = this.filterAndSerialize(type)
99-
100-
public fun toPlainTextJvm(): String = this.text
10182
}
10283

10384
@Serializable
@@ -111,7 +92,7 @@ public data class GroupMessage(
11192
* 群聊发送者
11293
*/
11394
var sender: GroupSender,
114-
override var sessionId: Uuid? = null
95+
override var sessionId: Uuid? = null,
11596
) : GroupMessageActionable, BaseMessage(), IGroupMessage {
11697
@Transient
11798
lateinit var action: OneBotAction
@@ -247,6 +228,18 @@ public data class GroupMessage(
247228
}
248229
return this.action.sendGroupMessage(groupId, msg)
249230
}
231+
232+
/**
233+
* 将消息序列化
234+
*/
235+
override fun serialize(): List<MessageSegment> = message.serialize()
236+
237+
/**
238+
* 强制将当前消息作为合并转发消息解析,
239+
* 如果消息并非合并转发消息则会抛出序列化异常
240+
*/
241+
override suspend fun resolveForwardMessage(): ForwardMessage.ForwardMessage? =
242+
action.getForwardMessage(message.first { it.type == SegmentType.forward }.data.id ?: return null)
250243
}
251244

252245
@Serializable
@@ -255,7 +248,7 @@ public data class PrivateMessage(
255248
* 私聊发送者
256249
*/
257250
val sender: PrivateSender,
258-
override var sessionId: Uuid? = null
251+
override var sessionId: Uuid? = null,
259252
) : MessageActionable, BaseMessage(), IPrivateMessage {
260253

261254
@Transient
@@ -384,6 +377,18 @@ public data class PrivateMessage(
384377
}
385378
return this.action.sendPrivateMessage(userId, msg)
386379
}
380+
381+
/**
382+
* 将消息序列化
383+
*/
384+
override fun serialize(): List<MessageSegment> = message.serialize()
385+
386+
/**
387+
* 强制将当前消息作为合并转发消息解析,
388+
* 如果消息并非合并转发消息则会抛出序列化异常
389+
*/
390+
override suspend fun resolveForwardMessage(): ForwardMessage.ForwardMessage? =
391+
action.getForwardMessage(message.first { it.type == SegmentType.forward }.data.id ?: return null)
387392
}
388393

389394
/**
@@ -410,7 +415,8 @@ internal val BaseMessage.command get() = this.first.split(" ").first()
410415
* 快速从一个数组消息中获取所有的文字部分
411416
* 返回一个字符串列表
412417
*/
413-
public val BaseMessage.texts: List<String> get() = this.message.filter { it.type == SegmentType.text }.mapNotNull { it.data.text }
418+
public val BaseMessage.texts: List<String>
419+
get() = this.message.filter { it.type == SegmentType.text }.mapNotNull { it.data.text }
414420

415421

416422
/**

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ 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.enums.RequestType
1514
import cn.rtast.rob.event.packed.GroupMessageErrorEvent
16-
import cn.rtast.rob.event.packed.PrivateMessageErrorEvent
1715
import cn.rtast.rob.event.raw.internal.RawWebsocketErrorEvent
1816
import cn.rtast.rob.event.raw.message.GroupMessage
1917
import cn.rtast.rob.event.raw.message.PrivateMessage
18+
import cn.rtast.rob.event.raw.message.serialize
2019
import cn.rtast.rob.event.raw.message.text
2120
import cn.rtast.rob.onebot.OneBotListener
2221
import cn.rtast.rob.onebot.dsl.image
2322
import cn.rtast.rob.onebot.dsl.text
23+
import cn.rtast.rob.segment.ForwardSegment
2424
import cn.rtast.rob.segment.Text
2525
import cn.rtast.rob.segment.toMessageChain
2626
import cn.rtast.rob.session.accept
@@ -77,24 +77,24 @@ class TestClient {
7777
val qqGroupId = 985927054L
7878
val instance1 = OneBotFactory.createClient(wsAddress, wsPassword, object : OneBotListener {
7979
override suspend fun onGroupMessage(message: GroupMessage) {
80-
println("listener")
81-
throw RuntimeException("test exception")
80+
// 获取合并转发消息id
81+
println(message.serialize().filterIsInstance<ForwardSegment>().firstOrNull()?.id)
82+
println(message.resolveForwardMessage()) // 将此消息强制作为合并转发消息解析
83+
message.reply {
84+
text("测试")
85+
}
8286
}
8387

8488
override suspend fun onPrivateMessage(message: PrivateMessage) {
85-
throw RuntimeException("priv ex")
89+
println(message.serialize().filterIsInstance<ForwardSegment>().firstOrNull()?.id)
90+
println(message.resolveForwardMessage())
91+
message.reply {
92+
text("测试")
93+
}
8694
}
8795

8896
override suspend fun onWebsocketErrorEvent(event: RawWebsocketErrorEvent) {
89-
println(event.exception)
90-
}
91-
92-
override suspend fun onGroupMessageError(event: GroupMessageErrorEvent) {
93-
println("msg err ${event.message} ${event.exception}")
94-
}
95-
96-
override suspend fun onPrivateMessageError(event: PrivateMessageErrorEvent) {
97-
println("priv msg err ${event.message} ${event.exception}")
97+
event.exception.printStackTrace()
9898
}
9999
}, logLevel = LogLevel.DEBUG)
100100
instance1.addListeningGroup(qqGroupId)

0 commit comments

Comments
 (0)