feat: add jue command

This commit is contained in:
2024-09-21 16:03:28 +08:00
parent 60b41ead3b
commit 6d4cdff0a8
6 files changed
+129 -21

No files matched your search

@@ -0,0 +1,65 @@
/*
* Copyright © 2024 RTAkland
* Author: RTAkland
* Date: 2024/9/21
*/
package cn.rtast.fancybot.commands.misc
import cn.rtast.fancybot.util.Resources
import cn.rtast.fancybot.util.drawCircularImage
import cn.rtast.fancybot.util.makeGif
import cn.rtast.fancybot.util.str.encodeToBase64
import cn.rtast.fancybot.util.toBufferedImage
import cn.rtast.rob.entity.GroupMessage
import cn.rtast.rob.enums.ArrayMessageType
import cn.rtast.rob.util.BaseCommand
import cn.rtast.rob.util.ob.MessageChain
import cn.rtast.rob.util.ob.OneBotListener
import com.madgag.gif.fmsware.GifDecoder
import java.awt.image.BufferedImage
import java.net.URI
class JueCommand : BaseCommand() {
override val commandNames = listOf("")
private val avatarUrl = "https://q1.qlogo.cn/g?b=qq&nk=#{}&s=640"
private fun createJueGIF(source: String, target: String): String {
val baseGIF = Resources.loadFromResources("misc/jue.gif")
val sourceAvatar = URI(avatarUrl.replace("#{}", source)).toURL().readBytes().toBufferedImage()
val targetAvatar = URI(avatarUrl.replace("#{}", target)).toURL().readBytes().toBufferedImage()
val decoder = GifDecoder()
decoder.read(baseGIF)
val frames = mutableListOf<BufferedImage>()
fun drawFrame(index: Int, sourceX: Int, sourceY: Int, targetX: Int, targetY: Int) {
val frame = decoder.getFrame(index)
val g2d = frame.createGraphics()
g2d.drawCircularImage(sourceAvatar, sourceX, sourceY, 126.0, 126.0)
g2d.drawCircularImage(targetAvatar, targetX, targetY, 126.0, 126.0)
g2d.dispose()
frames.add(frame)
}
(0 until decoder.frameCount).forEach {
when (it) {
0 -> drawFrame(it, 115, -12, 3, 175)
1 -> drawFrame(it, 109, 2, 10, 170)
2 -> drawFrame(it, 130, -13, 5, 154)
}
}
val gifBytes = decoder.makeGif(frames)
val gif = gifBytes.encodeToBase64()
return gif
}
override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List<String>) {
val target = message.message.find { it.type == ArrayMessageType.at }?.data?.qq.toString()
val source = message.sender.userId.toString()
val gif = this.createJueGIF(source, target)
val msg = MessageChain.Builder().addImage(gif, true).build()
listener.sendGroupMessage(message.groupId, msg)
}
}