diff --git a/CHANGELOG.md b/CHANGELOG.md
index bf0a0c23..e722015c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,20 @@
+# v4.0.0
+
+> Release & Pull Notes: [v4.0.0](https://github.com/simple-robot/simpler-robot/releases/tag/v4.0.0)
+
+- feat(core): KookBot 支持根据引用查询消息内容的相关API ([`98a7fc1..500491e`](https://github.com/simple-robot/simpler-robot/compare/98a7fc1..8e460f6))
+
+ 98a7fc1..500491e
+
+ - [`98a7fc1`](https://github.com/simple-robot/simpler-robot/commit/98a7fc1)
+ - [`500491e`](https://github.com/simple-robot/simpler-robot/commit/500491e)
+
+
+
+- feat(core): KookMessageContent 支持根据引用查询消息内容的相关API ([`8e460f6`](https://github.com/simple-robot/simpler-robot/commit/8e460f6))
+- build(deps): Update Kotlin to 2.0.10, simbot to 4.6.0 ([`f81d7e7`](https://github.com/simple-robot/simpler-robot/commit/f81d7e7))
+- build(deps): bump ksp from 2.0.0-1.0.24 to 2.0.10-1.0.24 ([`11bfb0c`](https://github.com/simple-robot/simpler-robot/commit/11bfb0c))
+
# v4.0.0-beta6
> Release & Pull Notes: [v4.0.0-beta6](https://github.com/simple-robot/simpler-robot/releases/tag/v4.0.0-beta6)
diff --git a/buildSrc/src/main/kotlin/P.kt b/buildSrc/src/main/kotlin/P.kt
index 23882083..410b45f3 100644
--- a/buildSrc/src/main/kotlin/P.kt
+++ b/buildSrc/src/main/kotlin/P.kt
@@ -23,23 +23,6 @@
import love.forte.gradle.common.core.project.ProjectDetail
import love.forte.gradle.common.core.property.systemProp
-/*
-* Copyright (c) 2022-2022 ForteScarlet
-*
-* 本文件是 simbot-component-kook 的一部分。
-*
-* simbot-component-kook 是自由软件:你可以再分发之和/或依照由自由软件基金会发布的 GNU 通用公共许可证修改之,无论是版本 3 许可证,还是(按你的决定)任何以后版都可以。
-*
-* 发布 simbot-component-kook 是希望它能有用,但是并无保障;甚至连可销售和符合某个特定的目的都不保证。请参看 GNU 通用公共许可证,了解详情。
-*
-* 你应该随程序获得一份 GNU 通用公共许可证的复本。如果没有,请看:
-* https://www.gnu.org/licenses
-* https://www.gnu.org/licenses/gpl-3.0-standalone.html
-* https://www.gnu.org/licenses/lgpl-3.0-standalone.html
-*
-*
-*/
-
object P : ProjectDetail() {
const val GROUP = "love.forte.simbot.component"
@@ -49,8 +32,8 @@ object P : ProjectDetail() {
override val homepage: String
get() = HOMEPAGE
- const val VERSION = "4.0.0-beta6"
- const val NEXT_VERSION = "4.0.0-beta7"
+ const val VERSION = "4.0.0"
+ const val NEXT_VERSION = "4.0.1"
override val snapshotVersion = "$NEXT_VERSION-SNAPSHOT"
override val version = if (isSnapshot()) snapshotVersion else VERSION
diff --git a/buildSrc/src/main/kotlin/changelog/GenerateChangelog.kt b/buildSrc/src/main/kotlin/changelog/GenerateChangelog.kt
index e7bb7dc4..c2b5e484 100644
--- a/buildSrc/src/main/kotlin/changelog/GenerateChangelog.kt
+++ b/buildSrc/src/main/kotlin/changelog/GenerateChangelog.kt
@@ -50,12 +50,9 @@ fun Project.generateChangelog(tag: String) {
file.writeText(
"""
+ > [!note]
> 对应核心版本: [**v$coreVersion**](https://github.com/simple-robot/simpler-robot/releases/tag/v$coreVersion)
- > [!warning]
- > 目前版本尚处于 **`beta`** 阶段,代表仍然可能存在部分已知问题或未知问题,
- > 以及尚未完善的内容和落后于官方更新的内容。
-
我们欢迎并期望着您的 [反馈](https://github.com/simple-robot/simbot-component-kook/issues) 或 [协助](https://github.com/simple-robot/simbot-component-kook/pulls),感谢您的贡献与支持!
""".trimIndent()
diff --git a/buildSrc/src/main/kotlin/simbot-kook-changelog-generator.gradle.kts b/buildSrc/src/main/kotlin/simbot-kook-changelog-generator.gradle.kts
index e7745e6f..2f702942 100644
--- a/buildSrc/src/main/kotlin/simbot-kook-changelog-generator.gradle.kts
+++ b/buildSrc/src/main/kotlin/simbot-kook-changelog-generator.gradle.kts
@@ -25,33 +25,6 @@ tasks.create("createChangelog") {
group = "documentation"
doFirst {
generateChangelog("v${P.version}")
-// println("Generate change log for $version ...")
-// // configurations.runtimeClasspath
-// val changelogDir = rootProject.file(".changelog").also {
-// it.mkdirs()
-// }
-// val file = File(changelogDir, "$version.md")
-// if (!file.exists()) {
-// file.createNewFile()
-// val coreVersion = simbotVersion.toString()
-// val autoGenerateText = """
-//
-// **部分依赖库版本参考**
-//
-// | **库** | **版本** |
-// |---------|--------|
-// | 核心库 | [**v$coreVersion**](https://github.com/ForteScarlet/simpler-robot/releases/tag/v$coreVersion) |
-//
-// > **Warning**
-// 当前版本处于 **`ALPHA`**阶段,仍旧有很多[**已知问题**](https://github.com/simple-robot/simbot-component-kook/issues/)和可能存在的**潜在问题**,
-// 如有发现问题请积极[反馈](https://github.com/simple-robot/simbot-component-kook/issues/)或 [协助我们解决](https://github.com/simple-robot/simbot-component-kook/pulls),非常感谢!
-//
-//
-// """.trimIndent()
-//
-//
-// file.writeText(autoGenerateText)
-// }
}
}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index f849ed0e..c5001d7b 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,5 +1,5 @@
[versions]
-kotlin = "2.0.0"
+kotlin = "2.0.10"
kotlinx-coroutines = "1.8.1"
kotlinx-serialization = "1.7.1"
dokka = "1.9.20"
@@ -7,11 +7,11 @@ openjdk-jmh = "1.37"
ktor = "2.3.12"
log4j = "2.23.0"
# simbot
-simbot = "4.5.0"
+simbot = "4.6.0"
suspendTransform = "0.9.0"
gradleCommon = "0.6.0"
# ksp
-ksp = "2.0.0-1.0.24"
+ksp = "2.0.10-1.0.24"
# https://square.github.io/kotlinpoet/
kotlinPoet = "1.18.1"
diff --git a/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/bot/KookBot.kt b/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/bot/KookBot.kt
index d009d730..d8634cfc 100644
--- a/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/bot/KookBot.kt
+++ b/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/bot/KookBot.kt
@@ -1,18 +1,21 @@
/*
- * Copyright (c) 2023. ForteScarlet.
+ * Copyright (c) 2023-2024. ForteScarlet.
*
- * This file is part of simbot-component-kook.
+ * This file is part of simbot-component-kook.
*
- * simbot-component-kook is free software: you can redistribute it and/or modify it under the terms of
- * the GNU Lesser General Public License as published by the Free Software Foundation,
- * either version 3 of the License, or (at your option) any later version.
+ * simbot-component-kook is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
*
- * simbot-component-kook is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU Lesser General Public License for more details.
+ * simbot-component-kook is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public License along with simbot-component-kook,
- * If not, see .
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with simbot-component-kook,
+ * If not, see .
*/
package love.forte.simbot.component.kook.bot
@@ -25,20 +28,25 @@ import love.forte.simbot.bot.GuildRelation
import love.forte.simbot.common.collectable.Collectable
import love.forte.simbot.common.id.ID
import love.forte.simbot.common.id.StringID.Companion.ID
+import love.forte.simbot.common.id.literal
import love.forte.simbot.component.kook.KookComponent
import love.forte.simbot.component.kook.KookGuild
import love.forte.simbot.component.kook.KookUserChat
import love.forte.simbot.component.kook.message.KookAsset
import love.forte.simbot.component.kook.message.KookAssetImage
+import love.forte.simbot.component.kook.message.KookChannelMessageDetailsContent.Companion.toContent
+import love.forte.simbot.component.kook.message.KookMessageContent
import love.forte.simbot.component.kook.util.requestDataBy
import love.forte.simbot.kook.api.ApiResponseException
import love.forte.simbot.kook.api.ApiResultException
import love.forte.simbot.kook.api.asset.Asset
import love.forte.simbot.kook.api.asset.CreateAssetApi
+import love.forte.simbot.kook.api.message.GetChannelMessageViewApi
import love.forte.simbot.kook.api.userchat.GetUserChatListApi
import love.forte.simbot.kook.messages.MessageType
import love.forte.simbot.kook.stdlib.Ticket
import love.forte.simbot.logger.Logger
+import love.forte.simbot.message.MessageReference
import love.forte.simbot.suspendrunner.ST
import love.forte.simbot.suspendrunner.STP
import kotlin.coroutines.CoroutineContext
@@ -162,6 +170,23 @@ public interface KookBot : Bot, CoroutineScope {
@Deprecated("Unsupported in KOOK", ReplaceWith("null"))
override val groupRelation: GroupRelation?
get() = null
+
+ /**
+ * 根据引用ID查询对应的 **频道消息** 的 [KookMessageContent]。
+ */
+ @ST
+ override suspend fun messageFromId(id: ID): KookMessageContent {
+ val view = GetChannelMessageViewApi.create(id.literal).requestDataBy(this)
+ return view.toContent(this)
+ }
+
+ /**
+ * 根据引用查询对应的 **频道消息** 的 [KookMessageContent]。
+ */
+ @ST
+ override suspend fun messageFromReference(reference: MessageReference): KookMessageContent {
+ return messageFromId(reference.id)
+ }
}
/**
diff --git a/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/message/KookChannelMessageDetailsContent.kt b/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/message/KookChannelMessageDetailsContent.kt
index 348b7ac7..fb57f193 100644
--- a/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/message/KookChannelMessageDetailsContent.kt
+++ b/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/message/KookChannelMessageDetailsContent.kt
@@ -100,6 +100,12 @@ public data class KookChannelMessageDetailsContent internal constructor(
return details.quote?.asMessage()
}
+ override suspend fun referenceMessage(): KookMessageContent? {
+ val quote = details.quote ?: return null
+ val view = GetChannelMessageViewApi.create(quote.id).requestDataBy(bot)
+ return view.toContent(bot)
+ }
+
/**
* 删除当前的频道消息。
*
diff --git a/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/message/KookReceiveMessageContent.kt b/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/message/KookReceiveMessageContent.kt
index 2bc369c1..e486e3e3 100644
--- a/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/message/KookReceiveMessageContent.kt
+++ b/simbot-component-kook-core/src/commonMain/kotlin/love/forte/simbot/component/kook/message/KookReceiveMessageContent.kt
@@ -30,6 +30,7 @@ import love.forte.simbot.common.id.IntID.Companion.ID
import love.forte.simbot.common.id.StringID.Companion.ID
import love.forte.simbot.component.kook.bot.KookBot
import love.forte.simbot.component.kook.message.KookAttachmentMessage.Companion.asMessage
+import love.forte.simbot.component.kook.message.KookChannelMessageDetailsContent.Companion.toContent
import love.forte.simbot.component.kook.message.KookMessages.AT_TYPE_ROLE
import love.forte.simbot.component.kook.message.KookMessages.AT_TYPE_USER
import love.forte.simbot.component.kook.message.KookQuote.Companion.asMessage
@@ -46,6 +47,8 @@ import love.forte.simbot.kook.api.message.GetChannelMessageViewApi
import love.forte.simbot.kook.api.message.GetDirectMessageViewApi
import love.forte.simbot.kook.api.userchat.CreateUserChatApi
import love.forte.simbot.kook.event.*
+import love.forte.simbot.kook.messages.ChannelMessageDetails
+import love.forte.simbot.kook.messages.DirectMessageDetails
import love.forte.simbot.kook.objects.card.CardMessage
import love.forte.simbot.logger.Logger
import love.forte.simbot.logger.LoggerFactory
@@ -159,6 +162,12 @@ public interface KookMessageContent : MessageContent, DeleteSupport {
@STP
override suspend fun reference(): KookQuote?
+ /**
+ * 根据 [消息引用][reference] 查询其对应的消息原内容。
+ */
+ @STP
+ override suspend fun referenceMessage(): KookMessageContent?
+
/**
* 尝试根据当前消息ID删除目标。
*
@@ -192,6 +201,20 @@ private suspend fun referenceFromDirectWithChatCode(bot: KookBot, msgId: String,
return details.quote?.asMessage()
}
+private suspend fun detailsFromChannel(bot: KookBot, msgId: String): ChannelMessageDetails {
+ val api = GetChannelMessageViewApi.create(msgId)
+ return bot.requestData(api)
+}
+
+private suspend fun detailsFromDirect(bot: KookBot, msgId: String, authorId: String): DirectMessageDetails {
+ val chat = CreateUserChatApi.create(authorId).requestDataBy(bot)
+ return detailsFromDirectWithChatCode(bot, msgId, chat.code)
+}
+
+private suspend fun detailsFromDirectWithChatCode(bot: KookBot, msgId: String, chatCode: String): DirectMessageDetails {
+ return GetDirectMessageViewApi.create(chatCode, msgId).requestDataBy(bot)
+}
+
/**
* KOOK 消息事件所收到的消息正文类型。
*
@@ -239,6 +262,26 @@ public class KookReceiveMessageContent internal constructor(
}
}
+ override suspend fun referenceMessage(): KookMessageContent {
+ return if (isDirect) {
+ val details = detailsFromDirect(bot, source.msgId, source.authorId)
+ KookUpdatedMessageContent(
+ bot = bot,
+ isDirect = false,
+ chatCode = null,
+ rawContent = details.content,
+ msgId = details.id,
+ mention = emptyList(),
+ mentionRoles = emptyList(),
+ isMentionAll = false,
+ isMentionHere = false
+ )
+ } else {
+ val details = detailsFromChannel(bot, source.msgId)
+ details.toContent(bot)
+ }
+ }
+
@JvmSynthetic
override suspend fun delete(vararg options: DeleteOption) {
// TODO options
@@ -300,6 +343,27 @@ public class KookUpdatedMessageContent internal constructor(
}
}
+ @JvmSynthetic
+ override suspend fun referenceMessage(): KookMessageContent {
+ return if (isDirect) {
+ val details = detailsFromDirectWithChatCode(bot, msgId, chatCode!!)
+ KookUpdatedMessageContent(
+ bot = bot,
+ isDirect = false,
+ chatCode = null,
+ rawContent = details.content,
+ msgId = details.id,
+ mention = emptyList(),
+ mentionRoles = emptyList(),
+ isMentionAll = false,
+ isMentionHere = false
+ )
+ } else {
+ val details = detailsFromChannel(bot, msgId)
+ details.toContent(bot)
+ }
+ }
+
@JvmSynthetic
override suspend fun delete(vararg options: DeleteOption) {
// TODO options