Skip to content

Commit 2c49a49

Browse files
committed
refactor(core): move internal logic to MessageParsingContext [skip build]
1 parent 3d8bba6 commit 2c49a49

7 files changed

Lines changed: 181 additions & 193 deletions

File tree

acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/Bot.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ import org.ntqqrev.acidify.internal.util.triSha1
4949
import org.ntqqrev.acidify.internal.util.unescapeHttp
5050
import org.ntqqrev.acidify.logging.*
5151
import org.ntqqrev.acidify.message.*
52-
import org.ntqqrev.acidify.message.BotEssenceMessage.Companion.toBotEssenceMessage
53-
import org.ntqqrev.acidify.message.BotForwardedMessage.Companion.parseForwardedMessage
54-
import org.ntqqrev.acidify.message.BotIncomingMessage.Companion.parseMessage
5552
import org.ntqqrev.acidify.message.internal.MessageBuildingContext
53+
import org.ntqqrev.acidify.message.internal.MessageParsingContext.Companion.parseForwardedMessage
54+
import org.ntqqrev.acidify.message.internal.MessageParsingContext.Companion.parseMessage
55+
import org.ntqqrev.acidify.message.internal.MessageParsingContext.Companion.toBotEssenceMessage
5656
import org.ntqqrev.acidify.struct.*
5757
import org.ntqqrev.acidify.struct.BotFriendRequest.Companion.parseFilteredFriendRequest
5858
import org.ntqqrev.acidify.struct.BotFriendRequest.Companion.parseFriendRequest

acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/event/internal/MsgPushSignal.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import org.ntqqrev.acidify.internal.packet.message.PushMsg
1111
import org.ntqqrev.acidify.internal.packet.message.PushMsgType
1212
import org.ntqqrev.acidify.internal.packet.message.extra.*
1313
import org.ntqqrev.acidify.internal.protobuf.invoke
14-
import org.ntqqrev.acidify.message.BotIncomingMessage.Companion.parseMessage
1514
import org.ntqqrev.acidify.message.BotIncomingSegment
1615
import org.ntqqrev.acidify.message.MessageScene
16+
import org.ntqqrev.acidify.message.internal.MessageParsingContext.Companion.parseMessage
1717
import org.ntqqrev.acidify.struct.BotGroupNotification
1818
import org.ntqqrev.acidify.struct.RequestState
1919
import kotlin.time.Clock
Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package org.ntqqrev.acidify.message
22

3-
import kotlinx.serialization.json.int
4-
import kotlinx.serialization.json.jsonPrimitive
5-
import org.ntqqrev.acidify.internal.packet.misc.GroupEssenceMsgItem
63
import kotlin.js.JsExport
74

