Skip to content

Commit 907b349

Browse files
authored
Merge pull request #93 from simple-robot/dev/main
Release: v1.2.0
2 parents 1c1b8d6 + 2e36f50 commit 907b349

File tree

16 files changed

+192
-46
lines changed

16 files changed

+192
-46
lines changed

.github/dependabot.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: gradle
4+
directory: /
5+
target-branch: "dev/main"
6+
schedule:
7+
interval: daily
8+
labels:
9+
- dependencies
10+
assignees:
11+
- ForteScarlet
12+
open-pull-requests-limit: 10

.github/workflows/qodana_code_quality.yml

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,25 @@ on:
77
- dev/main
88
- master
99
- main
10-
10+
1111
jobs:
1212
qodana:
13+
if: ${{ !startsWith(github.head_ref, 'dependabot/') }}
1314
runs-on: ubuntu-latest
15+
permissions:
16+
contents: write
17+
pull-requests: write
18+
checks: write
1419
steps:
1520
- uses: actions/checkout@v4
1621
with:
17-
fetch-depth: 0
22+
ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit
23+
fetch-depth: 0 # a full history is required for pull request analysis
1824
- name: 'Qodana Scan'
19-
uses: JetBrains/[email protected]
25+
uses: JetBrains/qodana-action@main
26+
with:
27+
upload-result: true
28+
github-token: ${{ secrets.FORLIY_ACCESS_TOKEN }}
2029
env:
21-
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
30+
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }} # read the steps about it below
31+
GITHUB_TOKEN: ${{ secrets.FORLIY_ACCESS_TOKEN }}

