Skip to content

Commit 7561d8c

Browse files
YurnYurn
Yurn
authored and
Yurn
committed
更新 satori
1 parent 041e97e commit 7561d8c

File tree

11 files changed

+130
-177
lines changed

11 files changed

+130
-177
lines changed

adapter/build.gradle.kts

-20
Original file line numberDiff line numberDiff line change
@@ -93,26 +93,6 @@ kotlin {
9393
api(libs.ktor.client.darwin)
9494
}
9595

96-
iosX64Main.dependencies {
97-
implementation(libs.yutori.ios.x64)
98-
}
99-
100-
iosArm64Main.dependencies {
101-
implementation(libs.yutori.ios.arm64)
102-
}
103-
104-
iosSimulatorArm64Main.dependencies {
105-
implementation(libs.yutori.ios.simulator.arm64)
106-
}
107-
108-
macosX64Main.dependencies {
109-
implementation(libs.yutori.macos.x64)
110-
}
111-
112-
macosArm64Main.dependencies {
113-
implementation(libs.yutori.macos.arm64)
114-
}
115-
11696
linuxMain.dependencies {
11797
api(libs.ktor.client.curl)
11898
}

adapter/src/commonMain/kotlin/cn/yurin/yutorix/module/satori/adapter/ActionService.kt

+10-10
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@
77

88
package cn.yurin.yutorix.module.satori.adapter
99

10-
import cn.yurn.yutori.AdapterActionService
11-
import cn.yurn.yutori.Channel
12-
import cn.yurn.yutori.FormData
13-
import cn.yurn.yutori.Guild
14-
import cn.yurn.yutori.GuildMember
15-
import cn.yurn.yutori.GuildRole
16-
import cn.yurn.yutori.Message
17-
import cn.yurn.yutori.User
18-
import cn.yurn.yutori.Yutori
19-
import cn.yurn.yutori.message.element.MessageElement
10+
import cn.yurin.yutori.AdapterActionService
11+
import cn.yurin.yutori.Channel
12+
import cn.yurin.yutori.FormData
13+
import cn.yurin.yutori.Guild
14+
import cn.yurin.yutori.GuildMember
15+
import cn.yurin.yutori.GuildRole
16+
import cn.yurin.yutori.Message
17+
import cn.yurin.yutori.User
18+
import cn.yurin.yutori.Yutori
19+
import cn.yurin.yutori.message.element.MessageElement
2020
import cn.yurin.yutorix.module.satori.SatoriAdapterProperties
2121
import cn.yurin.yutorix.module.satori.SerializableBidiPagingList
2222
import cn.yurin.yutorix.module.satori.SerializableChannel

adapter/src/commonMain/kotlin/cn/yurin/yutorix/module/satori/adapter/Adapter.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
package cn.yurin.yutorix.module.satori.adapter
44

5-
import cn.yurn.yutori.Adapter
6-
import cn.yurn.yutori.BuilderMarker
7-
import cn.yurn.yutori.Login
8-
import cn.yurn.yutori.Reinstallable
9-
import cn.yurn.yutori.Yutori
5+
import cn.yurin.yutori.Adapter
6+
import cn.yurin.yutori.BuilderMarker
7+
import cn.yurin.yutori.Login
8+
import cn.yurin.yutori.Reinstallable
9+
import cn.yurin.yutori.Yutori
1010
import cn.yurin.yutorix.module.satori.SatoriAdapterProperties
1111
import co.touchlab.kermit.Logger
1212
import kotlinx.atomicfu.atomic

adapter/src/commonMain/kotlin/cn/yurin/yutorix/module/satori/adapter/EventService.kt

+36-15
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22

33
package cn.yurin.yutorix.module.satori.adapter
44

