diff --git a/build.gradle.kts b/build.gradle.kts index 8a428a1..9a02a5f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,6 +15,7 @@ version = fancyBotVersion repositories { mavenCentral() mavenLocal() + maven("https://oss.sonatype.org/content/repositories/snapshots") maven("https://repo.rtast.cn/api/v4/projects/33/packages/maven") maven("https://repo.rtast.cn/api/v4/projects/19/packages/maven") } @@ -45,6 +46,7 @@ dependencies { implementation(libs.logback.classic) implementation(libs.slf4j.api) implementation(libs.aws.s3.sdk) + implementation(libs.sweble.wikitext) } tasks.build { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 99ca3a8..d0f3ae6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,6 +14,7 @@ zxingVersion = "3.5.3" logbackClassicVersion = "1.5.8" sl4jVersion = "2.0.16" awsS3SDKVersion = "2.28.18" +blikiWikiVersion = "3.1.1-SNAPSHOT" [libraries] ronebot = { group = "cn.rtast", name = "ROneBot", version.ref = "ronebotVersion" } @@ -31,6 +32,7 @@ zxing-javase = { group = "com.google.zxing", name = "javase", version.ref = "zxi logback-classic = { group = "ch.qos.logback", name = "logback-classic", version.ref = "logbackClassicVersion" } slf4j-api = { group = "org.slf4j", name = "slf4j-api", version.ref = "sl4jVersion" } aws-s3-sdk = { group = "software.amazon.awssdk", name = "s3", version.ref = "awsS3SDKVersion" } +sweble-wikitext = { group = "info.bliki.wiki", name = "bliki-core", version.ref = "blikiWikiVersion" } [bundles] diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/lookup/MinecraftCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/lookup/MinecraftCommand.kt index 8725048..fcc7383 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/lookup/MinecraftCommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/lookup/MinecraftCommand.kt @@ -9,18 +9,22 @@ package cn.rtast.fancybot.commands.lookup import cn.rtast.fancybot.annotations.CommandDescription +import cn.rtast.fancybot.commands.lookup.WikipediaCommand.Companion.extractPlainTextFromHtml import cn.rtast.fancybot.configManager import cn.rtast.fancybot.entity.mc.DecodedSkin import cn.rtast.fancybot.entity.mc.MCVersion +import cn.rtast.fancybot.entity.mc.MCWikiPageResponse import cn.rtast.fancybot.entity.mc.MCWikiSearchResponse import cn.rtast.fancybot.entity.mc.Skin import cn.rtast.fancybot.entity.mc.Username import cn.rtast.fancybot.enums.mc.MCVersionType import cn.rtast.fancybot.util.Http +import cn.rtast.fancybot.util.Logger import cn.rtast.fancybot.util.misc.isFullyTransparent import cn.rtast.fancybot.util.misc.scaleImage import cn.rtast.fancybot.util.misc.toByteArray import cn.rtast.fancybot.util.misc.toURL +import cn.rtast.fancybot.util.str.convertToHTML import cn.rtast.fancybot.util.str.decodeToString import cn.rtast.fancybot.util.str.encodeToBase64 import cn.rtast.fancybot.util.str.fromJson @@ -67,32 +71,64 @@ class MCVersionCommand : BaseCommand() { class MinecraftWikiCommand : BaseCommand() { override val commandNames = listOf("mcwiki") - private val searchApiUrl = "https://zh.minecraft.wiki" + private val baseApiUrl = "https://zh.minecraft.wiki/rest.php/v1" + private val logger = Logger.getLogger() override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List) { - val searchKeyword = args.joinToString(" ").trim() - val messages = mutableListOf() - val headerMessage = listOf("结果如下:").asMessageChain() - messages.add(headerMessage) - Http.get( - "$searchApiUrl/rest.php/v1/search/title", - mapOf("q" to searchKeyword, "limit" to 10) - ).pages.forEach { - val msg = MessageChain.Builder() - val imageUrl = it.thumbnail - if (imageUrl != null) { - val imageBase64 = imageUrl.url.toURL().readBytes().encodeToBase64() - msg.addImage(imageBase64, true) + val action = args.first() + when (action) { + "s", "搜索" -> { + val searchKeyword = args.drop(1).joinToString(" ").trim() + val messages = mutableListOf() + val headerMessage = listOf("结果如下:").asMessageChain() + messages.add(headerMessage) + Http.get( + "$baseApiUrl/search/title", + mapOf("q" to searchKeyword, "limit" to 10) + ).pages.forEach { + val msg = MessageChain.Builder() + val imageUrl = it.thumbnail + if (imageUrl != null) { + val imageBase64 = imageUrl.url.toURL().readBytes().encodeToBase64() + msg.addImage(imageBase64, true) + } + msg.addText("标题: ${it.title}") + .addNewLine() + .addText("ID: ${it.id}") + .addNewLine() + .addText("https://zh.minecraft.wiki/w/${it.title.uriEncode}") + messages.add(msg.build()) + } + message.reply(messages.asNode(configManager.selfId)) + } + + else -> { + val title = args.joinToString(" ").trim() + var response = Http.get("$baseApiUrl/page/$title") + if (response.httpCode != null) { + logger.info("页面($title)不存在") + message.reply("页面($title)不存在") + return + } + if (response.redirectTarget != null) { + logger.info("重定向Wiki页面到: ${response.redirectTarget}") + response = Http.get(response.redirectTarget) + } + val messages = mutableListOf() + val headerMsg = listOf("标题${response.title}的内容如下").asMessageChain() + val footerMsg = listOf( + "数据来源: https://zh.minecraft.wiki", + "协议: ${response.license.title}(${response.license.url})" + ).asMessageChain(true) + val bodyMsg = MessageChain.Builder() + .addText(response.source.convertToHTML().extractPlainTextFromHtml()) + .build() + messages.add(headerMsg) + messages.add(bodyMsg) + messages.add(footerMsg) + message.reply(messages.asNode(configManager.selfId)) } - msg.addText("标题: ${it.title}") - .addNewLine() - .addText("ID: ${it.id}") - .addNewLine() - .addText("https://zh.minecraft.wiki/w/${it.title.uriEncode}") - messages.add(msg.build()) } - message.reply(messages.asNode(configManager.selfId)) - repeat(3) { message.sender.poke() } } } diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/lookup/WikipediaCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/lookup/WikipediaCommand.kt index d5f52e3..07b466e 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/lookup/WikipediaCommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/lookup/WikipediaCommand.kt @@ -25,9 +25,11 @@ class WikipediaCommand : BaseCommand() { private val wikipediaAPI = "https://proxy.rtast.cn/https/zh.wikipedia.org/w/api.php" - private fun String.extractPlainTextFromHtml(): String { - val doc = Jsoup.parse(this) - return doc.text() + companion object { + fun String.extractPlainTextFromHtml(): String { + val doc = Jsoup.parse(this) + return doc.text() + } } override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List) { diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/mc/MCWikiPageResponse.kt b/src/main/kotlin/cn/rtast/fancybot/entity/mc/MCWikiPageResponse.kt new file mode 100644 index 0000000..625da10 --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/entity/mc/MCWikiPageResponse.kt @@ -0,0 +1,31 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/10/10 + */ + + +package cn.rtast.fancybot.entity.mc + +import com.google.gson.annotations.SerializedName + +data class MCWikiPageResponse( + @SerializedName("redirect_target") + val redirectTarget: String?, + val httpCode: Int?, + val id: Int, + val title: String, + val latest: Latest, + val source: String, + val license: License +) { + data class Latest( + val id: Int, + val timestamp: String, + ) + + data class License( + val url: String, + val title: String, + ) +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/util/str/WikiText.kt b/src/main/kotlin/cn/rtast/fancybot/util/str/WikiText.kt new file mode 100644 index 0000000..070d901 --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/util/str/WikiText.kt @@ -0,0 +1,14 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/10/10 + */ + + +package cn.rtast.fancybot.util.str + +import info.bliki.wiki.model.WikiModel + +fun String.convertToHTML(): String { + return WikiModel.toHtml(this) +} \ No newline at end of file