buildSrc/src/main/kotlin/P.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ object P {
3737
override val description: String get() = DESCRIPTION
3838
override val homepage: String get() = HOMEPAGE
3939

40-
const val VERSION = "1.1.0"
41-
const val NEXT_VERSION = "1.1.1"
40+
const val VERSION = "1.2.0"
41+
const val NEXT_VERSION = "1.2.1"
4242

4343
override val snapshotVersion = "$NEXT_VERSION-SNAPSHOT"
4444
override val version = if (isSnapshot()) snapshotVersion else VERSION

gradle/libs.versions.toml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
[versions]
22
kotlin = "2.0.0"
33
kotlinx-coroutines = "1.8.1"
4-
kotlinx-serialization = "1.6.3"
4+
kotlinx-serialization = "1.7.1"
55
dokka = "1.9.20"
6-
ktor = "2.3.11"
7-
openjdk-jmh = "1.35"
8-
log4j = "2.20.0"
6+
ktor = "2.3.12"
7+
openjdk-jmh = "1.37"
8+
log4j = "2.23.1"
99
# simbot
10-
simbot = "4.1.0"
10+
simbot = "4.5.0"
1111
suspendTransform = "0.9.0"
1212
gradleCommon = "0.6.0"
1313
# ksp
14-
ksp = "2.0.0-1.0.22"
14+
ksp = "2.0.0-1.0.24"
1515
# https://square.github.io/kotlinpoet/
16-
kotlinPoet = "1.17.0"
16+
kotlinPoet = "1.18.1"
1717
# https://mockk.io/
1818
mockk = "1.13.12"
1919
# https://detekt.dev/docs/intro
20-
detekt = "1.23.3"
20+
detekt = "1.23.6"
2121

2222
[libraries]
2323
# simbot
@@ -108,7 +108,7 @@ ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
108108
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
109109
# binary-compatibility-validator
110110
# https://github.com/Kotlin/binary-compatibility-validator
111-
kotlinxBinaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.15.0-Beta.2" }
111+
kotlinxBinaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.3" }
112112

113113
[bundles]
114114
gradle-common = ["gradle-common-core", "gradle-common-multiplatform", "gradle-common-publication"]

settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*/
1717

1818
plugins {
19-
id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0"
19+
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
2020
}
2121
rootProject.name = "simbot-component-onebot"
2222

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotGroupMessageEventImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ internal abstract class OneBotGroupMessageEventImpl(
7676
return bot.executeData(
7777
sendGroupMsgApi(
7878
target = sourceEvent.groupId,
79-
message = sourceEvent.message,
79+
message = messageContent.sourceSegments,
8080
reply = sourceEvent.messageId
8181
)
8282
).toReceipt(bot)

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/event/internal/message/OneBotPrivateMessageEventImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ internal abstract class OneBotPrivateMessageEventImpl(
7171
return bot.executeData(
7272
sendPrivateMsgApi(
7373
target = sourceEvent.userId,
74-
message = sourceEvent.message,
74+
message = messageContent.sourceSegments,
7575
)
7676
).toReceipt(bot)
7777
}

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/core/utils/MessageUtil.kt

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package love.forte.simbot.component.onebot.v11.core.utils
1919

2020
import love.forte.simbot.common.id.ID
21+
import love.forte.simbot.component.onebot.common.annotations.InternalOneBotAPI
2122
import love.forte.simbot.component.onebot.v11.core.api.OneBotMessageOutgoing
2223
import love.forte.simbot.component.onebot.v11.core.api.SendMsgApi
2324
import love.forte.simbot.component.onebot.v11.message.segment.OneBotMessageSegment
@@ -29,7 +30,8 @@ import love.forte.simbot.component.onebot.v11.message.segment.OneBotText
2930
*
3031
* @param messageType see [SendMsgApi]`.MESSAGE_TYPE_*`
3132
*/
32-
internal fun sendTextMsgApi(
33+
@InternalOneBotAPI
34+
public fun sendTextMsgApi(
3335
messageType: String,
3436
target: ID,
3537
text: String,
@@ -58,7 +60,8 @@ internal fun sendTextMsgApi(
5860
}
5961
}
6062

61-
internal fun sendPrivateTextMsgApi(
63+
@InternalOneBotAPI
64+
public fun sendPrivateTextMsgApi(
6265
target: ID,
6366
text: String,
6467
reply: ID? = null,
@@ -69,7 +72,8 @@ internal fun sendPrivateTextMsgApi(
6972
reply = reply,
7073
)
7174

72-
internal fun sendGroupTextMsgApi(
75+
@InternalOneBotAPI
76+
public fun sendGroupTextMsgApi(
7377
target: ID,
7478
text: String,
7579
reply: ID? = null,
@@ -86,7 +90,8 @@ internal fun sendGroupTextMsgApi(
8690
*
8791
* @param messageType see [SendMsgApi]`.MESSAGE_TYPE_*`
8892
*/
89-
internal fun sendMsgApi(
93+
@InternalOneBotAPI
94+
public fun sendMsgApi(
9095
messageType: String,
9196
target: ID,
9297
message: List<OneBotMessageSegment>,
@@ -112,7 +117,8 @@ internal fun sendMsgApi(
112117
}
113118
}
114119

115-
internal fun resolveReplyMessageSegmentList(
120+
@InternalOneBotAPI
121+
public fun resolveReplyMessageSegmentList(
116122
message: List<OneBotMessageSegment>,
117123
reply: ID,
118124
): List<OneBotMessageSegment> {
@@ -132,7 +138,8 @@ internal fun resolveReplyMessageSegmentList(
132138
return newMessage
133139
}
134140

135-
internal fun sendPrivateMsgApi(
141+
@InternalOneBotAPI
142+
public fun sendPrivateMsgApi(
136143
target: ID,
137144
message: List<OneBotMessageSegment>,
138145
reply: ID? = null,
@@ -143,7 +150,8 @@ internal fun sendPrivateMsgApi(
143150
reply = reply,
144151
)
145152

146-
internal fun sendGroupMsgApi(
153+
@InternalOneBotAPI
154+
public fun sendGroupMsgApi(
147155
target: ID,
148156
message: List<OneBotMessageSegment>,
149157
reply: ID? = null,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package love.forte.simbot.component.onebot.v11.core
2+
3+
import kotlinx.coroutines.test.runTest
4+
import love.forte.simbot.common.id.IntID.Companion.ID
5+
import love.forte.simbot.component.onebot.v11.core.api.OneBotMessageOutgoing
6+
import love.forte.simbot.component.onebot.v11.core.api.SendMsgApi
7+
import love.forte.simbot.component.onebot.v11.core.utils.sendMsgApi
8+
import love.forte.simbot.component.onebot.v11.core.utils.sendTextMsgApi
9+
import love.forte.simbot.component.onebot.v11.message.resolveToOneBotSegmentList
10+
import love.forte.simbot.component.onebot.v11.message.segment.OneBotFace
11+
import love.forte.simbot.component.onebot.v11.message.segment.OneBotReply
12+
import love.forte.simbot.component.onebot.v11.message.segment.OneBotText
13+
import love.forte.simbot.message.Face
14+
import love.forte.simbot.message.MessageIdReference
15+
import love.forte.simbot.message.buildMessages
16+
import kotlin.collections.first
17+
import kotlin.test.Test
18+
import kotlin.test.assertEquals
19+
import kotlin.test.assertIs
20+
import kotlin.test.assertNotNull
21+
22+
/**
23+
* Tests for `OneBotReply` and `MessageReference` for send.
24+
*
25+
* @author ForteScarlet
26+
*/
27+
class ReplyAndMessageReferenceTests {
28+
@Test
29+
fun sendReplyWithSingleSegmentTest() {
30+
val api = sendMsgApi(
31+
SendMsgApi.MESSAGE_TYPE_GROUP,
32+
target = 123.ID,
33+
message = listOf(OneBotText.create("Hello")),
34+
reply = 456.ID,
35+
)
36+
37+
val body = assertIs<SendMsgApi.Body>(api.body)
38+
val content = assertIs<OneBotMessageOutgoing.SegmentsValue>(body.message)
39+
val firstReply = assertIs<OneBotReply>(content.segments.first())
40+
41+
assertEquals(456.ID, firstReply.id)
42+
}
43+
44+
@Test
45+
fun sendReplyWithSegmentsTest() {
46+
val api = sendMsgApi(
47+
SendMsgApi.MESSAGE_TYPE_GROUP,
48+
target = 123.ID,
49+
message = listOf(OneBotText.create("Hello"), OneBotText.create("Hello"), OneBotFace.create(999.ID)),
50+
reply = 456.ID,
51+
)
52+
53+
val body = assertIs<SendMsgApi.Body>(api.body)
54+
val content = assertIs<OneBotMessageOutgoing.SegmentsValue>(body.message)
55+
val firstReply = assertIs<OneBotReply>(content.segments.first())
56+
57+
assertEquals(456.ID, firstReply.id)
58+
}
59+
60+
@Test
61+
fun sendReplyWithTextTest() {
62+
val api = sendTextMsgApi(
63+
SendMsgApi.MESSAGE_TYPE_GROUP,
64+
target = 123.ID,
65+
text = "666",
66+
reply = 456.ID,
67+
)
68+
69+
val body = assertIs<SendMsgApi.Body>(api.body)
70+
val content = assertIs<OneBotMessageOutgoing.SegmentsValue>(body.message)
71+
val firstReply = assertIs<OneBotReply>(content.segments.first())
72+
73+
assertEquals(456.ID, firstReply.id)
74+
}
75+
76+
@Test
77+
fun messagesToSegmentsWithMessageReferenceTest() = runTest {
78+
val messages = buildMessages {
79+
+"Hello"
80+
+MessageIdReference(123.ID)
81+
+Face(111.ID)
82+
}
83+
84+
val segments = messages.resolveToOneBotSegmentList(null)
85+
assertEquals(3, segments.size)
86+
val reply = assertNotNull(
87+
segments.firstNotNullOfOrNull { it as? OneBotReply }
88+
)
89+
90+
assertEquals(123.ID, reply.id)
91+
}
92+
93+
}

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/jvmTest/kotlin/ApiExecutableTests.kt renamed to simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/jvmTest/kotlin/love/forte/simbot/component/onebot/v11/core/ApiExecutableTests.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
package love.forte.simbot.component.onebot.v11.core
2+
13
import io.mockk.coVerify
24
import io.mockk.mockk
35
import kotlinx.coroutines.test.runTest
46
import love.forte.simbot.component.onebot.v11.core.api.OneBotApi
57
import love.forte.simbot.component.onebot.v11.core.api.OneBotApiExecutable
68
import love.forte.simbot.component.onebot.v11.core.api.inExecutableScope
7-
import kotlin.test.Test
89

910
/**
1011
*

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/jvmTest/kotlin/AppTest.kt renamed to simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/jvmTest/kotlin/love/forte/simbot/component/onebot/v11/core/AppTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package love.forte.simbot.component.onebot.v11.core
2+
13
import io.ktor.client.engine.java.Java
24
import io.ktor.http.Url
35
import love.forte.simbot.application.listeners
@@ -34,7 +36,7 @@ suspend fun main() {
3436
eventServerHost = Url("ws://localhost:3001")
3537
wsClientEngineFactory = Java
3638
apiClientEngineFactory = Java
37-
accessToken = "test"
39+
accessToken("test")
3840
}
3941
)
4042

simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/jvmTest/kotlin/BotDefaultImageAdditionalTests.kt renamed to simbot-component-onebot-v11/simbot-component-onebot-v11-core/src/jvmTest/kotlin/love/forte/simbot/component/onebot/v11/core/BotDefaultImageAdditionalTests.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
package love.forte.simbot.component.onebot.v11.core
2+
13
import kotlinx.coroutines.test.runTest
24
import love.forte.simbot.component.onebot.v11.core.bot.firstOneBotBotManager
35
import love.forte.simbot.component.onebot.v11.core.bot.register
4-
import love.forte.simbot.component.onebot.v11.core.useOneBot11
56
import love.forte.simbot.component.onebot.v11.message.resolveToOneBotSegment
67
import love.forte.simbot.component.onebot.v11.message.segment.OneBotImage
78
import love.forte.simbot.core.application.launchSimpleApplication

simbot-component-onebot-v11/simbot-component-onebot-v11-message/api/simbot-component-onebot-v11-message.api

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ public abstract interface class love/forte/simbot/component/onebot/v11/message/O
44
public abstract fun getMessages ()Llove/forte/simbot/message/Messages;
55
public abstract fun getPlainText ()Ljava/lang/String;
66
public abstract fun getSourceSegments ()Ljava/util/List;
7+
public fun reference (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
8+
public static synthetic fun reference$suspendImpl (Llove/forte/simbot/component/onebot/v11/message/OneBotMessageContent;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
79
}
810

911
public abstract interface class love/forte/simbot/component/onebot/v11/message/OneBotMessageElement : love/forte/simbot/message/Message$Element {
@@ -918,14 +920,14 @@ public final class love/forte/simbot/component/onebot/v11/message/segment/OneBot
918920
public final fun serializer ()Lkotlinx/serialization/KSerializer;
919921
}
920922

921-
public final class love/forte/simbot/component/onebot/v11/message/segment/OneBotReply : love/forte/simbot/component/onebot/v11/message/segment/OneBotMessageSegment {
923+
public final class love/forte/simbot/component/onebot/v11/message/segment/OneBotReply : love/forte/simbot/component/onebot/v11/message/segment/OneBotMessageSegment, love/forte/simbot/message/MessageReference {
922924
public static final field Factory Llove/forte/simbot/component/onebot/v11/message/segment/OneBotReply$Factory;
923925
public static final field TYPE Ljava/lang/String;
924926
public synthetic fun <init> (Llove/forte/simbot/component/onebot/v11/message/segment/OneBotReply$Data;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
925927
public static final fun create (Llove/forte/simbot/common/id/ID;)Llove/forte/simbot/component/onebot/v11/message/segment/OneBotReply;
926928
public synthetic fun getData ()Ljava/lang/Object;
927929
public fun getData ()Llove/forte/simbot/component/onebot/v11/message/segment/OneBotReply$Data;
928-
public final fun getId ()Llove/forte/simbot/common/id/ID;
930+
public fun getId ()Llove/forte/simbot/common/id/ID;
929931
}
930932

931933
public synthetic class love/forte/simbot/component/onebot/v11/message/segment/OneBotReply$$serializer : kotlinx/serialization/internal/GeneratedSerializer {

simbot-component-onebot-v11/simbot-component-onebot-v11-message/src/commonMain/kotlin/love/forte/simbot/component/onebot/v11/message/MessageElementResolvers.kt

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,23 +87,24 @@ public suspend fun Message.Element.resolveToOneBotSegment(
8787
is Face -> OneBotFace.create(id)
8888
is At -> OneBotAt.create(target)
8989
is AtAll -> OneBotAt.createAtAll()
90-
is Image -> {
91-
when (this) {
92-
// offline image
93-
is OfflineImage -> suspendCancellableCoroutine<OneBotMessageSegment?> { continuation ->
94-
offlineImageResolver(defaultImageAdditionalParams)
95-
.resolve(this, continuation)
96-
}
97-
98-
// remote images, OneBot组件中实际上没有此类型的实现
99-
// 将它的 id 直接视为 file
100-
is RemoteImage -> OneBotImage.create(id.literal)
101-
102-
// 其他未知类型,不管
103-
else -> null
90+
is Image -> when (this) {
91+
// offline image
92+
is OfflineImage -> suspendCancellableCoroutine<OneBotMessageSegment?> { continuation ->
93+
offlineImageResolver(defaultImageAdditionalParams)
94+
.resolve(this, continuation)
10495
}
96+
97+
// remote images, OneBot组件中实际上没有此类型的实现
98+
// 将它的 id 直接视为 file
99+
is RemoteImage -> OneBotImage.create(id.literal)
100+
101+
// 其他未知类型,不管
102+
else -> null
105103
}
106104

105+
// since 1.2.0
106+
is MessageReference -> OneBotReply.create(id)
107+
107108
// 其他未知类型,不管
108109
else -> null
109110
}

0 commit comments

Comments
 (0)