5-
import cn.yurn.yutori.AdapterContext
6-
import cn.yurn.yutori.AdapterEventService
7-
import cn.yurn.yutori.Event
8-
import cn.yurn.yutori.Login
9-
import cn.yurn.yutori.MessageEvents
10-
import cn.yurn.yutori.RootActions
11-
import cn.yurn.yutori.SigningEvent
12-
import cn.yurn.yutori.Yutori
5+
import cn.yurin.yutori.AdapterContext
6+
import cn.yurin.yutori.AdapterEventService
7+
import cn.yurin.yutori.Event
8+
import cn.yurin.yutori.Login
9+
import cn.yurin.yutori.MessageEvents
10+
import cn.yurin.yutori.RootActions
11+
import cn.yurin.yutori.SigningEvent
12+
import cn.yurin.yutori.Yutori
13+
import cn.yurin.yutori.nick
1314
import cn.yurin.yutorix.module.satori.EventSignal
1415
import cn.yurin.yutorix.module.satori.Identify
1516
import cn.yurin.yutorix.module.satori.IdentifySignal
@@ -18,7 +19,6 @@ import cn.yurin.yutorix.module.satori.PongSignal
1819
import cn.yurin.yutorix.module.satori.ReadySignal
1920
import cn.yurin.yutorix.module.satori.SatoriAdapterProperties
2021
import cn.yurin.yutorix.module.satori.Signal
21-
import cn.yurn.yutori.nick
2222
import co.touchlab.kermit.Logger
2323
import io.ktor.client.HttpClient
2424
import io.ktor.client.plugins.websocket.WebSockets
@@ -76,7 +76,14 @@ class WebSocketEventService(
7676
actionsList.clear()
7777
var ready = false
7878
var isReceivedPong: Boolean
79-
sendSerialized(IdentifySignal(Identify(properties.token, sequence?.toInt())))
79+
sendSerialized(
80+
IdentifySignal(
81+
Identify(
82+
properties.token,
83+
sequence?.toInt()
84+
)
85+
)
86+
)
8087
Logger.i(name) { "成功建立 WebSocket 连接, 尝试建立事件推送服务" }
8188
launch {
8289
delay(10000)
@@ -88,7 +95,8 @@ class WebSocketEventService(
8895
}
8996
}
9097
while (isActive) try {
91-
val receive = (incoming.receive() as? Frame.Text ?: continue).readText()
98+
val receive =
99+
(incoming.receive() as? Frame.Text ?: continue).readText()
92100
Logger.d(name) { "接收信令: $receive" }
93101
when (val signal = json.decodeFromString<Signal>(receive)) {
94102
is ReadySignal -> {
@@ -104,7 +112,12 @@ class WebSocketEventService(
104112
actionsList += actions
105113
yutori.actionsList += actions
106114
}
107-
onConnect(signal.body.logins.map { it.toUniverse(null, yutori) })
115+
onConnect(signal.body.logins.map {
116+
it.toUniverse(
117+
null,
118+
yutori
119+
)
120+
})
108121
Logger.i(name) { "成功建立事件推送服务: ${signal.body.logins}" }
109122
launch {
110123
do {
@@ -117,7 +130,15 @@ class WebSocketEventService(
117130
}
118131
}
119132

120-
is EventSignal -> launch { onEvent(signal.body.toUniverse(alias, yutori)) }
133+
is EventSignal -> launch {
134+
onEvent(
135+
signal.body.toUniverse(
136+
alias,
137+
yutori
138+
)
139+
)
140+
}
141+
121142
is PongSignal -> {
122143
isReceivedPong = true
123144
Logger.d(name) { "收到 PONG" }
@@ -166,8 +187,8 @@ class WebSocketEventService(
166187
}
167188
Logger.d(name) { "事件详细信息: $event" }
168189
sequence = event.id
169-
val actions = actionsList.find {
170-
actions -> actions.platform == event.platform && actions.userId == event.selfId
190+
val actions = actionsList.find { actions ->
191+
actions.platform == event.platform && actions.userId == event.selfId
171192
} ?: run {
172193
val actions = RootActions(
173194
alias = alias,

core/build.gradle.kts

-20
Original file line numberDiff line numberDiff line change
@@ -71,26 +71,6 @@ kotlin {
7171
api(libs.ktor.serialization.kotlinx.json)
7272
api(libs.ksoup)
7373
}
74-
75-
iosX64Main.dependencies {
76-
implementation(libs.yutori.ios.x64)
77-
}
78-
79-
iosArm64Main.dependencies {
80-
implementation(libs.yutori.ios.arm64)
81-
}
82-
83-
iosSimulatorArm64Main.dependencies {
84-
implementation(libs.yutori.ios.simulator.arm64)
85-
}
86-
87-
macosX64Main.dependencies {
88-
implementation(libs.yutori.macos.x64)
89-
}
90-
91-
macosArm64Main.dependencies {
92-
implementation(libs.yutori.macos.arm64)
93-
}
9474
}
9575
}
9676

core/src/commonMain/kotlin/cn/yurin/yutorix/module/satori/Entity.kt

+23-23
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@
22

33
package cn.yurin.yutorix.module.satori
44

5-
import cn.yurn.yutori.BidiPagingList
6-
import cn.yurn.yutori.Channel
7-
import cn.yurn.yutori.Event
8-
import cn.yurn.yutori.Guild
9-
import cn.yurn.yutori.GuildMember
10-
import cn.yurn.yutori.GuildRole
11-
import cn.yurn.yutori.Interaction
12-
import cn.yurn.yutori.Login
13-
import cn.yurn.yutori.Message
14-
import cn.yurn.yutori.PagingList
15-
import cn.yurn.yutori.SigningEvent
16-
import cn.yurn.yutori.User
17-
import cn.yurn.yutori.Yutori
18-
import cn.yurn.yutori.argv
19-
import cn.yurn.yutori.button
20-
import cn.yurn.yutori.channel
21-
import cn.yurn.yutori.guild
22-
import cn.yurn.yutori.login
23-
import cn.yurn.yutori.member
24-
import cn.yurn.yutori.message
25-
import cn.yurn.yutori.operator
26-
import cn.yurn.yutori.role
27-
import cn.yurn.yutori.user
5+
import cn.yurin.yutori.BidiPagingList
6+
import cn.yurin.yutori.Channel
7+
import cn.yurin.yutori.Event
8+
import cn.yurin.yutori.Guild
9+
import cn.yurin.yutori.GuildMember
10+
import cn.yurin.yutori.GuildRole
11+
import cn.yurin.yutori.Interaction
12+
import cn.yurin.yutori.Login
13+
import cn.yurin.yutori.Message
14+
import cn.yurin.yutori.PagingList
15+
import cn.yurin.yutori.SigningEvent
16+
import cn.yurin.yutori.User
17+
import cn.yurin.yutori.Yutori
18+
import cn.yurin.yutori.argv
19+
import cn.yurin.yutori.button
20+
import cn.yurin.yutori.channel
21+
import cn.yurin.yutori.guild
22+
import cn.yurin.yutori.login
23+
import cn.yurin.yutori.member
24+
import cn.yurin.yutori.message
25+
import cn.yurin.yutori.operator
26+
import cn.yurin.yutori.role
27+
import cn.yurin.yutori.user
2828
import kotlinx.serialization.ExperimentalSerializationApi
2929
import kotlinx.serialization.SerialName
3030
import kotlinx.serialization.Serializable

core/src/commonMain/kotlin/cn/yurin/yutorix/module/satori/Util.kt

+40-43
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
package cn.yurin.yutorix.module.satori
44

5-
import cn.yurn.yutori.Yutori
6-
import cn.yurn.yutori.message.element.MessageElement
7-
import cn.yurn.yutori.message.element.NodeMessageElement
8-
import cn.yurn.yutori.message.element.Text
5+
import cn.yurin.yutori.Yutori
6+
import cn.yurin.yutori.message.element.MessageElement
7+
import cn.yurin.yutori.message.element.Text
98
import com.fleeksoft.ksoup.Ksoup
109
import com.fleeksoft.ksoup.nodes.Comment
1110
import com.fleeksoft.ksoup.nodes.DocumentType
@@ -33,41 +32,31 @@ fun String.deserialize(yutori: Yutori): List<MessageElement> {
3332
private fun parseElement(yutori: Yutori, node: Node): MessageElement = when (node) {
3433
is TextNode -> Text(node.text())
3534
is Element -> {
36-
val container = yutori.elements[node.tagName()]
37-
val attributes = buildMap<String, Any?> {
35+
val container = yutori.elements[when (val name = node.tagName()) {
36+
"a" -> "href"
37+
"img" -> "image"
38+
"b" -> "bold"
39+
"i" -> "idiomatic"
40+
"u" -> "underline"
41+
"s" -> "strikethrough"
42+
"del" -> "delete"
43+
"p" -> "paragraph"
44+
else -> name
45+
}]
46+
val properties = buildMap {
3847
for ((key, value) in node.attributes()) {
3948
put(key, value)
4049
}
41-
}
42-
container?.invoke(attributes)?.apply {
43-
for (attr in node.attributes()) {
44-
val key = attr.key
45-
val value = attr.value
46-
this.properties[key] =
47-
when (val default = container.propertiesDefault[key] ?: "") {
48-
is String -> value
49-
is Number -> if (value.contains(".")) {
50-
value.toDouble()
51-
} else {
52-
runCatching {
53-
value.toInt()
54-
}.getOrElse {
55-
value.toLong()
56-
}
57-
}
58-
59-
is Boolean -> if (attr.toString().contains("=")) {
60-
value.toBooleanStrict()
61-
} else {
62-
true
63-
}
64-
65-
else -> throw RuntimeException("Message element property parse failed: ${default::class}")
66-
}
50+
}.toMutableMap()
51+
val children = buildList {
52+
for (child in node.childNodes()) {
53+
add(parseElement(yutori, child))
6754
}
68-
for (child in node.childNodes()) this.children += parseElement(yutori, child)
69-
} ?: NodeMessageElement(
70-
node.tagName()
55+
}
56+
container?.invoke(properties, children) ?: MessageElement(
57+
node.tagName(),
58+
properties,
59+
children
7160
)
7261
}
7362

@@ -76,14 +65,22 @@ private fun parseElement(yutori: Yutori, node: Node): MessageElement = when (nod
7665

7766
fun List<MessageElement>.serialize() = joinToString("") { it.serialize() }
7867

79-
fun MessageElement.serialize() = when (this) {
80-
is Text -> serialize()
81-
is NodeMessageElement -> serialize()
82-
else -> throw UnsupportedOperationException("Unknown element type: $this")
83-
}
84-
85-
private fun Text.serialize() = text.encode()
86-
private fun NodeMessageElement.serialize() = buildString {
68+
private fun MessageElement.serialize() = buildString {
69+
if (this@serialize is Text) {
70+
append(content.encode())
71+
return@buildString
72+
}
73+
val nodeName = when (elementName) {
74+
"href" -> "a"
75+
"image" -> "img"
76+
"bold" -> "b"
77+
"idiomatic" -> "i"
78+
"underline" -> "u"
79+
"strikethrough" -> "s"
80+
"delete" -> "del"
81+
"paragraph" -> "p"
82+
else -> elementName
83+
}
8784
append("<$nodeName")
8885
for (item in properties) {
8986
val key = item.key

gradle/libs.versions.toml

+2-7
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ agp = "8.6.1"
44
atomicfu = "0.25.0"
55
ktor = "3.0.0-rc-1"
66
ksoup = "0.1.9"
7-
yutori = "5badb79b61b360efaba89b8c97206bedc2e265d9"
7+
yutori = "c571ab1af5aa13c12d7a5e0b3d6ab6c0ce6d1f1b"
88

99
[libraries]
1010
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
@@ -20,12 +20,7 @@ ktor-client-curl = { module = "io.ktor:ktor-client-curl", version.ref = "ktor" }
2020
ktor-client-winhttp = { module = "io.ktor:ktor-client-winhttp", version.ref = "ktor" }
2121
ktor-client-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" }
2222
ksoup = { module = "com.fleeksoft.ksoup:ksoup-lite", version.ref = "ksoup" }
23-
yutori = { module = "cn.yurn.yutori:yutori", version.ref = "yutori" }
24-
yutori-ios-x64 = { module = "cn.yurn.yutori:yutori-iosx64", version.ref = "yutori" }
25-
yutori-ios-arm64 = { module = "cn.yurn.yutori:yutori-iosarm64", version.ref = "yutori" }
26-
yutori-ios-simulator-arm64 = { module = "cn.yurn.yutori:yutori-iossimulatorarm64", version.ref = "yutori" }
27-
yutori-macos-x64 = { module = "cn.yurn.yutori:yutori-macosx64", version.ref = "yutori" }
28-
yutori-macos-arm64 = { module = "cn.yurn.yutori:yutori-macosarm64", version.ref = "yutori" }
23+
yutori = { module = "cn.yurin.yutori:yutori", version.ref = "yutori" }
2924

3025
[plugins]
3126
multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }

0 commit comments

Comments
 (0)