85
/**
@@ -28,27 +25,4 @@ class BotEssenceMessage internal constructor(
2825
val operatorName: String,
2926
val operationTime: Long,
3027
val segments: List<BotEssenceSegment>
31-
) {
32-
companion object {
33-
internal fun GroupEssenceMsgItem.toBotEssenceMessage(groupUin: Long) = BotEssenceMessage(
34-
groupUin = groupUin,
35-
messageSeq = this.msgSeq,
36-
messageTime = this.senderTime,
37-
senderUin = this.senderUin.toLongOrNull() ?: 0L,
38-
senderName = this.senderNick,
39-
operatorUin = this.addDigestUin.toLongOrNull() ?: 0L,
40-
operatorName = this.addDigestNick,
41-
operationTime = this.addDigestTime,
42-
segments = this.msgContent.mapNotNull { element ->
43-
val msgType = element["msg_type"]?.jsonPrimitive?.int ?: return@mapNotNull null
44-
when (msgType) {
45-
1 -> BotEssenceSegment.Text(element["text"]?.jsonPrimitive?.content ?: "")
46-
2 -> BotEssenceSegment.Face(element["face_index"]?.jsonPrimitive?.int ?: 0)
47-
3 -> BotEssenceSegment.Image(element["image_url"]?.jsonPrimitive?.content ?: "")
48-
4 -> BotEssenceSegment.Video(element["file_thumbnail_url"]?.jsonPrimitive?.content ?: "")
49-
else -> null
50-
}
51-
}
52-
).takeIf { it.segments.isNotEmpty() }
53-
}
54-
}
28+
)
Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package org.ntqqrev.acidify.message
22

3-
import org.ntqqrev.acidify.Bot
4-
import org.ntqqrev.acidify.internal.packet.message.CommonMessage
5-
import org.ntqqrev.acidify.internal.protobuf.PbObject
6-
import org.ntqqrev.acidify.message.BotIncomingMessage.Companion.buildSegments
73
import kotlin.js.JsExport
84

95
/**
@@ -21,30 +17,5 @@ class BotForwardedMessage internal constructor(
2117
) {
2218
lateinit var segments: List<BotIncomingSegment>
2319
internal set
24-
25-
companion object {
26-
internal fun Bot.parseForwardedMessage(raw: PbObject<CommonMessage>): BotForwardedMessage? {
27-
val routingHead = raw.get { routingHead }
28-
val contentHead = raw.get { contentHead }
29-
val senderName = routingHead.get { commonC2C }.get { name }.takeIf { it.isNotEmpty() }
30-
?: routingHead.get { group }.get { groupCard }.takeIf { it.isNotEmpty() }
31-
?: "QQ用户"
32-
val avatarUrl = contentHead.get { forwardExt }.get { avatar }
33-
val message = BotForwardedMessage(
34-
senderName = senderName,
35-
avatarUrl = avatarUrl,
36-
timestamp = contentHead.get { time }
37-
)
38-
val segments = buildSegments(
39-
elems = raw.get { messageBody }.get { richText }.get { this.elems },
40-
scene = MessageScene.FRIEND
41-
)
42-
if (segments.isEmpty()) {
43-
return null
44-
}
45-
message.segments = segments
46-
return message
47-
}
48-
}
4920
}
5021

Lines changed: 0 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
package org.ntqqrev.acidify.message
22

3-
import org.ntqqrev.acidify.Bot
43
import org.ntqqrev.acidify.internal.packet.message.CommonMessage
5-
import org.ntqqrev.acidify.internal.packet.message.Elem
6-
import org.ntqqrev.acidify.internal.packet.message.PushMsgType
7-
import org.ntqqrev.acidify.internal.packet.message.extra.PrivateFileExtra
84
import org.ntqqrev.acidify.internal.protobuf.PbObject
9-
import org.ntqqrev.acidify.internal.protobuf.invoke
10-
import org.ntqqrev.acidify.message.internal.IncomingSegmentFactory
11-
import org.ntqqrev.acidify.message.internal.MessageParsingContext
125
import kotlin.js.JsExport
136

147
/**
@@ -60,128 +53,4 @@ class BotIncomingMessage internal constructor(
6053
val groupCard: String,
6154
val specialTitle: String
6255
)
63-
64-
companion object {
65-
internal val factories = listOf<IncomingSegmentFactory<*>>(
66-
IncomingSegmentFactory.Text,
67-
IncomingSegmentFactory.Mention,
68-
IncomingSegmentFactory.Face,
69-
IncomingSegmentFactory.Reply,
70-
IncomingSegmentFactory.Image,
71-
IncomingSegmentFactory.Record,
72-
IncomingSegmentFactory.Video,
73-
IncomingSegmentFactory.File,
74-
IncomingSegmentFactory.Forward,
75-
IncomingSegmentFactory.MarketFace,
76-
IncomingSegmentFactory.LightApp,
77-
)
78-
79-
internal fun Bot.parseMessage(raw: PbObject<CommonMessage>): BotIncomingMessage? {
80-
val contentHead = raw.get { contentHead }
81-
val pushMsgType = PushMsgType.from(contentHead.get { type }) ?: return null
82-
val draftMsg = buildDraftMessage(raw, pushMsgType) ?: return null
83-
val segments = if (pushMsgType != PushMsgType.FriendFileMessage) {
84-
buildSegments(raw.get { messageBody }.get { richText }.get { elems }, draftMsg.scene) {
85-
draftMsg.extraInfo = it
86-
}
87-
} else {
88-
val notOnlineFile = PrivateFileExtra(raw.get { messageBody }.get { msgContent })
89-
.get { notOnlineFile }
90-
listOf(
91-
BotIncomingSegment.File(
92-
fileId = notOnlineFile.get { fileUuid },
93-
fileName = notOnlineFile.get { fileName },
94-
fileSize = notOnlineFile.get { fileSize },
95-
fileHash = notOnlineFile.get { fileIdCrcMedia }
96-
)
97-
)
98-
}
99-
100-
if (segments.isEmpty()) {
101-
return null
102-
}
103-
104-
draftMsg.segments = segments
105-
return draftMsg
106-
}
107-
108-
private fun Bot.buildDraftMessage(raw: PbObject<CommonMessage>, pushMsgType: PushMsgType): BotIncomingMessage? {
109-
val routingHead = raw.get { routingHead }
110-
val contentHead = raw.get { contentHead }
111-
112-
return when (pushMsgType) {
113-
PushMsgType.FriendMessage,
114-
PushMsgType.FriendRecordMessage,
115-
PushMsgType.FriendFileMessage -> {
116-
val isSelfSend = routingHead.get { fromUin } == this.uin
117-
BotIncomingMessage(
118-
scene = MessageScene.FRIEND,
119-
peerUin = if (isSelfSend) routingHead.get { toUin } else routingHead.get { fromUin },
120-
peerUid = if (isSelfSend) routingHead.get { toUid } else routingHead.get { fromUid },
121-
sequence = contentHead.get { clientSequence },
122-
timestamp = contentHead.get { time },
123-
senderUin = routingHead.get { fromUin },
124-
senderUid = routingHead.get { fromUid },
125-
clientSequence = contentHead.get { sequence }, // weird
126-
random = contentHead.get { random },
127-
messageUid = contentHead.get { msgUid },
128-
raw = raw,
129-
)
130-
}
131-
132-
PushMsgType.GroupMessage -> {
133-
BotIncomingMessage(
134-
scene = MessageScene.GROUP,
135-
peerUin = routingHead.get { group }.get { groupCode },
136-
peerUid = routingHead.get { toUid },
137-
sequence = contentHead.get { sequence },
138-
timestamp = contentHead.get { time },
139-
senderUin = routingHead.get { fromUin },
140-
senderUid = routingHead.get { fromUid },
141-
clientSequence = contentHead.get { clientSequence },
142-
random = contentHead.get { random },
143-
messageUid = contentHead.get { msgUid },
144-
raw = raw,
145-
)
146-
}
147-
148-
else -> return null
149-
}
150-
}
151-
152-
internal fun Bot.buildSegments(
153-
elems: List<PbObject<Elem>>,
154-
scene: MessageScene,
155-
onExtraInfo: ((ExtraInfo) -> Unit)? = null
156-
): List<BotIncomingSegment> {
157-
val segments = mutableListOf<BotIncomingSegment>()
158-
val ctx = MessageParsingContext(scene, elems, this)
159-
while (ctx.hasNext()) {
160-
ctx.tryPeekType { this.extraInfo }?.let {
161-
onExtraInfo?.invoke(
162-
ExtraInfo(
163-
nick = it.get { nick },
164-
groupCard = it.get { groupCard },
165-
specialTitle = it.get { senderTitle },
166-
)
167-
)
168-
ctx.consume()
169-
continue
170-
}
171-
172-
var matched = false
173-
for (factory in factories) {
174-
val segment = factory.tryParse(ctx) ?: continue
175-
segments += segment
176-
matched = true
177-
break
178-
}
179-
if (!matched) {
180-
ctx.skip()
181-
}
182-
}
183-
184-
return segments
185-
}
186-
}
18756
}

acidify-core/src/commonMain/kotlin/org/ntqqrev/acidify/message/internal/IncomingSegmentFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import org.ntqqrev.acidify.internal.protobuf.invoke
1515
import org.ntqqrev.acidify.internal.util.BinaryReader
1616
import org.ntqqrev.acidify.internal.util.Prefix
1717
import org.ntqqrev.acidify.internal.util.readUInt32BE
18-
import org.ntqqrev.acidify.message.BotIncomingMessage.Companion.buildSegments
1918
import org.ntqqrev.acidify.message.BotIncomingSegment
2019
import org.ntqqrev.acidify.message.ImageSubType
2120
import org.ntqqrev.acidify.message.MessageScene
21+
import org.ntqqrev.acidify.message.internal.MessageParsingContext.Companion.buildSegments
2222
import kotlin.math.min
2323

2424
internal interface IncomingSegmentFactory<T : BotIncomingSegment> {

0 commit comments

Comments
 (0)