From 1242d1fc3fb16570994052db190c61698c14c772 Mon Sep 17 00:00:00 2001 From: RTAkland Date: Thu, 12 Sep 2024 11:18:57 +0800 Subject: [PATCH] feat: support b23.tv parse and improve cover draw, format code, clean code --- gradle/libs.versions.toml | 2 +- src/main/kotlin/cn/rtast/fancybot/FancyBot.kt | 26 ++++++++++++++++--- .../fancybot/commands/AntiRevokeCommand.kt | 2 +- .../fancybot/commands/misc/BVParseCommand.kt | 25 +++++------------- .../rtast/fancybot/util/file/JrrpManager.kt | 6 +---- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1940f37..480a1e1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] kotlinVersion = "2.0.10" -ronebotVersion = "1.6.2" +ronebotVersion = "1.7.0" shadowVersion = "8.3.0" okhttpVersion = "5.0.0-alpha.14" exposedVersion = "0.53.0" diff --git a/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt b/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt index 1ae6aba..d67be62 100644 --- a/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt +++ b/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt @@ -27,17 +27,37 @@ import cn.rtast.rob.entity.GroupRevokeMessage import cn.rtast.rob.enums.ArrayMessageType import cn.rtast.rob.util.ob.MessageChain import cn.rtast.rob.util.ob.OBMessage +import okhttp3.OkHttpClient +import okhttp3.Request class FancyBot : OBMessage { + private val tempOkHttpClient = OkHttpClient() + override suspend fun onGroupMessage(message: GroupMessage, json: String) { val sender = message.sender.nickname val senderId = message.sender.userId val msg = message.rawMessage val groupId = message.groupId println("$sender($senderId: $groupId): $msg") - if (message.rawMessage.startsWith("BV") || message.rawMessage.startsWith("https://www.bilibili.com")) { - BVParseCommand.parse(this, message) + if (message.rawMessage.startsWith("BV") || + message.rawMessage.startsWith("https://www.bilibili.com") || + message.rawMessage.contains("https://b23.tv/") + ) { + // parse bilibili video with a link, bvid or b23.tv link + val bvid = if (message.rawMessage.startsWith("BV")) { + message.rawMessage + } else if (message.rawMessage.contains("https://b23.tv/")) { + val shortUrl = message.rawMessage.split(" ").last() + val request = Request.Builder().url(shortUrl).build() + val redirectedUrl = tempOkHttpClient.newCall(request).execute() + redirectedUrl.use { + it.request.url.toString().split("/")[4].split("?").first() + } + } else { + message.rawMessage.split("/")[4] + } + BVParseCommand.parse(this, bvid, message) } if (message.message.any { it.type == ArrayMessageType.reply }) { // Image url parse val command = message.message.reversed().find { it.type == ArrayMessageType.text }!!.data.text!! @@ -65,7 +85,7 @@ class FancyBot : OBMessage { override suspend fun onGetGroupMessageResponse(message: GetMessage) { when (message.data.id) { - "revoke" -> AntiRevokeCommand.getMessageCallback(this, message) + "revoke" -> AntiRevokeCommand.callback(this, message) "imageUrl" -> ImageURLCommand.callback(this, message) "reverseGif" -> ReverseGIFCommand.callback(this, message) } diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/AntiRevokeCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/AntiRevokeCommand.kt index 8ace975..c7f45ad 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/AntiRevokeCommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/AntiRevokeCommand.kt @@ -29,7 +29,7 @@ class AntiRevokeCommand : BaseCommand() { } companion object { - suspend fun getMessageCallback(listener: OBMessage, message: GetMessage) { + suspend fun callback(listener: OBMessage, message: GetMessage) { val msgList = mutableListOf() msgList.add( ArrayMessage( diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/misc/BVParseCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/misc/BVParseCommand.kt index c0d8d9a..30a1d02 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/misc/BVParseCommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/misc/BVParseCommand.kt @@ -39,20 +39,11 @@ object BVParseCommand { private val replyIcon = ImageIO.read(Resources.loadFromResources("bili/reply.png")) private fun Int.formatNumber(): String { - return when { - this >= 100000000 -> "${this / 100000000}亿" - this >= 10000 -> { - val wan = this / 10000 - val remainder = this % 10000 - if (remainder == 0) "${wan}万" else "${wan}万${remainder}" - } - - this >= 1000 -> { - val remainder = this % 1000 - if (remainder == 0) "${this / 1000}千" else "${this / 1000}千零${remainder}" - } - - else -> this.toString() + return if (this >= 10000) { + val result = this / 10000.0 + String.format("%.1f万", result) + } else { + this.toString() } } @@ -144,7 +135,7 @@ object BVParseCommand { // draw author face this.drawImage(faceImage, g2d, 40, 480, 60.0, 60.0, true) // draw cover image - this.drawImage(coverImage, g2d, 470, 140, 600.0, 300.0, true) + this.drawImage(coverImage, g2d, 430, 140, 600.0, 300.0, true) g2d.dispose() val byteArrayOutputStream = ByteArrayOutputStream() ImageIO.write(backgroundImage, "png", byteArrayOutputStream) @@ -152,9 +143,7 @@ object BVParseCommand { return imageBytes.encodeToBase64() } - suspend fun parse(listener: OBMessage, message: GroupMessage) { - val bvid = if (message.rawMessage.startsWith("BV")) message.rawMessage - else message.rawMessage.split("/")[4] + suspend fun parse(listener: OBMessage, bvid: String, message: GroupMessage) { val videoInfo = Http.get(CID_URL, mapOf("bvid" to bvid)) val authorFace = videoInfo.data.owner.face val title = videoInfo.data.title diff --git a/src/main/kotlin/cn/rtast/fancybot/util/file/JrrpManager.kt b/src/main/kotlin/cn/rtast/fancybot/util/file/JrrpManager.kt index 71a6b57..68060cc 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/file/JrrpManager.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/file/JrrpManager.kt @@ -33,11 +33,7 @@ class JrrpManager { suspend fun isJrrped(id: Long): Boolean { val record = getRecord(id) - return if (record != null) { - record.timestamp.isSameDay(Instant.now().epochSecond) - } else { - false - } + return record?.timestamp?.isSameDay(Instant.now().epochSecond) ?: false } suspend fun jrrp(id: Long): Long {